Skip to content
源码分析手册

Coordinator 模式:AI 军团的指挥官

当一个任务变得过于复杂(例如重构整个模块并同步更新所有测试),单个 Claude 实例可能会由于上下文过载或逻辑混乱而力不从心。这时,Claude Code 会切换到 Coordinator(协调员)模式,开启“AI 军团”模式。

从定义开始

Coordinator 模式是一种角色分离的编排架构。在这种模式下,主 Claude 实例不再亲自动手写代码或运行命令,而是化身为“经理(Coordinator)”,专门负责任务拆解和成果验收。它会创建多个“工人(Worker)”子 agent 来执行具体的繁琐任务。

实现细节

整个机制建立在 src/coordinator/coordinatorMode.ts 的逻辑之上:

  1. 身份切换与工具隔离: 一旦开启 CLAUDE_CODE_COORDINATOR_MODE,系统会根据角色(Coordinator 或 Worker)严格限制可调用的工具集。

    • Coordinator:拥有 agent (用于创建工人), send_message (用于指挥工人), task_stop (用于终止任务) 等管理类工具。它不再拥有 bashfile_edit 权限。
    • Worker:由 agent 工具生成,subagent_type 设为 worker。它们拥有执行权(bash, file_edit, file_read),但不能再创建自己的子 agent。
  2. 异步通信协议: Coordinator 和 Worker 之间不通过实时聊天,而是通过特定的 XML 格式进行异步通信。当 Worker 完成任务时,系统会生成一个 <task-notification> 块发送回 Coordinator,包含:

    • <task-id>:哪个工人在汇报?
    • <status>:成功还是失败?
    • <result>:具体干了什么?(例如:改了哪些文件,测试通过了吗?)
  3. 特性门控与 Swarms (src/utils/agentSwarmsEnabled.ts)

    • 对于外部用户,这属于实验性功能(Agent Swarms)。你需要带上 --agent-teams 启动参数,或者设置 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
    • 系统还设置了一个名为 tengu_amber_flint 的 GrowthBook 开关作为“熔断器”,Anthropic 可以远程禁用此功能。

实战注意事项

  • 信息隔离:Worker 默认看不到主对话的全部历史,它们只拥有 Coordinator 在 agent 工具调用中提供的 prompt。如果 Coordinator 没把关键的文件路径或错误信息传过去,Worker 就会“抓瞎”。
  • 状态同步:Coordinator 模式下的主实例会变得非常“高冷”,它只会说:“我去分工了”,然后等待异步回调。如果你在它等待时不停问它进度,它可能只能告诉你“仍在等待工人 a1b 汇报”。

相关主题

去阅读 src/tools/AgentTool/ 的代码。你会发现 Agent 工具是如何利用 subagent_type 来区分“简单调研任务”和“生产力工人”的。这才是整个集群化执行的发动机。

源码锚点

  • src/coordinator/coordinatorMode.ts (模式切换逻辑)
📄 src/coordinator/coordinatorMode.tsL25-27 of 370
typescript
function isScratchpadGateEnabled(): boolean {
  return checkStatsigFeatureGate_CACHED_MAY_BE_STALE('tengu_scratch')
}
  • src/utils/agentSwarmsEnabled.ts (功能开关与门控)
📄 src/utils/agentSwarmsEnabled.tsL10-12 of 45
typescript
function isAgentTeamsFlagSet(): boolean {
  return process.argv.includes('--agent-teams')
}
  • src/tools/AgentTool/constants.ts (AGENT_TOOL_NAME 定义)
📄 src/tools/AgentTool/constants.ts13 lines
typescript
export const AGENT_TOOL_NAME = 'Agent'
// Legacy wire name for backward compat (permission rules, hooks, resumed sessions)
export const LEGACY_AGENT_TOOL_NAME = 'Task'
export const VERIFICATION_AGENT_TYPE = 'verification'

// Built-in agents that run once and return a report — the parent never
// SendMessages back to continue them. Skip the agentId/SendMessage/usage
// trailer for these to save tokens (~135 chars × 34M Explore runs/week).
export const ONE_SHOT_BUILTIN_AGENT_TYPES: ReadonlySet<string> = new Set([
  'Explore',
  'Plan',
])

基于 Claude Code v2.1.88 开源快照的深度分析