💻 源码
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.types import RunnableConfig, interrupt, Command


# 定义状态结构
class State(dict):
    task: str
    approval: str


# 自动步骤:生成任务
def create_task(state: State):
    task = "审批预算申请(金额:5000元)"
    print(f"系统创建任务:{task}")
    state["task"] = task
    return state


# 人工步骤:等待人工输入
def human_approval(state: State):
    print("等待人工审批中...")
    # 触发人工中断(这里 LangGraph 会暂停执行,直到被 resume)
    approval = interrupt("请输入审批结果(批准 / 不批准):")
    state["approval"] = approval
    return state


# 后续步骤:根据人工结果继续
def finalize(state: State):
    if state["approval"] == "批准":
        print(f"✅ 审批通过:{state['task']}")
    else:
        print(f"❌ 审批拒绝:{state['task']}")
    return state


# === 构建图 ===
def build_graph():
    grpah_builder = StateGraph(State)
    grpah_builder.add_node("create_task", create_task)
    grpah_builder.add_node("human_approval", human_approval)
    grpah_builder.add_node("finalize", finalize)

    grpah_builder.add_edge(START, "create_task")
    grpah_builder.add_edge("create_task", "human_approval")
    grpah_builder.add_edge("human_approval", "finalize")
    grpah_builder.add_edge("finalize", END)

    memory = InMemorySaver()
    graph = grpah_builder.compile(checkpointer=memory)
    return graph


# === 运行示例 ===
graph = build_graph()

# 第一次运行 —— 执行到人工中断处
config = RunnableConfig(configurable={"thread_id": "12345"})
print("=== 第一次运行 ===")
state = graph.invoke({}, config=config)
print("第一次运行状态:", state)

# # 模拟人工输入并恢复执行
# print("\n=== 第二次运行(人工输入后继续) ===")
# user_decision = input("是否批准?")
# state = graph.invoke(Command(resume=user_decision), config=config)
# print("第二次运行状态:", state)

# 模拟人工输入并恢复执行
config1 = RunnableConfig(configurable={"thread_id": "678910"})
print("\n=== 第二次运行(人工输入后继续) ===")
user_decision = input("是否批准?")
state = graph.invoke(Command(resume=user_decision), config=config)
print("第二次运行状态:", state)