Coordinator 模式:AI 军团的指挥官
当一个任务变得过于复杂(例如重构整个模块并同步更新所有测试),单个 Claude 实例可能会由于上下文过载或逻辑混乱而力不从心。这时,Claude Code 会切换到 Coordinator(协调员)模式,开启“AI 军团”模式。
从定义开始
Coordinator 模式是一种角色分离的编排架构。在这种模式下,主 Claude 实例不再亲自动手写代码或运行命令,而是化身为“经理(Coordinator)”,专门负责任务拆解和成果验收。它会创建多个“工人(Worker)”子 agent 来执行具体的繁琐任务。
实现细节
整个机制建立在 src/coordinator/coordinatorMode.ts 的逻辑之上:
身份切换与工具隔离: 一旦开启
CLAUDE_CODE_COORDINATOR_MODE,系统会根据角色(Coordinator 或 Worker)严格限制可调用的工具集。- Coordinator:拥有
agent(用于创建工人),send_message(用于指挥工人),task_stop(用于终止任务) 等管理类工具。它不再拥有bash或file_edit权限。 - Worker:由
agent工具生成,subagent_type设为worker。它们拥有执行权(bash,file_edit,file_read),但不能再创建自己的子 agent。
- Coordinator:拥有
异步通信协议: Coordinator 和 Worker 之间不通过实时聊天,而是通过特定的 XML 格式进行异步通信。当 Worker 完成任务时,系统会生成一个
<task-notification>块发送回 Coordinator,包含:<task-id>:哪个工人在汇报?<status>:成功还是失败?<result>:具体干了什么?(例如:改了哪些文件,测试通过了吗?)
特性门控与 Swarms (
src/utils/agentSwarmsEnabled.ts):- 对于外部用户,这属于实验性功能(Agent Swarms)。你需要带上
--agent-teams启动参数,或者设置CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1。 - 系统还设置了一个名为
tengu_amber_flint的 GrowthBook 开关作为“熔断器”,Anthropic 可以远程禁用此功能。
- 对于外部用户,这属于实验性功能(Agent Swarms)。你需要带上
实战注意事项
- 信息隔离:Worker 默认看不到主对话的全部历史,它们只拥有 Coordinator 在
agent工具调用中提供的prompt。如果 Coordinator 没把关键的文件路径或错误信息传过去,Worker 就会“抓瞎”。 - 状态同步:Coordinator 模式下的主实例会变得非常“高冷”,它只会说:“我去分工了”,然后等待异步回调。如果你在它等待时不停问它进度,它可能只能告诉你“仍在等待工人 a1b 汇报”。
相关主题
去阅读 src/tools/AgentTool/ 的代码。你会发现 Agent 工具是如何利用 subagent_type 来区分“简单调研任务”和“生产力工人”的。这才是整个集群化执行的发动机。
源码锚点
src/coordinator/coordinatorMode.ts(模式切换逻辑)
📄 src/coordinator/coordinatorMode.ts
typescript
function isScratchpadGateEnabled(): boolean {
return checkStatsigFeatureGate_CACHED_MAY_BE_STALE('tengu_scratch')
}src/utils/agentSwarmsEnabled.ts(功能开关与门控)
📄 src/utils/agentSwarmsEnabled.ts
typescript
function isAgentTeamsFlagSet(): boolean {
return process.argv.includes('--agent-teams')
}src/tools/AgentTool/constants.ts(AGENT_TOOL_NAME 定义)
📄 src/tools/AgentTool/constants.ts
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',
])