多 Agent 编排

Coordinator

Coordinator 模式把主 Claude 降级为「编排者」:主线程不再直接读写文件或跑命令, 而是把任务拆解后派发给多个异步 worker 子 agent 并行执行,收到结果后综合再派发,形成 研究、综合、实现、验证的流水线。

  • 自动分派
  • 多 worker
  • COORDINATOR_MODE

这是什么

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。
i
双开关设计

特性 flag 决定代码是否存在,环境变量决定是否激活。isCoordinatorMode() 同时要求两者成立,因此即使特性已编译进产物,默认也不会进入编排模式。

安装启用

  1. (推荐)会话内切换

    在交互式会话里执行 /coordinator 即可开/关。命令只在 COORDINATOR_MODE 特性编译进产物时可见。开启时会设置 QS_COORDINATOR_MODE=1,关闭时清除该变量。

    qsdashi 会话
    # 开启:主线程变为编排者
    /coordinator
    # → Coordinator mode enabled — use Agent(subagent_type: "worker") to dispatch tasks
    
    # 再次执行即关闭,回到普通模式
    /coordinator
    # → Coordinator mode disabled — back to normal mode
  2. 启动时注入环境变量

    交互切换外,也可在启动前设置环境变量直接进入。dev 模式示例(特性已默认开启):

    Terminal
    # 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
  3. 会话恢复自动对齐

    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 看不到对话

每个 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-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)。

常见问题排错

i
主线程不能读文件或跑命令

这是预期行为:编排者的工具池被过滤为 Agent / SendMessage / TaskStop。需要读文件或执行命令时派 worker,并把 文件、错误、验收标准写进 worker 的 prompt。

!
worker 还在跑但方向错了

该 worker 的 runtime task 仍为 running。用 TaskStop({ task_id }) 停止,会产生一条 killed 通知; 停止后的 worker 仍可用 SendMessage 续跑。

!
SendMessage 失败

常见原因:找不到 agentId、worker 的 sidechain .jsonl/.meta.json 缺失、或 plain text 消息漏了 summary。核对 agentId,或改为新开一个 fresh worker(一次性 async agent 已结束时,新开通常比续跑更干净)。

!
coordinator 下没有 worker

多出现在 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 来源。