Skip to main content
Claude Code 里有很多看起来都叫“多 Agent”的东西:Agent 工具、fork agent、Coordinator Mode、Agent Teams / Swarm、remote agent、后台 runtime task、TaskCreate 任务白板。它们共享部分底层设施,但不是同一个抽象。 这篇文档解决的是跨机制理解问题:当你看到一个任务被“派出去”、一个 teammate 变成 idle、一个 <task-notification> 回到主线程、一个 team 目录还在但 teammate 不跑了,应该知道它属于哪套机制、状态放在哪里、通信走哪条路、哪些东西能恢复。

全局心智模型

最短心智模型是:
先把几个词压平:

系统分层

多 Agent 系统可以看成五层,每层回答一个问题: 这五层不是一一对应关系。Coordinator worker 在运行层是 LocalAgentTask,通信层靠 <task-notification>SendMessage(to: agentId);Swarm teammate 在运行层可能是 InProcessTeammateTask,通信层靠 mailbox;remote agent 在运行层是本地 RemoteAgentTask 镜像,真实执行状态来自 CCR。

什么时候用哪套机制

两个常见误判:

两种多 Agent 拓扑

Coordinator 和 Swarm 都是多 Agent,但控制权和状态模型完全不同。 Coordinator Mode 不是 Swarm 的特殊 Team Lead。它共享 AgentToolLocalAgentTaskSendMessage 等设施,但不使用 TeamCreate/TeamDelete/TaskList/TaskUpdate 作为核心团队协作机制。

Coordinator Mode 五段状态机

Coordinator Mode 的核心设计是把主 Claude 降级为编排器:主线程不直接 Read/Edit/Bash,而是拆任务、派 worker、综合结果、必要时停止或继续 worker。

1. 启用状态机

两层条件都满足才算进入 Coordinator:

2. 恢复状态机

Coordinator mode 是会话属性,写在主 session JSONL 的 mode entry 中:
resume 时会把当前环境和 transcript 中的 mode 对齐: 这避免用户在 normal 环境恢复 coordinator 会话,或反过来把普通会话误当 coordinator 运行。

3. Prompt 状态机

Coordinator prompt 不是只看 env。交互 REPL 侧大致优先级是: 风险点是 --agent 和 Coordinator 混用:可能出现工具池已经按 coordinator 过滤,但 system prompt 不是 coordinator 的不一致。 Headless 也要单独看。当前 headless 路径明确做了 coordinator 工具过滤,并注入 coordinator user context;但 system prompt 组装路径和交互 REPL 不完全相同,应把它当成需要复核的边界,而不是默认等同交互路径。

4. 工具过滤状态机

Coordinator 主线程和 worker 的工具池不同: 交互路径主要走 mergeAndFilterTools();headless 路径会在主入口直接应用 coordinator 工具过滤;worker 工具池由 AgentTool 独立组装,不继承主线程被过滤后的工具池。

5. Worker lifecycle

Coordinator 下 Agent(worker) 会被强制异步: <task-notification> 是 user-role message,但不是用户输入。Coordinator prompt 必须把它当成 worker 结果信号:
Coordinator 的关键约束是“综合而不是转发”。worker 看不到用户和 coordinator 的完整对话,所以 prompt 必须自包含:
反模式是:

Coordinator 边界与排错

Swarm 完整状态机

Swarm 的核心是团队,而不是一次 Agent 调用。TeamCreate 建 team,Agent({ name }) 加 teammate,TaskCreate/Update/List/Get 提供任务白板,SendMessage 和 mailbox 提供通信与控制。 当前实现默认启用 Agent Teams;设置 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS_DISABLED 才会关闭。

团队生命周期

关键不变量:

存储拓扑

Swarm 的核心状态在 ~/.claude/teams~/.claude/tasks

TeamCreate 到 teammate 的链路

TeamCreate 不只是写 config.json。它还会注册 session cleanup、重置 team 对应 task list、设置 leaderTeamName,并把 leader 投影到 AppState.teamContext AgentTool 遇到 team_name/current teamContext + name 时走 teammate spawn 分支,不走普通 runAgent()spawnTeammate() 会解析 team、唯一化 name、选择 backend、更新 AppState.teamContext.teammates,再追加 TeamFile.members

in-process vs pane-based teammate

AgentTool 分流决策树

AgentTool.call() 是多 Agent 入口最复杂的分叉点。同一个 Agent 工具会根据参数和上下文走不同运行时: 所以文档里不能把“Agent”写成一个单一概念:同一个工具入口下面至少有五条运行路径。

通信路径对照

多 Agent 的通信路径决定了结果是否进入当前 turn、是否持久化、能不能 resume。

SendMessage 路由

plain text SendMessage 要带 summary。structured message 不能 broadcast,也不能跨 uds/bridge/tcp session。单 session 下 teammate name 是裸 name,to 不应写成含 @ 的跨域地址。

Mailbox 协议表

Mailbox 路径是:
它有 lock、原子 rename、大小上限和压缩策略: 协议消息不只是“聊天”: 一个重要边界:mailbox attachment 只消费非结构化消息;结构化协议消息应保持 unread,交给 useInboxPoller 或 in-process runner 路由。否则权限、plan、shutdown 可能被当成普通上下文吞掉。

Task 不是 Runtime Task

TaskCreate 的 task 和 LocalAgentTask 的 task 是两套模型。 共享任务生命周期: TaskUpdate 在 Swarm 下有增强: runtime task 类型包括:

持久化与恢复矩阵

恢复能力取决于状态放在哪里。最重要的区别是:能看到状态不等于能继续运行。 调试时可以按这个顺序问:
  1. 文件还在吗?
  2. AppState 投影还在吗?
  3. runtime task 还在 running 吗?
  4. 通信通道还可用吗?
  5. sidechain / inbox / remote sidecar 是否足够恢复?

用户可见状态如何投影

UI 展示的是不同状态源的投影,不是单一真相。 pane-based team 主要通过 footer TeamStatus 和 TeamsDialog 管理:Enter 查看,k kill,s shutdown,p prune idle,Shift+Tab 切 permission mode。in-process teammate 的 transcript view 输入会进 pendingUserMessages,不是写 mailbox。

两条端到端场景

复杂 bug 用 Coordinator

这个流程没有 TeamCreate,也不依赖 shared task list。

长期并行任务用 Swarm

这个流程里 team、task list 和 mailbox 是核心。teammate 输出不会自动给 lead;需要 SendMessage 或明确的协议消息。

失败与排障矩阵

常见误区

延伸阅读

这篇文档是跨机制总览。需要深入某条链路时,优先看专题文档:

源码入口索引