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)