两个 agent 之间的握手协议
Agent 之间也要"打合同"。request_id 是合同号。
为什么要协议?
s09 里 send_message 就能传任何内容。但两个 agent 要关于某件事达成共识(比如 "我要关机了,可以吗?")时,光发字符串不够——你需要:
- 请求有明确身份(request_id),这样响应能对号入座。
- 状态机:pending → approved | rejected,每个状态的后果清晰。
- 一致的字段:双方都知道
approve: true意味着什么。
这就是 shutdown_request / shutdown_response / plan_approval / plan_approval_response 存在的原因。
Shutdown 协议全流程
lead 想让 alice 下班:
lead: # 发 shutdown_request,服务端记 request_id req_id = uuid4()[:8] shutdown_requests[req_id] = {"target": "alice", "status": "pending"} send("alice", "shutdown_request", extra={"request_id": req_id}) alice: # 下轮 loop 读邮箱,看到 shutdown_request # 决定:做完手头的活再回,approve 一下 tool_use("shutdown_response", request_id=req_id, approve=True) lead: # 收到 shutdown_response,更新 tracker 到 approved shutdown_requests[req_id]["status"] = "approved" # alice 线程自己检测到 shutdown 接受,设 status=shutdown 退出循环
Shutdown FSM 可视化
看状态机走每一步。alice 还可以 reject——说「我在做关键工作,现在不能停」。
Plan Approval · 同样的模式,不同的域
teammate 在开大动作前提交 plan 请 lead 审批:
alice: tool_use("plan_approval", plan="我打算把 auth 模块全部用 jwt 重写") # alice 继续 idle 等 lead lead: # 看到 alice 的 plan_approval_response 请求 tool_use("plan_approval", request_id="...", approve=False, feedback="先别动 auth,我们下月要做整体 refactor")
看 s10 源码会发现:两个协议用的是完全相同的 request_id 追踪模式——只是换了字典名(shutdown_requests vs plan_requests)。这就是「一个模式,两个域」。
为什么不抽象出一个通用 Protocol 基类?s10 刻意不抽象。原因:现在只有两个协议,抽象的收益还不明显;显式写两份每个都能独立理解。等有了第四、第五个协议再提炼也不迟(rule of three)。