这是什么
Coordinator 模式改变主 Claude 的角色。开启后,主线程(编排者)只能使用
Agent、SendMessage、TaskStop
三个工具派发和控制工作,不直接触碰文件;真正干活的是被派出的
worker 子 agent。这种「主线程只编排、worker 只执行」的分离,让一个主脑可以
并发调度多个任务,并在实现与验证之间切换视角。
核心约束:
-
编排者工具池受限:仅
Agent(派发 worker)、SendMessage(继续已有 worker)、TaskStop(停止 worker), 外加结构化输出工具与(若可用)PR 活动订阅类 MCP 工具。 -
worker 用完整工具集:标准工具(Bash、Read、Edit 等)+ 已连接 MCP 工具 +
Skill 工具;但排除
TeamCreate、TeamDelete、SendMessage、SyntheticOutput,因此 worker 不能再嵌套编排。 - worker 看不到你的对话:每个 worker 的 prompt 必须自包含,包含文件路径、行号、 错误信息与验收标准。
-
结果以通知回流:worker 完成后以
<task-notification>(user-role 消息,但不是用户输入)回到下一轮,编排者据此继续派发。
与 Workflow(确定性脚本编排)和多实例群控(跨进程 Pipe IPC)不同,Coordinator 是单进程内的星型编排:编排者居中,worker 是它派出的异步本地子 agent,不涉及 团队邮箱、共享任务白板或跨机器通信。
前置条件
| 条件 | 说明 |
|---|---|
特性 COORDINATOR_MODE |
控制代码可用性。已包含在 DEFAULT_BUILD_FEATURES,dev 与 build
默认编译进产物。
|
环境变量 QS_COORDINATOR_MODE |
控制当前进程是否实际进入 coordinator。/coordinator 命令会自动
设置或清除它。
|
内置 worker agent |
编排者派发用的 subagent_type: "worker" 由内置 agent 提供。非交互
(headless)环境若禁用了内置 agent,则 coordinator 下没有 worker。
|
特性 flag 决定代码是否存在,环境变量决定是否激活。isCoordinatorMode()
同时要求两者成立,因此即使特性已编译进产物,默认也不会进入编排模式。
安装启用
-
(推荐)会话内切换
在交互式会话里执行
/coordinator即可开/关。命令只在COORDINATOR_MODE特性编译进产物时可见。开启时会设置QS_COORDINATOR_MODE=1,关闭时清除该变量。# 开启:主线程变为编排者 /coordinator # → Coordinator mode enabled — use Agent(subagent_type: "worker") to dispatch tasks # 再次执行即关闭,回到普通模式 /coordinator # → Coordinator mode disabled — back to normal mode -
启动时注入环境变量
交互切换外,也可在启动前设置环境变量直接进入。dev 模式示例(特性已默认开启):
# dev 模式(如需显式声明特性) FEATURE_COORDINATOR_MODE=1 QS_COORDINATOR_MODE=1 bun run dev # Simple 模式:worker 工具面降到 Bash / Read / Edit FEATURE_COORDINATOR_MODE=1 QS_COORDINATOR_MODE=1 \ QS_SIMPLE=1 bun run dev -
会话恢复自动对齐
coordinator 是会话属性,写入主 session JSONL 的
mode元数据。恢复旧会话时matchSessionMode()会按存储的模式自动设置或清除QS_COORDINATOR_MODE,避免在普通环境恢复编排会话(或反之)。
配置
Coordinator 通过环境变量与 feature flag 配置,不写入 settings.json。
| 变量 | 作用 |
|---|---|
FEATURE_COORDINATOR_MODE |
编译 coordinator 代码路径(已在 DEFAULT_BUILD_FEATURES 默认开启) |
QS_COORDINATOR_MODE |
为真时当前进程进入编排模式;/coordinator 会设置/清除它 |
QS_SIMPLE |
Worker 工具面收窄为 Bash、Read、Edit,适合简单执行路径 |
CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS |
非交互环境禁用内置 agent 时,coordinator 下将没有 worker |
模式持久化与恢复相关的位置:
| 位置 | 内容 |
|---|---|
主 session JSONL 的 mode entry |
{"type":"mode","mode":"coordinator"},由 saveMode() 写入 |
worker 的 sidechain + .meta.json |
worker 身份与历史,用于 SendMessage 续跑 |
常用命令与参数
斜杠命令:
| 命令 | 行为 |
|---|---|
/coordinator |
开/关 coordinator 模式;切换后持久化 mode 并刷新 agent 定义 |
编排者可用工具(由模型调用,非人类斜杠命令):
| 工具 | 调用方 | 作用 |
|---|---|---|
Agent |
编排者 | 派发新 worker,使用 subagent_type: "worker";coordinator 下强制异步 |
SendMessage |
编排者 | 继续已存在的 worker(to 传 agentId),复用其已加载的上下文 |
TaskStop |
编排者 | 停止跑错方向的 worker(task_id 取自 Agent 的启动结果) |
| 标准工具 / MCP / Skill | worker | Bash、Read、Edit 等 + 已连接 MCP 工具 + Skill 工具 |
每个 worker 的 prompt 必须自包含。系统提示明确禁止
"based on your findings" 这类懒惰委托——编排者必须先理解 worker
的发现,再写出含具体文件路径、行号、修改内容的指令。
实战示例
并行研究,再综合派发实现(编排者视角):
# 1. 并行派发两个只读研究 worker(同一消息内多次调用即并行)
Agent({ description: "调查 auth bug",
subagent_type: "worker",
prompt: "在 src/auth/ 定位会话/令牌校验附近的空指针风险,报告文件、行号、类型。不要改文件。" })
Agent({ description: "研究 auth 测试",
subagent_type: "worker",
prompt: "列出 src/auth/ 相关测试文件与覆盖缺口,报告结构。不要改文件。" })
# 2. worker 完成后收到 <task-notification>,编排者综合发现
# 再写出含具体位置的实现指令(继续同一 worker 以复用其上下文)
SendMessage({ to: "agent-a1b",
message: "修复 src/auth/validate.ts:42 的空指针:user.id 前加空检查,为 null 时返回 401。提交并报告 hash。" })
# 3. 方向错误时先停后纠
TaskStop({ task_id: "agent-x7q" })
SendMessage({ to: "agent-x7q",
message: "停止 JWT 重构,改为只修复 validate.ts:42 的空指针。" })
worker 结果通知格式(回到下一轮的 user-role 消息):
<task-notification>
<task-id>agent-a1b</task-id>
<status>completed|failed|killed</status>
<summary>Agent "调查 auth bug" completed</summary>
<result>Found null pointer in src/auth/validate.ts:42...</result>
<usage>
<total_tokens>N</total_tokens>
<tool_uses>N</tool_uses>
<duration_ms>N</duration_ms>
</usage>
</task-notification>
编排者的典型流水线是:Research(worker 并行)→ Synthesis(编排者综合)→ Implementation(worker)→ Verification(worker)。
常见问题排错
这是预期行为:编排者的工具池被过滤为
Agent / SendMessage / TaskStop。需要读文件或执行命令时派 worker,并把
文件、错误、验收标准写进 worker 的 prompt。
该 worker 的 runtime task 仍为 running。用
TaskStop({ task_id }) 停止,会产生一条 killed 通知;
停止后的 worker 仍可用 SendMessage 续跑。
常见原因:找不到 agentId、worker 的 sidechain .jsonl/.meta.json
缺失、或 plain text 消息漏了 summary。核对 agentId,或改为新开一个 fresh
worker(一次性 async agent 已结束时,新开通常比续跑更干净)。
多出现在 non-interactive(headless)环境:内置 agent 被禁用时不会提供
worker。检查 CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS。
--agent 混用
--agent 指定的 main-thread agent prompt 优先级高于 coordinator prompt,
可能出现「工具池已按 coordinator 过滤,但 system prompt 不是 coordinator」的不一致。
需混用时先确认当前 system prompt 来源。