from typing import TypedDict, Annotated import operator import time from langgraph.graph import StateGraph, END class GraphState(TypedDict): messages: Annotated[list, operator.add] step_count: int result: str def step_1(state: GraphState) -> GraphState: print("šŸ”„ ę‰§č”Œę­„éŖ¤1: ę•°ę®å‡†å¤‡é˜¶ę®µ") time.sleep(0.5) return { "messages": ["ę­„éŖ¤1: å¼€å§‹ę•°ę®å‡†å¤‡"], "step_count": state.get("step_count", 0) + 1, "result": "ę•°ę®å‡†å¤‡å®Œęˆ", } def step_2(state: GraphState) -> GraphState: print("šŸ”„ ę‰§č”Œę­„éŖ¤2: ę•°ę®å¤„ē†é˜¶ę®µ") time.sleep(0.7) return { "messages": ["ę­„éŖ¤2: ę­£åœØå¤„ē†ę•°ę®"], "step_count": state.get("step_count", 0) + 1, "result": "ę•°ę®å¤„ē†å®Œęˆļ¼Œå‡†å¤‡åˆ†ęž", } def step_3(state: GraphState) -> GraphState: print("šŸ”„ ę‰§č”Œę­„éŖ¤3: ę•°ę®åˆ†ęžé˜¶ę®µ") time.sleep(0.9) total_messages = len(state.get("messages", [])) return { "messages": ["ę­„éŖ¤3: åˆ†ęžå®Œęˆļ¼Œē”Ÿęˆęœ€ē»ˆē»“ęžœ"], "step_count": state.get("step_count", 0) + 1, "result": f"åˆ†ęžå®Œęˆļ¼ę€»å…±å¤„ē†äŗ† {total_messages + 1} ę”ę¶ˆęÆļ¼Œę‰§č”Œäŗ† {state.get('step_count', 0) + 1} äøŖę­„éŖ¤", } def create_workflow(): wf = StateGraph(GraphState) wf.add_node("step_1", step_1) wf.add_node("step_2", step_2) wf.add_node("step_3", step_3) wf.set_entry_point("step_1") wf.add_edge("step_1", "step_2") wf.add_edge("step_2", "step_3") wf.add_edge("step_3", END) return wf.compile() def main(): print("=" * 60) print("šŸš€ LangGraph stream_mode='values' ē¤ŗä¾‹ļ¼ˆčæ”å›žå®Œę•“ēŠ¶ę€ļ¼‰") print("=" * 60) app = create_workflow() initial = {"messages": [], "step_count": 0, "result": ""} for i, state in enumerate(app.stream(initial, stream_mode="values")): print(f"\nšŸ” ę­„éŖ¤ {i} å®ŒęˆåŽēš„ēŠ¶ę€:") print(f" šŸ“ messages: {state.get('messages', [])}") print(f" šŸ”¢ step_count: {state.get('step_count', 0)}") print(f" ✨ result: {state.get('result', '')}") print("\nāœ… 完成!") if __name__ == "__main__": main()