Skip to main content
一些工具操作可能比较敏感,需要在执行前获得人工批准。深度智能体通过 LangGraph 的中断功能支持人工介入工作流。您可以使用 interrupt_on 参数配置哪些工具需要批准。当 interrupt_on 被设置时,HumanInTheLoopMiddleware 会被添加到 深度智能体栈 中。如果一个运行在工具返回结果之前被取消或中断,同一个栈中的 @[PatchToolCallsMiddleware] 会自动修复消息历史记录。 :::python ::: :::js :::

基本配置

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

决策类型

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

条件中断

默认情况下,interrupt_on 中列出的每个工具调用都会暂停以供审核。要仅暂停某些调用,请向工具的 InterruptOnConfig 添加一个 when 谓词。谓词接收一个 @[ToolCallRequest] 并返回 True 以中断或 False 以自动批准,因此您可以根据工具的参数进行控制。
条件中断需要 langchain>=1.3.3。
当 when 谓词返回 False 时,调用不会中断。当它返回 True,或当您省略 when 时,调用会像往常一样暂停。计算结果为 False 的调用永远不会被添加到中断批次中,因此审核者只看到需要决策的操作。 有关其他配置选项和示例,请参阅 LangChain 人工介入文档。 :::

处理中断

当中断被触发时,智能体会暂停执行并返回控制权。检查结果中的中断,并相应地处理它们。如果用户拒绝操作,请包含一个清晰的 message,告诉智能体工具未被执行以及下一步该做什么。 :::python
::: :::js
:::

使用流式输出处理中断

对于实时 UI,使用 .stream() 而不是 .invoke() 来在处理 HITL 中断时显示 Token 和工具调用进度。中断会作为 __interrupt__ 条目出现在 updates 流中。流完成后,收集人类决策并通过 Command(resume=...) 再次流式传输以恢复。
对于典型的 interrupt_on HITL 暂停,使用与 .invoke() 相同形状的扁平 {"decisions": [...]} 负载来恢复。当同时有多个中断待处理时(例如,并行分支),将每个中断 ID 映射到其恢复值。参见 处理多个中断。
:::python
::: :::js
:::
结合 "messages" 和 "updates" 流式模式,在捕获 HITL 中断的同时向用户显示实时 LLM Token。"messages" 模式流式传输 Token;"updates" 模式发送中断负载。

多个工具调用

当智能体调用多个需要批准的工具时,所有中断都会被批量组合在一个中断中。您必须按顺序为每个提供决策。 :::python
::: :::js
:::

拒绝消息

当审核者返回一个 reject 决策时,深度智能体会跳过工具调用并将拒绝反馈发送回智能体。如果您省略 message,默认反馈会告诉模型工具未被执行,除非用户请求,否则不要重试同一个工具调用。 对于敏感或具有副作用的工具,在决策时传递一个与领域相关的 message。明确说明智能体是否应该放弃操作、询问后续问题或尝试更安全的替代方案。 :::python
::: :::js
:::

编辑工具参数

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

子智能体中断

在使用子智能体时,您可以在工具调用 上 和 内 中使用中断。

工具调用上的中断

每个子智能体都可以有自己的 interrupt_on 配置,该配置会覆盖主智能体的设置: :::python
::: :::js
::: 当子智能体触发中断时,处理方式相同——检查结果中的 __interrupt__ 并使用 Command 恢复。 当流式传输时,子智能体中断也会作为 __interrupt__ 条目出现在父 updates 流中。您不需要 subgraphs=True 来传递中断。如果您还想流式传输子智能体 Token 和进度事件,请启用 subgraphs=True。参见 使用流式输出处理中断 以获取完整模式。

工具调用内的中断

子智能体工具可以直接调用 interrupt() 来暂停执行并等待批准: :::python
运行时会产生以下输出:
::: :::js
运行时会产生以下输出:
::: :::python

文件系统权限中断

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

最佳实践

始终使用检查点器

人工介入需要检查点器来在中断和恢复之间持久化智能体状态:

使用相同的线程 ID

恢复时,你必须使用相同配置且具有相同 thread_id:

决策顺序与操作匹配

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

根据风险调整配置

根据工具的风险级别配置不同的工具:
:::
官方原文:src/oss/deepagents/human-in-the-loop.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026