coordinator-and-swarm.mdx 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. ---
  2. title: "协调者与蜂群模式 - 多 Agent 高级编排"
  3. description: "从源码角度解析 Claude Code 多 Agent 协作:Coordinator Mode 的 System Prompt 设计、Worker 生命周期、Task 通信协议和 Swarm 蜂群的任务分配机制。"
  4. keywords: ["协调者模式", "蜂群模式", "Agent Swarm", "多 Agent 协作", "任务编排"]
  5. ---
  6. {/* 本章目标:从源码角度揭示 Coordinator Mode 和 Agent Swarms 的架构设计 */}
  7. ## 两种协作模式的架构差异
  8. | 维度 | Coordinator Mode | Agent Swarms |
  9. |------|-----------------|--------------|
  10. | **门控** | `feature('COORDINATOR_MODE')` + `CLAUDE_CODE_COORDINATOR_MODE=1` | 任务系统 V2(默认启用) |
  11. | **拓扑** | 星型:Coordinator 居中,Worker 外围 | 网状:对等 Agent 共享任务列表 |
  12. | **角色** | 明确分工:Coordinator 编排、Worker 执行 | 模糊:每个 Agent 自主认领任务 |
  13. | **通信** | `SendMessage` 定向通信 + `<task-notification>` | 任务文件系统 + 邮箱广播 |
  14. | **适用** | 需要集中决策的复杂任务 | 并行度高的独立子任务 |
  15. 两者不是互斥的——Coordinator Mode 可以在 Swarm 架构之上运行,将 Coordinator 作为特殊的 Leader Agent。
  16. ## Coordinator Mode:星型编排架构
  17. ### 激活机制
  18. ```typescript
  19. // src/coordinator/coordinatorMode.ts:36
  20. export function isCoordinatorMode(): boolean {
  21. if (feature('COORDINATOR_MODE')) {
  22. return isEnvTruthy(process.env.CLAUDE_CODE_COORDINATOR_MODE)
  23. }
  24. return false // 外部构建始终 false
  25. }
  26. ```
  27. Coordinator Mode 需要双重门控:构建时 `feature('COORDINATOR_MODE')` 和运行时环境变量。`matchSessionMode()` 在会话恢复时自动同步模式状态——如果恢复的会话是 coordinator 模式,它会翻转环境变量以确保一致性。
  28. ### Coordinator 的工具集
  29. Coordinator 被剥夺了所有"动手"工具,只保留编排能力:
  30. | 工具 | 用途 |
  31. |------|------|
  32. | **Agent** | 启动新 Worker(`subagent_type: "worker"`) |
  33. | **SendMessage** | 向已有 Worker 发送后续指令 |
  34. | **TaskStop** | 中途停止走错方向的 Worker |
  35. | **subscribe_pr_activity** | 订阅 GitHub PR 事件(review comments、CI 结果) |
  36. Coordinator **不写代码、不读文件、不执行命令**——它只做三件事:理解需求、分配任务、综合结果。
  37. ### Worker 的工具权限
  38. Worker 的可用工具由 `getCoordinatorUserContext()`(`coordinatorMode.ts:80`)动态注入到 System Prompt:
  39. ```typescript
  40. // 简化模式下:只有 Bash + Read + Edit
  41. const workerTools = isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE')
  42. ? [BASH_TOOL_NAME, FILE_READ_TOOL_NAME, FILE_EDIT_TOOL_NAME]
  43. : Array.from(ASYNC_AGENT_ALLOWED_TOOLS)
  44. .filter(name => !INTERNAL_WORKER_TOOLS.has(name))
  45. ```
  46. `INTERNAL_WORKER_TOOLS`(TeamCreate、TeamDelete、SendMessage、SyntheticOutput)被显式排除——Worker 不能嵌套创建团队或发送消息,防止不可控的递归。
  47. ### Scratchpad:跨 Worker 的共享知识库
  48. 当 `tengu_scratch` feature flag 启用时,Coordinator 拥有一个 Scratchpad 目录:
  49. ```
  50. Scratchpad 目录:
  51. - Workers 可自由读写,无需权限审批
  52. - 用于持久化的跨 Worker 知识
  53. - 结构由 Coordinator 决定(无固定格式)
  54. ```
  55. 这是一个关键的协作原语——Worker A 的研究结果可以写入 Scratchpad,Worker B 直接读取,无需通过 Coordinator 中转。
  56. ### `<task-notification>` 通信协议
  57. Worker 完成后,Coordinator 收到 XML 格式的通知:
  58. ```xml
  59. <task-notification>
  60. <task-id>agent-a1b</task-id> ← Worker 的 agentId
  61. <status>completed|failed|killed</status>
  62. <summary>Agent "Investigate auth bug" completed</summary>
  63. <result>Found null pointer in src/auth/validate.ts:42...</result>
  64. <usage>
  65. <total_tokens>N</total_tokens>
  66. <tool_uses>N</tool_uses>
  67. <duration_ms>N</duration_ms>
  68. </usage>
  69. </task-notification>
  70. ```
  71. 通知以 `user-role message` 形式送达,Coordinator 通过 `<task-notification>` 标签区分它和用户消息。`<task-id>` 用于 `SendMessage` 的 `to` 参数,实现定向续传。
  72. ### Coordinator 的核心职责:综合(Synthesis)
  73. Coordinator System Prompt(`coordinatorMode.ts:111-369`,约 260 行)明确要求 Coordinator **不能懒惰地委派理解**:
  74. ```
  75. 反模式(禁止):
  76. "Based on your findings, fix the auth bug"
  77. → 把理解的责任推给了 Worker
  78. 正确做法:
  79. "Fix the null pointer in src/auth/validate.ts:42.
  80. The user field on Session (src/auth/types.ts:15) is
  81. undefined when sessions expire but the token remains cached.
  82. Add a null check before user.id access."
  83. → Coordinator 自己理解了问题,给出精确指令
  84. ```
  85. 这是 Coordinator Mode 最核心的设计约束:Coordinator 必须先理解,再分配。
  86. ## Agent Swarms:蜂群式协作
  87. Swarm 模式基于任务系统 V2(详见[任务管理](../tools/task-management.mdx)),核心机制是**共享任务列表 + 竞争认领**:
  88. ### 团队初始化
  89. ```
  90. Leader 创建团队(TeamCreateTool)
  91. 设置 teamName → setLeaderTeamName()
  92. 所有 teammate 自动获得相同的 taskListId
  93. teammate 启动时:
  94. 1. CLAUDE_CODE_TASK_LIST_ID 环境变量(显式覆盖)
  95. 2. teammate 上下文的 teamName(共享 leader 的任务列表)
  96. 3. CLAUDE_CODE_TEAM_NAME 环境变量
  97. 4. leader 设置的 teamName
  98. 5. getSessionId()(兜底)
  99. ```
  100. 多级优先级确保了 Leader 和所有 Teammate 指向同一个任务列表,无需额外协调。
  101. ### 任务认领与竞争
  102. `claimTask()` 是 Swarm 的核心并发原语:
  103. ```
  104. Teammate A 调用 TaskList → 发现 task #3 是 pending
  105. Teammate B 同时发现 task #3 是 pending
  106. 两者同时尝试 TaskUpdate(task #3, {status: "in_progress"})
  107. 文件锁 + 高水位标记保证原子性:
  108. - 第一个写入者获得 owner 锁定
  109. - 第二个写入者收到 already_claimed 错误
  110. 获得任务的 teammate 执行工作
  111. 完成后 TaskUpdate(task #3, {status: "completed"})
  112. → 依赖此任务的其他任务自动解锁
  113. → tool_result 提示 "Call TaskList to find your next task"
  114. ```
  115. ### Teammate 的生命周期管理
  116. ```
  117. Teammate 异常退出
  118. unassignTeammateTasks()
  119. → 扫描任务列表,找到 owner === teammateName 的未完成任务
  120. → 重置为 pending + owner=undefined
  121. Leader 通过 mailbox 收到通知
  122. → 重新分配或创建新 Teammate
  123. ```
  124. ## 任务类型全景
  125. 支撑多 Agent 协作的是 7 种任务类型(`src/tasks/types.ts`):
  126. | 任务类型 | 运行位置 | 状态管理 | 适用场景 |
  127. |----------|---------|---------|---------|
  128. | **LocalAgentTask** | 本地子进程 | `LocalAgentTaskState` | 标准子 Agent 任务 |
  129. | **LocalShellTask** | 本地 shell | `LocalShellTaskState` | 后台 shell 命令 |
  130. | **InProcessTeammateTask** | 同进程内 | `InProcessTeammateTaskState` | 轻量级进程内队友 |
  131. | **RemoteAgentTask** | 远程服务器 | `RemoteAgentTaskState` | 分布式 Agent(CCR) |
  132. | **DreamTask** | 后台静默 | `DreamTaskState` | 后台自主整理记忆 |
  133. | **LocalWorkflowTask** | 本地 | `LocalWorkflowTaskState` | 工作流编排 |
  134. | **MonitorMcpTask** | 本地 | `MonitorMcpTaskState` | MCP 监控任务 |
  135. `InProcessTeammateTask` 与 `LocalAgentTask` 的关键差异:前者共享进程的内存空间和基础设施状态(如 MCP 连接池),但有独立的对话上下文和工具权限;后者是完全隔离的子进程,启动开销更大但更安全。
  136. ## Coordinator vs Swarm 的选择
  137. | 场景 | 推荐模式 | 原因 |
  138. |------|---------|------|
  139. | "重构认证系统,需要多模块协调" | Coordinator | 需要集中决策,Worker 间有依赖 |
  140. | "修复 10 个独立的 lint 警告" | Swarm | 任务独立,可完全并行 |
  141. | "研究方案 A 和方案 B,然后选一个实现" | Coordinator | 先并行研究,再集中决策 |
  142. | "在大仓库中搜索所有 TODO 并分类" | Swarm | 无依赖,各自领任务即可 |