某些工具操作可能比较敏感,需要在执行前获得人工批准。Deep Agents 通过 LangGraph 的中断功能支持人机协作工作流。您可以使用 interrupt_on 参数来配置哪些工具需要审批。当设置了 interrupt_on 时,HumanInTheLoopMiddleware 会被添加到默认中间件栈中。如果在工具返回结果之前运行被取消或中断,同一栈中的 PatchToolCallsMiddleware 会自动修复消息历史。

基本配置

interrupt_on 参数接受一个字典,将工具名称映射到中断配置。每个工具可以配置为:
  • True:启用中断并使用默认行为(允许批准、编辑、拒绝、回复)
  • False:禁用该工具的中断
  • InterruptOnConfig:自定义配置。设置 allowed_decisions 以控制审查选项。 在 Python 中,可以添加一个可选的 when 谓词来仅中断特定调用(参见条件中断)。

决策类型

allowed_decisions 列表控制人工审查工具调用时可以采取的操作: 当人工拒绝提议的操作时使用 reject。仅当人工扮演工具角色时使用 respond,例如回答 ask_user 提示。不要使用 respond 来拒绝具有副作用的工具,因为模型可能会将其消息视为成功的工具结果。
编辑工具参数时,请保守地进行更改。对原始参数进行重大修改可能会导致模型重新评估其方法,并可能多次执行工具或采取意外操作。
您可以为每个工具自定义可用的决策:

条件中断

默认情况下,interrupt_on 中列出的每个工具调用都会暂停以进行审查。要仅暂停某些调用,请在工具的 InterruptOnConfig 中添加 when 谓词。该谓词接收一个 ToolCallRequest 并返回 True 以中断或 False 以自动批准,因此您可以根据工具的参数进行控制。
条件中断需要 langchain>=1.3.3。
当 when 谓词返回 False 时,调用将运行而不中断。当它返回 True 时,或者当您省略 when 时,调用将照常暂停。计算结果为 False 的调用永远不会被添加到中断批次中,因此审查者只会看到需要决策的操作。 更多配置选项和示例,请参见 LangChain 人机协作文档。

处理中断

当触发中断时,代理会暂停执行并返回控制权。检查结果中的中断并相应处理。如果用户拒绝某个操作,请包含一个明确的 message,告知代理该工具未执行以及下一步该怎么做。

多个工具调用

当代理调用需要批准的多个工具时,所有中断都会合并到一个中断中。您必须按顺序为每个工具提供决策。

拒绝消息

当审查者返回 reject 决策时,Deep Agents 会跳过工具调用并将拒绝反馈发送回代理。如果您省略 message,默认反馈会告知模型该工具未执行,除非用户要求,否则不要重试相同的工具调用。 对于敏感或具有副作用的工具,请在决策中传递特定领域的 message。明确说明代理是应该放弃该操作、提出后续问题还是尝试更安全的替代方案。

编辑工具参数

当 "edit" 在允许的决策中时,您可以在执行前修改工具参数:

子代理中断

使用子代理时,您可以在工具调用时和工具调用内部使用中断。

工具调用时的中断

每个子代理可以拥有自己的 interrupt_on 配置,以覆盖主代理的设置:
当子代理触发中断时,处理方式相同——检查结果中的 interrupts 并使用 Command 恢复。

工具调用内部的中断

子代理工具可以直接调用 interrupt() 来暂停执行并等待批准:
运行时,会产生以下输出:

文件系统权限中断

文件系统权限中断需要 deepagents>=0.6.8。
除了 interrupt_on,您还可以通过将权限规则标记为 mode="interrupt" 来暂停内置的文件系统工具。当代理在与中断模式规则匹配的路径上调用 write_file 或 edit_file 时,create_deep_agent 会引发与已配置工具相同的人机协作中断,并使用文件系统工具的名称作为操作名称。
处理并恢复中断的方式与工具调用中断相同:运行直到暂停,检查请求,然后使用决策恢复。
文件系统权限中断会与您传递的任何 interrupt_on 合并,因此单个审查步骤可以同时覆盖自定义工具和受保护的文件系统路径。

最佳实践

始终使用检查点

人机协作需要一个检查点来在中断和恢复之间持久化代理状态:

使用相同的线程 ID

恢复时,您必须使用带有相同 thread_id 的相同配置:

匹配决策顺序与操作

决策列表必须与 action_requests 的顺序匹配:

根据风险定制配置

根据工具的风险级别进行不同的配置: