中断如何工作
LangGraph 代理支持中断,这是代理将控制权交还给客户端的显式暂停点。当代理遇到中断时:- 代理停止执行并发出中断载荷
useStream钩子通过stream.interrupt呈现该中断- 您的 UI 渲染一个带有批准/拒绝/编辑选项的审核卡片
- 用户做出决定
- 您的代码使用恢复命令调用
stream.submit() - 代理从上次中断处继续执行
为 HITL 设置 useStream
定义一个与代理状态模式匹配的 TypeScript 接口,并将其作为类型参数传递给useStream,以实现对状态值的类型安全访问。在下面的示例中,请将 typeof myAgent 替换为您的接口名称:
中断载荷
当代理暂停时,stream.interrupt 包含一个具有以下结构的 HITLRequest:
决定类型
HITL 模式支持四种决定类型:批准
用户确认操作应按原样继续执行:拒绝
用户拒绝操作,并可选择提供原因:当操作被拒绝时,代理会收到拒绝原因,并可以决定如何继续。它可能会重新措辞、提出澄清问题,或完全放弃该操作。
编辑
用户在批准前修改操作的参数:回复
用户为“询问用户”风格的工具提供直接回复。message 成为工具结果,工具本身不会被执行:
当工具旨在作为人工输入的占位符时,请使用
respond——例如,一个 ask_user 工具,提示代理从用户那里收集信息。构建 ApprovalCard
这是一个处理所有四种决定类型的完整审批卡片组件:恢复流程
用户做出决定后,完整流程如下:- 调用
stream.submit(null, { command: { resume: hitlResponse } }) useStream钩子将恢复命令发送到 LangGraph 后端- 代理接收
HITLResponse并继续执行。HITL 响应可能是以下之一:"approve":代理继续执行下一个操作"reject":代理接收拒绝理由并决定下一步"edit":代理使用编辑后的参数运行工具"respond":人工的消息直接作为工具结果返回,而不执行工具
- 随着代理恢复流式传输,
interrupt属性重置为null
常见用例
处理多个待处理操作
当代理想要同时执行多个操作时,一个中断可以包含多个actionRequests。为每个操作渲染一个卡片,并在恢复前收集所有决定:
最佳实践
实施 HITL 工作流时,请牢记以下准则:- 显示清晰的上下文。始终显示代理想要做什么以及为什么。包括操作描述和完整参数。
- 使批准成为最简单的路径。如果操作看起来正确,批准应该只需一次点击。将多步骤流程保留给拒绝/编辑。
- 验证编辑后的参数。当用户编辑操作参数时,在发送前验证 JSON 结构。对格式错误的输入显示内联错误。
- 持久化中断状态。如果用户刷新页面,中断仍应可见。
useStream通过线程的检查点处理此问题。 - 记录所有决定。对于审计跟踪,记录每个批准/拒绝/编辑决定,包括时间戳和做出决定的用户。
- 谨慎设置超时。长时间运行的代理不应在人工审核上无限期阻塞。考虑显示代理已等待了多长时间。
将这些文档连接到 Claude、VSCode 等,通过 MCP 获取实时答案。

