LEARN CLAUDE CODE

S09: Agent Teams — 持久化团队

问题:Subagent 是一次性的

S06 引入的 Subagent(通过 AgentTool)可以让模型启动一个子模型来做特定任务。但 Subagent 有一个根本限制——它是临时的。调用完成后,子代理就消失了,没有任何跨调用的记忆。如果你需要一个"前端专家"反复处理 UI 任务,每次都得从零开始解释它的角色。

Subagent 模型(S06): 主代理 ──► 创建子代理 ──► 子代理执行 ──► 返回结果 ──► 子代理销毁 ↑ 主代理 ──► 创建子代理 ──► 子代理执行 ──► 返回结果 ──► 子代理销毁 ↑ 每次都是全新的子代理 没有记忆传承 每次都要重新注入角色 没有上下文积累

解法:TeammateManager + MessageBus

从"一次性子代理"升级到"持久化团队成员"。核心有两个组件:

// .messages/agent-frontend.jsonl — 前端代理的收件箱
{"type":"message", "from":"lead", "content":"请实现登录页面的 UI", "ts":"2025-01-15T10:00:00Z"}
{"type":"message", "from":"agent-backend", "content":"API 端点已就绪: POST /auth/login", "ts":"2025-01-15T10:05:00Z"}
{"type":"broadcast", "from":"lead", "content":"提交前跑一次 lint", "ts":"2025-01-15T10:10:00Z"}

5 种消息类型

类型方向用途
message 点对点 普通通信——分配任务、汇报进度、请求信息
broadcast 一对多 Lead 向所有队友广播指令(例如"全员停止,需求变了")
shutdown_request Lead → Teammate 请求队友优雅关闭——完成手头任务后退出
shutdown_response Teammate → Lead 队友确认关闭,返回最终状态汇报
plan_approval_response Lead → Teammate Lead 审批队友提交的执行计划(approved/rejected)

Teammate 生命周期

Teammate 生命周期状态机: ┌──────────────────────────────────────────┐ │ │ ▼ │ ┌─────────┐ 收到消息 ┌─────────┐ 任务完成 ┌─────────┐ │ │ spawn │ ────────► │ working │ ────────► │ idle │─┘ └─────────┘ └─────────┘ └────┬────┘ ▲ │ │ 收到新消息 │ └────────────────────┘ │ 收到 shutdown_request │ ▼ ┌──────────┐ │ shutdown │ └──────────┘ 关键状态转换: spawn → 创建进程,注入身份和系统提示词 working → 正在执行任务,有独立上下文 idle → 任务完成,等待新消息(这是 S11 的扩展点) shutdown → 优雅退出,提交最终汇报

对比:Subagent vs Teammate

维度Subagent(S06)Teammate(S09)
生命周期单次调用持久存在,跨多次任务
记忆调用结束即丢失独立上下文窗口,持续积累
通信方式调用参数 → 返回值JSONL 消息收件箱
身份每次重新注入创建时固定,压缩后重注入
并行串行调用多 Teammate 并行工作
关闭自动(返回即销毁)需要 shutdown 协议

对应官方工具

TeamCreateTool + SendMessageTool

TeamCreateTool 创建一个持久化的团队成员,指定其身份(名称、角色描述、系统提示词)。SendMessageTool 向指定队友发送消息。官方实现中,消息总线和收件箱是内建的,不需要手动管理 JSONL 文件。

关键洞察:从 Subagent 到 Teammate 的升级,本质是把"函数调用"变成了"进程间通信"。Subagent 是同步的请求-响应,Teammate 是异步的消息传递。这让多个代理可以真正并行工作,而不是排队等主代理分配。