审批双向流(approval flow) 协议
别名:
审批双向流 · 双向流
审批事件的下行(`approval_request` 推给前端)与上行(`POST /approvals` 回传决定)合起来的完整闭环,再以 `approval_result` + `tool_result` 下行收尾。`requestId` 把请求与回答配对;拒绝则 `tool_result` 带 `denied` 标记、跳过执行,callId 配对不变式保持。
它是什么
审批双向流(approval flow)把审批的下行(approval_request 经事件流推给前端)与上行(POST /approvals 回传决定)合起来,构成完整闭环,再以 approval_result + tool_result 下行收尾。完整事件序列是:tool_call_start(循环决定要调用)→ approval_request(暂停,等人)→ 人类经 POST /approvals 回传 → approval_result(审计事件)→ tool_result(执行结果或 denied 标记)。
配对不变式
requestId 把请求与回答配对(实现用 req_<callId>),callId 配对不变式保持——每个 tool_call_start 恰好对应一个 tool_result。拒绝则 tool_result 带 ok:false, denied:true、跳过执行,工具从未运行。注意 suggest 档的 approval_request 是提示但不阻断:不等待、不问人,只是给前端一个展示「接下来会写文件」的机会。
为什么是双向的
事件流是单向的(服务器 → 客户端),人的决定必须另开一条上行通道。服务端是两半之间的桥:POST /approvals 回传结果(未知/已解决的 requestId 返回 404),GET /approvals 提供审计副本。暂停期间 SSE 连接不能断——ch15 的 keep-alive 注释行在这里才显出价值。审批挂起状态(挂起表)是界面层状态:loop 无状态,删掉 server,core 照常可测。
坑
按工具名批准而不是按调用批准:批了 delete_file(scratch.txt) 不等于批了 delete_file(important.txt)——requestId 精确到每一次调用;「这次会话里这个工具都放行」是显式策略(如「记住本次选择」),不是默认行为。相关词条:人在回路、风险分级。