interrupt() 函数来工作。该函数接受任何 JSON 可序列化的值并将其暴露给调用者。当您准备好继续时,您通过使用 Command 重新调用图来恢复执行,然后该值成为节点内 interrupt() 调用的返回值。
与静态断点(在学习习之前或之后暂停特定节点)不同,中断是动态的:它们可以放置在代码的任何位置,并且可以基于应用程序逻辑有条件地执行。
- 检查点保存您的位置: 检查点保存器写入确切的状态,这样您以后可以恢复,即使处于错误状态。
thread_id是您的指针: 设置config={"configurable": {"thread_id": ...}}来告诉检查点保存器加载哪个状态。- 中断有效载荷通过
chunk["interrupts"]暴露: 当使用version="v2"流式传输时,传递给interrupt()的值会出现在values流部分的interrupts字段中,这样您就知道图在等待什么。
thread_id 实际上是您的持久游标。重用它会恢复相同的检查点;使用新值会启动一个具有空状态的全新线程。
使用 interrupt 暂停
interrupt 函数暂停图执行并向调用者返回一个值。当您在节点内调用interrupt时,LangGraph 保存当前图状态并等待您恢复执行。
要使用interrupt,您需要:
- 一个检查点保存器来持久化图状态(在生产环境中使用持久检查点保存器)
- 在配置中设置线程 ID,以便运行时知道从哪个状态恢复
- 在您想要暂停的地方调用
interrupt()(有效载荷必须是 JSON 可序列化的)
interrupt时,会发生以下情况:
- 图执行在
interrupt被调用的确切位置被挂起 - 状态被保存到检查点保存器,以便以后可以恢复执行,在生产环境中,这应该是持久检查点保存器(例如由数据库支持)
- 值被返回给调用者,键为
__interrupt__;它可以是任何 JSON 可序列化的值(字符串、对象、数组等) - 图无限期等待直到您用响应恢复执行
- 当您恢复时,响应被传递回节点,成为
interrupt()调用的返回值
恢复中断
在中断暂停执行后,您可以通过使用包含恢复值的Command 再次调用图来恢复图。恢复值被传递回 interrupt 调用,允许节点使用外部输入继续执行。
- v2 (LangGraph >= 1.1)
- v1 (默认)
- 恢复时必须使用相同的线程 ID
- 传递给
Command(resume=...)的值成为interrupt调用的返回值 - 节点在恢复时从头重新启动
interrupt被调用的节点,因此interrupt()之前的任何代码都会再次运行 - 您可以传递任何 JSON 可序列化的值作为恢复值
常见模式
中断解锁的关键是暂停执行并等待外部输入的能力。这对各种用例很有用,包括:- 审批工作流:在执行关键操作(API 调用、数据库更改、金融交易)之前暂停
- 处理多个中断:恢复多个中断时将中断 ID 与恢复值配对
- 审查和编辑:让人类在继续之前审查和修改 LLM 输出或工具调用
- 中断工具调用:在执行之前暂停工具调用以审查和编辑
- 验证人工输入:在继续下一步之前暂停以验证人工输入
使用人工介入中断进行流式传输
在构建具有人工介入工作流的交互式 Agent 时,您可以同时流式传输消息块和节点更新,以在处理中断时提供实时反馈。 使用多个流模式("messages" 和 "updates")以及 subgraphs=True(如果存在子图)来:
- 实时流式传输 AI 响应
- 检测图何时遇到中断
- 无缝处理用户输入并恢复执行
-
version="v2":所有块都是具有type、ns和data键的StreamPart字典 -
chunk["type"]:按流模式("messages"、"updates"等)进行类型推断 -
chunk["ns"]:标识源图(根图为空元组,子图则填充) -
subgraphs=True:对于嵌套图中的中断检测是必需的 -
Command(resume=...):用用户提供的数据恢复图执行
处理多个中断
当并行分支同时中断时(例如,扇出到多个节点,每个节点都调用interrupt()),您可能需要在单个调用中恢复多个中断。
当用单个调用恢复多个中断时,将每个中断 ID 映射到其恢复值。
这确保每个响应在运行时与正确的中断配对。

