LEARN CLAUDE CODE
S09: Agent Teams — 持久化团队
问题:Subagent 是一次性的
S06 引入的 Subagent(通过 AgentTool)可以让模型启动一个子模型来做特定任务。但 Subagent 有一个根本限制——它是临时的。调用完成后,子代理就消失了,没有任何跨调用的记忆。如果你需要一个"前端专家"反复处理 UI 任务,每次都得从零开始解释它的角色。
Subagent 模型(S06):
主代理 ──► 创建子代理 ──► 子代理执行 ──► 返回结果 ──► 子代理销毁
↑
主代理 ──► 创建子代理 ──► 子代理执行 ──► 返回结果 ──► 子代理销毁
↑
每次都是全新的子代理 没有记忆传承
每次都要重新注入角色 没有上下文积累
解法:TeammateManager + MessageBus
从"一次性子代理"升级到"持久化团队成员"。核心有两个组件:
- TeammateManager:管理团队成员的生命周期——创建、查询、关闭。每个 Teammate 有自己的身份、系统提示词和独立的上下文窗口。
- MessageBus:基于 JSONL 文件的收件箱系统。每个 Teammate 有自己的收件箱文件(
.messages/{teammate-id}.jsonl),消息按行追加。
// .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 是异步的消息传递。这让多个代理可以真正并行工作,而不是排队等主代理分配。