diff --git a/CLAUDE.md b/CLAUDE.md index 9e82d29..1e91187 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -39,3 +39,63 @@ - 每个 teammate / agent 必须遵循本 `CLAUDE.md` 与 heicodeDocs。 - 不允许 teammate 跨仓自行修改未声明范围内的代码,或绕过 Manager ↔ Swarm 契约、计费、审计、审批链。 - 多 agent 协作的最终总结需说明各 agent 负责范围、修改文件、风险与未完成项。 + +--- + +# 本地测试环境 & 交接(LOCAL TEST & HANDOFF) + +> 本节供**换机/新会话续接**。这是 `xmindlab-heicode/agent_swarm` 的**本地测试快照**(镜像 + #7 实验改动),非主仓权威。**所有密钥只列「清单+出处」,绝不写明文**(组织规则 #8)。线上/主仓以 GitHub 为准。 + +## 本快照相对上游 main 的本地改动 +1. **#7 自底向上分解(让一个任务铺到多 agent)** — `agent/main.py` `propose_task()`(发 WS `task_proposal`)+ `agent/task_executor.py` `_maybe_propose_subtasks()`(种子用 `_parse_task` 拆分→逐个提案入池→其他 agent 自选)。仅顶层种子提案,子任务不递归(无环)。`ENABLE_AUTONOMOUS_PROPOSALS` 默认 on。 +2. **`_parse_task` 健壮化** — `max_tokens` 可配 `AGENT_PLAN_MAX_TOKENS`(本快照默认 **65536**;**生产热修用 32768**,因部分模型网关上限 32768,>之 400)+ `_coerce_subtasks` 宽容解析 + 失败重试 + 日志。 +3. **提案子任务 `required_capabilities=[]`** — 否则 LLM 给的具体能力非固定能力池子集 → 永远派不出 → 卡 PENDING(派发死锁修复)。 +4. **`orchestrator/agent_launcher.py`** — `ENABLE_SUBTASK_HANDOFF` 透传给 agent(测 handoff 旁路用)。 +5. **`k8s/orchestrator-local.yaml`** — 本地部署清单(下方)。 +> 主仓对应:#75(根因)/ #76(PR,默认 65536)。本快照是本地验证版,未必与 #76 完全一致。 + +## 本地部署(Docker Desktop k8s,kind 式;arm64) +**镜像(本机构建,arm64;Docker Hub 走 mirror `https://8cz1yribqx6cws.xuanyuan.run`,见 `~/.docker/daemon.json`)** +``` +docker build -f Dockerfile.orchestrator -t swarm-orchestrator:local . +docker build -f Dockerfile.agent -t swarm-agent:local . +# kind 集群不共享宿主镜像 → 导入每个节点: +for img in swarm-orchestrator:local swarm-agent:local redis:7-alpine; do + docker save "$img" -o /tmp/i.tar + for n in desktop-control-plane desktop-worker desktop-worker2 desktop-worker3; do + docker exec -i "$n" ctr -n k8s.io images import - < /tmp/i.tar; done; done +``` +**部署(kubectl apply 在本机权限被禁 → 用 create/set/delete)** +``` +kubectl create namespace swarm-system +kubectl -n swarm-system create secret generic swarm-model-key --from-literal=OPENAI_API_KEY=<模型KEY> # 见密钥清单 +kubectl create -f k8s/rbac/ +kubectl create -f k8s/redis-statefulset.yaml +kubectl create -f k8s/orchestrator-local.yaml +kubectl -n swarm-system port-forward svc/orchestrator-service 8000:8000 # → http://localhost:8000(本地无鉴权) +``` +`orchestrator-local.yaml` 关键 env:`OPENAI_API_BASE/AGENT_OPENAI_API_BASE=`、`OPENAI_MODEL=<模型id>`、`OPENAI_API_KEY`(secretKeyRef→swarm-model-key)、`REDIS_HOST=redis-service`、`AGENT_LAUNCH_BACKEND=kubernetes`、`AGENT_POD_IMAGE=swarm-agent:local`、`AGENT_LAUNCH_MIN_POOL/POOL_SIZE=16`/`MAX_POOL=64`/`MAX_AGENTS_PER_USER=64`、`AGENT_PROPOSAL_BUDGET=8`(无 `SECRET_RESOLVER`,本地不走 azkv)。 +**绑 git 仓**:create 请求里 `resource_grants[{resource_type:git, secret_ref:"azkv://local/secrets/", metadata:{repo_url,base_branch}}]`;本地无 Azure → 在 orchestrator 设 `HEICODE_SECRET_='{"git_username":..,"git_password":..}'`(dev 解析)。pod 连宿主服务用 kind 网关 `172.19.0.1`。 + +## 外部底座(本次新增,待接进蜂群 = Phase 3/4 未做) +- **OpenSandbox**(沙盒,代码执行):`uv venv --python 3.11` → `uv pip install opensandbox-server` → `opensandbox-server init-config ~/.sandbox.toml --example docker-zh` → `OPENSANDBOX_INSECURE_SERVER=YES opensandbox-server`(`127.0.0.1:8080`,docker 运行时)。SDK `opensandbox`(`SandboxSync.create(image, connection_config=ConnectionConfigSync(domain="127.0.0.1:8080",protocol="http"))` → `.commands.run(...)`)。 +- **jina MCP**(搜索/web 工具):托管 `https://mcp.jina.ai/v1`(Streamable HTTP,`Authorization: Bearer `),21 工具(search_web/read_url/…)。Python:`mcp` 包 `streamablehttp_client` + `ClientSession`。 + +## 密钥清单(只列出处,值自行获取/轮换;勿写明文) +| 用途 | 来源 / 重建方式 | +|---|---| +| 模型 key(`sk-`,放 k8s secret `swarm-model-key`) | 模型网关后台(api.heicode.cc / code.heicode.cc);**建议新建,勿复用已暴露的** | +| `JINA_API_KEY`(jina MCP) | Jina 后台;**对话中已暴露,务必吊销换新** | +| git 凭据(`HEICODE_SECRET_` 的 username/password) | 你的 gitea(gitee.ath.cx) | +| Azure(ACR/AKS) | 新机 `az login`(不导 token) | +| Docker mirror / gitea / ugdocker 镜像仓 | 当前为开放/已认证,无需单独凭据 | + +## 当前状态 / 未完成 +- ✅ 本地 fan-out 验证:种子→拆 N 子任务→N 个不同 agent 并行(#7 通)。✅ 生产热修(agent 镜像 `swarm-agent:p75-mt32768`,池8/预算8)。 +- ✅ OpenSandbox 本地起+执行验证;✅ jina MCP 托管验证。 +- ⬜ Phase 3:agent 接 jina MCP(MCP client + function-calling)。⬜ Phase 4:代码执行走 OpenSandbox。 +- ⚠️ 架构缺口(见 issue 备选):蜂群只 fan-out 不 convergence——产物碎在各结果分支、无合并/聚合(无 ResultAggregator);评审循环封顶 `MAX_REVIEW_CYCLES=2`(非迭代到最优);`master_agent.synthesize` 仅文字汇总,不整合代码。 + +## 换机续接 +- 代码:本仓(`xiaohei/Agentswarm` @ gitee.ath.cx)。镜像:`app-40967-lovecc.cn23.ugdocker.link/swarm-{orchestrator,agent}:local`(**arm64**;amd64 环境需重构建)。 +- Claude 会话记录/记忆在旧机 `~/.claude/projects/.../`(transcript)与 `~/.claude/.../memory/`,如需原样搬可拷贝(注意其中可能含敏感信息,自行甄别)。