import operator
import time
from typing import TypedDict, List, Annotated
from langgraph.graph import StateGraph, START, END
# def my_merge(a, b):
# # 这里定义合并逻辑
# return b
# 定义状态结构
class MyState(TypedDict):
#operator.add 这个合并起,就是把原来的内容和新内容进行一个合并
menu: Annotated[list, operator.add]
all_ready: bool
# --- 节点定义 ---
def start_cooking(state: MyState):
print("👨🍳 厨房准备开始!")
# 带 reducer 的通道初值本来就是 [],不需要初始化
# state["menu"] = []
# return state
return {}
def chef_a(state: MyState):
print("👩🍳 A 厨师在做:番茄炒蛋...")
time.sleep(2)
# 向共享 list 添加菜品
# state["menu"].append("番茄炒蛋")
# return state
return {"menu": ["番茄炒蛋"]}
def chef_b(state: MyState):
print("👨🍳 B 厨师在做:宫保鸡丁...")
time.sleep(3)
# state["menu"].append("宫保鸡丁")
# return state
return {"menu": ["宫保鸡丁"]}
def chef_c(state: MyState):
print("👩🍳 C 厨师在做:鱼香肉丝...")
time.sleep(1)
# state["menu"].append("鱼香肉丝")
# return state
return {"menu": ["鱼香肉丝"]}
def serve_dish(state: MyState):
print("\n🍽️ 所有菜都准备好了!菜单如下:")
for dish in state["menu"]:
print(" -", dish)
# menu 只读不返回:此刻它已经是合并好的 3 条,
# 一旦 return state,operator.add 会把这 3 条再追加一遍变 6 条。
# state["all_ready"] = True
# return state
return {"all_ready": True}
# --- 构建 LangGraph ---
def build_graph():
graph_builder = StateGraph(MyState)
graph_builder.add_node("start", start_cooking)
graph_builder.add_node("chef_a", chef_a)
graph_builder.add_node("chef_b", chef_b)
graph_builder.add_node("chef_c", chef_c)
graph_builder.add_node("serve", serve_dish)
# 启动 → 并行三个厨师
graph_builder.add_edge(START, "start")
graph_builder.add_edge("start", "chef_a")
graph_builder.add_edge("start", "chef_b")
graph_builder.add_edge("start", "chef_c")
# 三个厨师汇总到 serve
graph_builder.add_edge(["chef_a", "chef_b", "chef_c"], "serve")
graph_builder.add_edge("serve", END)
return graph_builder.compile()
# --- 运行 ---
if __name__ == "__main__":
graph = build_graph()
result = graph.invoke({})
print("\n最终结果:", result)