初始化项目:langgraph 学习笔记与 lg_common 通用组件包
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"id": "initial_id",
|
||||
"metadata": {
|
||||
"collapsed": true,
|
||||
"ExecuteTime": {
|
||||
"end_time": "2026-07-29T11:54:37.402220Z",
|
||||
"start_time": "2026-07-29T11:54:37.062467Z"
|
||||
}
|
||||
},
|
||||
"source": [
|
||||
"from typing import TypedDict, Annotated\n",
|
||||
"from operator import add\n",
|
||||
"\n",
|
||||
"from langgraph.graph import StateGraph, START, END\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# 1. 定义状态\n",
|
||||
"class OverAllState(TypedDict):\n",
|
||||
" logs: Annotated[list[str], add]\n",
|
||||
" id: str\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# 2. 定义节点\n",
|
||||
"def node_1(state: OverAllState) -> OverAllState:\n",
|
||||
" id = state[\"id\"]\n",
|
||||
" return {\n",
|
||||
" \"logs\": [\"node_1 运行完了\"],\n",
|
||||
" \"id\": id + \",node_1\"\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def node_2(state: OverAllState) -> OverAllState:\n",
|
||||
" id = state[\"id\"]\n",
|
||||
" return {\n",
|
||||
" \"logs\": [\"node_2 运行完了\"],\n",
|
||||
" \"id\": id + \",node_2\"\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# 图\n",
|
||||
"builder = StateGraph(state_schema=OverAllState)\n",
|
||||
"builder.add_node(node_1)\n",
|
||||
"builder.add_node(node_2)\n",
|
||||
"\n",
|
||||
"builder.add_edge(START, \"node_1\")\n",
|
||||
"builder.add_edge(\"node_1\", \"node_2\")\n",
|
||||
"builder.add_edge(\"node_2\", END)\n",
|
||||
"\n",
|
||||
"graph = builder.compile()\n",
|
||||
"\n",
|
||||
"result = graph.invoke({\"id\": \"gqt_\"})\n",
|
||||
"print(result)"
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"{'logs': ['node_1 运行完了', 'node_2 运行完了'], 'id': 'gqt_,node_1,node_2'}\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"execution_count": 2
|
||||
},
|
||||
{
|
||||
"metadata": {
|
||||
"ExecuteTime": {
|
||||
"end_time": "2026-07-29T11:54:38.247128Z",
|
||||
"start_time": "2026-07-29T11:54:37.414230Z"
|
||||
}
|
||||
},
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"graph_mermaid=graph.get_graph().draw_mermaid()\n",
|
||||
"print(graph_mermaid)"
|
||||
],
|
||||
"id": "615a7ac2bdbdfd2f",
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"---\n",
|
||||
"config:\n",
|
||||
" flowchart:\n",
|
||||
" curve: linear\n",
|
||||
"---\n",
|
||||
"graph TD;\n",
|
||||
"\t__start__([<p>__start__</p>]):::first\n",
|
||||
"\tnode_1(node_1)\n",
|
||||
"\tnode_2(node_2)\n",
|
||||
"\t__end__([<p>__end__</p>]):::last\n",
|
||||
"\t__start__ --> node_1;\n",
|
||||
"\tnode_1 --> node_2;\n",
|
||||
"\tnode_2 --> __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": 3
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"cell_type": "code",
|
||||
"outputs": [],
|
||||
"execution_count": null,
|
||||
"source": "",
|
||||
"id": "fb967b9e12fee1c0"
|
||||
}
|
||||
],
|
||||
"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
|
||||
}
|
||||
@@ -0,0 +1,198 @@
|
||||
{
|
||||
"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__([<p>__start__</p>]):::first\n",
|
||||
"\tnode_1(node_1)\n",
|
||||
"\tnode_2(node_2)\n",
|
||||
"\tnode_3(node_3)\n",
|
||||
"\tnode_4(node_4)\n",
|
||||
"\t__end__([<p>__end__</p>]):::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
|
||||
}
|
||||
Reference in New Issue
Block a user