Lesson 10 · 协作

两个 agent 之间的握手协议

Agent 之间也要"打合同"。request_id 是合同号。

⏱ 약 10 분 · 📝 3 개 인터랙티브 컴포넌트 · 🧑‍💻 기반 shareAI-lab · s10_team_protocols.py

为什么要协议?

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)。
Interactive

Widget 1 · Shutdown FSM · 走完整个状态机

点 "Next" 推进一步,看 request_id 如何在两个 agent 之间建立对应关系。

🧑‍💼 Lead
👩‍💻 Alice
shutdown_requests 状态表
{}
Interactive

Widget 2 · request_id 关联 · 别混错合同

多个请求同时在 pending——点一个响应,看哪个 request 被更新。这是协议能并发的关键。

待响应的请求
模拟的响应(点击触发)
Interactive

Widget 3 · Protocol Design · 你自己的第三个协议

给你一个新场景,应用 request_id 模式设计握手。选对才能通过。

答对 0 / 5