s09
Agent 团队
协作Teammates + Mailboxes
278 LOC9 个工具TypeScriptTeammateManager + file-based mailbox
When one agent can't finish, delegate to persistent teammates via async mailboxes
s01 > s02 > s03 > s04 > s05 > s06 | s07 > s08 > [ s09 ] s10 > s11 > s12
"任务太大一个人干不完, 要能分给队友" -- 持久化队友 + JSONL 邮箱。
Harness 层: 团队邮箱 -- 多个模型, 通过文件协调。
问题
子智能体 (s04) 是一次性的: 生成、干活、返回摘要、消亡。没有身份, 没有跨调用的记忆。后台任务 (s08) 能跑 shell 命令, 但做不了 LLM 引导的决策。
真正的团队协作需要三样东西: (1) 能跨多轮对话存活的持久智能体, (2) 身份和生命周期管理, (3) 智能体之间的通信通道。
解决方案
Teammate lifecycle:
spawn -> WORKING -> IDLE -> WORKING -> ... -> SHUTDOWN
Communication:
.team/
config.json <- team roster + statuses
inbox/
alice.jsonl <- append-only, drain-on-read
bob.jsonl
lead.jsonl
+--------+ send("alice","bob","...") +--------+
| alice | -----------------------------> | bob |
| loop | bob.jsonl << {json_line} | loop |
+--------+ +--------+
^ |
| BUS.read_inbox("alice") |
+---- alice.jsonl -> read + drain ---------+
工作原理
- TeammateManager 通过 config.json 维护团队名册。
class TeammateManager {
private configPath = resolve(teamDir, "config.json");
private config: TeamConfig = this.loadConfig();
}
spawn()创建队友并在线程中启动 agent loop。
spawn(name: string, role: string, prompt: string) {
this.config.members.push({ name, role, status: "working" });
this.saveConfig();
void this.teammateLoop(name, role, prompt);
return `Spawned '${name}' (role: ${role})`;
}
- MessageBus: append-only 的 JSONL 收件箱。
send()追加一行;read_inbox()读取全部并清空。
class MessageBus {
send(sender: string, to: string, content: string) {
appendFileSync(resolve(this.inboxDir, `${to}.jsonl`), `${JSON.stringify({ from: sender, content })}\n`);
}
readInbox(name: string) {
const lines = readFileSync(resolve(this.inboxDir, `${name}.jsonl`), "utf8").split(/\r?\n/).filter(Boolean);
writeFileSync(resolve(this.inboxDir, `${name}.jsonl`), "", "utf8");
return lines.map((line) => JSON.parse(line));
}
}
- 每个队友在每次 LLM 调用前检查收件箱, 将消息注入上下文。
for (const message of BUS.readInbox(name)) {
messages.push({ role: "user", content: JSON.stringify(message) });
}
const response = await client.messages.create(...);
相对 s08 的变更
| 组件 | 之前 (s08) | 之后 (s09) |
|---|---|---|
| Tools | 6 | 9 (+spawn/send/read_inbox) |
| 智能体数量 | 单一 | 领导 + N 个队友 |
| 持久化 | 无 | config.json + JSONL 收件箱 |
| 线程 | 后台命令 | 每线程完整 agent loop |
| 生命周期 | 一次性 | idle -> working -> idle |
| 通信 | 无 | message + broadcast |
试一试
cd learn-claude-code
cd agents-ts
npm install
npm run s09
试试这些 prompt:
Spawn alice (coder) and bob (tester). Have alice send bob a message.Broadcast "status update: phase 1 complete" to all teammatesCheck the lead inbox for any messages- 输入
/team查看团队名册和状态 - 输入
/inbox手动检查领导的收件箱