人审(HITL)与 RunState 序列化
这一章讲一个很实用的特性:危险工具(删库、转账)执行前先暂停、等人点「同意/拒绝」。难点不在「暂停」,在于暂停可能跨进程——用户可能 10 分钟后才在另一台服务器 上点同意。所以这章其实讲两件事:怎么暂停,怎么把暂停状态完整存盘再恢复。
1. 它要解决的小问题
模型说「我要调 deleteDatabase()」。你不想让它直接执行,而是:把这个请求晾起来,问人类「批不批?」。人批了才执行,没批就把「被拒绝」当工具结果回喂模型。
2. 思路/直觉
三步:
- 标记:工具配
needsApproval,执行前检查——没批过就不执行,而是产出一个RunToolApprovalItem。 - 暂停:这一拍的下一步变成
next_step_interruption,主循环直接return RunResult(带interruptions列表)。 - 恢复:调用方拿到结果,对每个待审项调
state.approve(item)或state.reject(item),然后 把同一个state再传回run()。引擎从中断处接着跑。
跨进程时,第 3 步前后多两步:state.toString() 存库、取出后 RunState.fromString() 还原。