LEARN CLAUDE CODE

S10: Team Protocols — request-response 协议

问题:缺少结构化握手

S09 的 MessageBus 可以传递任意消息,但某些关键操作需要结构化的请求-响应模式。两个典型场景:

没有协议时的混乱: Lead: "请关闭" Teammate: (正在写文件,没看到消息) Lead: (等了10秒) "关了没?" Teammate: "还没,我在写文件" Lead: "好的等你" Teammate: "好了,可以关了" Lead: "那关吧" ── 纯文本通信,没有状态追踪,容易出错 ── 有协议时的精确: Lead → shutdown_request(id=req-001) Teammate: 完成当前操作 Teammate → shutdown_response(correlation_id=req-001, status=done) Lead: 确认关闭,清理资源

解法:Correlation ID + FSM

两个协议(关机和计划审批)使用完全相同的模式:

  1. 请求方发送一条带有唯一 correlation_id 的请求消息
  2. 请求方在本地创建一个有限状态机(FSM),初始状态为 pending
  3. 响应方收到请求后处理,发回带有相同 correlation_id 的响应
  4. 请求方根据响应内容将 FSM 转换为 approvedrejecteddone
Correlation ID + FSM 模式: Lead (请求方) Teammate (响应方) │ │ │ shutdown_request │ │ { correlation_id: "req-001" } │ │ ──────────────────────────────────► │ │ │ FSM: pending 收到请求 │ 完成手头工作 │ │ │ shutdown_response │ │ { correlation_id: "req-001", │ │ status: "done" } │ │ ◄────────────────────────────────── │ │ │ FSM: pending → done 进程退出 │ 确认关闭,清理资源 ┌─────────┐ 收到响应(approved) ┌──────────┐ │ pending │ ────────────────────► │ approved │ └─────────┘ └──────────┘ │ 收到响应(rejected) ┌──────────┐ └──────────────────────────► │ rejected │ └──────────┘

两个协议的统一模式

维度关机协议计划审批协议
请求消息类型shutdown_requestplan_approval_request
响应消息类型shutdown_responseplan_approval_response
请求方LeadTeammate
响应方TeammateLead
FSM 终态doneapproved / rejected
超时处理强制终止默认拒绝
关键保证队友有机会完成手头任务危险操作必须 Lead 审批

对比:无协议 vs 有协议

维度纯文本消息(S09)结构化协议(S10)
关联性没有——不知道回复对应哪个请求correlation_id 精确关联
状态追踪靠 LLM 记忆FSM 确定性追踪
超时无法检测FSM 可设置超时自动转态
可靠性依赖 LLM 正确解析自然语言结构化 JSON,机器可解析

对应官方工具

SendMessageTool 的结构化消息类型

官方 SendMessageTool 不仅支持普通文本消息,还内置了结构化消息类型。shutdown_requestshutdown_responseplan_approval_response 等都是 SendMessageTool 的消息类型参数。协议逻辑(correlation ID 匹配、状态转换)由框架自动处理。

关键洞察:Correlation ID + FSM 是分布式系统的经典模式——和微服务里的 Saga 模式、数据库的两阶段提交本质相同。在 AI 代理系统中引入这个模式,意味着多代理协作不再依赖 LLM 的"理解能力",而是靠确定性的状态机保证正确性。