多 Agent 编排
CC 给了三种原语(subagent / agent team / workflow 脚本),按「谁持有计划」分层;Codex 把 multi_agent 工具集做成默认开启的稳定特性,用 config 层实现 agent 角色
多 Agent 编排
结论
两家都收敛到「主会话 + 可派生子 agent」模型,但分层方式不同。Claude Code 按协作拓扑给了三种原语:subagent(只向主 agent 汇报、不互通)、agent team(实验特性,lead + 平级 teammates + 共享任务列表 + mailbox 互发消息,env CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS 开启)、dynamic workflow(JS 脚本持有编排逻辑,可跑数百 agent)[一手文档]。Codex 则把多 agent 做成单一工具命名空间 multi_agent_v1(spawn_agent / wait_agent / send_input / list_agents / close_agent 等),feature key multi_agent 已是 Stable 且默认开启;“角色”不是独立 prompt 文件而是 config.toml 配置层(agent_type → 一层高优先级 TOML 覆盖),内置 default/explorer/awaiter 三个角色[一手源码]。CC 的 team 把每个 teammate 做成完整独立 CLI 会话(可 tmux 分屏、用户可直接对话),Codex 的 sub-agent 是同进程内的 thread——前者偏「多人协作」隐喻,后者偏「线程池」隐喻。
研究问题
- CC subagent 与 teammate 的本质区别?team 的状态存在哪、消息怎么路由?
- Codex 的 collab/multi-agent 工具面和角色机制是什么?是否默认可用?
- 「编排逻辑该由模型持有还是由代码持有」两家怎么裁决?
各 Agent 设计与实现
Claude Code
原语 1:Subagent(AgentTool/Task)——同会话内派生,"results return to the caller",互相不通信,token 成本低(docs/agent-teams.md:49-57)。
原语 2:Agent teams(实验)[一手文档][一手源码]
架构四件套(docs/agent-teams.md:212-220):team lead(创建团队的主会话,终身固定)、teammates(各自独立的完整 CC 实例)、共享 task list、mailbox。状态全部落本地文件:
- Team config:
~/.claude/teams/{team-name}/config.json(含members数组:name/agent ID/agent type,teammate 可读它发现队友) - Task list:
~/.claude/tasks/{team-name}/,"Task claiming uses file locking to prevent race conditions"(docs/agent-teams.md:163)
源码侧(重建版 2026-03-31,内部代号 swarm)印证了这套结构[一手源码]:
- 开关:
utils/agentSwarmsEnabled.ts:21-32—— "Opt-in via CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS env var OR --agent-teams flag"。 - 工具面:
TeamCreateTool(输入team_name,重名时自动生成新 slug,TeamCreateTool.ts:61-70)、TeamDeleteTool、SendMessageTool、TaskCreateTool/TaskUpdateTool。 SendMessageTool的输入 schema:to支持 "teammate name, or "*" for broadcast",feature 开关UDS_INBOX下还支持uds:<socket-path>本地对等体和bridge:<session-id>Remote Control 对等体(SendMessageTool.ts:67-75)——说明消息总线设计上预留了跨进程/跨机器扩展。- 消息不止纯文本:discriminated union 里有
shutdown_request/shutdown_response(带 approve 语义,teammate 可以拒绝关机)/plan_approval_response(SendMessageTool.ts:46-64)——团队治理(关机审批、计划审批)走的是同一条消息通道的结构化分支。 - 显示后端:
utils/swarm/backends/下有InProcessBackend/TmuxBackend/ITermBackend三种实现 +detection.ts自动探测,对应文档的 in-process 与 split-pane 两种 teammateMode。
Subagent vs teammate 的关键差异(docs/agent-teams.md:49-57 表):上下文都独立,但 subagent 只能把结果汇总回主 agent,teammate 之间可直接互发消息、自领任务,且用户可以绕过 lead 直接和任意 teammate 对话(Shift+Down 轮换)。teammate 可以引用 subagent 定义复用角色("tools allowlist 和 model 生效,body 追加进 system prompt",但 skills/mcpServers frontmatter 不生效,docs/agent-teams.md:240-252)。
治理钩子:TeammateIdle / TaskCreated / TaskCompleted 三个 hook,exit code 2 即可拦截(如阻止任务标记完成)(docs/agent-teams.md:189-195)。
已知限制(docs/agent-teams.md:403-414):/resume 不恢复 in-process teammates;一个 lead 只能管一个 team;不允许嵌套(teammate 不能再 spawn team);lead 身份不可转移。
原语 3:Dynamic workflows(research preview,v2.1.154+)[一手文档]
文档给了一张「谁持有计划」的判定表(docs/workflows.md:30-38):subagent/skill/team 都是 Claude 逐轮决定下一步,workflow 则是"A script the runtime executes"——Claude 写一段 JS 编排脚本,运行时在后台执行,规模 "Dozens to hundreds of agents per run",中间结果存脚本变量而非上下文窗口。内置 /deep-research 即一个 workflow;ultracode 关键字或 /effort ultracode 触发自动编排。workflow 派生的 subagent 一律跑 acceptEdits 模式并继承 allowlist(docs/workflows.md:163)。这相当于对「Anthropic 多 agent 研究 vs Cognition 单线程论」之争给出工程答案:常规任务单线程,可并行且模式可复用的任务把编排下沉为代码。
Codex CLI
工具面:multi_agent_v1 命名空间,"Tools for spawning and managing sub-agents"(core/src/tools/handlers/multi_agents_spec.rs:11-12)[一手源码]。从 spec 文件提取的工具清单:spawn_agent、send_input、send_message、followup_task、resume_agent、wait_agent(默认超时 30s,multi_agents_common.rs:31)、list_agents、close_agent(multi_agents_spec.rs:65-319)。spawn_agent 返回 "the spawned agent id plus the user-facing nickname",模型默认继承父 agent("Spawned agents inherit your current model by default",multi_agents_spec.rs:14)。
特性开关:features/src/lib.rs:957-968 —— Feature::Collab, key: "multi_agent", stage: Stage::Stable, default_enabled: true;同时存在 multi_agent_v2(UnderDevelopment,默认关)和 enable_fanout(SpawnCsv,UnderDevelopment)[一手源码]。即 b89ce9a 这个版本上多 agent 已是默认能力,且开启 fanout 会自动联动开启 Collab(lib.rs:516-517)。
角色 = 配置层,不是 prompt 文件:core/src/agent/role.rs 的模块注释说得很清楚——"Roles are selected at spawn time and are loaded with the same config machinery as config.toml... inserts the role as a high-precedence layer"(role.rs:1-7)。agent_type 省略时用 DEFAULT_ROLE_NAME = "default"(role.rs:28-29)。内置角色在 core/src/agent/builtins/:explorer.toml(空文件,即纯默认配置)和 awaiter.toml——后者是一个完整案例:model_reasoning_effort = "low" + 一段"You are an awaiter"的 developer_instructions,专职轮询等待长任务、明确禁止修改任务和臆造完成[一手源码]。角色层会保留调用方的 model_provider 和 service_tier 除非角色显式覆盖(role.rs:33-37)。
批量 fan-out:spawn_agents_on_csv 工具(agent_jobs/spawn_agents_on_csv.rs:20)读取 CSV 按行批量派生 agent——对标 CC workflow 的"数百 agent"规模场景,但还在 enable_fanout 开关后[一手源码]。
协作模板 ≠ 多 agent:collaboration-mode-templates crate 里的 plan/default/execute/pair_programming 四个模板(src/lib.rs:1-4)是人机协作风格(如 pair_programming.md 要求小步前进、把用户当队友),不是 agent 间协作,调研时易混淆[一手源码]。
没有 CC 式 team:codex-rs 中没有共享任务列表、teammate 间 mailbox、或用户直接对话子 agent 的机制;send_message/send_input 是父→子单向控制通道,子 agent 间互发消息未见实现[一手源码][推断]。审批上行由 codex_delegate.rs 转发子 agent 的 Exec/Patch 审批事件到父会话[一手源码]。
差异矩阵
| 维度 | Claude Code | Codex CLI |
|---|---|---|
| 默认可用性 | subagent 默认可用;team 实验需 env 开启;workflow research preview | multi_agent Stable 且默认开启 |
| 子 agent 形态 | teammate = 完整独立 CLI 会话(可 tmux 分屏) | 同进程 thread(thread_manager 管理) |
| 互相通信 | teammate 间可直接互发 + 广播(mailbox) | 父→子 send_input/send_message;子↔子未见 |
| 共享状态 | 文件系统任务列表(file locking 防竞态) | 无共享任务列表;结果经 wait_agent 收取 |
| 用户介入 | 可绕过 lead 直接对话任意 teammate | 经父会话;审批事件经 delegate 上行 |
| 角色定义 | subagent 定义(Markdown + frontmatter),可复用为 teammate | agent role = config.toml 配置层(TOML) |
| 内置角色 | 无(靠用户/插件定义) | default / explorer / awaiter |
| 大规模 fan-out | dynamic workflow(JS 脚本,数百 agent) | spawn_agents_on_csv(enable_fanout 开关后) |
| 治理钩子 | TeammateIdle / TaskCreated / TaskCompleted hooks | 沙箱 + 审批策略(无 team 级钩子) |
| 嵌套 | 禁止(teammate 不能 spawn team) | spawn_agent 受 max_concurrent_threads_per_session 约束(multi_agents_spec.rs:30) |
| 关机语义 | 结构化 shutdown_request,teammate 可拒绝 | close_agent 直接关闭 |
最小复现
# CC:开启 agent teams(需 v2.1.32+)
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 claude
> Create an agent team to review PR #142. Spawn three reviewers:
> one on security, one on performance, one on test coverage.
# 预期:~/.claude/teams/{team-name}/config.json 出现 members 数组
ls ~/.claude/teams/ ~/.claude/tasks/
# Codex:multi_agent 默认开启,直接在 TUI 提需求即可触发 spawn_agent
codex
> Spawn an explorer agent to map the crate dependency graph, then wait for it.
# 关闭:config.toml 中 [features] multi_agent = false(行为描述依据文档与源码,本机未实际运行 team 创建流程。)
Harness 接入建议(Yoda 实践)
Yoda 的定位恰好是「多 agent 编排 UI」(package.json: "precise parallel orchestration of multiple coding agents"),但实现路径与 runtime 内置 team 不同——Yoda 是runtime 之上的并行:每个 conversation 一个 PTY + 独立 worktree,跨 26 个 provider。建议:
- 不要和 CC agent team 抢同一层。CC team 的状态在
~/.claude/teams/,且明确警告 config.json "don't edit it by hand or pre-author it"(docs/agent-teams.md:230)。Yoda 可以只读这些文件做可视化(团队成员、任务列表状态),写操作一律通过向 lead 会话注入自然语言指令。 - Yoda 的并行模型是 CC subagent 的补集:runtime 内置并行共享一个账号/rate limit/进程,Yoda 的 PTY 并行天然跨 provider(一个任务 CC + 一个 Codex 互相 review),这是 runtime 做不到的拓扑。
- 任务依赖图自己持有。CC team 的任务依赖(pending→unblock)只在 team 生命周期内有效且 resume 后 teammate 丢失;Yoda 用 SQLite 持有跨会话任务 DAG,到点拉起新会话,更可靠。
- 借鉴 awaiter 角色:Codex 用一个低 reasoning effort 的专职 awaiter 轮询长任务,省主线程上下文。Yoda 的 agent event classifier(终端输出分类器)实现了同样目标且零 token——能用解析器就不要用模型。
- tmux 分屏模式在 VS Code 终端 / Windows Terminal / Ghostty 不可用(docs/agent-teams.md:414)——Yoda 自渲染多窗格不依赖 tmux,是嵌入式场景的优势。
失效条件
- CC agent teams 是实验特性:env 名、
~/.claude/teams/存储布局、hook 名都可能变;正式发布时本章需全面回归 - CC 重建源码(2026-03-31)中的 swarm 内部命名、UDS_INBOX feature 等可能与线上不一致(滞后约 2 个月)
- Codex
multi_agent_v2转正会改变工具面(v1 namespace 可能弃用);enable_fanout转正会改变 fan-out 结论 - dynamic workflows 处于 research preview,触发词已从
workflow改为ultracode(v2.1.160),后续仍可能变 - Codex 子 agent 间通信"未见实现"是基于 b89ce9a 的搜索结论,新版本可能补齐
参考资料
- CC 文档:
claude-code-docs/docs/agent-teams.md、docs/sub-agents.md、docs/workflows.md - CC 重建源码(2026-03-31):
src_2026-03-31/tools/{TeamCreateTool,SendMessageTool,TaskCreateTool}/、src_2026-03-31/utils/swarm/、src_2026-03-31/utils/agentSwarmsEnabled.ts - Codex 源码(b89ce9a,2026-06-06):
codex-rs/core/src/tools/handlers/multi_agents_spec.rs、codex-rs/core/src/agent/{role.rs,builtins/}、codex-rs/features/src/lib.rs:957-974、codex-rs/collaboration-mode-templates/ - Yoda:
coding/yoda/agents/integrations/providers.md、agents/architecture/overview.md