LangGraph 人工审批与恢复:暂停后怎样避免重复执行
可拒绝和恢复的本地例子及上线所需的持久化、身份和防重复边界。
适用场景用 interrupt 和 Command 演示批准、拒绝与恢复,分清 thread_id、内存检查点和持久化存储;附审批记录字段清单。
用 interrupt 和 Command 演示批准、拒绝与恢复,分清 thread_id、内存检查点和持久化存储;附审批记录字段清单。
来源 · JevLog 编辑部 · 本站原创

原文封面 · LangChain
2026-10-02 新增:依据当前官方文档整理,附本站编写练习。未做真实服务调用;来源首次发布日期未确认。
背景 / 问题
Section titled “背景 / 问题”AI 建议进入工作流后,需要能停下等人确认。暂停不代表批准;审核身份、对象版本和动作权限由应用验证。恢复还可能重入节点,不能重复发消息或创建记录。
-
安装 Python 与 langgraph,下载 approval-record.json。示例只返回状态,没有外部业务动作。
-
InMemorySaver 仅适合单进程练习,服务重启恢复要另接持久化检查点。
JevLog 原创流程图,非产品截图或实测结果。
1. 固定待批对象与版本
Section titled “1. 固定待批对象与版本”展示 proposal_id、version、原始证据和拟执行动作。批准时服务端再检查版本,防止看 v1 却批准 v2。先用内部草稿这样可撤回的例子。
2. 建立暂停与拒绝例子
Section titled “2. 建立暂停与拒绝例子”第一次 invoke 暂停,第二次 Command 用相同 thread_id 恢复。只接受明确布尔 True 表示批准,其余不授予动作权限。下面演示拒绝;换新 thread_id 再练批准。
from typing import TypedDictfrom langgraph.graph import StateGraph, START, ENDfrom langgraph.checkpoint.memory import InMemorySaverfrom langgraph.types import interrupt, Command
class State(TypedDict): proposal: str status: str
def review(state: State): decision = interrupt({"proposal":state["proposal"], "question":"Approve this draft?"}) approved = isinstance(decision, dict) and decision.get("approved") is True return {"status":"approved" if approved else "rejected"}
builder = StateGraph(State)builder.add_node("review", review)builder.add_edge(START, "review")builder.add_edge("review", END)graph = builder.compile(checkpointer=InMemorySaver())config = {"configurable":{"thread_id":"demo-proposal-001"}}print(graph.invoke({"proposal":"Create an internal draft only","status":"pending"}, config))print(graph.invoke(Command(resume={"approved":False}), config))3. 检查拒绝与重复批准
Section titled “3. 检查拒绝与重复批准”拒绝的终态是 rejected,后续动作不执行。已结束任务不当作新审批;重复批准返回已有状态。将提案版本和审核人记录在服务端,不只藏在浏览器本地变量。
4. 副作用移到审核之后
Section titled “4. 副作用移到审核之后”恢复会从含 interrupt 的节点开头重入,暂停前代码可能再跑。发送、扣费、创建放在独立后续阶段;用 proposal_id 加版本的唯一键防重复。不要捕获吞掉 interrupt 的内部暂停异常。
5. 上线补持久化与身份验证
Section titled “5. 上线补持久化与身份验证”内存演示不能证明重启恢复。上线替换持久化存储,记录审核时间、身份、版本、执行状态和失败原因。thread_id 只定位状态,不是访问凭证;Jev 只提建议,不能用 confidence 当人工签字。
练习样例:下载 approval-record.json,可在本地练习;非本站实测结果。
可拒绝和恢复的本地例子及上线所需的持久化、身份和防重复边界。
- 审核输入可能过期,要检查对象和版本仍有效。
- 拒绝不执行,重复批准不重复动作。
- 重启恢复有持久化方案,身份与版本由服务端校验。
来源边界:依据所列公开来源整理;本站未复现演示。分类结果需人工复核,不会自动执行。
知道 thread_id 就能批准吗?
Section titled “知道 thread_id 就能批准吗?”不能。它只定位状态,服务端仍校验审核人、权限、对象与版本。