{ "cells": [ { "cell_type": "code", "id": "initial_id", "metadata": { "collapsed": true, "ExecuteTime": { "end_time": "2026-07-29T13:09:26.374024Z", "start_time": "2026-07-29T13:09:26.349210Z" } }, "source": [ "\n", "\n", "\n", "from time import sleep\n", "\n", "from langgraph.graph import StateGraph, START, END\n", "\n", "\n", "def my_reducer(left: list[str], right: list[str]) -> list[str]:\n", " return left + right\n", "\n", "\n", "def id_reducer(left: str, right: str) -> str:\n", " if not left:\n", " return right\n", " if not right:\n", " return left\n", " print(f\"----> {left}+{right}={int(left) + int(right)}\")\n", " return str(int(left) + int(right))\n", "\n", "\n", "from typing import Annotated, TypedDict\n", "\n", "\n", "class OverAllState(TypedDict):\n", " logs: Annotated[list[str], my_reducer]\n", " id: Annotated[str, id_reducer] # 如果存在并行节点往同一个节点传递数据,没有reducer会报错\n", "\n", "\n", "def node_1(state: OverAllState) -> OverAllState:\n", " for k, v in state.items():\n", " print(k, v)\n", " return {\n", " \"logs\": [\"node_1\"],\n", " \"id\": state[\"id\"]\n", " }\n", "\n", "\n", "def node_2(state: OverAllState) -> OverAllState:\n", " for k, v in state.items():\n", " print(f\"2,{k},{v}\")\n", " return {\n", " \"logs\": [\"node_2\"],\n", " \"id\": state[\"id\"]\n", " }\n", "\n", "\n", "def node_3(state: OverAllState) -> OverAllState:\n", " sleep(1)\n", " for k, v in state.items():\n", " print(f\"3,{k},{v}\")\n", " return {\n", " \"logs\": [\"node_3\"],\n", " \"id\": state[\"id\"]\n", " }\n", "\n", "\n", "def node_4(state: OverAllState) -> OverAllState:\n", " sleep(2)\n", " for k, v in state.items():\n", " print(f\"4,{k},{v}\")\n", " return {\n", " \"logs\": [\"node_4\"],\n", " \"id\": state[\"id\"]\n", " }\n", "\n", "\n", "builder = StateGraph(state_schema=OverAllState)\n", "\n", "builder.add_node(node_1)\n", "builder.add_node(node_2)\n", "builder.add_node(node_3)\n", "builder.add_node(node_4)\n", "\n", "builder.add_edge(START, \"node_1\")\n", "builder.add_edge(\"node_1\", \"node_2\")\n", "builder.add_edge(\"node_1\", \"node_3\")\n", "builder.add_edge(\"node_2\", \"node_4\")\n", "builder.add_edge(\"node_3\", \"node_4\")\n", "builder.add_edge(\"node_4\", END)\n", "\n", "graph = builder.compile()\n", "mermaid_text = graph.get_graph().draw_mermaid()\n", "print(mermaid_text)" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---\n", "config:\n", " flowchart:\n", " curve: linear\n", "---\n", "graph TD;\n", "\t__start__([
__start__
]):::first\n", "\tnode_1(node_1)\n", "\tnode_2(node_2)\n", "\tnode_3(node_3)\n", "\tnode_4(node_4)\n", "\t__end__([__end__
]):::last\n", "\t__start__ --> node_1;\n", "\tnode_1 --> node_2;\n", "\tnode_1 --> node_3;\n", "\tnode_2 --> node_4;\n", "\tnode_3 --> node_4;\n", "\tnode_4 --> __end__;\n", "\tclassDef default fill:#f2f0ff,line-height:1.2\n", "\tclassDef first fill-opacity:0\n", "\tclassDef last fill:#bfb6fc\n", "\n" ] } ], "execution_count": 24 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-29T13:09:29.449187Z", "start_time": "2026-07-29T13:09:26.375281Z" } }, "cell_type": "code", "source": "result = graph.invoke({\"id\": \"2\"})", "id": "110aed99961c8afb", "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "logs []\n", "id 2\n", "----> 2+2=4\n", "2,logs,['node_1']\n", "2,id,4\n", "3,logs,['node_1']\n", "3,id,4\n", "----> 4+4=8\n", "----> 8+4=12\n", "4,logs,['node_1', 'node_2', 'node_3']\n", "4,id,12\n", "----> 12+12=24\n" ] } ], "execution_count": 25 }, { "metadata": { "ExecuteTime": { "end_time": "2026-07-29T13:09:29.470822Z", "start_time": "2026-07-29T13:09:29.460635Z" } }, "cell_type": "code", "source": "", "id": "88718dd1bf2453c1", "outputs": [], "execution_count": 25 } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 5 }