waiting_for_human,并带有继续运行所需的全部信息。保存整个结果,在你的应用中收集决定,然后把保存的结果和决定传给智能体的继续方法。
Phaseo 不保存 Agent SDK 运行。如果可恢复的状态必须在请求或进程重启后保留下来,请把它保存在你自己的应用中。
批准或拒绝工具调用
需要审批的工具、手动工具和人在回路工具会在执行前暂停运行。每个待处理调用都包含模型的call(带有它的 id)和一个 kind:approval、manual 或 hitl。请按精确的调用 ID 而不是工具名称回应每个调用,这样对同一工具的两次调用就能区分开。
被批准的调用会运行它的工具。被拒绝的调用会把 {"error": "<reason>"} 作为工具结果发给模型,默认原因是 Tool call rejected。
暂停本身也有一个
kind。Go 和 C# 对每个工具暂停都把它设为 tool_approval。PHP、Ruby 和 Java 在任一待处理调用需要审批时设为 tool_approval,否则使用第一个调用的类型。Rust 对审批调用使用 tool_approval,在所有待处理调用都需要外部结果时使用 external_output,两者混合时使用 tool_input。
如果要求每个工具调用都需要审批,而不是逐个工具设置,就在智能体定义上设置 requireApproval(Python 和 Ruby 中为 require_approval,Go 和 C# 中为 RequireApproval)。在 TypeScript 中它是一个函数 requireApproval(call, context)。Rust 只支持按工具审批,使用 Tool::require_approval()。工具展示了如何定义每种工具。
为手动工具和人在回路工具提供结果
对于manual 和 hitl 调用,按调用 ID 传入你的应用产生的结果。在 Rust 中,这类工具是用 Tool::external(...) 构建的。
Missing output for tool call <id> 失败(Go 中为小写的 missing,Python 中为 ValueError,Rust 中为 AgentError)。人工输入的消息不能代替工具输出。
暂停以进行人工审核
在智能体定义上设置一个人工审核回调,在运行继续之前检查每个模型响应。返回一个带reason(以及可选的 payload)的审核请求即可暂停,不返回任何内容则继续。暂停的 kind 是 human_review。回调会收到运行 ID、步骤索引、消息、模型响应和解析后的输出(Rust:运行 ID 和智能体 ID、步骤索引、消息、响应和应用上下文)。
Run <id> is waiting for human input 失败(Go:run <id> is waiting for human input;Java:Run is waiting for human input)。Rust 要求 human_input 非空。TypeScript 还接受结构化的 humanMessages。
在请求之间保存运行状态
运行结果是普通数据:把它存入你的数据库、对象存储或任务记录,并保持应用context 可序列化。只有 ID 相同的智能体才能继续一个运行。持久智能体循环示例方案展示了完整的保存与恢复流程。
如果要让 SDK 替你保存和加载运行,就传入一个带有 load(runId) 和 save(result) 的状态访问器。之后 SDK 会在每次运行和继续之后保存,你也可以按运行 ID 继续,而不必在每一层之间传递记录。
AgentDefinition 不属于序列化后的运行。实际使用的模型和步数上限保存在 RunRecord 中,所以按运行设置的覆盖在继续之后仍然有效。
无论你存储什么,都由你的应用负责已保存运行的加密和保留期限、审批和人工输入的授权,以及恢复后会再次执行的副作用的幂等性。