From b3f3b72f07877ed00b0591c6c73722445aec668e Mon Sep 17 00:00:00 2001 From: gqt <3217233537@qq.com> Date: Sun, 16 Aug 2026 00:25:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=EF=BC=9Alanggraph=20=E5=AD=A6=E4=B9=A0=E7=AC=94=E8=AE=B0?= =?UTF-8?q?=E4=B8=8E=20lg=5Fcommon=20=E9=80=9A=E7=94=A8=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 16 + _chat/1.md | 4 + chapter01/01.ipynb | 138 + chapter01/02_reducer.ipynb | 198 + chapter02/01_dynamic_send.ipynb | 340 + chapter02/02_fan_out.ipynb | 157 + chapter02/03_fan_in.ipynb | 210 + chapter02/04_ReAct_static_loop.ipynb | 560 + chapter02/05_ReAct_dynamic_loop.ipynb | 675 + chapter02/06_remaining_steps.ipynb | 144 + chapter02/07_retry.ipynb | 229 + chapter03/01_checkpoint.ipynb | 134 + chapter03/02_checkpoint_retry.ipynb | 1090 ++ chapter03/03_checkpoint_replay.ipynb | 3125 +++++ chapter03/04_memory.ipynb | 280 + chapter04/01_interrupt.ipynb | 187 + chapter04/02_interrupt_并行.ipynb | 148 + chapter04/03_approve.ipynb | 972 ++ chapter04/04_state_interrupt.ipynb | 719 ++ chapter04/05_tool_node.ipynb | 244 + chapter04/06_tool_node_2.ipynb | 240 + chapter05/01_output_values_updates.ipynb | 233 + chapter05/02_output_messages.ipynb | 13665 +++++++++++++++++++++ docker-compose.yml | 37 + lg_common/__init__.py | 6 + lg_common/env.py | 14 + lg_common/llm.py | 17 + pyproject.toml | 24 + uv.lock | 1589 +++ 29 files changed, 25395 insertions(+) create mode 100644 .gitignore create mode 100644 _chat/1.md create mode 100644 chapter01/01.ipynb create mode 100644 chapter01/02_reducer.ipynb create mode 100644 chapter02/01_dynamic_send.ipynb create mode 100644 chapter02/02_fan_out.ipynb create mode 100644 chapter02/03_fan_in.ipynb create mode 100644 chapter02/04_ReAct_static_loop.ipynb create mode 100644 chapter02/05_ReAct_dynamic_loop.ipynb create mode 100644 chapter02/06_remaining_steps.ipynb create mode 100644 chapter02/07_retry.ipynb create mode 100644 chapter03/01_checkpoint.ipynb create mode 100644 chapter03/02_checkpoint_retry.ipynb create mode 100644 chapter03/03_checkpoint_replay.ipynb create mode 100644 chapter03/04_memory.ipynb create mode 100644 chapter04/01_interrupt.ipynb create mode 100644 chapter04/02_interrupt_并行.ipynb create mode 100644 chapter04/03_approve.ipynb create mode 100644 chapter04/04_state_interrupt.ipynb create mode 100644 chapter04/05_tool_node.ipynb create mode 100644 chapter04/06_tool_node_2.ipynb create mode 100644 chapter05/01_output_values_updates.ipynb create mode 100644 chapter05/02_output_messages.ipynb create mode 100644 docker-compose.yml create mode 100644 lg_common/__init__.py create mode 100644 lg_common/env.py create mode 100644 lg_common/llm.py create mode 100644 pyproject.toml create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a54895c --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# Python +__pycache__/ +*.py[cod] +.venv/ +.python-version +*.egg-info/ + +# 环境变量与密钥 +.env + +# IDE +.idea/ +.vscode/ + +# Jupyter +.ipynb_checkpoints/ diff --git a/_chat/1.md b/_chat/1.md new file mode 100644 index 0000000..5a3747b --- /dev/null +++ b/_chat/1.md @@ -0,0 +1,4 @@ +pgvector/pgvector:pg17、redis:7.4-alpine 使用这个镜像编写/Volumes/ExternalStorageA/project/2026.7/langgraph学习/docker-compose.yml + +--- + diff --git a/chapter01/01.ipynb b/chapter01/01.ipynb new file mode 100644 index 0000000..cd32d6d --- /dev/null +++ b/chapter01/01.ipynb @@ -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__([

__start__

]):::first\n", + "\tnode_1(node_1)\n", + "\tnode_2(node_2)\n", + "\t__end__([

__end__

]):::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 +} diff --git a/chapter01/02_reducer.ipynb b/chapter01/02_reducer.ipynb new file mode 100644 index 0000000..88919c9 --- /dev/null +++ b/chapter01/02_reducer.ipynb @@ -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__([

__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 +} diff --git a/chapter02/01_dynamic_send.ipynb b/chapter02/01_dynamic_send.ipynb new file mode 100644 index 0000000..289a398 --- /dev/null +++ b/chapter02/01_dynamic_send.ipynb @@ -0,0 +1,340 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-07-30T13:49:53.991892Z", + "start_time": "2026-07-30T13:49:53.953141Z" + } + }, + "source": [ + "\"\"\"\n", + "动态扇出(fan-out)\n", + "\"\"\"\n", + "\n", + "import os\n", + "from dotenv import load_dotenv\n", + "from langchain.chat_models import init_chat_model\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")" + ], + "outputs": [], + "execution_count": 23 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-30T13:49:54.025529Z", + "start_time": "2026-07-30T13:49:54.012229Z" + } + }, + "cell_type": "code", + "source": [ + "from typing import TypedDict, Literal, Sequence\n", + "\n", + "\n", + "class OverallState(TypedDict):\n", + " topic: str\n", + " poem: str\n", + " ci_poem: str\n", + " joke: str\n", + "\n", + "\n", + "class WorkerState(TypedDict):\n", + " content_type: Literal[\"poem\", \"joke\", \"ci_poem\"]\n", + " prompt: str\n", + "\n", + "\n", + "class InputState(TypedDict):\n", + " topic: str\n", + "\n", + "\n", + "class OutputState(TypedDict):\n", + " poem: str\n", + " ci_poem: str\n", + " joke: str" + ], + "id": "ae2dc1758905a3a9", + "outputs": [], + "execution_count": 24 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-30T13:49:54.037302Z", + "start_time": "2026-07-30T13:49:54.025996Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "from langchain.messages import HumanMessage\n", + "from langgraph.types import Send\n", + "\n", + "\n", + "def worker_node(state: WorkerState) -> OutputState:\n", + " content_type = state[\"content_type\"]\n", + " prompt = state[\"prompt\"]\n", + " res = llm.invoke([HumanMessage(prompt)])\n", + "\n", + " return {\n", + " content_type: res.content\n", + " }\n", + "\n", + "\n", + "def router(state: InputState) -> Sequence[Send]:\n", + " router_prompt = \"请生成关于 {} 主题的{}\"\n", + " en_zh_map = {\n", + " \"poem\": \"七言绝句\",\n", + " \"joke\": \"笑话\",\n", + " \"ci_poem\": \"中文词\"\n", + " }\n", + "\n", + " topic = state[\"topic\"]\n", + " return [\n", + " Send(\n", + " \"worker_node\",\n", + " arg=WorkerState(\n", + " content_type=content_type,\n", + " prompt=router_prompt\n", + " .format(topic, en_zh_map[content_type])\n", + " )\n", + " )\n", + " for content_type in [\"poem\", \"joke\", \"ci_poem\"]\n", + " ]" + ], + "id": "3ac3b9c730c21141", + "outputs": [], + "execution_count": 25 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-30T13:49:54.057696Z", + "start_time": "2026-07-30T13:49:54.043335Z" + } + }, + "cell_type": "code", + "source": [ + "builder = StateGraph(\n", + " state_schema=OverallState,\n", + " input_schema=InputState,\n", + " output_schema=OutputState\n", + ")\n", + "\n", + "builder.add_node(\"router\", router)\n", + "builder.add_node(\"worker_node\", worker_node)\n", + "\n", + "builder.add_conditional_edges(\n", + " START,\n", + " router,\n", + " path_map={\"worker_node\": \"worker_node\"}\n", + ")\n", + "builder.add_edge(\"worker_node\", END)\n", + "\n", + "graph = builder.compile()" + ], + "id": "ac2b29823a3df4ee", + "outputs": [], + "execution_count": 26 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-30T13:50:20.554204Z", + "start_time": "2026-07-30T13:49:54.058820Z" + } + }, + "cell_type": "code", + "source": "res=graph.invoke(InputState(topic=\"汤姆猫\"))", + "id": "235958e92cc997aa", + "outputs": [], + "execution_count": 27 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-30T13:50:20.742345Z", + "start_time": "2026-07-30T13:50:20.575371Z" + } + }, + "cell_type": "code", + "source": [ + "from rich import print as rp\n", + "rp(res)" + ], + "id": "354d39c58926f899", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m{\u001B[0m\n", + " \u001B[32m'poem'\u001B[0m: \u001B[32m'《咏汤姆猫》\\n蓝灰掠地逐轻风,\\n百计千谋总落空。\\n莫叹连环招屡败,\\n犹凭百态逗群童。\\n\\n【简析】\\n- \u001B[0m\n", + "\u001B[32m**起承转合**:首句以“蓝灰掠地”勾勒经典动画形象,“逐轻风”暗写其与杰瑞的追逐场景;次句“百计千谋总落空”浓缩汤姆屡次布\u001B[0m\n", + "\u001B[32m陷阱却反受挫的喜剧内核;第三句笔锋一转,化贬为褒,赞其屡败屡战的韧劲;末句“百态”既指动画中丰富的肢体与表情夸张,亦\u001B[0m\n", + "\u001B[32m点出其跨越时代的童趣价值。\\n- \u001B[0m\n", + "\u001B[32m**格律**:本诗依《平水韵》上平一东韵,采用七绝平起首句入韵正格,平仄严谨,符合传统近体诗法度。\\n- \u001B[0m\n", + "\u001B[32m**文化呼应**:以古典诗语书写现代卡通形象,不涉直白名词,而通过“逐、空、败、童”等字眼,精准捕捉该角色“滑稽中带温情、\u001B[0m\n", + "\u001B[32m狼狈中见执着”的精神气质,使传统诗体与当代流行文化自然交融。'\u001B[0m,\n", + " \u001B[32m'ci_poem'\u001B[0m: \u001B[32m'以下为您整理围绕 **“汤姆猫(Talking Tom)”** \u001B[0m\n", + "\u001B[32m主题的中文词汇库,已按使用场景分类,方便您在内容创作、市场分析、产品策划或SEO优化中直接调用:\\n\\n### 🐾 \u001B[0m\n", + "\u001B[32m核心IP与角色\\n`会说话的汤姆猫`|`安吉拉(Talking \u001B[0m\n", + "\u001B[32mAngela)`|`本熊`|`汉克狗`|`金杰猫`|`数字宠物`|`虚拟陪伴角色`|`Outfit7`(出品方)\\n\\n### 🎮 \u001B[0m\n", + "\u001B[32m核心玩法与功能\\n`语音模仿`|`回声重播`|`趣味变声`|`指尖互动`|`换装打扮`|`迷你游戏合集`|`家园养成`|`触控反馈`\u001B[0m\n", + "\u001B[32m|`表情捕捉`|`节奏拍手`\\n\\n### ⚙️ \u001B[0m\n", + "\u001B[32m技术与研发方向\\n`实时语音识别`|`声音特征提取`|`口型同步驱动`|`3D动画渲染`|`多语言适配`|`低延迟交互`|`版本热更\u001B[0m\n", + "\u001B[32m新`|`轻量化客户端`\\n\\n### 📦 \u001B[0m\n", + "\u001B[32m衍生内容与生态\\n`同名动画剧集`|`实体毛绒公仔`|`主题盲盒/积木`|`儿童早教延伸应用`|`IP联名文具`|`粉丝同人二创`|\u001B[0m\n", + "\u001B[32m`线上音乐频道`|`AR互动滤镜`\\n\\n### 🌍 \u001B[0m\n", + "\u001B[32m市场与文化属性\\n`亲子互动娱乐`|`解压轻量游戏`|`网络模因(Meme)`|`Z世代童年数字记忆`|`全球化爆款应用`|`寓教于\u001B[0m\n", + "\u001B[32m乐定位`|`跨代际传播`|`安全合规设计`\\n\\n### 💼 \u001B[0m\n", + "\u001B[32m商业与运营术语\\n`免费下载+内购模式`|`激励视频广告`|`应用商店推荐位`|`用户次日留存`|`跨媒介IP发行`|`分级授权体\u001B[0m\n", + "\u001B[32m系`|`区域化本地运营`|`生命周期管理`\\n\\n---\\n📌 **使用建议**:\\n- **内容创作/短视频脚本**:优先组合 `语音模仿 + \u001B[0m\n", + "\u001B[32m指尖互动 + 解压轻量游戏 + 网络模因`\\n- **竞品分析/行业报告**:侧重 `免费+内购模式 + 用户留存 + 跨媒介IP发行 + \u001B[0m\n", + "\u001B[32m生命周期管理`\\n- **儿童产品策划**:可搭配 `安全合规设计 + 亲子互动娱乐 + 家园养成 + 儿童早教延伸`\\n- \u001B[0m\n", + "\u001B[32m**SEO/标签优化**:建议采用 `会说话的汤姆猫系列 / Talking Tom中文版 / 虚拟宠物手游 / \u001B[0m\n", + "\u001B[32m儿童互动APP`\\n\\n如需特定场景的短语搭配、长尾关键词清单或英文对照表,可告知具体用途(如:电商上架、公众号排版、投融\u001B[0m\n", + "\u001B[32m资BP等),我将为您进一步定制。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \n", + "\u001B[32m'这里为你原创创作了5个以《猫和老鼠》中“汤姆猫”为主题的笑话,保留了他屡败屡战、表情丰富、总被杰瑞机智反杀的经典人设\u001B[0m\n", + "\u001B[32m,风格轻松幽默,适合全年龄阅读:\\n\\n1. **【职场篇】** \\n汤姆去面试“高级防鼠专员”。 \u001B[0m\n", + "\u001B[32m\\nHR问:“你的核心竞争力是什么?” \u001B[0m\n", + "\u001B[32m\\n汤姆挺起胸膛:“二十年实战经验!精通高空坠落缓冲、电击后快速重启、以及被锅砸扁后的三维复原技术。” \u001B[0m\n", + "\u001B[32m\\nHR点头:“履历很扎实,但我们更看重结果。” \u001B[0m\n", + "\u001B[32m\\n汤姆叹气:“那我补充一条:我擅长在失败中积累素材,为下一代动画师提供反面PPT。” \\n\\n2. **【健身篇】** \u001B[0m\n", + "\u001B[32m\\n汤姆痛定思痛办卡健身,三个月练出八块腹肌,连杰瑞都在评论区留言:“哥,你这体格不当举重冠军可惜了!” \u001B[0m\n", + "\u001B[32m\\n第二天抓鼠,杰瑞只是把奶酪往前挪了半寸。 \\n汤姆全力冲刺,“砰!”直接撞穿三道墙。 \u001B[0m\n", + "\u001B[32m\\n邻居围观问他咋回事,汤姆揉着额头顶着大包说:“力量够了,就是惯性没收住。” \\n\\n3. **【哲学篇】** \u001B[0m\n", + "\u001B[32m\\n小朋友问汤姆:“你明明每次都被打败,为什么从不放弃?” \u001B[0m\n", + "\u001B[32m\\n汤姆推了推不存在的眼镜:“首先,这是工作;其次,如果我赢了,导演就得给我加薪;最后……你想想,谁舍得让一部播了八十多\u001B[0m\n", + "\u001B[32m年的动画片断更?” \\n小朋友恍然大悟:“原来你不是在抓老鼠,是在守护童年呀!” \\n\\n4. **【科技篇】** \u001B[0m\n", + "\u001B[32m\\n汤姆斥巨资下载了“AI智能捕鼠系统”,支持卫星定位、行为预测、自动诱捕。 \u001B[0m\n", + "\u001B[32m\\n首日上阵,屏幕显示:“目标已锁定,正在计算逃逸路线……” \\n杰瑞掏出小圆镜反射阳光晃了汤姆一下。 \u001B[0m\n", + "\u001B[32m\\n手机秒弹:“识别异常,疑似光学干扰。已为您切换至传统模式:跑、跳、躲、挨打。” \u001B[0m\n", + "\u001B[32m\\n汤姆默默关机:“算法再强,也算不出鼠标垫的反光角。” \\n\\n5. **【考试篇】** \\n语文题:请用“汤姆猫”造句。 \u001B[0m\n", + "\u001B[32m\\n学生甲写:“汤姆猫很有毅力。”(老师批:✅ 但缺乏细节) \u001B[0m\n", + "\u001B[32m\\n学生乙写:“汤姆猫每天都在努力,虽然每次都失败,但他从未停止。”(老师批:✅✅ 加分项) \u001B[0m\n", + "\u001B[32m\\n学生丙写:“汤姆猫的创可贴库存比我的作业本还多。”(老师批:✅✅✅ 现实主义杰作,附赠一张漫画配图) \\n\\n💡 \u001B[0m\n", + "\u001B[32m**小贴士**:这些笑话均基于经典动画的喜剧内核二次创作,未涉及任何版权侵权内容。如果你喜欢某种特定风格(比如谐音梗、\u001B[0m\n", + "\u001B[32m冷笑话、或结合现代生活场景),可以告诉我,我再为你定制一批!'\u001B[0m\n", + "\u001B[1m}\u001B[0m\n" + ], + "text/html": [ + "
{\n",
+       "    'poem': '《咏汤姆猫》\\n蓝灰掠地逐轻风,\\n百计千谋总落空。\\n莫叹连环招屡败,\\n犹凭百态逗群童。\\n\\n【简析】\\n- \n",
+       "**起承转合**:首句以“蓝灰掠地”勾勒经典动画形象,“逐轻风”暗写其与杰瑞的追逐场景;次句“百计千谋总落空”浓缩汤姆屡次布\n",
+       "陷阱却反受挫的喜剧内核;第三句笔锋一转,化贬为褒,赞其屡败屡战的韧劲;末句“百态”既指动画中丰富的肢体与表情夸张,亦\n",
+       "点出其跨越时代的童趣价值。\\n- \n",
+       "**格律**:本诗依《平水韵》上平一东韵,采用七绝平起首句入韵正格,平仄严谨,符合传统近体诗法度。\\n- \n",
+       "**文化呼应**:以古典诗语书写现代卡通形象,不涉直白名词,而通过“逐、空、败、童”等字眼,精准捕捉该角色“滑稽中带温情、\n",
+       "狼狈中见执着”的精神气质,使传统诗体与当代流行文化自然交融。',\n",
+       "    'ci_poem': '以下为您整理围绕 **“汤姆猫(Talking Tom)”** \n",
+       "主题的中文词汇库,已按使用场景分类,方便您在内容创作、市场分析、产品策划或SEO优化中直接调用:\\n\\n### 🐾 \n",
+       "核心IP与角色\\n`会说话的汤姆猫`|`安吉拉(Talking \n",
+       "Angela)`|`本熊`|`汉克狗`|`金杰猫`|`数字宠物`|`虚拟陪伴角色`|`Outfit7`(出品方)\\n\\n### 🎮 \n",
+       "核心玩法与功能\\n`语音模仿`|`回声重播`|`趣味变声`|`指尖互动`|`换装打扮`|`迷你游戏合集`|`家园养成`|`触控反馈`\n",
+       "|`表情捕捉`|`节奏拍手`\\n\\n### ⚙️ \n",
+       "技术与研发方向\\n`实时语音识别`|`声音特征提取`|`口型同步驱动`|`3D动画渲染`|`多语言适配`|`低延迟交互`|`版本热更\n",
+       "新`|`轻量化客户端`\\n\\n### 📦 \n",
+       "衍生内容与生态\\n`同名动画剧集`|`实体毛绒公仔`|`主题盲盒/积木`|`儿童早教延伸应用`|`IP联名文具`|`粉丝同人二创`|\n",
+       "`线上音乐频道`|`AR互动滤镜`\\n\\n### 🌍 \n",
+       "市场与文化属性\\n`亲子互动娱乐`|`解压轻量游戏`|`网络模因(Meme)`|`Z世代童年数字记忆`|`全球化爆款应用`|`寓教于\n",
+       "乐定位`|`跨代际传播`|`安全合规设计`\\n\\n### 💼 \n",
+       "商业与运营术语\\n`免费下载+内购模式`|`激励视频广告`|`应用商店推荐位`|`用户次日留存`|`跨媒介IP发行`|`分级授权体\n",
+       "系`|`区域化本地运营`|`生命周期管理`\\n\\n---\\n📌 **使用建议**:\\n- **内容创作/短视频脚本**:优先组合 `语音模仿 + \n",
+       "指尖互动 + 解压轻量游戏 + 网络模因`\\n- **竞品分析/行业报告**:侧重 `免费+内购模式 + 用户留存 + 跨媒介IP发行 + \n",
+       "生命周期管理`\\n- **儿童产品策划**:可搭配 `安全合规设计 + 亲子互动娱乐 + 家园养成 + 儿童早教延伸`\\n- \n",
+       "**SEO/标签优化**:建议采用 `会说话的汤姆猫系列 / Talking Tom中文版 / 虚拟宠物手游 / \n",
+       "儿童互动APP`\\n\\n如需特定场景的短语搭配、长尾关键词清单或英文对照表,可告知具体用途(如:电商上架、公众号排版、投融\n",
+       "资BP等),我将为您进一步定制。',\n",
+       "    'joke': \n",
+       "'这里为你原创创作了5个以《猫和老鼠》中“汤姆猫”为主题的笑话,保留了他屡败屡战、表情丰富、总被杰瑞机智反杀的经典人设\n",
+       ",风格轻松幽默,适合全年龄阅读:\\n\\n1. **【职场篇】**  \\n汤姆去面试“高级防鼠专员”。  \n",
+       "\\nHR问:“你的核心竞争力是什么?”  \n",
+       "\\n汤姆挺起胸膛:“二十年实战经验!精通高空坠落缓冲、电击后快速重启、以及被锅砸扁后的三维复原技术。”  \n",
+       "\\nHR点头:“履历很扎实,但我们更看重结果。”  \n",
+       "\\n汤姆叹气:“那我补充一条:我擅长在失败中积累素材,为下一代动画师提供反面PPT。”  \\n\\n2. **【健身篇】**  \n",
+       "\\n汤姆痛定思痛办卡健身,三个月练出八块腹肌,连杰瑞都在评论区留言:“哥,你这体格不当举重冠军可惜了!”  \n",
+       "\\n第二天抓鼠,杰瑞只是把奶酪往前挪了半寸。  \\n汤姆全力冲刺,“砰!”直接撞穿三道墙。  \n",
+       "\\n邻居围观问他咋回事,汤姆揉着额头顶着大包说:“力量够了,就是惯性没收住。”  \\n\\n3. **【哲学篇】**  \n",
+       "\\n小朋友问汤姆:“你明明每次都被打败,为什么从不放弃?”  \n",
+       "\\n汤姆推了推不存在的眼镜:“首先,这是工作;其次,如果我赢了,导演就得给我加薪;最后……你想想,谁舍得让一部播了八十多\n",
+       "年的动画片断更?”  \\n小朋友恍然大悟:“原来你不是在抓老鼠,是在守护童年呀!”  \\n\\n4. **【科技篇】**  \n",
+       "\\n汤姆斥巨资下载了“AI智能捕鼠系统”,支持卫星定位、行为预测、自动诱捕。  \n",
+       "\\n首日上阵,屏幕显示:“目标已锁定,正在计算逃逸路线……”  \\n杰瑞掏出小圆镜反射阳光晃了汤姆一下。  \n",
+       "\\n手机秒弹:“识别异常,疑似光学干扰。已为您切换至传统模式:跑、跳、躲、挨打。”  \n",
+       "\\n汤姆默默关机:“算法再强,也算不出鼠标垫的反光角。”  \\n\\n5. **【考试篇】**  \\n语文题:请用“汤姆猫”造句。  \n",
+       "\\n学生甲写:“汤姆猫很有毅力。”(老师批:✅ 但缺乏细节)  \n",
+       "\\n学生乙写:“汤姆猫每天都在努力,虽然每次都失败,但他从未停止。”(老师批:✅✅ 加分项)  \n",
+       "\\n学生丙写:“汤姆猫的创可贴库存比我的作业本还多。”(老师批:✅✅✅ 现实主义杰作,附赠一张漫画配图)  \\n\\n💡 \n",
+       "**小贴士**:这些笑话均基于经典动画的喜剧内核二次创作,未涉及任何版权侵权内容。如果你喜欢某种特定风格(比如谐音梗、\n",
+       "冷笑话、或结合现代生活场景),可以告诉我,我再为你定制一批!'\n",
+       "}\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 28 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-07-30T13:50:27.890134Z", + "start_time": "2026-07-30T13:50:20.745185Z" + } + }, + "cell_type": "code", + "source": [ + "from IPython.display import display\n", + "display(graph)" + ], + "id": "6cb9f09b1ee2d10", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 29 + } + ], + "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 +} diff --git a/chapter02/02_fan_out.ipynb b/chapter02/02_fan_out.ipynb new file mode 100644 index 0000000..8260746 --- /dev/null +++ b/chapter02/02_fan_out.ipynb @@ -0,0 +1,157 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-01T04:50:33.908055Z", + "start_time": "2026-08-01T04:50:33.897287Z" + } + }, + "source": [ + "from typing import TypedDict\n", + "\n", + "from langchain_core.runnables import RunnableConfig\n", + "\n", + "\n", + "class EmptyState(TypedDict):\n", + " pass\n", + "\n", + "def node_a(state:EmptyState,config:RunnableConfig)->EmptyState:\n", + " step=config[\"metadata\"][\"langgraph_step\"]\n", + " print(f\"node_a: step={step}\")\n", + " return {}\n", + "\n", + "def node_b(state:EmptyState,config:RunnableConfig)->EmptyState:\n", + " step=config[\"metadata\"][\"langgraph_step\"]\n", + " print(f\"node_b: step={step}\")\n", + " return {}\n", + "\n", + "def node_c(state:EmptyState,config:RunnableConfig)->EmptyState:\n", + " step=config[\"metadata\"][\"langgraph_step\"]\n", + " print(f\"node_c: step={step}\")\n", + " return {}\n", + "\n", + "def node_d(state:EmptyState,config:RunnableConfig)->EmptyState:\n", + " step=config[\"metadata\"][\"langgraph_step\"]\n", + " print(f\"node_d: step={step}\")\n", + " return {}\n", + "\n", + "def node_e(state:EmptyState,config:RunnableConfig)->EmptyState:\n", + " step=config[\"metadata\"][\"langgraph_step\"]\n", + " print(f\"node_e: step={step}\")\n", + " return {}" + ], + "outputs": [], + "execution_count": 9 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T04:50:33.925014Z", + "start_time": "2026-08-01T04:50:33.915467Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "builder=StateGraph(state_schema=EmptyState)\n", + "builder.add_node(node_a)\n", + "builder.add_node(node_b)\n", + "builder.add_node(node_c)\n", + "builder.add_node(node_d)\n", + "builder.add_node(node_e)\n", + "\n", + "builder.add_edge(START,\"node_a\")\n", + "builder.add_edge(\"node_a\",\"node_b\")\n", + "builder.add_edge(\"node_a\",\"node_c\")\n", + "builder.add_edge(\"node_b\",\"node_d\")\n", + "# builder.add_edge(\"node_d\",\"node_e\")\n", + "# builder.add_edge(\"node_c\",\"node_e\")\n", + "builder.add_edge([\"node_c\",\"node_d\"],\"node_e\") # and;上面的是or\n", + "builder.add_edge(\"node_e\",END)\n", + "\n", + "graph=builder.compile()" + ], + "id": "47c1dd155fedb7bc", + "outputs": [], + "execution_count": 10 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T04:50:34.428546Z", + "start_time": "2026-08-01T04:50:33.929526Z" + } + }, + "cell_type": "code", + "source": [ + "from IPython.display import display\n", + "display(graph)" + ], + "id": "eb260d13942a1eea", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 11 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T04:50:34.447127Z", + "start_time": "2026-08-01T04:50:34.429597Z" + } + }, + "cell_type": "code", + "source": "graph.invoke({})", + "id": "ce310bd296c73bd4", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "node_a: step=1\n", + "node_b: step=2\n", + "node_c: step=2\n", + "node_d: step=3\n", + "node_e: step=4\n" + ] + } + ], + "execution_count": 12 + } + ], + "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 +} diff --git a/chapter02/03_fan_in.ipynb b/chapter02/03_fan_in.ipynb new file mode 100644 index 0000000..377da14 --- /dev/null +++ b/chapter02/03_fan_in.ipynb @@ -0,0 +1,210 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-01T05:23:05.461288Z", + "start_time": "2026-08-01T05:23:05.449204Z" + } + }, + "source": [ + "\"\"\"\n", + "START --> (router) --> mapper_node --> (reducer字段合并) --> reducer_node\n", + " --> mapper_node -->\n", + "\"\"\"\n", + "\n", + "from typing import TypedDict, Annotated, Sequence\n", + "\n", + "from operator import add\n", + "\n", + "\n", + "class OverallState(TypedDict):\n", + " input_values: list[str]\n", + " entries: Annotated[list[tuple[str, int]], add]\n", + " word_counts: dict[str, int]\n", + "\n", + "\n", + "class MaperInputState(TypedDict):\n", + " input_value: str" + ], + "outputs": [], + "execution_count": 9 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T05:23:05.475801Z", + "start_time": "2026-08-01T05:23:05.462674Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.types import Send\n", + "\n", + "\n", + "def router_node(state: OverallState) -> Sequence[Send]:\n", + " task = []\n", + " for input_value in state[\"input_values\"]:\n", + " task.append(\n", + " Send(\"mapper_node\", arg={\"input_value\": input_value})\n", + " )\n", + " return task\n", + "\n", + "\n", + "def mapper_node(state: MaperInputState) -> OverallState:\n", + " words = state[\"input_value\"].split(\" \")\n", + " entries = []\n", + " for word in words:\n", + " entries.append((word, 1))\n", + " return {\n", + " \"entries\": entries,\n", + " }\n", + "\n", + "\n", + "def reducer_node(state: OverallState) -> OverallState:\n", + " entries = state[\"entries\"]\n", + " shuffle_dict = {}\n", + " for k, v in entries:\n", + " if k not in shuffle_dict:\n", + " shuffle_dict[k] = v\n", + " else:\n", + " shuffle_dict[k] += v\n", + " return {\n", + " \"word_counts\": shuffle_dict\n", + " }" + ], + "id": "acfc45665818b2c3", + "outputs": [], + "execution_count": 10 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T05:23:05.486771Z", + "start_time": "2026-08-01T05:23:05.479810Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "builder = StateGraph(state_schema=OverallState)\n", + "# builder.add_node(\"router_ndoe\")\n", + "builder.add_node(\"mapper_node\",mapper_node)\n", + "builder.add_node(\"reducer_node\",reducer_node)\n", + "\n", + "builder.add_conditional_edges(START, router_node, path_map=[\"mapper_node\"])\n", + "builder.add_edge(\"mapper_node\", \"reducer_node\")\n", + "builder.add_edge(\"reducer_node\", END)\n", + "\n", + "graph = builder.compile()" + ], + "id": "a58b2eee06957fa8", + "outputs": [], + "execution_count": 11 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T05:23:09.162442Z", + "start_time": "2026-08-01T05:23:05.490834Z" + } + }, + "cell_type": "code", + "source": [ + "from IPython.display import display\n", + "display(graph)" + ], + "id": "f9330e28be72d83d", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 12 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T05:23:09.188521Z", + "start_time": "2026-08-01T05:23:09.179066Z" + } + }, + "cell_type": "code", + "source": "res=graph.invoke({\"input_values\": [\"hello world1\", \"hello world2\",\"hello world3\"]})", + "id": "884a4663016ef510", + "outputs": [], + "execution_count": 13 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T05:23:09.254264Z", + "start_time": "2026-08-01T05:23:09.192955Z" + } + }, + "cell_type": "code", + "source": [ + "from rich import print as rp\n", + "\n", + "rp(res)" + ], + "id": "8426d824fcc37841", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_values'\u001B[0m: \u001B[1m[\u001B[0m\u001B[32m'hello world1'\u001B[0m, \u001B[32m'hello world2'\u001B[0m, \u001B[32m'hello world3'\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[32m'entries'\u001B[0m: \u001B[1m[\u001B[0m\u001B[1m(\u001B[0m\u001B[32m'hello'\u001B[0m, \u001B[1;36m1\u001B[0m\u001B[1m)\u001B[0m, \u001B[1m(\u001B[0m\u001B[32m'world1'\u001B[0m, \u001B[1;36m1\u001B[0m\u001B[1m)\u001B[0m, \u001B[1m(\u001B[0m\u001B[32m'hello'\u001B[0m, \u001B[1;36m1\u001B[0m\u001B[1m)\u001B[0m, \u001B[1m(\u001B[0m\u001B[32m'world2'\u001B[0m, \u001B[1;36m1\u001B[0m\u001B[1m)\u001B[0m, \u001B[1m(\u001B[0m\u001B[32m'hello'\u001B[0m, \u001B[1;36m1\u001B[0m\u001B[1m)\u001B[0m, \u001B[1m(\u001B[0m\u001B[32m'world3'\u001B[0m, \u001B[1;36m1\u001B[0m\u001B[1m)\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[32m'word_counts'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'hello'\u001B[0m: \u001B[1;36m3\u001B[0m, \u001B[32m'world1'\u001B[0m: \u001B[1;36m1\u001B[0m, \u001B[32m'world2'\u001B[0m: \u001B[1;36m1\u001B[0m, \u001B[32m'world3'\u001B[0m: \u001B[1;36m1\u001B[0m\u001B[1m}\u001B[0m\n", + "\u001B[1m}\u001B[0m\n" + ], + "text/html": [ + "
{\n",
+       "    'input_values': ['hello world1', 'hello world2', 'hello world3'],\n",
+       "    'entries': [('hello', 1), ('world1', 1), ('hello', 1), ('world2', 1), ('hello', 1), ('world3', 1)],\n",
+       "    'word_counts': {'hello': 3, 'world1': 1, 'world2': 1, 'world3': 1}\n",
+       "}\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 14 + } + ], + "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 +} diff --git a/chapter02/04_ReAct_static_loop.ipynb b/chapter02/04_ReAct_static_loop.ipynb new file mode 100644 index 0000000..3b9b353 --- /dev/null +++ b/chapter02/04_ReAct_static_loop.ipynb @@ -0,0 +1,560 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-01T06:25:04.231749Z", + "start_time": "2026-08-01T06:25:04.212936Z" + } + }, + "source": [ + "\"\"\"\n", + "使用 builder.add_conditional_edges(\"llm_node\", router) 做静态分支路由来实现ReAct模型\n", + "\"\"\"\n", + "\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from langchain.chat_models import init_chat_model\n", + "from langchain.tools import tool\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")\n", + "\n", + "\n", + "@tool(description=\"查询天气的工具,如果出现网络波动调用失败请重试(概率性问题)\")\n", + "def get_weather(city):\n", + " return \"It's sunny in %s\" % city\n", + "\n", + "\n", + "llm_with_tool = llm.bind_tools(tools=[get_weather])" + ], + "outputs": [], + "execution_count": 67 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:25:04.242598Z", + "start_time": "2026-08-01T06:25:04.233604Z" + } + }, + "cell_type": "code", + "source": [ + "from rich import print as rp\n", + "\n", + "# res = llm_with_tool.invoke(\"今天北京天气怎么样?\")\n", + "# rp(res)" + ], + "id": "94bff18fdf2f54e1", + "outputs": [], + "execution_count": 68 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:25:04.248423Z", + "start_time": "2026-08-01T06:25:04.243048Z" + } + }, + "cell_type": "code", + "source": [ + "from random import randint\n", + "from langgraph.graph import MessagesState\n", + "from langchain_core.messages import HumanMessage, ToolMessage\n", + "\n", + "\n", + "class OverallState(MessagesState):\n", + " user_input: str\n", + " final_output: str\n", + "\n", + "\n", + "def input_node(state: OverallState) -> OverallState:\n", + " return {\n", + " \"messages\": [HumanMessage(state[\"user_input\"])]\n", + " }\n", + "\n", + "\n", + "def llm_node(state: OverallState) -> OverallState:\n", + " ai_msg = llm_with_tool.invoke(state[\"messages\"])\n", + " return {\n", + " \"messages\": [ai_msg]\n", + " }\n", + "\n", + "\n", + "def tool_node(state: OverallState) -> OverallState:\n", + " messages = state[\"messages\"]\n", + " ai_msg = messages[-1]\n", + " tool_calls = ai_msg.tool_calls\n", + " for tool_call in tool_calls:\n", + " # tool_calls=[\n", + " # {\n", + " # 'name': 'get_weather',\n", + " # 'args': {'city': '北京'},\n", + " # 'id': 'call_dd68b38a18d146d3bccc27ac',\n", + " # 'type': 'tool_call'\n", + " # }\n", + " # ],\n", + " if tool_call[\"name\"] == \"get_weather\":\n", + " if randint(0, 9) < 6:\n", + " messages.append(ToolMessage(\n", + " content=\"网络波动请重试\",\n", + " tool_call_id=tool_call[\"id\"]\n", + " ))\n", + " else:\n", + " messages.append(get_weather.invoke(tool_call))\n", + " elif tool_call[\"name\"] == \"get_news\":\n", + " pass\n", + " else:\n", + " messages.append(ToolMessage(\n", + " content=\"工具名称错误\",\n", + " tool_call_id=tool_call[\"id\"]\n", + " ))\n", + " return {\n", + " \"messages\": messages\n", + " }\n", + "\n", + "\n", + "def output_node(state: OverallState) -> OverallState:\n", + " return {\n", + " \"final_output\": state[\"messages\"][-1].content\n", + " }" + ], + "id": "8704e6159960c974", + "outputs": [], + "execution_count": 69 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:25:04.259422Z", + "start_time": "2026-08-01T06:25:04.251235Z" + } + }, + "cell_type": "code", + "source": [ + "from typing import Literal\n", + "\n", + "\n", + "def router(state: OverallState) -> Literal[\"tool_node\", \"output_node\"]:\n", + " messages = state[\"messages\"]\n", + " last_msg = messages[-1]\n", + " if last_msg.tool_calls:\n", + " return \"tool_node\"\n", + " else:\n", + " return \"output_node\"" + ], + "id": "1abb612dd382567b", + "outputs": [], + "execution_count": 70 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:25:04.273994Z", + "start_time": "2026-08-01T06:25:04.260661Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "builder = StateGraph(state_schema=OverallState)\n", + "builder.add_node(\"input_node\", input_node)\n", + "builder.add_node(\"llm_node\", llm_node)\n", + "builder.add_node(\"tool_node\", tool_node)\n", + "builder.add_node(\"output_node\", output_node)\n", + "\n", + "builder.add_edge(START, \"input_node\")\n", + "builder.add_edge(\"input_node\", \"llm_node\")\n", + "builder.add_conditional_edges(\"llm_node\", router)\n", + "builder.add_edge(\"tool_node\", \"llm_node\")\n", + "builder.add_edge(\"output_node\", END)" + ], + "id": "19a3dccbc99528be", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 71 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:25:04.710996Z", + "start_time": "2026-08-01T06:25:04.278884Z" + } + }, + "cell_type": "code", + "source": [ + "graph=builder.compile()\n", + "\n", + "from IPython.display import display\n", + "display(graph)" + ], + "id": "d21399d1e5e0d13e", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 72 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:25:10.410791Z", + "start_time": "2026-08-01T06:25:04.712121Z" + } + }, + "cell_type": "code", + "source": [ + "res=graph.invoke({\"user_input\": \"今天北京天气怎么样?\"})\n", + "rp(res)" + ], + "id": "a59abf813489ce59", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m{\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m: \u001B[1m[\u001B[0m\n", + " \u001B[1;35mHumanMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'今天北京天气怎么样?'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'1faaf739-e9b1-466c-afe5-66a2adb4a56a'\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'refusal'\u001B[0m: \u001B[3;35mNone\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'token_usage'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'completion_tokens'\u001B[0m: \u001B[1;36m445\u001B[0m,\n", + " \u001B[32m'prompt_tokens'\u001B[0m: \u001B[1;36m277\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m722\u001B[0m,\n", + " \u001B[32m'completion_tokens_details'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'accepted_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'audio_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'reasoning_tokens'\u001B[0m: \u001B[1;36m415\u001B[0m,\n", + " \u001B[32m'rejected_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'text_tokens'\u001B[0m: \u001B[1;36m445\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'prompt_tokens_details'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'system_fingerprint'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'chatcmpl-e4455be0-ae94-94c1-822e-aba8ab733caa'\u001B[0m,\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'tool_calls'\u001B[0m,\n", + " \u001B[32m'logprobs'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--019fbbff-64ca-7472-945f-04d88c4591e7-0'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'name'\u001B[0m: \u001B[32m'get_weather'\u001B[0m,\n", + " \u001B[32m'args'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'city'\u001B[0m: \u001B[32m'北京'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'call_e6943007c96f4f68b1cf347a'\u001B[0m,\n", + " \u001B[32m'type'\u001B[0m: \u001B[32m'tool_call'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m277\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m445\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m722\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m415\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mToolMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'网络波动请重试'\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'f910e3c6-10ab-451c-b245-bcee5df7cc5e'\u001B[0m,\n", + " \u001B[33mtool_call_id\u001B[0m=\u001B[32m'call_e6943007c96f4f68b1cf347a'\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'refusal'\u001B[0m: \u001B[3;35mNone\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'token_usage'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'completion_tokens'\u001B[0m: \u001B[1;36m76\u001B[0m,\n", + " \u001B[32m'prompt_tokens'\u001B[0m: \u001B[1;36m324\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m400\u001B[0m,\n", + " \u001B[32m'completion_tokens_details'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'accepted_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'audio_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'reasoning_tokens'\u001B[0m: \u001B[1;36m46\u001B[0m,\n", + " \u001B[32m'rejected_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'text_tokens'\u001B[0m: \u001B[1;36m76\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'prompt_tokens_details'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'system_fingerprint'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'chatcmpl-dad4c739-5e80-9372-b198-ecd7b6d74f59'\u001B[0m,\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'tool_calls'\u001B[0m,\n", + " \u001B[32m'logprobs'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--019fbbff-722d-7c62-9855-7ecc715fd002-0'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'name'\u001B[0m: \u001B[32m'get_weather'\u001B[0m,\n", + " \u001B[32m'args'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'city'\u001B[0m: \u001B[32m'北京'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'call_46ea25112281427198ef735a'\u001B[0m,\n", + " \u001B[32m'type'\u001B[0m: \u001B[32m'tool_call'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m324\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m76\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m400\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m46\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mToolMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m\"It\u001B[0m\u001B[32m's sunny in 北京\"\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'get_weather'\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'c0370ecc-dd74-4f49-9c10-edf9db1952c8'\u001B[0m,\n", + " \u001B[33mtool_call_id\u001B[0m=\u001B[32m'call_46ea25112281427198ef735a'\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'北京今天晴天。'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'refusal'\u001B[0m: \u001B[3;35mNone\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'token_usage'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'completion_tokens'\u001B[0m: \u001B[1;36m120\u001B[0m,\n", + " \u001B[32m'prompt_tokens'\u001B[0m: \u001B[1;36m373\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m493\u001B[0m,\n", + " \u001B[32m'completion_tokens_details'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'accepted_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'audio_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'reasoning_tokens'\u001B[0m: \u001B[1;36m111\u001B[0m,\n", + " \u001B[32m'rejected_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'text_tokens'\u001B[0m: \u001B[1;36m120\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'prompt_tokens_details'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'system_fingerprint'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'chatcmpl-f17bc70e-1954-9db1-a384-1ce904a1c118'\u001B[0m,\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'stop'\u001B[0m,\n", + " \u001B[32m'logprobs'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--019fbbff-7554-7ed0-b994-e91d6be44b61-0'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m373\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m120\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m493\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m111\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m]\u001B[0m,\n", + " \u001B[32m'user_input'\u001B[0m: \u001B[32m'今天北京天气怎么样?'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \u001B[32m'北京今天晴天。'\u001B[0m\n", + "\u001B[1m}\u001B[0m\n" + ], + "text/html": [ + "
{\n",
+       "    'messages': [\n",
+       "        HumanMessage(\n",
+       "            content='今天北京天气怎么样?',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={},\n",
+       "            id='1faaf739-e9b1-466c-afe5-66a2adb4a56a'\n",
+       "        ),\n",
+       "        AIMessage(\n",
+       "            content='',\n",
+       "            additional_kwargs={'refusal': None},\n",
+       "            response_metadata={\n",
+       "                'token_usage': {\n",
+       "                    'completion_tokens': 445,\n",
+       "                    'prompt_tokens': 277,\n",
+       "                    'total_tokens': 722,\n",
+       "                    'completion_tokens_details': {\n",
+       "                        'accepted_prediction_tokens': None,\n",
+       "                        'audio_tokens': None,\n",
+       "                        'reasoning_tokens': 415,\n",
+       "                        'rejected_prediction_tokens': None,\n",
+       "                        'text_tokens': 445\n",
+       "                    },\n",
+       "                    'prompt_tokens_details': None\n",
+       "                },\n",
+       "                'model_provider': 'openai',\n",
+       "                'model_name': 'qwen3.6-flash',\n",
+       "                'system_fingerprint': None,\n",
+       "                'id': 'chatcmpl-e4455be0-ae94-94c1-822e-aba8ab733caa',\n",
+       "                'finish_reason': 'tool_calls',\n",
+       "                'logprobs': None\n",
+       "            },\n",
+       "            id='lc_run--019fbbff-64ca-7472-945f-04d88c4591e7-0',\n",
+       "            tool_calls=[\n",
+       "                {\n",
+       "                    'name': 'get_weather',\n",
+       "                    'args': {'city': '北京'},\n",
+       "                    'id': 'call_e6943007c96f4f68b1cf347a',\n",
+       "                    'type': 'tool_call'\n",
+       "                }\n",
+       "            ],\n",
+       "            invalid_tool_calls=[],\n",
+       "            usage_metadata={\n",
+       "                'input_tokens': 277,\n",
+       "                'output_tokens': 445,\n",
+       "                'total_tokens': 722,\n",
+       "                'input_token_details': {},\n",
+       "                'output_token_details': {'reasoning': 415}\n",
+       "            }\n",
+       "        ),\n",
+       "        ToolMessage(\n",
+       "            content='网络波动请重试',\n",
+       "            id='f910e3c6-10ab-451c-b245-bcee5df7cc5e',\n",
+       "            tool_call_id='call_e6943007c96f4f68b1cf347a'\n",
+       "        ),\n",
+       "        AIMessage(\n",
+       "            content='',\n",
+       "            additional_kwargs={'refusal': None},\n",
+       "            response_metadata={\n",
+       "                'token_usage': {\n",
+       "                    'completion_tokens': 76,\n",
+       "                    'prompt_tokens': 324,\n",
+       "                    'total_tokens': 400,\n",
+       "                    'completion_tokens_details': {\n",
+       "                        'accepted_prediction_tokens': None,\n",
+       "                        'audio_tokens': None,\n",
+       "                        'reasoning_tokens': 46,\n",
+       "                        'rejected_prediction_tokens': None,\n",
+       "                        'text_tokens': 76\n",
+       "                    },\n",
+       "                    'prompt_tokens_details': None\n",
+       "                },\n",
+       "                'model_provider': 'openai',\n",
+       "                'model_name': 'qwen3.6-flash',\n",
+       "                'system_fingerprint': None,\n",
+       "                'id': 'chatcmpl-dad4c739-5e80-9372-b198-ecd7b6d74f59',\n",
+       "                'finish_reason': 'tool_calls',\n",
+       "                'logprobs': None\n",
+       "            },\n",
+       "            id='lc_run--019fbbff-722d-7c62-9855-7ecc715fd002-0',\n",
+       "            tool_calls=[\n",
+       "                {\n",
+       "                    'name': 'get_weather',\n",
+       "                    'args': {'city': '北京'},\n",
+       "                    'id': 'call_46ea25112281427198ef735a',\n",
+       "                    'type': 'tool_call'\n",
+       "                }\n",
+       "            ],\n",
+       "            invalid_tool_calls=[],\n",
+       "            usage_metadata={\n",
+       "                'input_tokens': 324,\n",
+       "                'output_tokens': 76,\n",
+       "                'total_tokens': 400,\n",
+       "                'input_token_details': {},\n",
+       "                'output_token_details': {'reasoning': 46}\n",
+       "            }\n",
+       "        ),\n",
+       "        ToolMessage(\n",
+       "            content=\"It's sunny in 北京\",\n",
+       "            name='get_weather',\n",
+       "            id='c0370ecc-dd74-4f49-9c10-edf9db1952c8',\n",
+       "            tool_call_id='call_46ea25112281427198ef735a'\n",
+       "        ),\n",
+       "        AIMessage(\n",
+       "            content='北京今天晴天。',\n",
+       "            additional_kwargs={'refusal': None},\n",
+       "            response_metadata={\n",
+       "                'token_usage': {\n",
+       "                    'completion_tokens': 120,\n",
+       "                    'prompt_tokens': 373,\n",
+       "                    'total_tokens': 493,\n",
+       "                    'completion_tokens_details': {\n",
+       "                        'accepted_prediction_tokens': None,\n",
+       "                        'audio_tokens': None,\n",
+       "                        'reasoning_tokens': 111,\n",
+       "                        'rejected_prediction_tokens': None,\n",
+       "                        'text_tokens': 120\n",
+       "                    },\n",
+       "                    'prompt_tokens_details': None\n",
+       "                },\n",
+       "                'model_provider': 'openai',\n",
+       "                'model_name': 'qwen3.6-flash',\n",
+       "                'system_fingerprint': None,\n",
+       "                'id': 'chatcmpl-f17bc70e-1954-9db1-a384-1ce904a1c118',\n",
+       "                'finish_reason': 'stop',\n",
+       "                'logprobs': None\n",
+       "            },\n",
+       "            id='lc_run--019fbbff-7554-7ed0-b994-e91d6be44b61-0',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            usage_metadata={\n",
+       "                'input_tokens': 373,\n",
+       "                'output_tokens': 120,\n",
+       "                'total_tokens': 493,\n",
+       "                'input_token_details': {},\n",
+       "                'output_token_details': {'reasoning': 111}\n",
+       "            }\n",
+       "        )\n",
+       "    ],\n",
+       "    'user_input': '今天北京天气怎么样?',\n",
+       "    'final_output': '北京今天晴天。'\n",
+       "}\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 73 + } + ], + "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 +} diff --git a/chapter02/05_ReAct_dynamic_loop.ipynb b/chapter02/05_ReAct_dynamic_loop.ipynb new file mode 100644 index 0000000..abf8e97 --- /dev/null +++ b/chapter02/05_ReAct_dynamic_loop.ipynb @@ -0,0 +1,675 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-01T06:44:59.305672Z", + "start_time": "2026-08-01T06:44:59.280981Z" + } + }, + "source": [ + "\"\"\"\n", + "使用Command()来实现节点跳转,实现ReAct模型\n", + "\n", + " if ai_msg.tool_calls:\n", + " goto = \"tool_node\"\n", + " else:\n", + " goto = \"output_node\"\n", + " return Command(\n", + " goto=goto,\n", + " update={\n", + " \"messages\": ai_msg\n", + " }\n", + " )\n", + "\"\"\"\n", + "\n", + "import os\n", + "\n", + "from typing import Literal\n", + "from dotenv import load_dotenv\n", + "from langchain.chat_models import init_chat_model\n", + "from langchain.tools import tool\n", + "from langgraph.types import Command\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")\n", + "\n", + "\n", + "@tool(description=\"查询天气的工具,如果出现网络波动调用失败请重试(概率性问题)\")\n", + "def get_weather(city):\n", + " return \"It's sunny in %s\" % city\n", + "\n", + "\n", + "llm_with_tool = llm.bind_tools(tools=[get_weather])" + ], + "outputs": [], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:44:59.313318Z", + "start_time": "2026-08-01T06:44:59.309646Z" + } + }, + "cell_type": "code", + "source": [ + "from rich import print as rp\n", + "\n", + "# res = llm_with_tool.invoke(\"今天北京天气怎么样?\")\n", + "# rp(res)" + ], + "id": "94bff18fdf2f54e1", + "outputs": [], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:44:59.318736Z", + "start_time": "2026-08-01T06:44:59.313791Z" + } + }, + "cell_type": "code", + "source": [ + "from random import randint\n", + "from langgraph.graph import MessagesState\n", + "from langchain_core.messages import HumanMessage, ToolMessage\n", + "\n", + "\n", + "class OverallState(MessagesState):\n", + " user_input: str\n", + " final_output: str\n", + "\n", + "\n", + "def input_node(state: OverallState) -> OverallState:\n", + " return {\n", + " \"messages\": [HumanMessage(state[\"user_input\"])]\n", + " }\n", + "\n", + "\n", + "def llm_node(state: OverallState) -> Command[Literal[\"tool_node\", \"output_node\"]]:\n", + " ai_msg = llm_with_tool.invoke(state[\"messages\"])\n", + " if ai_msg.tool_calls:\n", + " goto = \"tool_node\"\n", + " else:\n", + " goto = \"output_node\"\n", + " return Command(\n", + " goto=goto,\n", + " update={\n", + " \"messages\": ai_msg\n", + " }\n", + " )\n", + "\n", + "\n", + "def tool_node(state: OverallState) -> OverallState:\n", + " messages = state[\"messages\"]\n", + " ai_msg = messages[-1]\n", + " tool_calls = ai_msg.tool_calls\n", + " for tool_call in tool_calls:\n", + " # tool_calls=[\n", + " # {\n", + " # 'name': 'get_weather',\n", + " # 'args': {'city': '北京'},\n", + " # 'id': 'call_dd68b38a18d146d3bccc27ac',\n", + " # 'type': 'tool_call'\n", + " # }\n", + " # ],\n", + " if tool_call[\"name\"] == \"get_weather\":\n", + " if randint(0, 9) < 6:\n", + " messages.append(ToolMessage(\n", + " content=\"网络波动请重试\",\n", + " tool_call_id=tool_call[\"id\"]\n", + " ))\n", + " else:\n", + " messages.append(get_weather.invoke(tool_call))\n", + " elif tool_call[\"name\"] == \"get_news\":\n", + " pass\n", + " else:\n", + " messages.append(ToolMessage(\n", + " content=\"工具名称错误\",\n", + " tool_call_id=tool_call[\"id\"]\n", + " ))\n", + " return {\n", + " \"messages\": messages\n", + " }\n", + "\n", + "\n", + "def output_node(state: OverallState) -> OverallState:\n", + " return {\n", + " \"final_output\": state[\"messages\"][-1].content\n", + " }" + ], + "id": "8704e6159960c974", + "outputs": [], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:44:59.328599Z", + "start_time": "2026-08-01T06:44:59.324182Z" + } + }, + "cell_type": "code", + "source": [ + "from typing import Literal\n", + "\n", + "\n", + "# def router(state: OverallState) -> Literal[\"tool_node\", \"output_node\"]:\n", + "# messages = state[\"messages\"]\n", + "# last_msg = messages[-1]\n", + "# if last_msg.tool_calls:\n", + "# return \"tool_node\"\n", + "# else:\n", + "# return \"output_node\"" + ], + "id": "1abb612dd382567b", + "outputs": [], + "execution_count": 6 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:44:59.342397Z", + "start_time": "2026-08-01T06:44:59.329035Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "builder = StateGraph(state_schema=OverallState)\n", + "builder.add_node(\"input_node\", input_node)\n", + "builder.add_node(\"llm_node\", llm_node)\n", + "builder.add_node(\"tool_node\", tool_node)\n", + "builder.add_node(\"output_node\", output_node)\n", + "\n", + "builder.add_edge(START, \"input_node\")\n", + "builder.add_edge(\"input_node\", \"llm_node\")\n", + "# builder.add_conditional_edges(\"llm_node\", router)\n", + "builder.add_edge(\"tool_node\", \"llm_node\")\n", + "builder.add_edge(\"output_node\", END)" + ], + "id": "19a3dccbc99528be", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 7 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:44:59.729157Z", + "start_time": "2026-08-01T06:44:59.342820Z" + } + }, + "cell_type": "code", + "source": [ + "graph = builder.compile()\n", + "\n", + "from IPython.display import display\n", + "\n", + "display(graph)" + ], + "id": "d21399d1e5e0d13e", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 8 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T06:45:05.384753Z", + "start_time": "2026-08-01T06:44:59.730926Z" + } + }, + "cell_type": "code", + "source": [ + "res = graph.invoke({\"user_input\": \"今天北京天气怎么样?\"})\n", + "rp(res)" + ], + "id": "a59abf813489ce59", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m{\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m: \u001B[1m[\u001B[0m\n", + " \u001B[1;35mHumanMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'今天北京天气怎么样?'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'375e5a7b-2b13-4565-b013-bb9aad06d265'\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'refusal'\u001B[0m: \u001B[3;35mNone\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'token_usage'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'completion_tokens'\u001B[0m: \u001B[1;36m366\u001B[0m,\n", + " \u001B[32m'prompt_tokens'\u001B[0m: \u001B[1;36m277\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m643\u001B[0m,\n", + " \u001B[32m'completion_tokens_details'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'accepted_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'audio_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'reasoning_tokens'\u001B[0m: \u001B[1;36m336\u001B[0m,\n", + " \u001B[32m'rejected_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'text_tokens'\u001B[0m: \u001B[1;36m366\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'prompt_tokens_details'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'system_fingerprint'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'chatcmpl-f991a856-7238-96a5-852a-0dac85149a32'\u001B[0m,\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'tool_calls'\u001B[0m,\n", + " \u001B[32m'logprobs'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--019fbc11-a0d9-7d33-93ec-ff8fd1f8142b-0'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'name'\u001B[0m: \u001B[32m'get_weather'\u001B[0m,\n", + " \u001B[32m'args'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'city'\u001B[0m: \u001B[32m'北京'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'call_d93cb082ae4540a5bf2c9f2d'\u001B[0m,\n", + " \u001B[32m'type'\u001B[0m: \u001B[32m'tool_call'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m277\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m366\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m643\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m336\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mToolMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'网络波动请重试'\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'cdbb3236-17b7-4621-bd65-7ce6f8f56b4b'\u001B[0m,\n", + " \u001B[33mtool_call_id\u001B[0m=\u001B[32m'call_d93cb082ae4540a5bf2c9f2d'\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'refusal'\u001B[0m: \u001B[3;35mNone\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'token_usage'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'completion_tokens'\u001B[0m: \u001B[1;36m52\u001B[0m,\n", + " \u001B[32m'prompt_tokens'\u001B[0m: \u001B[1;36m324\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m376\u001B[0m,\n", + " \u001B[32m'completion_tokens_details'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'accepted_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'audio_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'reasoning_tokens'\u001B[0m: \u001B[1;36m22\u001B[0m,\n", + " \u001B[32m'rejected_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'text_tokens'\u001B[0m: \u001B[1;36m52\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'prompt_tokens_details'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'system_fingerprint'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'chatcmpl-d8fd2cc2-7828-9b4a-aee2-9f1955083dd0'\u001B[0m,\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'tool_calls'\u001B[0m,\n", + " \u001B[32m'logprobs'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--019fbc11-ac91-7872-aec3-9052c524c035-0'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'name'\u001B[0m: \u001B[32m'get_weather'\u001B[0m,\n", + " \u001B[32m'args'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'city'\u001B[0m: \u001B[32m'北京'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'call_3ecd681eab7e4e56adfd0a38'\u001B[0m,\n", + " \u001B[32m'type'\u001B[0m: \u001B[32m'tool_call'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m324\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m52\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m376\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m22\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mToolMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'网络波动请重试'\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'e40500b2-d6c4-43d6-8e2c-dd7bea88ca75'\u001B[0m,\n", + " \u001B[33mtool_call_id\u001B[0m=\u001B[32m'call_3ecd681eab7e4e56adfd0a38'\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'refusal'\u001B[0m: \u001B[3;35mNone\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'token_usage'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'completion_tokens'\u001B[0m: \u001B[1;36m56\u001B[0m,\n", + " \u001B[32m'prompt_tokens'\u001B[0m: \u001B[1;36m371\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m427\u001B[0m,\n", + " \u001B[32m'completion_tokens_details'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'accepted_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'audio_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'reasoning_tokens'\u001B[0m: \u001B[1;36m26\u001B[0m,\n", + " \u001B[32m'rejected_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'text_tokens'\u001B[0m: \u001B[1;36m56\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'prompt_tokens_details'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'system_fingerprint'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'chatcmpl-de91122e-a999-97b6-be93-a2a869d0af99'\u001B[0m,\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'tool_calls'\u001B[0m,\n", + " \u001B[32m'logprobs'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--019fbc11-af56-7e91-96d1-391ef41f89b7-0'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'name'\u001B[0m: \u001B[32m'get_weather'\u001B[0m,\n", + " \u001B[32m'args'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'city'\u001B[0m: \u001B[32m'北京'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'call_0ebdb431a7b7466cb552a1fe'\u001B[0m,\n", + " \u001B[32m'type'\u001B[0m: \u001B[32m'tool_call'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m371\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m56\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m427\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m26\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mToolMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m\"It\u001B[0m\u001B[32m's sunny in 北京\"\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'get_weather'\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'c5974827-9abd-449b-99df-fc88570a611a'\u001B[0m,\n", + " \u001B[33mtool_call_id\u001B[0m=\u001B[32m'call_0ebdb431a7b7466cb552a1fe'\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'今天北京天气晴朗。'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'refusal'\u001B[0m: \u001B[3;35mNone\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'token_usage'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'completion_tokens'\u001B[0m: \u001B[1;36m111\u001B[0m,\n", + " \u001B[32m'prompt_tokens'\u001B[0m: \u001B[1;36m452\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m563\u001B[0m,\n", + " \u001B[32m'completion_tokens_details'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'accepted_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'audio_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'reasoning_tokens'\u001B[0m: \u001B[1;36m101\u001B[0m,\n", + " \u001B[32m'rejected_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'text_tokens'\u001B[0m: \u001B[1;36m111\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'prompt_tokens_details'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'system_fingerprint'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'chatcmpl-a81e8a43-2e43-9a55-9837-98eb47b58d37'\u001B[0m,\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'stop'\u001B[0m,\n", + " \u001B[32m'logprobs'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--019fbc11-b288-7033-aa7d-9b494f43d4ec-0'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m452\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m111\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m563\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m101\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m]\u001B[0m,\n", + " \u001B[32m'user_input'\u001B[0m: \u001B[32m'今天北京天气怎么样?'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \u001B[32m'今天北京天气晴朗。'\u001B[0m\n", + "\u001B[1m}\u001B[0m\n" + ], + "text/html": [ + "
{\n",
+       "    'messages': [\n",
+       "        HumanMessage(\n",
+       "            content='今天北京天气怎么样?',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={},\n",
+       "            id='375e5a7b-2b13-4565-b013-bb9aad06d265'\n",
+       "        ),\n",
+       "        AIMessage(\n",
+       "            content='',\n",
+       "            additional_kwargs={'refusal': None},\n",
+       "            response_metadata={\n",
+       "                'token_usage': {\n",
+       "                    'completion_tokens': 366,\n",
+       "                    'prompt_tokens': 277,\n",
+       "                    'total_tokens': 643,\n",
+       "                    'completion_tokens_details': {\n",
+       "                        'accepted_prediction_tokens': None,\n",
+       "                        'audio_tokens': None,\n",
+       "                        'reasoning_tokens': 336,\n",
+       "                        'rejected_prediction_tokens': None,\n",
+       "                        'text_tokens': 366\n",
+       "                    },\n",
+       "                    'prompt_tokens_details': None\n",
+       "                },\n",
+       "                'model_provider': 'openai',\n",
+       "                'model_name': 'qwen3.6-flash',\n",
+       "                'system_fingerprint': None,\n",
+       "                'id': 'chatcmpl-f991a856-7238-96a5-852a-0dac85149a32',\n",
+       "                'finish_reason': 'tool_calls',\n",
+       "                'logprobs': None\n",
+       "            },\n",
+       "            id='lc_run--019fbc11-a0d9-7d33-93ec-ff8fd1f8142b-0',\n",
+       "            tool_calls=[\n",
+       "                {\n",
+       "                    'name': 'get_weather',\n",
+       "                    'args': {'city': '北京'},\n",
+       "                    'id': 'call_d93cb082ae4540a5bf2c9f2d',\n",
+       "                    'type': 'tool_call'\n",
+       "                }\n",
+       "            ],\n",
+       "            invalid_tool_calls=[],\n",
+       "            usage_metadata={\n",
+       "                'input_tokens': 277,\n",
+       "                'output_tokens': 366,\n",
+       "                'total_tokens': 643,\n",
+       "                'input_token_details': {},\n",
+       "                'output_token_details': {'reasoning': 336}\n",
+       "            }\n",
+       "        ),\n",
+       "        ToolMessage(\n",
+       "            content='网络波动请重试',\n",
+       "            id='cdbb3236-17b7-4621-bd65-7ce6f8f56b4b',\n",
+       "            tool_call_id='call_d93cb082ae4540a5bf2c9f2d'\n",
+       "        ),\n",
+       "        AIMessage(\n",
+       "            content='',\n",
+       "            additional_kwargs={'refusal': None},\n",
+       "            response_metadata={\n",
+       "                'token_usage': {\n",
+       "                    'completion_tokens': 52,\n",
+       "                    'prompt_tokens': 324,\n",
+       "                    'total_tokens': 376,\n",
+       "                    'completion_tokens_details': {\n",
+       "                        'accepted_prediction_tokens': None,\n",
+       "                        'audio_tokens': None,\n",
+       "                        'reasoning_tokens': 22,\n",
+       "                        'rejected_prediction_tokens': None,\n",
+       "                        'text_tokens': 52\n",
+       "                    },\n",
+       "                    'prompt_tokens_details': None\n",
+       "                },\n",
+       "                'model_provider': 'openai',\n",
+       "                'model_name': 'qwen3.6-flash',\n",
+       "                'system_fingerprint': None,\n",
+       "                'id': 'chatcmpl-d8fd2cc2-7828-9b4a-aee2-9f1955083dd0',\n",
+       "                'finish_reason': 'tool_calls',\n",
+       "                'logprobs': None\n",
+       "            },\n",
+       "            id='lc_run--019fbc11-ac91-7872-aec3-9052c524c035-0',\n",
+       "            tool_calls=[\n",
+       "                {\n",
+       "                    'name': 'get_weather',\n",
+       "                    'args': {'city': '北京'},\n",
+       "                    'id': 'call_3ecd681eab7e4e56adfd0a38',\n",
+       "                    'type': 'tool_call'\n",
+       "                }\n",
+       "            ],\n",
+       "            invalid_tool_calls=[],\n",
+       "            usage_metadata={\n",
+       "                'input_tokens': 324,\n",
+       "                'output_tokens': 52,\n",
+       "                'total_tokens': 376,\n",
+       "                'input_token_details': {},\n",
+       "                'output_token_details': {'reasoning': 22}\n",
+       "            }\n",
+       "        ),\n",
+       "        ToolMessage(\n",
+       "            content='网络波动请重试',\n",
+       "            id='e40500b2-d6c4-43d6-8e2c-dd7bea88ca75',\n",
+       "            tool_call_id='call_3ecd681eab7e4e56adfd0a38'\n",
+       "        ),\n",
+       "        AIMessage(\n",
+       "            content='',\n",
+       "            additional_kwargs={'refusal': None},\n",
+       "            response_metadata={\n",
+       "                'token_usage': {\n",
+       "                    'completion_tokens': 56,\n",
+       "                    'prompt_tokens': 371,\n",
+       "                    'total_tokens': 427,\n",
+       "                    'completion_tokens_details': {\n",
+       "                        'accepted_prediction_tokens': None,\n",
+       "                        'audio_tokens': None,\n",
+       "                        'reasoning_tokens': 26,\n",
+       "                        'rejected_prediction_tokens': None,\n",
+       "                        'text_tokens': 56\n",
+       "                    },\n",
+       "                    'prompt_tokens_details': None\n",
+       "                },\n",
+       "                'model_provider': 'openai',\n",
+       "                'model_name': 'qwen3.6-flash',\n",
+       "                'system_fingerprint': None,\n",
+       "                'id': 'chatcmpl-de91122e-a999-97b6-be93-a2a869d0af99',\n",
+       "                'finish_reason': 'tool_calls',\n",
+       "                'logprobs': None\n",
+       "            },\n",
+       "            id='lc_run--019fbc11-af56-7e91-96d1-391ef41f89b7-0',\n",
+       "            tool_calls=[\n",
+       "                {\n",
+       "                    'name': 'get_weather',\n",
+       "                    'args': {'city': '北京'},\n",
+       "                    'id': 'call_0ebdb431a7b7466cb552a1fe',\n",
+       "                    'type': 'tool_call'\n",
+       "                }\n",
+       "            ],\n",
+       "            invalid_tool_calls=[],\n",
+       "            usage_metadata={\n",
+       "                'input_tokens': 371,\n",
+       "                'output_tokens': 56,\n",
+       "                'total_tokens': 427,\n",
+       "                'input_token_details': {},\n",
+       "                'output_token_details': {'reasoning': 26}\n",
+       "            }\n",
+       "        ),\n",
+       "        ToolMessage(\n",
+       "            content=\"It's sunny in 北京\",\n",
+       "            name='get_weather',\n",
+       "            id='c5974827-9abd-449b-99df-fc88570a611a',\n",
+       "            tool_call_id='call_0ebdb431a7b7466cb552a1fe'\n",
+       "        ),\n",
+       "        AIMessage(\n",
+       "            content='今天北京天气晴朗。',\n",
+       "            additional_kwargs={'refusal': None},\n",
+       "            response_metadata={\n",
+       "                'token_usage': {\n",
+       "                    'completion_tokens': 111,\n",
+       "                    'prompt_tokens': 452,\n",
+       "                    'total_tokens': 563,\n",
+       "                    'completion_tokens_details': {\n",
+       "                        'accepted_prediction_tokens': None,\n",
+       "                        'audio_tokens': None,\n",
+       "                        'reasoning_tokens': 101,\n",
+       "                        'rejected_prediction_tokens': None,\n",
+       "                        'text_tokens': 111\n",
+       "                    },\n",
+       "                    'prompt_tokens_details': None\n",
+       "                },\n",
+       "                'model_provider': 'openai',\n",
+       "                'model_name': 'qwen3.6-flash',\n",
+       "                'system_fingerprint': None,\n",
+       "                'id': 'chatcmpl-a81e8a43-2e43-9a55-9837-98eb47b58d37',\n",
+       "                'finish_reason': 'stop',\n",
+       "                'logprobs': None\n",
+       "            },\n",
+       "            id='lc_run--019fbc11-b288-7033-aa7d-9b494f43d4ec-0',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            usage_metadata={\n",
+       "                'input_tokens': 452,\n",
+       "                'output_tokens': 111,\n",
+       "                'total_tokens': 563,\n",
+       "                'input_token_details': {},\n",
+       "                'output_token_details': {'reasoning': 101}\n",
+       "            }\n",
+       "        )\n",
+       "    ],\n",
+       "    'user_input': '今天北京天气怎么样?',\n",
+       "    'final_output': '今天北京天气晴朗。'\n",
+       "}\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 9 + } + ], + "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 +} diff --git a/chapter02/06_remaining_steps.ipynb b/chapter02/06_remaining_steps.ipynb new file mode 100644 index 0000000..143a559 --- /dev/null +++ b/chapter02/06_remaining_steps.ipynb @@ -0,0 +1,144 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-01T07:13:47.504750Z", + "start_time": "2026-08-01T07:13:47.481437Z" + } + }, + "source": [ + "\"\"\"\n", + "剩余step不足优雅退出\n", + "\"\"\"\n", + "from typing import TypedDict, Literal\n", + "\n", + "from langchain_core.runnables import RunnableConfig\n", + "from langgraph.managed import RemainingSteps\n", + "from loguru import logger\n", + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "\n", + "class OverallState(TypedDict):\n", + " remaining_steps: RemainingSteps\n", + "\n", + "\n", + "def loop_node(state: OverallState, config: RunnableConfig) -> OverallState:\n", + " current_step = config[\"metadata\"][\"langgraph_step\"]\n", + " remaining_steps = state[\"remaining_steps\"]\n", + " logger.info(f\"Current step: {current_step},Remaining step: {remaining_steps}\")\n", + "\n", + "\n", + "def router(state: OverallState) -> Literal[\"loop_node\", \"__end__\"]:\n", + " remaining_steps = state[\"remaining_steps\"]\n", + " if remaining_steps < 3:\n", + " logger.info(f\"Remaining steps: {remaining_steps}, Ending\")\n", + " return END\n", + " return \"loop_node\"\n", + "\n", + "\n", + "builder = StateGraph(state_schema=OverallState)\n", + "builder.add_node(\"loop_node\", loop_node)\n", + "builder.add_edge(START, \"loop_node\")\n", + "builder.add_conditional_edges(\"loop_node\", router)" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T07:13:47.564382Z", + "start_time": "2026-08-01T07:13:47.505305Z" + } + }, + "cell_type": "code", + "source": [ + "graph = builder.compile()\n", + "graph.invoke({}, config={\"recursion_limit\": 10})" + ], + "id": "2b912f7145140920", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001B[32m2026-08-01 15:13:47.508\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mloop_node\u001B[0m:\u001B[36m19\u001B[0m - \u001B[1mCurrent step: 1,Remaining step: 9\u001B[0m\n", + "\u001B[32m2026-08-01 15:13:47.508\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mloop_node\u001B[0m:\u001B[36m19\u001B[0m - \u001B[1mCurrent step: 2,Remaining step: 8\u001B[0m\n", + "\u001B[32m2026-08-01 15:13:47.509\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mloop_node\u001B[0m:\u001B[36m19\u001B[0m - \u001B[1mCurrent step: 3,Remaining step: 7\u001B[0m\n", + "\u001B[32m2026-08-01 15:13:47.509\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mloop_node\u001B[0m:\u001B[36m19\u001B[0m - \u001B[1mCurrent step: 4,Remaining step: 6\u001B[0m\n", + "\u001B[32m2026-08-01 15:13:47.510\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mloop_node\u001B[0m:\u001B[36m19\u001B[0m - \u001B[1mCurrent step: 5,Remaining step: 5\u001B[0m\n", + "\u001B[32m2026-08-01 15:13:47.510\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mloop_node\u001B[0m:\u001B[36m19\u001B[0m - \u001B[1mCurrent step: 6,Remaining step: 4\u001B[0m\n", + "\u001B[32m2026-08-01 15:13:47.511\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mloop_node\u001B[0m:\u001B[36m19\u001B[0m - \u001B[1mCurrent step: 7,Remaining step: 3\u001B[0m\n", + "\u001B[32m2026-08-01 15:13:47.511\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mloop_node\u001B[0m:\u001B[36m19\u001B[0m - \u001B[1mCurrent step: 8,Remaining step: 2\u001B[0m\n", + "\u001B[32m2026-08-01 15:13:47.511\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mrouter\u001B[0m:\u001B[36m25\u001B[0m - \u001B[1mRemaining steps: 2, Ending\u001B[0m\n" + ] + } + ], + "execution_count": 6 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-01T07:13:50.095130Z", + "start_time": "2026-08-01T07:13:47.569216Z" + } + }, + "cell_type": "code", + "source": [ + "from IPython.display import display\n", + "\n", + "display(graph)" + ], + "id": "7049233147500b5a", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 7 + } + ], + "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 +} diff --git a/chapter02/07_retry.ipynb b/chapter02/07_retry.ipynb new file mode 100644 index 0000000..d6fd22f --- /dev/null +++ b/chapter02/07_retry.ipynb @@ -0,0 +1,229 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-01T07:55:31.602128Z", + "start_time": "2026-08-01T07:55:29.787634Z" + } + }, + "source": [ + "from typing import TypedDict\n", + "\n", + "from langgraph.types import RetryPolicy\n", + "from loguru import logger\n", + "from requests import HTTPError\n", + "\n", + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "\n", + "class OverallState(TypedDict):\n", + " pass\n", + "\n", + "\n", + "def node_a(state: OverallState) -> OverallState:\n", + " logger.info(\"node_a\")\n", + " raise HTTPError\n", + "\n", + "\n", + "builder = StateGraph(state_schema=OverallState)\n", + "builder.add_node(\n", + " \"node_a\", node_a,\n", + " retry_policy=RetryPolicy(\n", + " max_attempts=3,\n", + " jitter=True\n", + " ))\n", + "\n", + "builder.add_edge(START,\"node_a\")\n", + "builder.add_edge(\"node_a\",END)\n", + "\n", + "graph=builder.compile()\n", + "\n", + "try:\n", + " graph.invoke({})\n", + "except HTTPError as e:\n", + " logger.exception(e)" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001B[32m2026-08-01 15:55:29.797\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_a\u001B[0m:\u001B[36m15\u001B[0m - \u001B[1mnode_a\u001B[0m\n", + "\u001B[32m2026-08-01 15:55:30.395\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_a\u001B[0m:\u001B[36m15\u001B[0m - \u001B[1mnode_a\u001B[0m\n", + "\u001B[32m2026-08-01 15:55:31.562\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_a\u001B[0m:\u001B[36m15\u001B[0m - \u001B[1mnode_a\u001B[0m\n", + "\u001B[32m2026-08-01 15:55:31.563\u001B[0m | \u001B[31m\u001B[1mERROR \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36m\u001B[0m:\u001B[36m35\u001B[0m - \u001B[31m\u001B[1m\u001B[0m\n", + "\u001B[33m\u001B[1mTraceback (most recent call last):\u001B[0m\n", + "\n", + " File \"\", line 198, in _run_module_as_main\n", + " File \"\", line 88, in _run_code\n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/ipykernel_launcher.py\", line 18, in \n", + " app.launch_new_instance()\n", + " │ └ >\n", + " └ \n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/ipykernel/kernelapp.py\", line 807, in start\n", + " self.io_loop.start()\n", + " │ │ └ \n", + " │ └ \n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/tornado/platform/asyncio.py\", line 211, in start\n", + " self.asyncio_loop.run_forever()\n", + " │ │ └ \n", + " │ └ <_UnixSelectorEventLoop running=True closed=False debug=False>\n", + " └ \n", + " File \"/Users/gqt/.local/share/uv/python/cpython-3.13.11-macos-aarch64-none/lib/python3.13/asyncio/base_events.py\", line 683, in run_forever\n", + " self._run_once()\n", + " │ └ \n", + " └ <_UnixSelectorEventLoop running=True closed=False debug=False>\n", + " File \"/Users/gqt/.local/share/uv/python/cpython-3.13.11-macos-aarch64-none/lib/python3.13/asyncio/base_events.py\", line 2050, in _run_once\n", + " handle._run()\n", + " │ └ \n", + " └ ()>\n", + " File \"/Users/gqt/.local/share/uv/python/cpython-3.13.11-macos-aarch64-none/lib/python3.13/asyncio/events.py\", line 89, in _run\n", + " self._context.run(self._callback, *self._args)\n", + " │ │ │ │ │ └ \n", + " │ │ │ │ └ ()>\n", + " │ │ │ └ \n", + " │ │ └ ()>\n", + " │ └ \n", + " └ ()>\n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/ipykernel/kernelbase.py\", line 621, in shell_main\n", + " await self.dispatch_shell(msg, subshell_id=subshell_id)\n", + " │ │ │ └ None\n", + " │ │ └ [, , ')>, , \n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/ipykernel/kernelbase.py\", line 478, in dispatch_shell\n", + " await result\n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/ipykernel/ipkernel.py\", line 372, in execute_request\n", + " await super().execute_request(stream, ident, parent)\n", + " │ │ └ {'header': {'msg_id': '8c406f25-ebbb-410a-aacc-a8bb28894b9b', 'username': '', 'session': 'b96952d9-b243-44ee-8eef-3a21fc6793a...\n", + " │ └ [b'e3fae01b-8f7d-4358-9fd2-c397a1e35c71', b'\\x01']\n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/ipykernel/kernelbase.py\", line 834, in execute_request\n", + " reply_content = await reply_content\n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/ipykernel/ipkernel.py\", line 460, in do_execute\n", + " res = shell.run_cell(\n", + " │ └ \n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/ipykernel/zmqshell.py\", line 665, in run_cell\n", + " return super().run_cell(*args, **kwargs)\n", + " │ └ {'store_history': True, 'silent': False, 'cell_id': None}\n", + " └ ('from typing import TypedDict\\n\\nfrom langgraph.types import RetryPolicy\\nfrom loguru import logger\\nfrom requests import HT...\n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py\", line 3170, in run_cell\n", + " result = self._run_cell(\n", + " │ └ \n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py\", line 3225, in _run_cell\n", + " result = runner(coro)\n", + " │ └ \n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/IPython/core/async_helpers.py\", line 128, in _pseudo_sync_runner\n", + " coro.send(None)\n", + " │ └ \n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py\", line 3447, in run_cell_async\n", + " has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n", + " │ │ │ │ └ '/var/folders/_2/m2k52m654svgy0vz6nv68s7r0000gn/T/ipykernel_6932/1549273080.py'\n", + " │ │ │ └ [, , , \n", + " │ └ \n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py\", line 3688, in run_ast_nodes\n", + " if await self.run_code(code, result, async_=asy):\n", + " │ │ │ │ └ False\n", + " │ │ │ └ at 0x10d133c30, file \"/var/folders/_2/m2k52m654svgy0vz6nv68s7r0000gn/T/ipykernel_6932/1549273080.py\", l...\n", + " │ └ \n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py\", line 3748, in run_code\n", + " exec(code_obj, self.user_global_ns, self.user_ns)\n", + " │ │ │ │ └ \n", + " │ │ │ └ \n", + " │ │ └ \n", + " │ └ \n", + " └ at 0x10d133c30, file \"/var/folders/_2/m2k52m654svgy0vz6nv68s7r0000gn/T/ipykernel_6932/1549273080.py\", l...\n", + "\n", + "> File \"\u001B[32m/var/folders/_2/m2k52m654svgy0vz6nv68s7r0000gn/T/ipykernel_6932/\u001B[0m\u001B[32m\u001B[1m1549273080.py\u001B[0m\", line \u001B[33m33\u001B[0m, in \u001B[35m\u001B[0m\n", + " \u001B[1mgraph\u001B[0m\u001B[35m\u001B[1m.\u001B[0m\u001B[1minvoke\u001B[0m\u001B[1m(\u001B[0m\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[36m│ └ \u001B[0m\u001B[36m\u001B[1m\u001B[0m\n", + " \u001B[36m└ \u001B[0m\u001B[36m\u001B[1m\u001B[0m\n", + "\n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/pregel/main.py\", line 3913, in invoke\n", + " for chunk in self.stream(\n", + " │ └ \n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/pregel/main.py\", line 2967, in stream\n", + " for _ in runner.tick(\n", + " │ │ └ \n", + " │ └ \n", + " └ None\n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/pregel/_runner.py\", line 207, in tick\n", + " run_with_retry(\n", + " └ \n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/pregel/_retry.py\", line 617, in run_with_retry\n", + " return task.proc.invoke(task.input, config)\n", + " │ │ │ │ └ {'configurable': {'__pregel_runtime': Runtime(context=None, store=None, stream_writer=.stream...\n", + " │ │ │ └ \n", + " │ │ └ PregelExecutableTask(name='node_a', input={}, proc=, writes=...\n", + " │ └ \n", + " └ PregelExecutableTask(name='node_a', input={}, proc=, writes=...\n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/_internal/_runnable.py\", line 684, in invoke\n", + " input = context.run(step.invoke, input, config, **kwargs)\n", + " │ │ │ │ │ │ └ {}\n", + " │ │ │ │ │ └ {'configurable': {'__pregel_runtime': Runtime(context=None, store=None, stream_writer=.stream...\n", + " │ │ │ │ └ {}\n", + " │ │ │ └ \n", + " │ │ └ node_a(tags=None, recurse=True, explode_args=False, func_accepts={})\n", + " │ └ \n", + " └ <_contextvars.Context object at 0x10c307ac0>\n", + " File \"/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/_internal/_runnable.py\", line 426, in invoke\n", + " ret = self.func(*args, **kwargs)\n", + " │ │ │ └ {}\n", + " │ │ └ ({},)\n", + " │ └ \n", + " └ node_a(tags=None, recurse=True, explode_args=False, func_accepts={})\n", + "\n", + " File \"\u001B[32m/var/folders/_2/m2k52m654svgy0vz6nv68s7r0000gn/T/ipykernel_6932/\u001B[0m\u001B[32m\u001B[1m1549273080.py\u001B[0m\", line \u001B[33m16\u001B[0m, in \u001B[35mnode_a\u001B[0m\n", + " \u001B[35m\u001B[1mraise\u001B[0m \u001B[1mHTTPError\u001B[0m\n", + " \u001B[36m └ \u001B[0m\u001B[36m\u001B[1m\u001B[0m\n", + "\n", + "\u001B[31m\u001B[1mrequests.exceptions.HTTPError\u001B[0m\n", + "During task with name 'node_a' and id '7ca2bca4-ef75-604f-f146-f6d764f7c0ef'\n" + ] + } + ], + "execution_count": 7 + } + ], + "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 +} diff --git a/chapter03/01_checkpoint.ipynb b/chapter03/01_checkpoint.ipynb new file mode 100644 index 0000000..2801a0b --- /dev/null +++ b/chapter03/01_checkpoint.ipynb @@ -0,0 +1,134 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true + }, + "source": [ + "import os\n", + "from langchain.chat_models import init_chat_model\n", + "from dotenv import load_dotenv\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "from langgraph.graph.message import MessagesState\n", + "\n", + "\n", + "class OverallState(MessagesState):\n", + " output: str\n", + "\n", + "\n", + "def llm_node(state: OverallState) -> OverallState:\n", + " messages = state[\"messages\"]\n", + " res = llm.invoke(messages)\n", + " return {\n", + " \"messages\": [res]\n", + " }\n", + "\n", + "\n", + "def output_node(state: OverallState) -> OverallState:\n", + " return {\n", + " \"output\": state[\"messages\"][-1].content\n", + " }" + ], + "id": "b443de7fa7929ba2", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "builder = StateGraph(state_schema=OverallState)\n", + "builder.add_node(\"llm_node\", llm_node)\n", + "builder.add_node(\"output_node\", output_node)\n", + "\n", + "builder.add_edge(START, \"llm_node\")\n", + "builder.add_edge(\"llm_node\", \"output_node\")\n", + "builder.add_edge(\"output_node\", END)" + ], + "id": "887432b11f020144", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "from langgraph.checkpoint.postgres import PostgresSaver\n", + "from langchain_core.runnables import RunnableConfig\n", + "from rich import print as rp\n", + "\n", + "with PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " checkpointer.setup()\n", + " graph = builder.compile(checkpointer=checkpointer)\n", + "\n", + " config: RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": \"chapter_0804\"\n", + " }\n", + " }\n", + "\n", + " messages1 = {\n", + " \"messages\": [\n", + " {\"role\": \"user\", \"content\": \"你好,我是gqt\"}\n", + " ]\n", + " }\n", + " messages2 = {\n", + " \"messages\": [\n", + " {\"role\": \"user\", \"content\": \"你好,我是谁?\"}\n", + " ]\n", + " }\n", + "\n", + " res1 = graph.invoke(messages2, config=config)\n", + "\n", + "\n", + " rp(res1)\n", + " history_checkpoint = list(graph.get_state_history(config=config))\n", + "\n", + " # rp(history_checkpoint)" + ], + "id": "e0f6b05e0dfeb578", + "outputs": [], + "execution_count": null + } + ], + "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 +} diff --git a/chapter03/02_checkpoint_retry.ipynb b/chapter03/02_checkpoint_retry.ipynb new file mode 100644 index 0000000..9c79c64 --- /dev/null +++ b/chapter03/02_checkpoint_retry.ipynb @@ -0,0 +1,1090 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-04T05:41:32.812907Z", + "start_time": "2026-08-04T05:41:32.795458Z" + } + }, + "source": [ + "import os\n", + "from langchain.chat_models import init_chat_model\n", + "from dotenv import load_dotenv\n", + "from loguru import logger\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")" + ], + "outputs": [], + "execution_count": 14 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T05:41:36.720463Z", + "start_time": "2026-08-04T05:41:36.703774Z" + } + }, + "cell_type": "code", + "source": [ + "from typing import TypedDict\n", + "\n", + "\n", + "class OverAllState(TypedDict):\n", + " topic: str\n", + " poem: str\n", + " joke: str\n", + " final_output: str\n", + "\n", + "\n", + "class InputState(TypedDict):\n", + " topic: str\n", + "\n", + "\n", + "class OutputState(TypedDict):\n", + " final_output: str\n", + "\n", + "\n", + "topics = [\"布偶猫\", \"狸花猫\", \"金渐层\"]\n", + "topic_index = 0" + ], + "id": "106e6671a91aa246", + "outputs": [], + "execution_count": 15 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T05:43:55.203557Z", + "start_time": "2026-08-04T05:43:55.186773Z" + } + }, + "cell_type": "code", + "source": [ + "from langchain_core.messages import HumanMessage\n", + "\n", + "\n", + "def node_change_topic(state: InputState) -> OverAllState:\n", + " global topic_index\n", + " sub_topic = topics[topic_index]\n", + " topic_index += 1\n", + " topic_index %= 3\n", + " logger.info(f\"{state[\"topic\"]}:{sub_topic}\")\n", + " return {\n", + " \"topic\": f\"{state[\"topic\"]}:{sub_topic}\"\n", + " }\n", + "\n", + "\n", + "def node_poem(state: OverAllState) -> OverAllState:\n", + " logger.info(\"node_poem正在执行\")\n", + " topic = state[\"topic\"]\n", + " poem = llm.invoke([HumanMessage(f\"写一首关于{topic}主题的七言绝句\")]).content\n", + " return {\n", + " \"poem\": poem\n", + " }\n", + "\n", + "\n", + "import time\n", + "\n", + "\n", + "def node_joke(state: OverAllState) -> OverAllState:\n", + " logger.info(\"node_joke正在执行\")\n", + " time.sleep(5)\n", + " # raise Exception(\"人为抛异常\")\n", + " joke = llm.invoke([HumanMessage(f\"写一首关于{state[\"topic\"]}主题的笑话\")]).content\n", + " return {\n", + " \"joke\": joke\n", + " }\n", + "\n", + "\n", + "def node_output(state: OverAllState) -> OutputState:\n", + " logger.info(\"node_output正在执行\")\n", + " topic = state[\"topic\"]\n", + " poem = state[\"poem\"]\n", + " joke = state[\"joke\"]\n", + " final_output = f\"关于{topic}的七言绝句:{poem}\\n 笑话:{joke}\\n\"\n", + " return {\n", + " \"final_output\": final_output\n", + " }" + ], + "id": "d7bd12f973678dcc", + "outputs": [], + "execution_count": 21 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T05:44:01.149227Z", + "start_time": "2026-08-04T05:44:01.126217Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "#3. 构建图\n", + "builder = StateGraph(state_schema=OverAllState, input_schema=InputState, output_schema=OutputState)\n", + "\n", + "#3.1 添加节点\n", + "builder.add_node(\"node_change_topic\", node_change_topic)\n", + "builder.add_node(\"node_poem\", node_poem)\n", + "builder.add_node(\"node_joke\", node_joke)\n", + "builder.add_node(\"node_output\", node_output)\n", + "\n", + "#3.2 添加边\n", + "builder.add_edge(START, \"node_change_topic\")\n", + "builder.add_edge(\"node_change_topic\", \"node_poem\")\n", + "builder.add_edge(\"node_change_topic\", \"node_joke\")\n", + "builder.add_edge(\"node_poem\", \"node_output\")\n", + "builder.add_edge(\"node_joke\", \"node_output\")\n", + "builder.add_edge(\"node_output\", END)" + ], + "id": "9bc3e4889b1af0c9", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 22 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T05:42:43.349839Z", + "start_time": "2026-08-04T05:41:54.014430Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.checkpoint.postgres import PostgresSaver\n", + "from langchain_core.runnables import RunnableConfig\n", + "from rich import print as rp\n", + "\n", + "with PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " graph = builder.compile(checkpointer=checkpointer)\n", + "\n", + " from IPython.display import display\n", + "\n", + " display(graph)\n", + "\n", + " config:RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": \"chapter03-02\"\n", + " }\n", + " }\n", + "\n", + " res = graph.invoke({\"topic\": \"猫\"}, config=config)\n", + " print(res)" + ], + "id": "d5bdecb604d14cee", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001B[32m2026-08-04 13:41:55.431\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_change_topic\u001B[0m:\u001B[36m9\u001B[0m - \u001B[1m猫:布偶猫\u001B[0m\n", + "\u001B[32m2026-08-04 13:41:55.433\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_joke\u001B[0m:\u001B[36m28\u001B[0m - \u001B[1mnode_joke正在执行\u001B[0m\n", + "\u001B[32m2026-08-04 13:41:55.434\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_poem\u001B[0m:\u001B[36m16\u001B[0m - \u001B[1mnode_poem正在执行\u001B[0m\n" + ] + }, + { + "ename": "Exception", + "evalue": "人为抛异常", + "output_type": "error", + "traceback": [ + "\u001B[31m---------------------------------------------------------------------------\u001B[39m", + "\u001B[31mException\u001B[39m Traceback (most recent call last)", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[18]\u001B[39m\u001B[32m, line 18\u001B[39m\n\u001B[32m 14\u001B[39m \u001B[33m\"thread_id\"\u001B[39m: \u001B[33m\"chapter03-02\"\u001B[39m\n\u001B[32m 15\u001B[39m }\n\u001B[32m 16\u001B[39m }\n\u001B[32m 17\u001B[39m \n\u001B[32m---> \u001B[39m\u001B[32m18\u001B[39m res = graph.invoke({\u001B[33m\"topic\"\u001B[39m: \u001B[33m\"猫\"\u001B[39m}, config=config)\n\u001B[32m 19\u001B[39m print(res)\n", + "\u001B[36mFile \u001B[39m\u001B[32m/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/pregel/main.py:3913\u001B[39m, in \u001B[36mPregel.invoke\u001B[39m\u001B[34m(self, input, config, context, stream_mode, print_mode, output_keys, interrupt_before, interrupt_after, durability, control, version, **kwargs)\u001B[39m\n\u001B[32m 3910\u001B[39m chunks.append(chunk)\n\u001B[32m 3911\u001B[39m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[32m 3912\u001B[39m \u001B[38;5;66;03m# v1: collect interrupts from updates stream\u001B[39;00m\n\u001B[32m-> \u001B[39m\u001B[32m3913\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43;01mfor\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mchunk\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01min\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mself\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mstream\u001B[39;49m\u001B[30;43m(\u001B[39;49m\n\u001B[32m 3914\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43minput\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3915\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mconfig\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3916\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mcontext\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43mcontext\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3917\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mstream_mode\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43m(\u001B[39;49m\n\u001B[32m 3918\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43m[\u001B[39;49m\u001B[30;43m\"\u001B[39;49m\u001B[30;43mupdates\u001B[39;49m\u001B[30;43m\"\u001B[39;49m\u001B[30;43m,\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43m\"\u001B[39;49m\u001B[30;43mvalues\u001B[39;49m\u001B[30;43m\"\u001B[39;49m\u001B[30;43m]\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01mif\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mstream_mode\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43m==\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43m\"\u001B[39;49m\u001B[30;43mvalues\u001B[39;49m\u001B[30;43m\"\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01melse\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mstream_mode\u001B[39;49m\n\u001B[32m 3919\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43m)\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3920\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mprint_mode\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43mprint_mode\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3921\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43moutput_keys\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43moutput_keys\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3922\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43minterrupt_before\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43minterrupt_before\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3923\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43minterrupt_after\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43minterrupt_after\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3924\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mdurability\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43mdurability\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3925\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mcontrol\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43mcontrol\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3926\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43m*\u001B[39;49m\u001B[30;43m*\u001B[39;49m\u001B[30;43mkwargs\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 3927\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43m)\u001B[39;49m\u001B[30;43m:\u001B[39;49m\n\u001B[32m 3928\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43;01mif\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mstream_mode\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43m==\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43m\"\u001B[39;49m\u001B[30;43mvalues\u001B[39;49m\u001B[30;43m\"\u001B[39;49m\u001B[30;43m:\u001B[39;49m\n\u001B[32m 3929\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43;01mif\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mlen\u001B[39;49m\u001B[30;43m(\u001B[39;49m\u001B[30;43mchunk\u001B[39;49m\u001B[30;43m)\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43m==\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43m2\u001B[39;49m\u001B[30;43m:\u001B[39;49m\n", + "\u001B[36mFile \u001B[39m\u001B[32m/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/pregel/main.py:2967\u001B[39m, in \u001B[36mPregel.stream\u001B[39m\u001B[34m(self, input, config, context, stream_mode, print_mode, output_keys, interrupt_before, interrupt_after, durability, control, subgraphs, debug, version, **kwargs)\u001B[39m\n\u001B[32m 2965\u001B[39m \u001B[38;5;28;01mfor\u001B[39;00m task \u001B[38;5;129;01min\u001B[39;00m loop.match_cached_writes():\n\u001B[32m 2966\u001B[39m loop.output_writes(task.id, task.writes, cached=\u001B[38;5;28;01mTrue\u001B[39;00m)\n\u001B[32m-> \u001B[39m\u001B[32m2967\u001B[39m \u001B[30;43m\u001B[39;49m\u001B[30;43;01mfor\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43m_\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01min\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mrunner\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mtick\u001B[39;49m\u001B[30;43m(\u001B[39;49m\n\u001B[32m 2968\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43m[\u001B[39;49m\u001B[30;43mt\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01mfor\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mt\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01min\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mloop\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mtasks\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mvalues\u001B[39;49m\u001B[30;43m(\u001B[39;49m\u001B[30;43m)\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01mif\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43;01mnot\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mt\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mwrites\u001B[39;49m\u001B[30;43m]\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 2969\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mtimeout\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43mself\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mstep_timeout\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 2970\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mget_waiter\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43mget_waiter\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 2971\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mschedule_task\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43mloop\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43maccept_push\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 2972\u001B[39m \u001B[30;43m\u001B[39;49m\u001B[30;43m)\u001B[39;49m\u001B[30;43m:\u001B[39;49m\n\u001B[32m 2973\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43;03m# emit output\u001B[39;49;00m\n\u001B[32m 2974\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43;01myield from\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43m_output\u001B[39;49m\u001B[30;43m(\u001B[39;49m\n\u001B[32m 2975\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mstream_mode\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 2976\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mprint_mode\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m (...)\u001B[39m\u001B[32m 2982\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43m_state_mapper\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 2983\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43m)\u001B[39;49m\n\u001B[32m 2984\u001B[39m loop.after_tick()\n", + "\u001B[36mFile \u001B[39m\u001B[32m/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/pregel/_runner.py:344\u001B[39m, in \u001B[36mPregelRunner.tick\u001B[39m\u001B[34m(self, tasks, reraise, timeout, retry_policy, get_waiter, schedule_task)\u001B[39m\n\u001B[32m 342\u001B[39m \u001B[38;5;66;03m# panic on failure or timeout\u001B[39;00m\n\u001B[32m 343\u001B[39m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[32m--> \u001B[39m\u001B[32m344\u001B[39m \u001B[30;43m_panic_or_proceed\u001B[39;49m\u001B[30;43m(\u001B[39;49m\n\u001B[32m 345\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mfutures\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mdone\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43munion\u001B[39;49m\u001B[30;43m(\u001B[39;49m\u001B[30;43mf\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01mfor\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mf\u001B[39;49m\u001B[30;43m,\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43mt\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01min\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mfutures\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mitems\u001B[39;49m\u001B[30;43m(\u001B[39;49m\u001B[30;43m)\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01mif\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43mt\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43;01mis\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43;01mnot\u001B[39;49;00m\u001B[30;43m \u001B[39;49m\u001B[30;43;01mNone\u001B[39;49;00m\u001B[30;43m)\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 346\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mpanic\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43mreraise\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 347\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mhandled_exception_ids\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43mself\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43m_handled_exception_ids\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 348\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43mhandled_futures\u001B[39;49m\u001B[30;43m=\u001B[39;49m\u001B[30;43mhandled_futures\u001B[39;49m\u001B[30;43m,\u001B[39;49m\n\u001B[32m 349\u001B[39m \u001B[30;43m \u001B[39;49m\u001B[30;43m)\u001B[39;49m\n\u001B[32m 350\u001B[39m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m exc:\n\u001B[32m 351\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m tb := exc.__traceback__:\n", + "\u001B[36mFile \u001B[39m\u001B[32m/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/pregel/_runner.py:687\u001B[39m, in \u001B[36m_panic_or_proceed\u001B[39m\u001B[34m(futs, timeout_exc_cls, panic, handled_exception_ids, handled_futures)\u001B[39m\n\u001B[32m 685\u001B[39m interrupts.append(exc)\n\u001B[32m 686\u001B[39m \u001B[38;5;28;01melif\u001B[39;00m fut \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;129;01min\u001B[39;00m SKIP_RERAISE_SET:\n\u001B[32m--> \u001B[39m\u001B[32m687\u001B[39m \u001B[38;5;28;01mraise\u001B[39;00m exc\n\u001B[32m 688\u001B[39m \u001B[38;5;66;03m# raise combined interrupts\u001B[39;00m\n\u001B[32m 689\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m interrupts:\n", + "\u001B[36mFile \u001B[39m\u001B[32m/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/pregel/_executor.py:80\u001B[39m, in \u001B[36mBackgroundExecutor.done\u001B[39m\u001B[34m(self, task)\u001B[39m\n\u001B[32m 78\u001B[39m \u001B[38;5;250m\u001B[39m\u001B[33;03m\"\"\"Remove the task from the tasks dict when it's done.\"\"\"\u001B[39;00m\n\u001B[32m 79\u001B[39m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[32m---> \u001B[39m\u001B[32m80\u001B[39m \u001B[30;43mtask\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mresult\u001B[39;49m\u001B[30;43m(\u001B[39;49m\u001B[30;43m)\u001B[39;49m\n\u001B[32m 81\u001B[39m \u001B[38;5;28;01mexcept\u001B[39;00m GraphBubbleUp:\n\u001B[32m 82\u001B[39m \u001B[38;5;66;03m# This exception is an interruption signal, not an error\u001B[39;00m\n\u001B[32m 83\u001B[39m \u001B[38;5;66;03m# so we don't want to re-raise it on exit\u001B[39;00m\n\u001B[32m 84\u001B[39m \u001B[38;5;28mself\u001B[39m.tasks.pop(task)\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/.local/share/uv/python/cpython-3.13.11-macos-aarch64-none/lib/python3.13/concurrent/futures/_base.py:449\u001B[39m, in \u001B[36mFuture.result\u001B[39m\u001B[34m(self, timeout)\u001B[39m\n\u001B[32m 447\u001B[39m \u001B[38;5;28;01mraise\u001B[39;00m CancelledError()\n\u001B[32m 448\u001B[39m \u001B[38;5;28;01melif\u001B[39;00m \u001B[38;5;28mself\u001B[39m._state == FINISHED:\n\u001B[32m--> \u001B[39m\u001B[32m449\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[30;43mself\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43m__get_result\u001B[39;49m\u001B[30;43m(\u001B[39;49m\u001B[30;43m)\u001B[39;49m\n\u001B[32m 451\u001B[39m \u001B[38;5;28mself\u001B[39m._condition.wait(timeout)\n\u001B[32m 453\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m._state \u001B[38;5;129;01min\u001B[39;00m [CANCELLED, CANCELLED_AND_NOTIFIED]:\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/.local/share/uv/python/cpython-3.13.11-macos-aarch64-none/lib/python3.13/concurrent/futures/_base.py:401\u001B[39m, in \u001B[36mFuture.__get_result\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 399\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m._exception \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[32m 400\u001B[39m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[32m--> \u001B[39m\u001B[32m401\u001B[39m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;28mself\u001B[39m._exception\n\u001B[32m 402\u001B[39m \u001B[38;5;28;01mfinally\u001B[39;00m:\n\u001B[32m 403\u001B[39m \u001B[38;5;66;03m# Break a reference cycle with the exception in self._exception\u001B[39;00m\n\u001B[32m 404\u001B[39m \u001B[38;5;28mself\u001B[39m = \u001B[38;5;28;01mNone\u001B[39;00m\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/.local/share/uv/python/cpython-3.13.11-macos-aarch64-none/lib/python3.13/concurrent/futures/thread.py:59\u001B[39m, in \u001B[36m_WorkItem.run\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 56\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m\n\u001B[32m 58\u001B[39m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[32m---> \u001B[39m\u001B[32m59\u001B[39m result = \u001B[30;43mself\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mfn\u001B[39;49m\u001B[30;43m(\u001B[39;49m\u001B[30;43m*\u001B[39;49m\u001B[30;43mself\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43margs\u001B[39;49m\u001B[30;43m,\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43m*\u001B[39;49m\u001B[30;43m*\u001B[39;49m\u001B[30;43mself\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mkwargs\u001B[39;49m\u001B[30;43m)\u001B[39;49m\n\u001B[32m 60\u001B[39m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mBaseException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m exc:\n\u001B[32m 61\u001B[39m \u001B[38;5;28mself\u001B[39m.future.set_exception(exc)\n", + "\u001B[36mFile \u001B[39m\u001B[32m/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/pregel/_retry.py:617\u001B[39m, in \u001B[36mrun_with_retry\u001B[39m\u001B[34m(task, retry_policy, configurable)\u001B[39m\n\u001B[32m 615\u001B[39m task.writes.clear()\n\u001B[32m 616\u001B[39m \u001B[38;5;66;03m# run the task\u001B[39;00m\n\u001B[32m--> \u001B[39m\u001B[32m617\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[30;43mtask\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mproc\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43minvoke\u001B[39;49m\u001B[30;43m(\u001B[39;49m\u001B[30;43mtask\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43minput\u001B[39;49m\u001B[30;43m,\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43mconfig\u001B[39;49m\u001B[30;43m)\u001B[39;49m\n\u001B[32m 618\u001B[39m \u001B[38;5;28;01mexcept\u001B[39;00m ParentCommand \u001B[38;5;28;01mas\u001B[39;00m exc:\n\u001B[32m 619\u001B[39m ns: \u001B[38;5;28mstr\u001B[39m = config[CONF][CONFIG_KEY_CHECKPOINT_NS]\n", + "\u001B[36mFile \u001B[39m\u001B[32m/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/_internal/_runnable.py:684\u001B[39m, in \u001B[36mRunnableSeq.invoke\u001B[39m\u001B[34m(self, input, config, **kwargs)\u001B[39m\n\u001B[32m 682\u001B[39m \u001B[38;5;66;03m# run in context\u001B[39;00m\n\u001B[32m 683\u001B[39m \u001B[38;5;28;01mwith\u001B[39;00m set_config_context(config, run) \u001B[38;5;28;01mas\u001B[39;00m context:\n\u001B[32m--> \u001B[39m\u001B[32m684\u001B[39m \u001B[38;5;28minput\u001B[39m = \u001B[30;43mcontext\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mrun\u001B[39;49m\u001B[30;43m(\u001B[39;49m\u001B[30;43mstep\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43minvoke\u001B[39;49m\u001B[30;43m,\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43minput\u001B[39;49m\u001B[30;43m,\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43mconfig\u001B[39;49m\u001B[30;43m,\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43m*\u001B[39;49m\u001B[30;43m*\u001B[39;49m\u001B[30;43mkwargs\u001B[39;49m\u001B[30;43m)\u001B[39;49m\n\u001B[32m 685\u001B[39m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[32m 686\u001B[39m \u001B[38;5;28minput\u001B[39m = step.invoke(\u001B[38;5;28minput\u001B[39m, config)\n", + "\u001B[36mFile \u001B[39m\u001B[32m/Volumes/ExternalStorageA/project/2026.7/langgraph学习/.venv/lib/python3.13/site-packages/langgraph/_internal/_runnable.py:426\u001B[39m, in \u001B[36mRunnableCallable.invoke\u001B[39m\u001B[34m(self, input, config, **kwargs)\u001B[39m\n\u001B[32m 424\u001B[39m run_manager.on_chain_end(ret)\n\u001B[32m 425\u001B[39m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[32m--> \u001B[39m\u001B[32m426\u001B[39m ret = \u001B[30;43mself\u001B[39;49m\u001B[30;43m.\u001B[39;49m\u001B[30;43mfunc\u001B[39;49m\u001B[30;43m(\u001B[39;49m\u001B[30;43m*\u001B[39;49m\u001B[30;43margs\u001B[39;49m\u001B[30;43m,\u001B[39;49m\u001B[30;43m \u001B[39;49m\u001B[30;43m*\u001B[39;49m\u001B[30;43m*\u001B[39;49m\u001B[30;43mkwargs\u001B[39;49m\u001B[30;43m)\u001B[39;49m\n\u001B[32m 427\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m.recurse \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(ret, Runnable):\n\u001B[32m 428\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m ret.invoke(\u001B[38;5;28minput\u001B[39m, config)\n", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[16]\u001B[39m\u001B[32m, line 30\u001B[39m, in \u001B[36mnode_joke\u001B[39m\u001B[34m(state)\u001B[39m\n\u001B[32m 27\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m node_joke(state: OverAllState) -> OverAllState:\n\u001B[32m 28\u001B[39m logger.info(\u001B[33m\"node_joke正在执行\"\u001B[39m)\n\u001B[32m 29\u001B[39m time.sleep(\u001B[32m5\u001B[39m)\n\u001B[32m---> \u001B[39m\u001B[32m30\u001B[39m \u001B[38;5;28;01mraise\u001B[39;00m Exception(\u001B[33m\"人为抛异常\"\u001B[39m)\n\u001B[32m 31\u001B[39m joke = llm.invoke([HumanMessage(f\"写一首关于{state[\u001B[33m\"topic\"\u001B[39m]}主题的笑话\")]).content\n\u001B[32m 32\u001B[39m return {\n\u001B[32m 33\u001B[39m \u001B[33m\"joke\"\u001B[39m: joke\n", + "\u001B[31mException\u001B[39m: 人为抛异常", + "During task with name 'node_joke' and id 'cd8cec25-ae0d-9f02-3890-a518bb35fdd1'" + ] + } + ], + "execution_count": 18 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T05:43:12.059735Z", + "start_time": "2026-08-04T05:43:12.003804Z" + } + }, + "cell_type": "code", + "source": [ + "with PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " graph = builder.compile(checkpointer=checkpointer)\n", + "\n", + " config:RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": \"chapter03-02\"\n", + " }\n", + " }\n", + "\n", + " # rp(list(graph.get_state_history(config=config)))\n", + " a=graph.get_state_history(config=config)\n", + " rp(list(a))" + ], + "id": "88b6d6447a7e9975", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m[\u001B[0m\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_poem'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3baa-65cc-8001-fd0611e135f5'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m1\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T05:41:55.432983+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3ba5-604a-8000-a241ade3cd62'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'ba3d2e7f-f628-285f-2c1d-b9015451be36'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_poem'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_poem'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典意境中:\\n\\n**《咏布偶猫\u001B[0m\n", + "\u001B[32m》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 **创作简析**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \u001B[0m\n", + "\u001B[32m**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \u001B[0m\n", + "\u001B[32m**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\u001B[0m\n", + "\u001B[32m雅致。\\n- \u001B[0m\n", + "\u001B[32m**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\u001B[0m\n", + "\u001B[32m平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\u001B[0m\n", + "\u001B[32m,可告知为您微调。'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'cd8cec25-ae0d-9f02-3890-a518bb35fdd1'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_joke'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[32m\"Exception\u001B[0m\u001B[32m(\u001B[0m\u001B[32m'人为抛异常'\u001B[0m\u001B[32m)\u001B[0m\u001B[32m\"\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[3;35mNone\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_change_topic'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3ba5-604a-8000-a241ade3cd62'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m0\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T05:41:55.430806+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3ba2-6656-bfff-b93599952686'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'b9bb703e-b73b-77b8-f4ba-a3964f155967'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_change_topic'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_change_topic'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__start__'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3ba2-6656-bfff-b93599952686'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m-1\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'input'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T05:41:55.429725+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'e6b34968-4ae1-b17e-c449-7e93cf44f04f'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'__start__'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'__start__'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" + ], + "text/html": [ + "
[\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '猫:布偶猫'},\n",
+       "        next=('node_poem', 'node_joke'),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3baa-65cc-8001-fd0611e135f5'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 1, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T05:41:55.432983+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3ba5-604a-8000-a241ade3cd62'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='ba3d2e7f-f628-285f-2c1d-b9015451be36',\n",
+       "                name='node_poem',\n",
+       "                path=('__pregel_pull', 'node_poem'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'poem': \n",
+       "'这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典意境中:\\n\\n**《咏布偶猫\n",
+       "》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 **创作简析**\\n- \n",
+       "**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \n",
+       "**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \n",
+       "**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\n",
+       "雅致。\\n- \n",
+       "**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\n",
+       "平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\n",
+       ",可告知为您微调。'\n",
+       "                }\n",
+       "            ),\n",
+       "            PregelTask(\n",
+       "                id='cd8cec25-ae0d-9f02-3890-a518bb35fdd1',\n",
+       "                name='node_joke',\n",
+       "                path=('__pregel_pull', 'node_joke'),\n",
+       "                error=\"Exception('人为抛异常')\",\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result=None\n",
+       "            )\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '猫'},\n",
+       "        next=('node_change_topic',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3ba5-604a-8000-a241ade3cd62'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 0, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T05:41:55.430806+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3ba2-6656-bfff-b93599952686'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='b9bb703e-b73b-77b8-f4ba-a3964f155967',\n",
+       "                name='node_change_topic',\n",
+       "                path=('__pregel_pull', 'node_change_topic'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫:布偶猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={},\n",
+       "        next=('__start__',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3ba2-6656-bfff-b93599952686'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': -1, 'source': 'input', 'parents': {}},\n",
+       "        created_at='2026-08-04T05:41:55.429725+00:00',\n",
+       "        parent_config=None,\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='e6b34968-4ae1-b17e-c449-7e93cf44f04f',\n",
+       "                name='__start__',\n",
+       "                path=('__pregel_pull', '__start__'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    )\n",
+       "]\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 19 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T05:44:33.002327Z", + "start_time": "2026-08-04T05:44:14.567924Z" + } + }, + "cell_type": "code", + "source": [ + "with PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " graph = builder.compile(checkpointer=checkpointer)\n", + "\n", + " config:RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": \"chapter03-02\"\n", + " }\n", + " }\n", + "\n", + " res = graph.invoke(None, config=config)\n", + " print(res)" + ], + "id": "84e145b5cbd5ea33", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001B[32m2026-08-04 13:44:14.652\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_joke\u001B[0m:\u001B[36m28\u001B[0m - \u001B[1mnode_joke正在执行\u001B[0m\n", + "\u001B[32m2026-08-04 13:44:32.933\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_output\u001B[0m:\u001B[36m38\u001B[0m - \u001B[1mnode_output正在执行\u001B[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'final_output': '关于猫:布偶猫的七言绝句:这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典意境中:\\n\\n**《咏布偶猫》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 **创作简析**\\n- **首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- **次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- **第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失雅致。\\n- **末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气),可告知为您微调。\\n 笑话:朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把它从沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n朋友恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当恒温真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 *(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*\\n'}\n" + ] + } + ], + "execution_count": 23 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T05:45:11.791379Z", + "start_time": "2026-08-04T05:45:11.740168Z" + } + }, + "cell_type": "code", + "source": [ + "with PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " graph = builder.compile(checkpointer=checkpointer)\n", + "\n", + " config:RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": \"chapter03-02\"\n", + " }\n", + " }\n", + "\n", + " # rp(list(graph.get_state_history(config=config)))\n", + " a=graph.get_state_history(config=config)\n", + " rp(list(a))" + ], + "id": "de1ca0f96078e6e8", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m[\u001B[0m\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典意境中:\\n\\n**《咏布偶猫\u001B[0m\n", + "\u001B[32m》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 **创作简析**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \u001B[0m\n", + "\u001B[32m**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \u001B[0m\n", + "\u001B[32m**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\u001B[0m\n", + "\u001B[32m雅致。\\n- \u001B[0m\n", + "\u001B[32m**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\u001B[0m\n", + "\u001B[32m平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\u001B[0m\n", + "\u001B[32m,可告知为您微调。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \n", + "\u001B[32m'朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把它从\u001B[0m\n", + "\u001B[32m沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n朋友\u001B[0m\n", + "\u001B[32m恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当恒温\u001B[0m\n", + "\u001B[32m真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 \u001B[0m\n", + "\u001B[32m*(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典\u001B[0m\n", + "\u001B[32m意境中:\\n\\n**《咏布偶猫》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 \u001B[0m\n", + "\u001B[32m**创作简析**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \u001B[0m\n", + "\u001B[32m**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \u001B[0m\n", + "\u001B[32m**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\u001B[0m\n", + "\u001B[32m雅致。\\n- \u001B[0m\n", + "\u001B[32m**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\u001B[0m\n", + "\u001B[32m平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\u001B[0m\n", + "\u001B[32m,可告知为您微调。\\n \u001B[0m\n", + "\u001B[32m笑话:朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把\u001B[0m\n", + "\u001B[32m它从沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n\u001B[0m\n", + "\u001B[32m朋友恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当\u001B[0m\n", + "\u001B[32m恒温真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 \u001B[0m\n", + "\u001B[32m*(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc79-19b9-612e-8003-faffb547edbe'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m3\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T05:44:32.935130+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc79-19b3-6a9e-8002-ad5fb522deab'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典意境中:\\n\\n**《咏布偶猫\u001B[0m\n", + "\u001B[32m》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 **创作简析**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \u001B[0m\n", + "\u001B[32m**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \u001B[0m\n", + "\u001B[32m**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\u001B[0m\n", + "\u001B[32m雅致。\\n- \u001B[0m\n", + "\u001B[32m**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\u001B[0m\n", + "\u001B[32m平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\u001B[0m\n", + "\u001B[32m,可告知为您微调。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \n", + "\u001B[32m'朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把它从\u001B[0m\n", + "\u001B[32m沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n朋友\u001B[0m\n", + "\u001B[32m恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当恒温\u001B[0m\n", + "\u001B[32m真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 \u001B[0m\n", + "\u001B[32m*(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_output'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc79-19b3-6a9e-8002-ad5fb522deab'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m2\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T05:44:32.932900+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3baa-65cc-8001-fd0611e135f5'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'83384b54-c070-2d74-eb34-50f9151dba08'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_output'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_output'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典\u001B[0m\n", + "\u001B[32m意境中:\\n\\n**《咏布偶猫》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 \u001B[0m\n", + "\u001B[32m**创作简析**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \u001B[0m\n", + "\u001B[32m**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \u001B[0m\n", + "\u001B[32m**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\u001B[0m\n", + "\u001B[32m雅致。\\n- \u001B[0m\n", + "\u001B[32m**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\u001B[0m\n", + "\u001B[32m平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\u001B[0m\n", + "\u001B[32m,可告知为您微调。\\n \u001B[0m\n", + "\u001B[32m笑话:朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把\u001B[0m\n", + "\u001B[32m它从沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n\u001B[0m\n", + "\u001B[32m朋友恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当\u001B[0m\n", + "\u001B[32m恒温真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 \u001B[0m\n", + "\u001B[32m*(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_poem'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3baa-65cc-8001-fd0611e135f5'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m1\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T05:41:55.432983+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3ba5-604a-8000-a241ade3cd62'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'ba3d2e7f-f628-285f-2c1d-b9015451be36'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_poem'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_poem'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典意境中:\\n\\n**《咏布偶猫\u001B[0m\n", + "\u001B[32m》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 **创作简析**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \u001B[0m\n", + "\u001B[32m**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \u001B[0m\n", + "\u001B[32m**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\u001B[0m\n", + "\u001B[32m雅致。\\n- \u001B[0m\n", + "\u001B[32m**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\u001B[0m\n", + "\u001B[32m平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\u001B[0m\n", + "\u001B[32m,可告知为您微调。'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'cd8cec25-ae0d-9f02-3890-a518bb35fdd1'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_joke'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[32m\"Exception\u001B[0m\u001B[32m(\u001B[0m\u001B[32m'人为抛异常'\u001B[0m\u001B[32m)\u001B[0m\u001B[32m\"\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'joke'\u001B[0m: \n", + "\u001B[32m'朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把它从\u001B[0m\n", + "\u001B[32m沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n朋友\u001B[0m\n", + "\u001B[32m恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当恒温\u001B[0m\n", + "\u001B[32m真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 \u001B[0m\n", + "\u001B[32m*(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_change_topic'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3ba5-604a-8000-a241ade3cd62'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m0\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T05:41:55.430806+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3ba2-6656-bfff-b93599952686'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'b9bb703e-b73b-77b8-f4ba-a3964f155967'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_change_topic'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_change_topic'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__start__'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-02'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fc73-3ba2-6656-bfff-b93599952686'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m-1\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'input'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T05:41:55.429725+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'e6b34968-4ae1-b17e-c449-7e93cf44f04f'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'__start__'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'__start__'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" + ], + "text/html": [ + "
[\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:布偶猫',\n",
+       "            'poem': \n",
+       "'这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典意境中:\\n\\n**《咏布偶猫\n",
+       "》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 **创作简析**\\n- \n",
+       "**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \n",
+       "**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \n",
+       "**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\n",
+       "雅致。\\n- \n",
+       "**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\n",
+       "平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\n",
+       ",可告知为您微调。',\n",
+       "            'joke': \n",
+       "'朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把它从\n",
+       "沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n朋友\n",
+       "恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当恒温\n",
+       "真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 \n",
+       "*(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典\n",
+       "意境中:\\n\\n**《咏布偶猫》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 \n",
+       "**创作简析**\\n- \n",
+       "**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \n",
+       "**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \n",
+       "**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\n",
+       "雅致。\\n- \n",
+       "**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\n",
+       "平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\n",
+       ",可告知为您微调。\\n \n",
+       "笑话:朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把\n",
+       "它从沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n\n",
+       "朋友恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当\n",
+       "恒温真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 \n",
+       "*(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*\\n'\n",
+       "        },\n",
+       "        next=(),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc79-19b9-612e-8003-faffb547edbe'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 3, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T05:44:32.935130+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc79-19b3-6a9e-8002-ad5fb522deab'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:布偶猫',\n",
+       "            'poem': \n",
+       "'这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典意境中:\\n\\n**《咏布偶猫\n",
+       "》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 **创作简析**\\n- \n",
+       "**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \n",
+       "**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \n",
+       "**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\n",
+       "雅致。\\n- \n",
+       "**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\n",
+       "平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\n",
+       ",可告知为您微调。',\n",
+       "            'joke': \n",
+       "'朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把它从\n",
+       "沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n朋友\n",
+       "恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当恒温\n",
+       "真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 \n",
+       "*(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*'\n",
+       "        },\n",
+       "        next=('node_output',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc79-19b3-6a9e-8002-ad5fb522deab'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 2, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T05:44:32.932900+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3baa-65cc-8001-fd0611e135f5'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='83384b54-c070-2d74-eb34-50f9151dba08',\n",
+       "                name='node_output',\n",
+       "                path=('__pregel_pull', 'node_output'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典\n",
+       "意境中:\\n\\n**《咏布偶猫》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 \n",
+       "**创作简析**\\n- \n",
+       "**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \n",
+       "**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \n",
+       "**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\n",
+       "雅致。\\n- \n",
+       "**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\n",
+       "平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\n",
+       ",可告知为您微调。\\n \n",
+       "笑话:朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把\n",
+       "它从沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n\n",
+       "朋友恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当\n",
+       "恒温真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 \n",
+       "*(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*\\n'\n",
+       "                }\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '猫:布偶猫'},\n",
+       "        next=('node_poem', 'node_joke'),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3baa-65cc-8001-fd0611e135f5'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 1, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T05:41:55.432983+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3ba5-604a-8000-a241ade3cd62'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='ba3d2e7f-f628-285f-2c1d-b9015451be36',\n",
+       "                name='node_poem',\n",
+       "                path=('__pregel_pull', 'node_poem'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'poem': \n",
+       "'这是一首为您定制的七言绝句,严格遵循平水韵与近体诗格律,并将布偶猫的标志性特征自然化入古典意境中:\\n\\n**《咏布偶猫\n",
+       "》**\\n蓝眸似水漾春柔,\\n布偶名传态自悠。\\n纵被轻抬如醉舞,\\n长依锦帐梦同游。\\n\\n---\\n\\n📖 **创作简析**\\n- \n",
+       "**首句**以“蓝眸似水”点出布偶猫最动人的蓝宝石般双眼,“漾春柔”既写其瞳孔的清澈透亮,也暗喻其性情温润。\\n- \n",
+       "**次句**直接入题,“布偶名传”交代品种,“态自悠”刻画它天生步态从容、气质高贵的特点。\\n- \n",
+       "**第三句**巧妙化用该品种最著名的“玩偶体质”:一旦被轻轻抱起,便会瞬间放松四肢,瘫软如沉睡或醉酒起舞之态,生动而不失\n",
+       "雅致。\\n- \n",
+       "**末句**落脚于陪伴之情,布偶猫天性亲人黏人,“锦帐梦同游”写它常伴主人榻前枕畔,共享岁月静好。\\n\\n全诗押《平水韵》下\n",
+       "平十一尤韵,平仄严整,兼顾了传统诗语的含蓄美与现代宠物主题的亲和力。如需调整风格(如更偏重萌趣、或更偏重古风仙气)\n",
+       ",可告知为您微调。'\n",
+       "                }\n",
+       "            ),\n",
+       "            PregelTask(\n",
+       "                id='cd8cec25-ae0d-9f02-3890-a518bb35fdd1',\n",
+       "                name='node_joke',\n",
+       "                path=('__pregel_pull', 'node_joke'),\n",
+       "                error=\"Exception('人为抛异常')\",\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'joke': \n",
+       "'朋友第一次见我的布偶猫,好奇地问:“难怪叫布偶猫,是不是抱起来跟玩具似的,一点反应都没有?”\\n\\n我点点头,顺手把它从\n",
+       "沙发上捞进怀里。\\n\\n只听“噗叽”一声轻响——它瞬间全身断电,脑袋一歪,四肢垂下,活脱脱一滩会打呼噜的长毛果冻。\\n\\n朋友\n",
+       "恍然大悟:“原来真是布偶!”\\n\\n我叹了口气:“别高兴太早,等它‘系统重启’发现有人擅自篡改了重力感应,今晚就得拿你当恒温\n",
+       "真皮沙发,不吸满三小时电费不准关机。”\\n\\n💡 \n",
+       "*(注:布偶猫因被抱起时会自然放松瘫软而得名,性格粘人如“狗系猫”,常被戏称“人形挂饰+移动暖炉”。)*'\n",
+       "                }\n",
+       "            )\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '猫'},\n",
+       "        next=('node_change_topic',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3ba5-604a-8000-a241ade3cd62'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 0, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T05:41:55.430806+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3ba2-6656-bfff-b93599952686'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='b9bb703e-b73b-77b8-f4ba-a3964f155967',\n",
+       "                name='node_change_topic',\n",
+       "                path=('__pregel_pull', 'node_change_topic'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫:布偶猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={},\n",
+       "        next=('__start__',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-02',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fc73-3ba2-6656-bfff-b93599952686'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': -1, 'source': 'input', 'parents': {}},\n",
+       "        created_at='2026-08-04T05:41:55.429725+00:00',\n",
+       "        parent_config=None,\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='e6b34968-4ae1-b17e-c449-7e93cf44f04f',\n",
+       "                name='__start__',\n",
+       "                path=('__pregel_pull', '__start__'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    )\n",
+       "]\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 24 + } + ], + "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 +} diff --git a/chapter03/03_checkpoint_replay.ipynb b/chapter03/03_checkpoint_replay.ipynb new file mode 100644 index 0000000..4d319ac --- /dev/null +++ b/chapter03/03_checkpoint_replay.ipynb @@ -0,0 +1,3125 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-04T06:14:15.380978Z", + "start_time": "2026-08-04T06:14:14.636824Z" + } + }, + "source": [ + "import os\n", + "from langchain.chat_models import init_chat_model\n", + "from dotenv import load_dotenv\n", + "from loguru import logger\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")\n", + "from typing import TypedDict\n", + "\n", + "\n", + "class OverAllState(TypedDict):\n", + " topic: str\n", + " poem: str\n", + " joke: str\n", + " final_output: str\n", + "\n", + "\n", + "class InputState(TypedDict):\n", + " topic: str\n", + "\n", + "\n", + "class OutputState(TypedDict):\n", + " final_output: str\n", + "\n", + "\n", + "topics = [\"布偶猫\", \"狸花猫\", \"金渐层\"]\n", + "topic_index = 0\n", + "from langchain_core.messages import HumanMessage\n", + "\n", + "\n", + "def node_change_topic(state: InputState) -> OverAllState:\n", + " global topic_index\n", + " sub_topic = topics[topic_index]\n", + " topic_index += 1\n", + " topic_index %= 3\n", + " logger.info(f\"{state[\"topic\"]}:{sub_topic}\")\n", + " return {\n", + " \"topic\": f\"{state[\"topic\"]}:{sub_topic}\"\n", + " }\n", + "\n", + "\n", + "def node_poem(state: OverAllState) -> OverAllState:\n", + " logger.info(\"node_poem正在执行\")\n", + " topic = state[\"topic\"]\n", + " poem = llm.invoke([HumanMessage(f\"写一首关于{topic}主题的七言绝句\")]).content\n", + " return {\n", + " \"poem\": poem\n", + " }\n", + "\n", + "\n", + "import time\n", + "\n", + "\n", + "def node_joke(state: OverAllState) -> OverAllState:\n", + " logger.info(\"node_joke正在执行\")\n", + " time.sleep(5)\n", + " # raise Exception(\"人为抛异常\")\n", + " joke = llm.invoke([HumanMessage(f\"写一首关于{state[\"topic\"]}主题的笑话\")]).content\n", + " return {\n", + " \"joke\": joke\n", + " }\n", + "\n", + "\n", + "def node_output(state: OverAllState) -> OutputState:\n", + " logger.info(\"node_output正在执行\")\n", + " topic = state[\"topic\"]\n", + " poem = state[\"poem\"]\n", + " joke = state[\"joke\"]\n", + " final_output = f\"关于{topic}的七言绝句:{poem}\\n 笑话:{joke}\\n\"\n", + " return {\n", + " \"final_output\": final_output\n", + " }\n", + "\n", + "\n", + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "#3. 构建图\n", + "builder = StateGraph(state_schema=OverAllState, input_schema=InputState, output_schema=OutputState)\n", + "\n", + "#3.1 添加节点\n", + "builder.add_node(\"node_change_topic\", node_change_topic)\n", + "builder.add_node(\"node_poem\", node_poem)\n", + "builder.add_node(\"node_joke\", node_joke)\n", + "builder.add_node(\"node_output\", node_output)\n", + "\n", + "#3.2 添加边\n", + "builder.add_edge(START, \"node_change_topic\")\n", + "builder.add_edge(\"node_change_topic\", \"node_poem\")\n", + "builder.add_edge(\"node_change_topic\", \"node_joke\")\n", + "builder.add_edge(\"node_poem\", \"node_output\")\n", + "builder.add_edge(\"node_joke\", \"node_output\")\n", + "builder.add_edge(\"node_output\", END)\n", + "\n", + "Thread_ID=\"chapter03-03-2\"" + ], + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T06:14:51.500319Z", + "start_time": "2026-08-04T06:14:15.382375Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.checkpoint.postgres import PostgresSaver\n", + "from langchain_core.runnables import RunnableConfig\n", + "from rich import print as rp\n", + "\n", + "with PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " graph = builder.compile(checkpointer=checkpointer)\n", + "\n", + " from IPython.display import display\n", + "\n", + " display(graph)\n", + "\n", + " config: RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": Thread_ID\n", + " }\n", + " }\n", + "\n", + " res = graph.invoke({\"topic\": \"猫\"}, config=config)\n", + " print(res)" + ], + "id": "c96c6390338a5f21", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001B[32m2026-08-04 14:14:15.833\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_change_topic\u001B[0m:\u001B[36m41\u001B[0m - \u001B[1m猫:布偶猫\u001B[0m\n", + "\u001B[32m2026-08-04 14:14:15.834\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_joke\u001B[0m:\u001B[36m60\u001B[0m - \u001B[1mnode_joke正在执行\u001B[0m\n", + "\u001B[32m2026-08-04 14:14:15.834\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_poem\u001B[0m:\u001B[36m48\u001B[0m - \u001B[1mnode_poem正在执行\u001B[0m\n", + "\u001B[32m2026-08-04 14:14:51.448\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_output\u001B[0m:\u001B[36m70\u001B[0m - \u001B[1mnode_output正在执行\u001B[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'final_output': '关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n 平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- 首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- 次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- 三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- 结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 *注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'}\n" + ] + } + ], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T06:15:23.213387Z", + "start_time": "2026-08-04T06:14:51.510906Z" + } + }, + "cell_type": "code", + "source": [ + "with PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " graph = builder.compile(checkpointer=checkpointer)\n", + "\n", + " config: RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": Thread_ID\n", + " }\n", + " }\n", + "\n", + " res = graph.invoke({\"topic\": \"猫\"}, config=config)\n", + " print(res)" + ], + "id": "f7590a7a4b919fa7", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001B[32m2026-08-04 14:14:51.525\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_change_topic\u001B[0m:\u001B[36m41\u001B[0m - \u001B[1m猫:狸花猫\u001B[0m\n", + "\u001B[32m2026-08-04 14:14:51.526\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_joke\u001B[0m:\u001B[36m60\u001B[0m - \u001B[1mnode_joke正在执行\u001B[0m\n", + "\u001B[32m2026-08-04 14:14:51.527\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_poem\u001B[0m:\u001B[36m48\u001B[0m - \u001B[1mnode_poem正在执行\u001B[0m\n", + "\u001B[32m2026-08-04 14:15:23.177\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_output\u001B[0m:\u001B[36m70\u001B[0m - \u001B[1mnode_output正在执行\u001B[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'final_output': '关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- **首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- **次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- **后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- 全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。\\n 笑话:**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。 \\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘部署任务’。” \\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只蟑螂。’” \\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦\\n'}\n" + ] + } + ], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T06:15:23.334056Z", + "start_time": "2026-08-04T06:15:23.225923Z" + } + }, + "cell_type": "code", + "source": [ + "with PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " graph = builder.compile(checkpointer=checkpointer)\n", + "\n", + " config: RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": Thread_ID\n", + " }\n", + " }\n", + "\n", + " a = graph.get_state_history(config=config)\n", + " rp(list(a))" + ], + "id": "3a9c32917549911b", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m[\u001B[0m\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \u001B[0m\n", + "\u001B[32m**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \u001B[0m\n", + "\u001B[32m**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\u001B[0m\n", + "\u001B[32m千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \u001B[0m\n", + "\u001B[32m全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \n", + "\u001B[32m'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\u001B[0m\n", + "\u001B[32m\\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \u001B[0m\n", + "\u001B[32m\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \u001B[0m\n", + "\u001B[32m\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\u001B[0m\n", + "\u001B[32m部署任务’。” \u001B[0m\n", + "\u001B[32m\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\u001B[0m\n", + "\u001B[32m试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\u001B[0m\n", + "\u001B[32m蟑螂。’” \u001B[0m\n", + "\u001B[32m\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \u001B[0m\n", + "\u001B[32m\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \u001B[0m\n", + "\u001B[32m\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \u001B[0m\n", + "\u001B[32m\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \u001B[0m\n", + "\u001B[32m\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\u001B[0m\n", + "\u001B[32m\\n**【简析】**\\n- **首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \u001B[0m\n", + "\u001B[32m**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \u001B[0m\n", + "\u001B[32m**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\u001B[0m\n", + "\u001B[32m千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \u001B[0m\n", + "\u001B[32m全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。\\n \u001B[0m\n", + "\u001B[32m笑话:**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全\u001B[0m\n", + "\u001B[32m场。 \\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \u001B[0m\n", + "\u001B[32m\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \u001B[0m\n", + "\u001B[32m\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\u001B[0m\n", + "\u001B[32m部署任务’。” \u001B[0m\n", + "\u001B[32m\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\u001B[0m\n", + "\u001B[32m试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\u001B[0m\n", + "\u001B[32m蟑螂。’” \u001B[0m\n", + "\u001B[32m\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \u001B[0m\n", + "\u001B[32m\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \u001B[0m\n", + "\u001B[32m\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \u001B[0m\n", + "\u001B[32m\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \u001B[0m\n", + "\u001B[32m\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbe-0706-6974-8008-c71557b5dc3e'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m8\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:15:23.179237+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbe-0701-68de-8007-2ad28bcb4976'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \u001B[0m\n", + "\u001B[32m**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \u001B[0m\n", + "\u001B[32m**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\u001B[0m\n", + "\u001B[32m千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \u001B[0m\n", + "\u001B[32m全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \n", + "\u001B[32m'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\u001B[0m\n", + "\u001B[32m\\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \u001B[0m\n", + "\u001B[32m\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \u001B[0m\n", + "\u001B[32m\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\u001B[0m\n", + "\u001B[32m部署任务’。” \u001B[0m\n", + "\u001B[32m\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\u001B[0m\n", + "\u001B[32m试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\u001B[0m\n", + "\u001B[32m蟑螂。’” \u001B[0m\n", + "\u001B[32m\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \u001B[0m\n", + "\u001B[32m\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \u001B[0m\n", + "\u001B[32m\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \u001B[0m\n", + "\u001B[32m\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \u001B[0m\n", + "\u001B[32m\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_output'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbe-0701-68de-8007-2ad28bcb4976'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m7\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:15:23.177150+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d928-6a08-8006-35ed060f8ee3'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'd3a63007-e420-2fcc-aed8-c5149422dfde'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_output'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_output'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\u001B[0m\n", + "\u001B[32m\\n**【简析】**\\n- **首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \u001B[0m\n", + "\u001B[32m**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \u001B[0m\n", + "\u001B[32m**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\u001B[0m\n", + "\u001B[32m千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \u001B[0m\n", + "\u001B[32m全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。\\n \u001B[0m\n", + "\u001B[32m笑话:**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全\u001B[0m\n", + "\u001B[32m场。 \\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \u001B[0m\n", + "\u001B[32m\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \u001B[0m\n", + "\u001B[32m\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\u001B[0m\n", + "\u001B[32m部署任务’。” \u001B[0m\n", + "\u001B[32m\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\u001B[0m\n", + "\u001B[32m试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\u001B[0m\n", + "\u001B[32m蟑螂。’” \u001B[0m\n", + "\u001B[32m\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \u001B[0m\n", + "\u001B[32m\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \u001B[0m\n", + "\u001B[32m\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \u001B[0m\n", + "\u001B[32m\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \u001B[0m\n", + "\u001B[32m\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_poem'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d928-6a08-8006-35ed060f8ee3'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m6\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:51.526192+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d926-6e74-8005-a9fc4c288c05'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'77342f14-15e6-c5bc-8f25-b8b8cefd007d'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_poem'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_poem'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \u001B[0m\n", + "\u001B[32m**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \u001B[0m\n", + "\u001B[32m**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\u001B[0m\n", + "\u001B[32m千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \u001B[0m\n", + "\u001B[32m全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'825339d5-161c-ccc8-9b2e-34feabd5553f'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_joke'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'joke'\u001B[0m: \n", + "\u001B[32m'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\u001B[0m\n", + "\u001B[32m\\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \u001B[0m\n", + "\u001B[32m\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \u001B[0m\n", + "\u001B[32m\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\u001B[0m\n", + "\u001B[32m部署任务’。” \u001B[0m\n", + "\u001B[32m\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\u001B[0m\n", + "\u001B[32m试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\u001B[0m\n", + "\u001B[32m蟑螂。’” \u001B[0m\n", + "\u001B[32m\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \u001B[0m\n", + "\u001B[32m\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \u001B[0m\n", + "\u001B[32m\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \u001B[0m\n", + "\u001B[32m\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \u001B[0m\n", + "\u001B[32m\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_change_topic'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d926-6e74-8005-a9fc4c288c05'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m5\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:51.525484+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d925-6f6a-8004-afdc655bcf3e'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'5a530aea-0249-8ac1-d3f9-b682fe5c3ed1'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_change_topic'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_change_topic'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__start__'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d925-6f6a-8004-afdc655bcf3e'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m4\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'input'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:51.525097+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d86e-69fa-8003-114ba5bfc8d9'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'c826210e-4aff-32fc-0107-d1f9db0dafac'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'__start__'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'__start__'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d86e-69fa-8003-114ba5bfc8d9'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m3\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:51.449994+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d869-65ae-8002-29476531e96f'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_output'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d869-65ae-8002-29476531e96f'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m2\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:51.447817+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c5-661a-8001-4ddcbe7b9f39'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'd43b88ad-1c4d-fcf9-1384-87ed89945888'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_output'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_output'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_poem'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c5-661a-8001-4ddcbe7b9f39'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m1\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:15.833955+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c2-6b54-8000-42a6002f7750'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'dd3335c3-b32b-a9d1-beeb-9bd2174bd04e'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_poem'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_poem'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'7218bff6-2df7-fc0d-1af3-929655e851e4'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_joke'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_change_topic'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c2-6b54-8000-42a6002f7750'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m0\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:15.832861+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c1-62d6-bfff-ee766e7f5ad0'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'6638d1a7-2292-8f41-20b6-33dc3155b1cf'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_change_topic'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_change_topic'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__start__'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c1-62d6-bfff-ee766e7f5ad0'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m-1\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'input'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:15.832233+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'1571a5e2-96b4-b37c-436f-c20218e363af'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'__start__'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'__start__'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" + ], + "text/html": [ + "
[\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:狸花猫',\n",
+       "            'poem': \n",
+       "'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \n",
+       "**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \n",
+       "**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \n",
+       "**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\n",
+       "千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \n",
+       "全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。',\n",
+       "            'joke': \n",
+       "'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\n",
+       "\\n医生一边量体重一边笑:“你家猫脾气挺大啊。”  \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。”  \n",
+       "\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?”  \\n“咋了?”  \n",
+       "\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\n",
+       "部署任务’。”  \n",
+       "\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\n",
+       "试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\n",
+       "蟑螂。’”  \n",
+       "\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。”  \n",
+       "\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。  \n",
+       "\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?”  \n",
+       "\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译):  \n",
+       "\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦',\n",
+       "            'final_output': \n",
+       "'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\n",
+       "\\n**【简析】**\\n- **首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \n",
+       "**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \n",
+       "**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\n",
+       "千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \n",
+       "全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。\\n \n",
+       "笑话:**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全\n",
+       "场。  \\n医生一边量体重一边笑:“你家猫脾气挺大啊。”  \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。”  \n",
+       "\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?”  \\n“咋了?”  \n",
+       "\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\n",
+       "部署任务’。”  \n",
+       "\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\n",
+       "试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\n",
+       "蟑螂。’”  \n",
+       "\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。”  \n",
+       "\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。  \n",
+       "\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?”  \n",
+       "\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译):  \n",
+       "\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦\\n'\n",
+       "        },\n",
+       "        next=(),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbe-0706-6974-8008-c71557b5dc3e'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 8, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:15:23.179237+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbe-0701-68de-8007-2ad28bcb4976'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:狸花猫',\n",
+       "            'poem': \n",
+       "'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \n",
+       "**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \n",
+       "**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \n",
+       "**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\n",
+       "千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \n",
+       "全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。',\n",
+       "            'joke': \n",
+       "'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\n",
+       "\\n医生一边量体重一边笑:“你家猫脾气挺大啊。”  \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。”  \n",
+       "\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?”  \\n“咋了?”  \n",
+       "\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\n",
+       "部署任务’。”  \n",
+       "\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\n",
+       "试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\n",
+       "蟑螂。’”  \n",
+       "\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。”  \n",
+       "\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。  \n",
+       "\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?”  \n",
+       "\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译):  \n",
+       "\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=('node_output',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbe-0701-68de-8007-2ad28bcb4976'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 7, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:15:23.177150+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d928-6a08-8006-35ed060f8ee3'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='d3a63007-e420-2fcc-aed8-c5149422dfde',\n",
+       "                name='node_output',\n",
+       "                path=('__pregel_pull', 'node_output'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'final_output': \n",
+       "'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\n",
+       "\\n**【简析】**\\n- **首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \n",
+       "**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \n",
+       "**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\n",
+       "千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \n",
+       "全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。\\n \n",
+       "笑话:**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全\n",
+       "场。  \\n医生一边量体重一边笑:“你家猫脾气挺大啊。”  \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。”  \n",
+       "\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?”  \\n“咋了?”  \n",
+       "\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\n",
+       "部署任务’。”  \n",
+       "\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\n",
+       "试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\n",
+       "蟑螂。’”  \n",
+       "\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。”  \n",
+       "\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。  \n",
+       "\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?”  \n",
+       "\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译):  \n",
+       "\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦\\n'\n",
+       "                }\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:狸花猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=('node_poem', 'node_joke'),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d928-6a08-8006-35ed060f8ee3'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 6, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:51.526192+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d926-6e74-8005-a9fc4c288c05'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='77342f14-15e6-c5bc-8f25-b8b8cefd007d',\n",
+       "                name='node_poem',\n",
+       "                path=('__pregel_pull', 'node_poem'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'poem': \n",
+       "'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \n",
+       "**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \n",
+       "**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \n",
+       "**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\n",
+       "千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \n",
+       "全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。'\n",
+       "                }\n",
+       "            ),\n",
+       "            PregelTask(\n",
+       "                id='825339d5-161c-ccc8-9b2e-34feabd5553f',\n",
+       "                name='node_joke',\n",
+       "                path=('__pregel_pull', 'node_joke'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'joke': \n",
+       "'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\n",
+       "\\n医生一边量体重一边笑:“你家猫脾气挺大啊。”  \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。”  \n",
+       "\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?”  \\n“咋了?”  \n",
+       "\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\n",
+       "部署任务’。”  \n",
+       "\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\n",
+       "试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\n",
+       "蟑螂。’”  \n",
+       "\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。”  \n",
+       "\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。  \n",
+       "\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?”  \n",
+       "\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译):  \n",
+       "\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦'\n",
+       "                }\n",
+       "            )\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=('node_change_topic',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d926-6e74-8005-a9fc4c288c05'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 5, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:51.525484+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d925-6f6a-8004-afdc655bcf3e'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='5a530aea-0249-8ac1-d3f9-b682fe5c3ed1',\n",
+       "                name='node_change_topic',\n",
+       "                path=('__pregel_pull', 'node_change_topic'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫:狸花猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:布偶猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=('__start__',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d925-6f6a-8004-afdc655bcf3e'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 4, 'source': 'input', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:51.525097+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d86e-69fa-8003-114ba5bfc8d9'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='c826210e-4aff-32fc-0107-d1f9db0dafac',\n",
+       "                name='__start__',\n",
+       "                path=('__pregel_pull', '__start__'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:布偶猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=(),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d86e-69fa-8003-114ba5bfc8d9'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 3, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:51.449994+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d869-65ae-8002-29476531e96f'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:布偶猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\n",
+       "        },\n",
+       "        next=('node_output',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d869-65ae-8002-29476531e96f'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 2, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:51.447817+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c5-661a-8001-4ddcbe7b9f39'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='d43b88ad-1c4d-fcf9-1384-87ed89945888',\n",
+       "                name='node_output',\n",
+       "                path=('__pregel_pull', 'node_output'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "                }\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '猫:布偶猫'},\n",
+       "        next=('node_poem', 'node_joke'),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c5-661a-8001-4ddcbe7b9f39'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 1, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:15.833955+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c2-6b54-8000-42a6002f7750'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='dd3335c3-b32b-a9d1-beeb-9bd2174bd04e',\n",
+       "                name='node_poem',\n",
+       "                path=('__pregel_pull', 'node_poem'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\n",
+       "                }\n",
+       "            ),\n",
+       "            PregelTask(\n",
+       "                id='7218bff6-2df7-fc0d-1af3-929655e851e4',\n",
+       "                name='node_joke',\n",
+       "                path=('__pregel_pull', 'node_joke'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\n",
+       "                }\n",
+       "            )\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '猫'},\n",
+       "        next=('node_change_topic',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c2-6b54-8000-42a6002f7750'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 0, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:15.832861+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c1-62d6-bfff-ee766e7f5ad0'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='6638d1a7-2292-8f41-20b6-33dc3155b1cf',\n",
+       "                name='node_change_topic',\n",
+       "                path=('__pregel_pull', 'node_change_topic'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫:布偶猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={},\n",
+       "        next=('__start__',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c1-62d6-bfff-ee766e7f5ad0'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': -1, 'source': 'input', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:15.832233+00:00',\n",
+       "        parent_config=None,\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='1571a5e2-96b4-b37c-436f-c20218e363af',\n",
+       "                name='__start__',\n",
+       "                path=('__pregel_pull', '__start__'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    )\n",
+       "]\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T06:16:11.359762Z", + "start_time": "2026-08-04T06:15:23.340114Z" + } + }, + "cell_type": "code", + "source": [ + "with PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " graph = builder.compile(checkpointer=checkpointer)\n", + "\n", + " config: RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": Thread_ID\n", + " }\n", + " }\n", + "\n", + " now_checkpoint_config = None\n", + " for checkpoint in graph.get_state_history(config=config):\n", + " if checkpoint.next == ('node_poem', 'node_joke'):\n", + " now_checkpoint_config = checkpoint.config\n", + " break\n", + " rp(now_checkpoint_config)\n", + " res = graph.invoke(None, config=now_checkpoint_config)\n", + " print(res)" + ], + "id": "205d29fbdabb464", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d928-6a08-8006-35ed060f8ee3'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + "\u001B[1m}\u001B[0m\n" + ], + "text/html": [ + "
{\n",
+       "    'configurable': {\n",
+       "        'thread_id': 'chapter03-03-2',\n",
+       "        'checkpoint_ns': '',\n",
+       "        'checkpoint_id': '1f18fcbc-d928-6a08-8006-35ed060f8ee3'\n",
+       "    }\n",
+       "}\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001B[32m2026-08-04 14:15:23.365\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_joke\u001B[0m:\u001B[36m60\u001B[0m - \u001B[1mnode_joke正在执行\u001B[0m\n", + "\u001B[32m2026-08-04 14:15:23.365\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_poem\u001B[0m:\u001B[36m48\u001B[0m - \u001B[1mnode_poem正在执行\u001B[0m\n", + "\u001B[32m2026-08-04 14:16:11.327\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mnode_output\u001B[0m:\u001B[36m70\u001B[0m - \u001B[1mnode_output正在执行\u001B[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'final_output': '关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\\n---\\n**【格律与立意简注】**\\n- **体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- **起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- **承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- **转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物特性。\\n- **合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长。\\n 笑话:# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣, \\n踱步阳台当总监。 \\n抓鼠翻墙样样精, \\n主人唤名装没听见。 \\n\\n若问为何太傲娇? \\n它舔爪子慢悠悠: \\n“本喵虽会捉老鼠, \\n不按劳动法加班!”\\n\\n---\\n💡 *注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*\\n'}\n" + ] + } + ], + "execution_count": 6 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T06:17:36.689887Z", + "start_time": "2026-08-04T06:17:36.619547Z" + } + }, + "cell_type": "code", + "source": [ + "\n", + "with PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " graph = builder.compile(checkpointer=checkpointer)\n", + "\n", + " config: RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": Thread_ID\n", + " }\n", + " }\n", + "\n", + " a = graph.get_state_history(config=config)\n", + " rp(list(a))" + ], + "id": "91746e5d4d323f19", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m[\u001B[0m\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\\n---\\n**【格律与立意简\u001B[0m\n", + "\u001B[32m注】**\\n- **体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- \u001B[0m\n", + "\u001B[32m**起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- \u001B[0m\n", + "\u001B[32m**承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- \u001B[0m\n", + "\u001B[32m**转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物\u001B[0m\n", + "\u001B[32m特性。\\n- \u001B[0m\n", + "\u001B[32m**合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长\u001B[0m\n", + "\u001B[32m。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣, \\n踱步阳台当总监。 \\n抓鼠翻墙样样精, \u001B[0m\n", + "\u001B[32m\\n主人唤名装没听见。 \\n\\n若问为何太傲娇? \\n它舔爪子慢悠悠: \\n“本喵虽会捉老鼠, \\n不按劳动法加班!”\\n\\n---\\n💡\u001B[0m\n", + "\u001B[32m*注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子\u001B[0m\n", + "\u001B[32m“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\u001B[0m\n", + "\u001B[32m\\n---\\n**【格律与立意简注】**\\n- \u001B[0m\n", + "\u001B[32m**体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- \u001B[0m\n", + "\u001B[32m**起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- \u001B[0m\n", + "\u001B[32m**承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- \u001B[0m\n", + "\u001B[32m**转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物\u001B[0m\n", + "\u001B[32m特性。\\n- \u001B[0m\n", + "\u001B[32m**合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长\u001B[0m\n", + "\u001B[32m。\\n 笑话:# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣, \\n踱步阳台当总监。 \\n抓鼠翻墙样样精, \\n主人唤名装没听见。 \u001B[0m\n", + "\u001B[32m\\n\\n若问为何太傲娇? \\n它舔爪子慢悠悠: \\n“本喵虽会捉老鼠, \\n不按劳动法加班!”\\n\\n---\\n💡 \u001B[0m\n", + "\u001B[32m*注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子\u001B[0m\n", + "\u001B[32m“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbf-d238-6cb8-8009-761153ff2d85'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m9\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:16:11.329433+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbf-d233-622c-8008-d774e7412fab'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\\n---\\n**【格律与立意简\u001B[0m\n", + "\u001B[32m注】**\\n- **体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- \u001B[0m\n", + "\u001B[32m**起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- \u001B[0m\n", + "\u001B[32m**承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- \u001B[0m\n", + "\u001B[32m**转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物\u001B[0m\n", + "\u001B[32m特性。\\n- \u001B[0m\n", + "\u001B[32m**合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长\u001B[0m\n", + "\u001B[32m。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣, \\n踱步阳台当总监。 \\n抓鼠翻墙样样精, \u001B[0m\n", + "\u001B[32m\\n主人唤名装没听见。 \\n\\n若问为何太傲娇? \\n它舔爪子慢悠悠: \\n“本喵虽会捉老鼠, \\n不按劳动法加班!”\\n\\n---\\n💡\u001B[0m\n", + "\u001B[32m*注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子\u001B[0m\n", + "\u001B[32m“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_output'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbf-d233-622c-8008-d774e7412fab'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m8\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:16:11.327101+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbe-08ca-6846-8007-ef432c456ae1'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'4221f56c-6ad1-2e20-4599-c4e09ab8e821'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_output'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_output'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\u001B[0m\n", + "\u001B[32m\\n---\\n**【格律与立意简注】**\\n- \u001B[0m\n", + "\u001B[32m**体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- \u001B[0m\n", + "\u001B[32m**起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- \u001B[0m\n", + "\u001B[32m**承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- \u001B[0m\n", + "\u001B[32m**转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物\u001B[0m\n", + "\u001B[32m特性。\\n- \u001B[0m\n", + "\u001B[32m**合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长\u001B[0m\n", + "\u001B[32m。\\n 笑话:# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣, \\n踱步阳台当总监。 \\n抓鼠翻墙样样精, \\n主人唤名装没听见。 \u001B[0m\n", + "\u001B[32m\\n\\n若问为何太傲娇? \\n它舔爪子慢悠悠: \\n“本喵虽会捉老鼠, \\n不按劳动法加班!”\\n\\n---\\n💡 \u001B[0m\n", + "\u001B[32m*注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子\u001B[0m\n", + "\u001B[32m“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_poem'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbe-08ca-6846-8007-ef432c456ae1'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m7\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'fork'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:15:23.364347+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d928-6a08-8006-35ed060f8ee3'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'a24083cf-94c9-2cde-8be1-f15357aa52e6'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_poem'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_poem'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\\n---\\n**【格律与立意简\u001B[0m\n", + "\u001B[32m注】**\\n- **体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- \u001B[0m\n", + "\u001B[32m**起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- \u001B[0m\n", + "\u001B[32m**承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- \u001B[0m\n", + "\u001B[32m**转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物\u001B[0m\n", + "\u001B[32m特性。\\n- \u001B[0m\n", + "\u001B[32m**合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长\u001B[0m\n", + "\u001B[32m。'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'f38c182c-7475-4cff-c9b0-5e0843bd0650'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_joke'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣, \\n踱步阳台当总监。 \\n抓鼠翻墙样样精, \u001B[0m\n", + "\u001B[32m\\n主人唤名装没听见。 \\n\\n若问为何太傲娇? \\n它舔爪子慢悠悠: \\n“本喵虽会捉老鼠, \\n不按劳动法加班!”\\n\\n---\\n💡\u001B[0m\n", + "\u001B[32m*注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子\u001B[0m\n", + "\u001B[32m“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \u001B[0m\n", + "\u001B[32m**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \u001B[0m\n", + "\u001B[32m**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\u001B[0m\n", + "\u001B[32m千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \u001B[0m\n", + "\u001B[32m全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \n", + "\u001B[32m'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\u001B[0m\n", + "\u001B[32m\\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \u001B[0m\n", + "\u001B[32m\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \u001B[0m\n", + "\u001B[32m\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\u001B[0m\n", + "\u001B[32m部署任务’。” \u001B[0m\n", + "\u001B[32m\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\u001B[0m\n", + "\u001B[32m试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\u001B[0m\n", + "\u001B[32m蟑螂。’” \u001B[0m\n", + "\u001B[32m\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \u001B[0m\n", + "\u001B[32m\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \u001B[0m\n", + "\u001B[32m\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \u001B[0m\n", + "\u001B[32m\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \u001B[0m\n", + "\u001B[32m\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\u001B[0m\n", + "\u001B[32m\\n**【简析】**\\n- **首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \u001B[0m\n", + "\u001B[32m**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \u001B[0m\n", + "\u001B[32m**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\u001B[0m\n", + "\u001B[32m千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \u001B[0m\n", + "\u001B[32m全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。\\n \u001B[0m\n", + "\u001B[32m笑话:**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全\u001B[0m\n", + "\u001B[32m场。 \\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \u001B[0m\n", + "\u001B[32m\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \u001B[0m\n", + "\u001B[32m\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\u001B[0m\n", + "\u001B[32m部署任务’。” \u001B[0m\n", + "\u001B[32m\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\u001B[0m\n", + "\u001B[32m试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\u001B[0m\n", + "\u001B[32m蟑螂。’” \u001B[0m\n", + "\u001B[32m\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \u001B[0m\n", + "\u001B[32m\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \u001B[0m\n", + "\u001B[32m\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \u001B[0m\n", + "\u001B[32m\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \u001B[0m\n", + "\u001B[32m\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbe-0706-6974-8008-c71557b5dc3e'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m8\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:15:23.179237+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbe-0701-68de-8007-2ad28bcb4976'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \u001B[0m\n", + "\u001B[32m**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \u001B[0m\n", + "\u001B[32m**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\u001B[0m\n", + "\u001B[32m千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \u001B[0m\n", + "\u001B[32m全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \n", + "\u001B[32m'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\u001B[0m\n", + "\u001B[32m\\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \u001B[0m\n", + "\u001B[32m\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \u001B[0m\n", + "\u001B[32m\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\u001B[0m\n", + "\u001B[32m部署任务’。” \u001B[0m\n", + "\u001B[32m\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\u001B[0m\n", + "\u001B[32m试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\u001B[0m\n", + "\u001B[32m蟑螂。’” \u001B[0m\n", + "\u001B[32m\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \u001B[0m\n", + "\u001B[32m\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \u001B[0m\n", + "\u001B[32m\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \u001B[0m\n", + "\u001B[32m\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \u001B[0m\n", + "\u001B[32m\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_output'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbe-0701-68de-8007-2ad28bcb4976'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m7\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:15:23.177150+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d928-6a08-8006-35ed060f8ee3'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'd3a63007-e420-2fcc-aed8-c5149422dfde'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_output'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_output'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\u001B[0m\n", + "\u001B[32m\\n**【简析】**\\n- **首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \u001B[0m\n", + "\u001B[32m**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \u001B[0m\n", + "\u001B[32m**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\u001B[0m\n", + "\u001B[32m千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \u001B[0m\n", + "\u001B[32m全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。\\n \u001B[0m\n", + "\u001B[32m笑话:**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全\u001B[0m\n", + "\u001B[32m场。 \\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \u001B[0m\n", + "\u001B[32m\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \u001B[0m\n", + "\u001B[32m\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\u001B[0m\n", + "\u001B[32m部署任务’。” \u001B[0m\n", + "\u001B[32m\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\u001B[0m\n", + "\u001B[32m试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\u001B[0m\n", + "\u001B[32m蟑螂。’” \u001B[0m\n", + "\u001B[32m\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \u001B[0m\n", + "\u001B[32m\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \u001B[0m\n", + "\u001B[32m\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \u001B[0m\n", + "\u001B[32m\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \u001B[0m\n", + "\u001B[32m\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_poem'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d928-6a08-8006-35ed060f8ee3'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m6\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:51.526192+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d926-6e74-8005-a9fc4c288c05'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'77342f14-15e6-c5bc-8f25-b8b8cefd007d'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_poem'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_poem'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \u001B[0m\n", + "\u001B[32m**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \u001B[0m\n", + "\u001B[32m**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \u001B[0m\n", + "\u001B[32m**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\u001B[0m\n", + "\u001B[32m千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \u001B[0m\n", + "\u001B[32m全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'825339d5-161c-ccc8-9b2e-34feabd5553f'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_joke'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'joke'\u001B[0m: \n", + "\u001B[32m'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\u001B[0m\n", + "\u001B[32m\\n医生一边量体重一边笑:“你家猫脾气挺大啊。” \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。” \u001B[0m\n", + "\u001B[32m\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?” \\n“咋了?” \u001B[0m\n", + "\u001B[32m\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\u001B[0m\n", + "\u001B[32m部署任务’。” \u001B[0m\n", + "\u001B[32m\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\u001B[0m\n", + "\u001B[32m试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\u001B[0m\n", + "\u001B[32m蟑螂。’” \u001B[0m\n", + "\u001B[32m\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。” \u001B[0m\n", + "\u001B[32m\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。 \u001B[0m\n", + "\u001B[32m\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?” \u001B[0m\n", + "\u001B[32m\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译): \u001B[0m\n", + "\u001B[32m\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_change_topic'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d926-6e74-8005-a9fc4c288c05'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m5\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:51.525484+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d925-6f6a-8004-afdc655bcf3e'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'5a530aea-0249-8ac1-d3f9-b682fe5c3ed1'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_change_topic'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_change_topic'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫:狸花猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__start__'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d925-6f6a-8004-afdc655bcf3e'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m4\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'input'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:51.525097+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d86e-69fa-8003-114ba5bfc8d9'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'c826210e-4aff-32fc-0107-d1f9db0dafac'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'__start__'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'__start__'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m,\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d86e-69fa-8003-114ba5bfc8d9'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m3\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:51.449994+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d869-65ae-8002-29476531e96f'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m,\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_output'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbc-d869-65ae-8002-29476531e96f'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m2\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:51.447817+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c5-661a-8001-4ddcbe7b9f39'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'd43b88ad-1c4d-fcf9-1384-87ed89945888'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_output'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_output'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'final_output'\u001B[0m: \n", + "\u001B[32m'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\u001B[0m\n", + "\u001B[32m格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \u001B[0m\n", + "\u001B[32m《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \\n以为是个大傲娇。 \u001B[0m\n", + "\u001B[32m\\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_poem'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c5-661a-8001-4ddcbe7b9f39'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m1\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:15.833955+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c2-6b54-8000-42a6002f7750'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'dd3335c3-b32b-a9d1-beeb-9bd2174bd04e'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_poem'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_poem'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'poem'\u001B[0m: \n", + "\u001B[32m'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \u001B[0m\n", + "\u001B[32m体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n \u001B[0m\n", + "\u001B[32m平平仄仄仄平平,仄仄平平仄仄平。\\n 平平仄仄平平仄,仄仄平平仄仄平。\\n (严格依正格,无拗救)\\n\\n【意象简析】\\n- \u001B[0m\n", + "\u001B[32m首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \u001B[0m\n", + "\u001B[32m次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \u001B[0m\n", + "\u001B[32m三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \u001B[0m\n", + "\u001B[32m结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'7218bff6-2df7-fc0d-1af3-929655e851e4'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_joke'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_joke'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'joke'\u001B[0m: \u001B[32m'# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍, \\n蓝眸深邃似星涛。 \\n人前端坐摆架子, \u001B[0m\n", + "\u001B[32m\\n以为是个大傲娇。 \\n\\n忽闻开罐“咔哒”响, \\n秒变软泥往膝跑。 \\n若问为何名布偶? \\n**实乃吃货演技高!**\\n\\n💡 \u001B[0m\n", + "\u001B[32m*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\u001B[0m\n", + "\u001B[32m真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_change_topic'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c2-6b54-8000-42a6002f7750'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m0\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:15.832861+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c1-62d6-bfff-ee766e7f5ad0'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'6638d1a7-2292-8f41-20b6-33dc3155b1cf'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_change_topic'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_change_topic'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫:布偶猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__start__'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'chapter03-03-2'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f18fcbb-84c1-62d6-bfff-ee766e7f5ad0'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'step'\u001B[0m: \u001B[1;36m-1\u001B[0m, \u001B[32m'source'\u001B[0m: \u001B[32m'input'\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-04T06:14:15.832233+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'1571a5e2-96b4-b37c-436f-c20218e363af'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'__start__'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'__start__'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'猫'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" + ], + "text/html": [ + "
[\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:狸花猫',\n",
+       "            'poem': \n",
+       "'**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\\n---\\n**【格律与立意简\n",
+       "注】**\\n- **体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- \n",
+       "**起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- \n",
+       "**承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- \n",
+       "**转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物\n",
+       "特性。\\n- \n",
+       "**合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长\n",
+       "。',\n",
+       "            'joke': '# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣,  \\n踱步阳台当总监。  \\n抓鼠翻墙样样精,  \n",
+       "\\n主人唤名装没听见。  \\n\\n若问为何太傲娇?  \\n它舔爪子慢悠悠:  \\n“本喵虽会捉老鼠,  \\n不按劳动法加班!”\\n\\n---\\n💡\n",
+       "*注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子\n",
+       "“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*',\n",
+       "            'final_output': \n",
+       "'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\n",
+       "\\n---\\n**【格律与立意简注】**\\n- \n",
+       "**体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- \n",
+       "**起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- \n",
+       "**承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- \n",
+       "**转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物\n",
+       "特性。\\n- \n",
+       "**合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长\n",
+       "。\\n 笑话:# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣,  \\n踱步阳台当总监。  \\n抓鼠翻墙样样精,  \\n主人唤名装没听见。  \n",
+       "\\n\\n若问为何太傲娇?  \\n它舔爪子慢悠悠:  \\n“本喵虽会捉老鼠,  \\n不按劳动法加班!”\\n\\n---\\n💡 \n",
+       "*注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子\n",
+       "“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*\\n'\n",
+       "        },\n",
+       "        next=(),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbf-d238-6cb8-8009-761153ff2d85'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 9, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:16:11.329433+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbf-d233-622c-8008-d774e7412fab'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:狸花猫',\n",
+       "            'poem': \n",
+       "'**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\\n---\\n**【格律与立意简\n",
+       "注】**\\n- **体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- \n",
+       "**起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- \n",
+       "**承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- \n",
+       "**转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物\n",
+       "特性。\\n- \n",
+       "**合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长\n",
+       "。',\n",
+       "            'joke': '# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣,  \\n踱步阳台当总监。  \\n抓鼠翻墙样样精,  \n",
+       "\\n主人唤名装没听见。  \\n\\n若问为何太傲娇?  \\n它舔爪子慢悠悠:  \\n“本喵虽会捉老鼠,  \\n不按劳动法加班!”\\n\\n---\\n💡\n",
+       "*注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子\n",
+       "“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=('node_output',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbf-d233-622c-8008-d774e7412fab'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 8, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:16:11.327101+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbe-08ca-6846-8007-ef432c456ae1'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='4221f56c-6ad1-2e20-4599-c4e09ab8e821',\n",
+       "                name='node_output',\n",
+       "                path=('__pregel_pull', 'node_output'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'final_output': \n",
+       "'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\n",
+       "\\n---\\n**【格律与立意简注】**\\n- \n",
+       "**体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- \n",
+       "**起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- \n",
+       "**承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- \n",
+       "**转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物\n",
+       "特性。\\n- \n",
+       "**合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长\n",
+       "。\\n 笑话:# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣,  \\n踱步阳台当总监。  \\n抓鼠翻墙样样精,  \\n主人唤名装没听见。  \n",
+       "\\n\\n若问为何太傲娇?  \\n它舔爪子慢悠悠:  \\n“本喵虽会捉老鼠,  \\n不按劳动法加班!”\\n\\n---\\n💡 \n",
+       "*注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子\n",
+       "“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*\\n'\n",
+       "                }\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:狸花猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=('node_poem', 'node_joke'),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbe-08ca-6846-8007-ef432c456ae1'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 7, 'source': 'fork', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:15:23.364347+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d928-6a08-8006-35ed060f8ee3'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='a24083cf-94c9-2cde-8be1-f15357aa52e6',\n",
+       "                name='node_poem',\n",
+       "                path=('__pregel_pull', 'node_poem'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'poem': \n",
+       "'**《咏狸花猫》**\\n狸斑似虎沐晨晴,\\n跃壁穿廊逐影轻。\\n野性天成非槛养,\\n闲依短砌伴灯明。\\n\\n---\\n**【格律与立意简\n",
+       "注】**\\n- **体裁**:七言绝句,平起首句入韵,押《平水韵》下平八庚(晴、轻、明)。平仄严合规制。\\n- \n",
+       "**起句**:“狸斑似虎”点出中国本土狸花猫独有的棕黑相间斑纹,自带山野气韵;“沐晨晴”赋予画面清朗生机。\\n- \n",
+       "**承句**:以“跃壁穿廊”“逐影轻”刻画其矫健敏捷、狩猎本能,动静相生,突出灵动机敏的体态。\\n- \n",
+       "**转句**:“野性天成非槛养”一笔宕开,强调其不靠人工娇宠、不恋朱门华堂的独立品格,贴合狸花猫耐寒耐粗、适应力强的生物\n",
+       "特性。\\n- \n",
+       "**合句**:“闲依短砌伴灯明”收束于人与猫的默契共处。虽具野性却不疏离,长夜守望院落,静伴人间灯火,外刚内柔,余味绵长\n",
+       "。'\n",
+       "                }\n",
+       "            ),\n",
+       "            PregelTask(\n",
+       "                id='f38c182c-7475-4cff-c9b0-5e0843bd0650',\n",
+       "                name='node_joke',\n",
+       "                path=('__pregel_pull', 'node_joke'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'joke': '# 《狸花猫上岗记》\\n\\n狸花身披虎斑衣,  \\n踱步阳台当总监。  \\n抓鼠翻墙样样精,  \n",
+       "\\n主人唤名装没听见。  \\n\\n若问为何太傲娇?  \\n它舔爪子慢悠悠:  \\n“本喵虽会捉老鼠,  \\n不按劳动法加班!”\\n\\n---\\n💡\n",
+       "*注:狸花猫是中国原生猫种,以体格健壮、捕猎本能强、性格独立著称。这首诗用“职场打工人”的反差梗包装,既保留了你家主子\n",
+       "“又菜又爱演”的日常,也暗夸了它一身好本领~(记得按时开罐,毕竟合同上可没写自愿996哦)*'\n",
+       "                }\n",
+       "            )\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:狸花猫',\n",
+       "            'poem': \n",
+       "'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \n",
+       "**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \n",
+       "**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \n",
+       "**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\n",
+       "千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \n",
+       "全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。',\n",
+       "            'joke': \n",
+       "'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\n",
+       "\\n医生一边量体重一边笑:“你家猫脾气挺大啊。”  \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。”  \n",
+       "\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?”  \\n“咋了?”  \n",
+       "\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\n",
+       "部署任务’。”  \n",
+       "\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\n",
+       "试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\n",
+       "蟑螂。’”  \n",
+       "\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。”  \n",
+       "\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。  \n",
+       "\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?”  \n",
+       "\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译):  \n",
+       "\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦',\n",
+       "            'final_output': \n",
+       "'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\n",
+       "\\n**【简析】**\\n- **首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \n",
+       "**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \n",
+       "**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\n",
+       "千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \n",
+       "全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。\\n \n",
+       "笑话:**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全\n",
+       "场。  \\n医生一边量体重一边笑:“你家猫脾气挺大啊。”  \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。”  \n",
+       "\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?”  \\n“咋了?”  \n",
+       "\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\n",
+       "部署任务’。”  \n",
+       "\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\n",
+       "试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\n",
+       "蟑螂。’”  \n",
+       "\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。”  \n",
+       "\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。  \n",
+       "\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?”  \n",
+       "\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译):  \n",
+       "\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦\\n'\n",
+       "        },\n",
+       "        next=(),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbe-0706-6974-8008-c71557b5dc3e'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 8, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:15:23.179237+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbe-0701-68de-8007-2ad28bcb4976'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:狸花猫',\n",
+       "            'poem': \n",
+       "'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \n",
+       "**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \n",
+       "**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \n",
+       "**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\n",
+       "千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \n",
+       "全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。',\n",
+       "            'joke': \n",
+       "'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\n",
+       "\\n医生一边量体重一边笑:“你家猫脾气挺大啊。”  \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。”  \n",
+       "\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?”  \\n“咋了?”  \n",
+       "\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\n",
+       "部署任务’。”  \n",
+       "\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\n",
+       "试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\n",
+       "蟑螂。’”  \n",
+       "\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。”  \n",
+       "\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。  \n",
+       "\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?”  \n",
+       "\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译):  \n",
+       "\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=('node_output',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbe-0701-68de-8007-2ad28bcb4976'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 7, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:15:23.177150+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d928-6a08-8006-35ed060f8ee3'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='d3a63007-e420-2fcc-aed8-c5149422dfde',\n",
+       "                name='node_output',\n",
+       "                path=('__pregel_pull', 'node_output'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'final_output': \n",
+       "'关于猫:狸花猫的七言绝句:**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\n",
+       "\\n**【简析】**\\n- **首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \n",
+       "**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \n",
+       "**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\n",
+       "千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \n",
+       "全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。\\n \n",
+       "笑话:**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全\n",
+       "场。  \\n医生一边量体重一边笑:“你家猫脾气挺大啊。”  \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。”  \n",
+       "\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?”  \\n“咋了?”  \n",
+       "\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\n",
+       "部署任务’。”  \n",
+       "\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\n",
+       "试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\n",
+       "蟑螂。’”  \n",
+       "\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。”  \n",
+       "\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。  \n",
+       "\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?”  \n",
+       "\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译):  \n",
+       "\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦\\n'\n",
+       "                }\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:狸花猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=('node_poem', 'node_joke'),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d928-6a08-8006-35ed060f8ee3'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 6, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:51.526192+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d926-6e74-8005-a9fc4c288c05'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='77342f14-15e6-c5bc-8f25-b8b8cefd007d',\n",
+       "                name='node_poem',\n",
+       "                path=('__pregel_pull', 'node_poem'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'poem': \n",
+       "'**《咏狸花猫》**\\n狸纹似虎卧斜阳,\\n跃瓦穿庭影自长。\\n不恋朱门金屋暖,\\n闲栖草舍即吾乡。\\n\\n**【简析】**\\n- \n",
+       "**首句**以“狸纹似虎”点出狸花猫典型的斑甲特征,斜阳 backdrop 赋予画面古朴静谧之气。\\n- \n",
+       "**次句**写其灵动之态,“跃瓦穿庭”勾勒中国传统院落中的常见身影,“影自长”暗含其从容自在的性情。\\n- \n",
+       "**后两句**作对比转折,狸花猫虽生于民间,却不愿被豢养于金笼华室;“草舍即吾乡”既呼应其作为中国本土猫种与百姓生活相伴\n",
+       "千年的文化基因,亦托出其独立而不失忠诚的品格。\\n- \n",
+       "全诗依《平水韵》下平七阳,属七绝平起首句入韵正格,意象古典凝练,贴合狸花猫“形野而心定、居简而性灵”的特质。'\n",
+       "                }\n",
+       "            ),\n",
+       "            PregelTask(\n",
+       "                id='825339d5-161c-ccc8-9b2e-34feabd5553f',\n",
+       "                name='node_joke',\n",
+       "                path=('__pregel_pull', 'node_joke'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'joke': \n",
+       "'**《狸花猫的“职场定位”》**\\n\\n主人带狸花猫去看医生,猫咪一进诊室就跳上检查台,尾巴盘成个问号,眼神锐利地扫过全场。\n",
+       "\\n医生一边量体重一边笑:“你家猫脾气挺大啊。”  \\n主人挠头:“其实它平时可乖了,就是有点‘职业习惯’。”  \n",
+       "\\n\\n邻居路过插话:“可不嘛!上次物业让拍全家福,我儿子举着胡萝卜逗它,你猜它啥反应?”  \\n“咋了?”  \n",
+       "\\n“它直接端坐上位,前爪交叠,胡须微抖,活脱脱一副‘领导视察工作’的派头。连我家狗子看了都自觉往后挪了两步,生怕打扰‘\n",
+       "部署任务’。”  \n",
+       "\\n\\n主人叹气:“是啊,买进口小窝它嫌软,拆快递盒倒能原地扎营三天三夜;给梳毛嫌麻烦,舔毛三分钟就能‘战备复原’。昨天我\n",
+       "试图教它握手,它甩了我一眼,仿佛在说:‘本喵祖传虎纹迷彩服,天生将门之后。你让我表演招财?不如先看看我昨晚守了多少只\n",
+       "蟑螂。’”  \n",
+       "\\n\\n医生合上病历本,郑重点头:“懂了,这不是宠物,这是编制外的‘社区安防特聘专员’。建议下次挂号挂‘战略顾问’科。”  \n",
+       "\\n\\n主人心安了大半,刚转身出门,听见屋里传来一声短促的呼噜。  \n",
+       "\\n邻居凑近窗边嘀咕:“完了,它是不是又发现墙缝里有动静准备出警了?”  \n",
+       "\\n主人回头一看,只见狸花猫端正坐着,盯着一个空纸盒,缓缓吐出一句(猫语翻译):  \n",
+       "\\n**“沙盘已就位,后勤待命。本将军,下班。”** 🐾📦'\n",
+       "                }\n",
+       "            )\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=('node_change_topic',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d926-6e74-8005-a9fc4c288c05'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 5, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:51.525484+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d925-6f6a-8004-afdc655bcf3e'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='5a530aea-0249-8ac1-d3f9-b682fe5c3ed1',\n",
+       "                name='node_change_topic',\n",
+       "                path=('__pregel_pull', 'node_change_topic'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫:狸花猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:布偶猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=('__start__',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d925-6f6a-8004-afdc655bcf3e'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 4, 'source': 'input', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:51.525097+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d86e-69fa-8003-114ba5bfc8d9'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='c826210e-4aff-32fc-0107-d1f9db0dafac',\n",
+       "                name='__start__',\n",
+       "                path=('__pregel_pull', '__start__'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:布偶猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*',\n",
+       "            'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "        },\n",
+       "        next=(),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d86e-69fa-8003-114ba5bfc8d9'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 3, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:51.449994+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d869-65ae-8002-29476531e96f'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '猫:布偶猫',\n",
+       "            'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。',\n",
+       "            'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\n",
+       "        },\n",
+       "        next=('node_output',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbc-d869-65ae-8002-29476531e96f'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 2, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:51.447817+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c5-661a-8001-4ddcbe7b9f39'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='d43b88ad-1c4d-fcf9-1384-87ed89945888',\n",
+       "                name='node_output',\n",
+       "                path=('__pregel_pull', 'node_output'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'final_output': \n",
+       "'关于猫:布偶猫的七言绝句:《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【\n",
+       "格律说明】\\n- 体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。\\n 笑话:# \n",
+       "《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \\n以为是个大傲娇。  \n",
+       "\\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*\\n'\n",
+       "                }\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '猫:布偶猫'},\n",
+       "        next=('node_poem', 'node_joke'),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c5-661a-8001-4ddcbe7b9f39'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 1, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:15.833955+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c2-6b54-8000-42a6002f7750'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='dd3335c3-b32b-a9d1-beeb-9bd2174bd04e',\n",
+       "                name='node_poem',\n",
+       "                path=('__pregel_pull', 'node_poem'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'poem': \n",
+       "'《咏布偶猫》\\n云裘雪缕拥清眸,\\n静守闲庭岁月悠。\\n娇身一抱随人软,\\n恰似春绵坠玉楼。\\n\\n【格律说明】\\n- \n",
+       "体式:七言绝句(首句平起入韵)\\n- 韵部:平水韵·下平十一尤(眸、悠、楼),一韵到底\\n- 平仄:\\n  \n",
+       "平平仄仄仄平平,仄仄平平仄仄平。\\n  平平仄仄平平仄,仄仄平平仄仄平。\\n  (严格依正格,无拗救)\\n\\n【意象简析】\\n- \n",
+       "首句以“云裘雪缕”喻布偶猫蓬松柔滑的被毛,“清眸”点出其标志性湛蓝眼眸。\\n- \n",
+       "次句写其性情温驯恬淡,不扰尘喧,契合品种“温柔伴侣”的特质。\\n- \n",
+       "三句直击布偶猫最著名的习性:被人抱起时四肢放松、浑身柔软,毫无挣扎戒备。\\n- \n",
+       "结句以“春绵坠楼”作比,既状其轻盈松软之态,又暗扣“布偶”之名,余韵婉约。'\n",
+       "                }\n",
+       "            ),\n",
+       "            PregelTask(\n",
+       "                id='7218bff6-2df7-fc0d-1af3-929655e851e4',\n",
+       "                name='node_joke',\n",
+       "                path=('__pregel_pull', 'node_joke'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'joke': '# 《布偶猫·戏精本喵》\\n\\n一身绒毛赛白袍,  \\n蓝眸深邃似星涛。  \\n人前端坐摆架子,  \n",
+       "\\n以为是个大傲娇。  \\n\\n忽闻开罐“咔哒”响,  \\n秒变软泥往膝跑。  \\n若问为何名布偶?  \\n**实乃吃货演技高!**\\n\\n💡 \n",
+       "*注:布偶猫因被抱起时四肢放松、身体柔软得名“布偶”。此诗调侃其“高贵冷脸”与“一听开罐秒瘫”的反差萌,最后一句点出:哪是\n",
+       "真没骨头,分明是看准主人软肋,专演“布偶”换罐头的高阶干饭选手!*'\n",
+       "                }\n",
+       "            )\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '猫'},\n",
+       "        next=('node_change_topic',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c2-6b54-8000-42a6002f7750'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': 0, 'source': 'loop', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:15.832861+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c1-62d6-bfff-ee766e7f5ad0'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='6638d1a7-2292-8f41-20b6-33dc3155b1cf',\n",
+       "                name='node_change_topic',\n",
+       "                path=('__pregel_pull', 'node_change_topic'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫:布偶猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={},\n",
+       "        next=('__start__',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': 'chapter03-03-2',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f18fcbb-84c1-62d6-bfff-ee766e7f5ad0'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'step': -1, 'source': 'input', 'parents': {}},\n",
+       "        created_at='2026-08-04T06:14:15.832233+00:00',\n",
+       "        parent_config=None,\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='1571a5e2-96b4-b37c-436f-c20218e363af',\n",
+       "                name='__start__',\n",
+       "                path=('__pregel_pull', '__start__'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '猫'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    )\n",
+       "]\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 7 + } + ], + "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 +} diff --git a/chapter03/04_memory.ipynb b/chapter03/04_memory.ipynb new file mode 100644 index 0000000..be5e65e --- /dev/null +++ b/chapter03/04_memory.ipynb @@ -0,0 +1,280 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-04T11:46:45.964787Z", + "start_time": "2026-08-04T11:46:45.760685Z" + } + }, + "source": [ + "import os\n", + "\n", + "from langchain_core.messages import SystemMessage, HumanMessage\n", + "from langgraph.store.postgres import PostgresStore\n", + "from langgraph.checkpoint.postgres import PostgresSaver\n", + "from dotenv import load_dotenv\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "with PostgresStore.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as store:\n", + " store.setup()\n", + "\n", + " namespace_root = (\"users\",)\n", + "\n", + " namespace1 = (*namespace_root, \"Alice\")\n", + " value1 = {\n", + " \"course\": \"计算机组成原理\",\n", + " \"sports\": \"跑步\",\n", + " \"food\": \"紫光园奶皮子酸奶\"\n", + " }\n", + "\n", + " namespace2 = (*namespace_root, \"Bob\")\n", + " value2 = {\n", + " \"course\": \"数字电路与模拟电路\",\n", + " \"sports\": \"跑步\",\n", + " \"food\": \"奶皮子糖葫芦\"\n", + " }\n", + "\n", + " namespace3 = (*namespace_root, \"Black\")\n", + " value3 = {\n", + " \"course\": \"数字电路与模拟电路\",\n", + " \"sports\": \"羽毛球\",\n", + " \"food\": \"紫光园奶皮子酸奶\"\n", + " }\n", + "\n", + " store.put(namespace1, \"preferences_key\", value1)\n", + " store.put(namespace2, \"preferences_key\", value2)\n", + " store.put(namespace3, \"preferences_key\", value3)\n", + "\n", + " for item in store.search(namespace_root):\n", + " print(item)\n" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Item(namespace=['users', 'Black'], key='preferences_key', value={'food': '紫光园奶皮子酸奶', 'course': '数字电路与模拟电路', 'sports': '羽毛球'}, created_at='2026-08-04T10:45:38.755093+00:00', updated_at='2026-08-04T11:46:45.948064+00:00', score=None)\n", + "Item(namespace=['users', 'Bob'], key='preferences_key', value={'food': '奶皮子糖葫芦', 'course': '数字电路与模拟电路', 'sports': '跑步'}, created_at='2026-08-04T10:45:38.754688+00:00', updated_at='2026-08-04T11:46:45.947122+00:00', score=None)\n", + "Item(namespace=['users', 'Alice'], key='preferences_key', value={'food': '紫光园奶皮子酸奶', 'course': '计算机组成原理', 'sports': '跑步'}, created_at='2026-08-04T10:45:38.753947+00:00', updated_at='2026-08-04T11:46:45.945722+00:00', score=None)\n" + ] + } + ], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T11:46:46.446236Z", + "start_time": "2026-08-04T11:46:45.965910Z" + } + }, + "cell_type": "code", + "source": [ + "import os\n", + "from langchain.chat_models import init_chat_model\n", + "from loguru import logger\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")\n", + "from typing import TypedDict, Literal\n", + "from langgraph.graph.message import MessagesState\n", + "\n", + "\n", + "class OverAllState(MessagesState):\n", + " username: str\n", + " user_input: str\n", + " output: str\n", + " preferences: dict[str, str]" + ], + "id": "620e9e56cb68c08c", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T11:46:46.462880Z", + "start_time": "2026-08-04T11:46:46.446947Z" + } + }, + "cell_type": "code", + "source": [ + "def router(state: OverAllState) -> Literal[\"check_preference_node\", \"llm_node\"]:\n", + " if not state.get(\"preferences\"):\n", + " logger.info(\"需要从长期记忆里面查询\")\n", + " return \"check_preference_node\"\n", + " return \"llm_node\"\n", + "\n", + "\n", + "from langgraph.runtime import Runtime\n", + "\n", + "\n", + "def check_preference_node(state: OverAllState, runtime: Runtime) -> OverAllState:\n", + " namespace_root = (\"users\",)\n", + " username = state[\"username\"]\n", + " namespace = (*namespace_root, username)\n", + " preferences = runtime.store.get(namespace, \"preferences_key\")\n", + "\n", + " if not item:\n", + " logger.info(\"没有找到用户偏好\")\n", + " return {}\n", + "\n", + " logger.info(f\"用户偏好: {preferences}\")\n", + " return {\n", + " \"preferences\": preferences\n", + " }\n", + "\n", + "\n", + "def llm_node(state: OverAllState) -> OverAllState:\n", + " preference = state[\"preferences\"]\n", + " logger.info(f\"用户偏好: {preference}\")\n", + "\n", + " user_input = state[\"user_input\"]\n", + " human_prompt = f\"\"\"\n", + " 用户输入: {user_input}\n", + " 用户偏好: {preference}\n", + " \"\"\"\n", + " system_prompt = \"\"\"\n", + " 你是一个助手,你需要根据用户的输入和偏好,给出一个回答。\n", + " \"\"\"\n", + "\n", + " messages = [SystemMessage(content=system_prompt)] if not state.get(\"messages\", []) else state[\"messages\"]\n", + " res = llm.invoke(messages + [HumanMessage(content=human_prompt)])\n", + "\n", + " messages = messages + [HumanMessage(content=human_prompt), res]\n", + "\n", + " return {\n", + " \"output\": res.content,\n", + " \"messages\": messages\n", + " }" + ], + "id": "12a3b5c23aae5688", + "outputs": [], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T11:46:46.481789Z", + "start_time": "2026-08-04T11:46:46.464391Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "builder = StateGraph(state_schema=OverAllState)\n", + "\n", + "builder.add_node(\"check_preference_node\", check_preference_node)\n", + "builder.add_node(\"llm_node\", llm_node)\n", + "\n", + "builder.add_conditional_edges(START, router, path_map=[\"check_preference_node\", \"llm_node\"], )\n", + "builder.add_edge(\"check_preference_node\", \"llm_node\")\n", + "builder.add_edge(\"llm_node\", END)" + ], + "id": "3973036e6adb9466", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-04T11:49:25.366389Z", + "start_time": "2026-08-04T11:49:13.660229Z" + } + }, + "cell_type": "code", + "source": [ + "from langchain_core.runnables import RunnableConfig\n", + "\n", + "with PostgresStore.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as store, \\\n", + " PostgresSaver.from_conn_string(os.getenv(\"LANGGRAPH_DATABASE_URL\")) as checkpointer:\n", + " graph = builder.compile(checkpointer=checkpointer, store=store)\n", + "\n", + " from IPython.display import display\n", + "\n", + " display(graph)\n", + "\n", + " config: RunnableConfig = {\n", + " \"configurable\": {\n", + " \"thread_id\": \"77777\"\n", + " }\n", + " }\n", + "\n", + " res = graph.invoke({\"username\": \"Alice\", \"user_input\": \"我有些无聊,跟我聊聊天\"}, config=config)\n", + "\n", + " print(\"=\" * 50)\n", + " print(res)" + ], + "id": "ffeeb995bfb8780e", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001B[32m2026-08-04 19:49:16.090\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mllm_node\u001B[0m:\u001B[36m29\u001B[0m - \u001B[1m用户偏好: Item(namespace=['users', 'Alice'], key='preferences_key', value={'food': '紫光园奶皮子酸奶', 'course': '计算机组成原理', 'sports': '跑步'}, created_at='2026-08-04T10:45:38.753947+00:00', updated_at='2026-08-04T11:46:45.945722+00:00')\u001B[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n", + "{'messages': [SystemMessage(content='\\n 你是一个助手,你需要根据用户的输入和偏好,给出一个回答。\\n ', additional_kwargs={}, response_metadata={}, id='7a32b0e6-ab68-4bac-8092-c700e31f95ee'), HumanMessage(content=\"\\n 用户输入: 我有些无聊,跟我聊聊天\\n 用户偏好: Item(namespace=['users', 'Alice'], key='preferences_key', value={'food': '紫光园奶皮子酸奶', 'course': '计算机组成原理', 'sports': '跑步'}, created_at='2026-08-04T10:45:38.753947+00:00', updated_at='2026-08-04T11:46:45.945722+00:00')\\n \", additional_kwargs={}, response_metadata={}, id='78e7f212-2f10-482e-a498-8f0c4cff4fd6'), AIMessage(content='嗨 Alice,无聊的时候找个人随便聊聊最解压啦!既然咱们正好碰上,我先悄悄用你的小偏好来抛几个话题接风:\\n\\n🥛 你超爱的**紫光园奶皮子酸奶**,我想象中那种厚厚的奶皮裹着浓稠酸奶,勺子一挖直接“哗啦”掉下来的感觉肯定超治愈~你是习惯把它当下午茶解馋,还是运动后必来一杯补充能量呀?\\n\\n💻 看你最近在学**《计算机组成原理》**,这可是门既硬核又充满逻辑美感的课!不知道你现在进度到哪了?是卡在流水线的冒险冲突上,还是在琢磨 Cache 的映射方式?要是碰到什么让人头秃的考点,随时吐吐槽,我给你递虚拟纸巾~\\n\\n🏃\\u200d♀️ 还有你平时坚持**跑步**的习惯真的很棒!最近天气慢慢回暖/转凉(根据当前实际气候可微调),你更喜欢去操场听歌绕圈,还是偏爱城市步道或公园林荫道?跑完步喝上那杯奶皮子酸奶,算不算一天的完美收官?\\n\\n你可以随便挑一个最想聊的方向开头,或者咱们就纯闲聊、分享点最近遇到的趣事、电影、甚至天马行空的脑洞也行。我在这儿,你说哪儿我接哪儿~✨', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 1379, 'prompt_tokens': 157, 'total_tokens': 1536, 'completion_tokens_details': {'accepted_prediction_tokens': None, 'audio_tokens': None, 'reasoning_tokens': 1102, 'rejected_prediction_tokens': None, 'text_tokens': 1379}, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'qwen3.6-flash', 'system_fingerprint': None, 'id': 'chatcmpl-6737d989-2290-98db-a5fb-5eb527bd05db', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019fcc9a-6dab-74a3-9bab-4400bf2ddce6-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 157, 'output_tokens': 1379, 'total_tokens': 1536, 'input_token_details': {}, 'output_token_details': {'reasoning': 1102}}), HumanMessage(content=\"\\n 用户输入: 我有些无聊,跟我聊聊天\\n 用户偏好: Item(namespace=['users', 'Alice'], key='preferences_key', value={'food': '紫光园奶皮子酸奶', 'course': '计算机组成原理', 'sports': '跑步'}, created_at='2026-08-04T10:45:38.753947+00:00', updated_at='2026-08-04T11:46:45.945722+00:00')\\n \", additional_kwargs={}, response_metadata={}, id='5adab8fb-211a-4591-ba35-a8106c72d860'), AIMessage(content='嗨 Alice,无聊的时候随便扯聊天确实最解压啦~看你平时的喜好,我先悄悄用你的“舒适区”抛几个小话头,你看哪个顺眼咱们就从哪儿开始:\\n\\n🥛 **关于那口奶皮子**:紫光园的奶皮子酸奶是不是属于“挖一勺能听见奶皮滑落声”的快乐?你是习惯把它当成学习/运动后的专属犒赏,还是闲时随手来一杯的日常小确幸?有没有试过加水果或麦片自己DIY?\\n\\n💻 **关于《计算机组成原理》**:这门课可是出了名的“逻辑密度高+抽象程度强”,你现在进度到哪一章了?是卡在数据通路的设计上,还是在琢磨Cache的命中率优化?要是觉得脑细胞不够用了,随时吐吐槽,我给你递虚拟咖啡和橡皮擦~\\n\\n🏃\\u200d♀️ **关于跑步**:跑步其实是很好的“无聊克星”之一。你平时更偏爱操场绕圈听播客,还是城市步道看风景?跑完步配上那杯奶皮子酸奶,算不算一套完美的“身心重启套餐”?最近有定什么小目标吗,比如连续打卡7天、尝试间歇跑之类的?\\n\\n你可以挑一个最想接的话茬随口聊聊,或者完全抛开这些,跟我说说最近刷到的有趣视频、纠结的小选择、甚至天马行空的白日梦都行。我在这儿,你说哪儿我接哪儿~✨', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 1013, 'prompt_tokens': 567, 'total_tokens': 1580, 'completion_tokens_details': {'accepted_prediction_tokens': None, 'audio_tokens': None, 'reasoning_tokens': 708, 'rejected_prediction_tokens': None, 'text_tokens': 1013}, 'prompt_tokens_details': None}, 'model_provider': 'openai', 'model_name': 'qwen3.6-flash', 'system_fingerprint': None, 'id': 'chatcmpl-a24f98e8-a2f9-99c0-a76b-9024f9c1c3e4', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019fcc9b-46bb-7d50-b20f-73b8f4cfe0ab-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 567, 'output_tokens': 1013, 'total_tokens': 1580, 'input_token_details': {}, 'output_token_details': {'reasoning': 708}})], 'username': 'Alice', 'user_input': '我有些无聊,跟我聊聊天', 'output': '嗨 Alice,无聊的时候随便扯聊天确实最解压啦~看你平时的喜好,我先悄悄用你的“舒适区”抛几个小话头,你看哪个顺眼咱们就从哪儿开始:\\n\\n🥛 **关于那口奶皮子**:紫光园的奶皮子酸奶是不是属于“挖一勺能听见奶皮滑落声”的快乐?你是习惯把它当成学习/运动后的专属犒赏,还是闲时随手来一杯的日常小确幸?有没有试过加水果或麦片自己DIY?\\n\\n💻 **关于《计算机组成原理》**:这门课可是出了名的“逻辑密度高+抽象程度强”,你现在进度到哪一章了?是卡在数据通路的设计上,还是在琢磨Cache的命中率优化?要是觉得脑细胞不够用了,随时吐吐槽,我给你递虚拟咖啡和橡皮擦~\\n\\n🏃\\u200d♀️ **关于跑步**:跑步其实是很好的“无聊克星”之一。你平时更偏爱操场绕圈听播客,还是城市步道看风景?跑完步配上那杯奶皮子酸奶,算不算一套完美的“身心重启套餐”?最近有定什么小目标吗,比如连续打卡7天、尝试间歇跑之类的?\\n\\n你可以挑一个最想接的话茬随口聊聊,或者完全抛开这些,跟我说说最近刷到的有趣视频、纠结的小选择、甚至天马行空的白日梦都行。我在这儿,你说哪儿我接哪儿~✨', 'preferences': Item(namespace=['users', 'Alice'], key='preferences_key', value={'food': '紫光园奶皮子酸奶', 'course': '计算机组成原理', 'sports': '跑步'}, created_at='2026-08-04T10:45:38.753947+00:00', updated_at='2026-08-04T11:46:45.945722+00:00')}\n" + ] + } + ], + "execution_count": 7 + } + ], + "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 +} diff --git a/chapter04/01_interrupt.ipynb b/chapter04/01_interrupt.ipynb new file mode 100644 index 0000000..3ff3f87 --- /dev/null +++ b/chapter04/01_interrupt.ipynb @@ -0,0 +1,187 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-08T03:28:49.888065Z", + "start_time": "2026-08-08T03:28:49.662363Z" + } + }, + "source": [ + "from langgraph.types import interrupt,Command\n", + "from langgraph.graph import StateGraph,START,END\n", + "from langgraph.checkpoint.memory import InMemorySaver\n", + "from typing import TypedDict\n", + "\n", + "\n", + "class OverallState(TypedDict):\n", + " username: str\n", + "\n", + "def node_a(state:OverallState):\n", + " username=interrupt(\"请输入名称\")\n", + " return {\n", + " \"username\":username\n", + " }\n", + "\n", + "builder=StateGraph(state_schema=OverallState)\n", + "builder.add_node(\"node_a\",node_a)\n", + "builder.add_edge(START,\"node_a\")\n", + "builder.add_edge(\"node_a\",END)" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T03:28:49.903527Z", + "start_time": "2026-08-08T03:28:49.892763Z" + } + }, + "cell_type": "code", + "source": [ + "checkpointer = InMemorySaver()\n", + "graph = builder.compile(checkpointer=checkpointer)" + ], + "id": "c01ae74fba33b881", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T03:28:50.532477Z", + "start_time": "2026-08-08T03:28:49.909136Z" + } + }, + "cell_type": "code", + "source": [ + "from IPython.display import display\n", + "display(graph)" + ], + "id": "2dbf4ded88cc37f5", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T03:28:50.571341Z", + "start_time": "2026-08-08T03:28:50.552213Z" + } + }, + "cell_type": "code", + "source": [ + "config = {\"configurable\":{\"thread_id\":\"123\"}}\n", + "interrupt_res = graph.invoke({},config=config)\n", + "print(interrupt_res)" + ], + "id": "12eb3e02772cb32c", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'__interrupt__': [Interrupt(value='请输入名称', id='78fc392614f7abbc556297e16024b932')]}\n" + ] + } + ], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T03:29:03.007686Z", + "start_time": "2026-08-08T03:28:50.581140Z" + } + }, + "cell_type": "code", + "source": [ + "inputt = interrupt_res['__interrupt__'][0].value\n", + "print(inputt)\n", + "username = input(inputt)" + ], + "id": "bf48e979b66c6a55", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "请输入名称\n" + ] + } + ], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T03:29:03.046382Z", + "start_time": "2026-08-08T03:29:03.013899Z" + } + }, + "cell_type": "code", + "source": [ + "resume_res = graph.invoke(Command(resume=username),config=config)\n", + "print(resume_res)" + ], + "id": "bc4bd5ded638a924", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'username': '{\"username\":\"gqt\"}'}\n" + ] + } + ], + "execution_count": 6 + } + ], + "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 +} diff --git a/chapter04/02_interrupt_并行.ipynb b/chapter04/02_interrupt_并行.ipynb new file mode 100644 index 0000000..cd28392 --- /dev/null +++ b/chapter04/02_interrupt_并行.ipynb @@ -0,0 +1,148 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-08T04:11:13.127896Z", + "start_time": "2026-08-08T04:11:12.847837Z" + } + }, + "source": [ + "from typing import TypedDict\n", + "\n", + "from langgraph.graph import StateGraph, START, END\n", + "from langgraph.types import Command, interrupt\n", + "from langgraph.checkpoint.memory import InMemorySaver\n", + "\n", + "class OverAllState(TypedDict):\n", + " username: str\n", + " age: int\n", + "\n", + "def node_a(state: OverAllState) -> OverAllState:\n", + " username = interrupt(\"请输入您的姓名\")\n", + " return {\n", + " \"username\": username\n", + " }\n", + "\n", + "def node_b(state: OverAllState) -> OverAllState:\n", + " age = interrupt(\"请输入您的年龄\")\n", + " return {\n", + " \"age\": age\n", + " }\n", + "\n", + "builder = StateGraph(state_schema=OverAllState)\n", + "builder.add_node(\"node_a\", node_a)\n", + "builder.add_node(\"node_b\", node_b)\n", + "builder.add_edge(START, \"node_a\")\n", + "builder.add_edge(START, \"node_b\")\n", + "builder.add_edge(\"node_a\", END)\n", + "builder.add_edge(\"node_b\", END)\n", + "\n", + "checkpointer = InMemorySaver()\n", + "graph = builder.compile(checkpointer=checkpointer)" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T04:11:28.447300Z", + "start_time": "2026-08-08T04:11:26.041846Z" + } + }, + "cell_type": "code", + "source": [ + "\n", + "from IPython.display import display\n", + "display(graph)\n", + "\n", + "config = {\"configurable\": {\"thread_id\": \"123\"}}\n", + "interrupted_res = graph.invoke({}, config=config)\n", + "print('=' * 30, '-> interrupt_res <-', '=' * 30)\n", + "print(interrupted_res)" + ], + "id": "abcc8cd4f3bd84f3", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================== -> interrupt_res <- ==============================\n", + "{'__interrupt__': [Interrupt(value='请输入您的姓名', id='e9519e001a32c19a70ca7cc46f4f11e2'), Interrupt(value='请输入您的年龄', id='df991c247fd4883d31b3c252b9e3f1fb')]}\n" + ] + } + ], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T04:11:56.635076Z", + "start_time": "2026-08-08T04:11:48.097926Z" + } + }, + "cell_type": "code", + "source": [ + "\n", + "resume_map = {}\n", + "for i in interrupted_res['__interrupt__']:\n", + " user_input = input(f\"{i.value}: \")\n", + " if \"年龄\" in i.value:\n", + " resume_map[i.id] = int(user_input)\n", + " else:\n", + " resume_map[i.id] = user_input\n", + "\n", + "resumed_res = graph.invoke(Command(resume=resume_map), config=config)\n", + "print('=' * 30, '-> resumed_res <-', '=' * 30)\n", + "print(resumed_res)" + ], + "id": "87688f85a8052f23", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "============================== -> resumed_res <- ==============================\n", + "{'username': 'gqt', 'age': 18}\n" + ] + } + ], + "execution_count": 3 + } + ], + "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 +} diff --git a/chapter04/03_approve.ipynb b/chapter04/03_approve.ipynb new file mode 100644 index 0000000..3eb2fc4 --- /dev/null +++ b/chapter04/03_approve.ipynb @@ -0,0 +1,972 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-08T04:53:29.334892Z", + "start_time": "2026-08-08T04:53:28.808380Z" + } + }, + "source": [ + "import os\n", + "from langchain.chat_models import init_chat_model\n", + "from dotenv import load_dotenv\n", + "from langchain_core.messages import HumanMessage\n", + "from langgraph.types import Command, interrupt\n", + "from loguru import logger\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T04:53:29.345814Z", + "start_time": "2026-08-08T04:53:29.341327Z" + } + }, + "cell_type": "code", + "source": [ + "from typing import TypedDict, Literal\n", + "\n", + "\n", + "class OverAllState(TypedDict):\n", + " topic: str\n", + " poem: str\n", + " is_approved: bool\n", + "\n", + "\n", + "def approve_node(state: OverAllState) -> Command[Literal[\"llm_node\", \"default_node\"]]:\n", + " is_approved = interrupt(\"是否同意调用模型?\")\n", + " goto = \"llm_node\" if is_approved else \"default_node\"\n", + " return Command(\n", + " goto=goto,\n", + " update={\"is_approved\": is_approved}\n", + " )\n", + "\n", + "\n", + "def llm_node(state: OverAllState) -> OverAllState:\n", + " topic = state[\"topic\"]\n", + " res = llm.invoke([HumanMessage(f\"帮我写一首关于{topic}的诗\")])\n", + " return {\n", + " \"poem\": res\n", + " }\n", + "\n", + "\n", + "def default_node(state: OverAllState) -> OverAllState:\n", + " return {\n", + " \"poem\": \"请求被拒绝\"\n", + " }\n", + "\n", + "\n" + ], + "id": "eaeb7057bfa0c0cb", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T04:53:29.387360Z", + "start_time": "2026-08-08T04:53:29.346263Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "builder = StateGraph(state_schema=OverAllState)\n", + "\n", + "builder.add_node(\"approve_node\", approve_node)\n", + "builder.add_node(\"llm_node\", llm_node)\n", + "builder.add_node(\"default_node\", default_node)\n", + "builder.add_edge(START, \"approve_node\")\n", + "builder.add_edge(\"llm_node\", END)\n", + "builder.add_edge(\"default_node\", END)" + ], + "id": "ed713dbe23cebaf9", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T04:53:29.396295Z", + "start_time": "2026-08-08T04:53:29.387958Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.checkpoint.memory import InMemorySaver\n", + "\n", + "checkpointer = InMemorySaver()\n", + "graph = builder.compile(checkpointer=checkpointer)" + ], + "id": "78c76401419dea90", + "outputs": [], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T04:53:29.798462Z", + "start_time": "2026-08-08T04:53:29.397753Z" + } + }, + "cell_type": "code", + "source": [ + "from IPython.display import display\n", + "\n", + "display(graph)" + ], + "id": "230037b482df29d4", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T04:53:29.880811Z", + "start_time": "2026-08-08T04:53:29.822544Z" + } + }, + "cell_type": "code", + "source": [ + "config = {\n", + " \"configurable\": {\n", + " \"thread_id\": \"123456\"\n", + " }\n", + "}\n", + "from rich import print as rp\n", + "\n", + "rp(list(graph.get_state_history(config=config)))" + ], + "id": "c133a0465bca7dc7", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n" + ], + "text/html": [ + "
[]\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 6 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T04:53:29.912605Z", + "start_time": "2026-08-08T04:53:29.884629Z" + } + }, + "cell_type": "code", + "source": [ + "res1 = graph.invoke({\"topic\": \"莲花\"}, config=config)\n", + "# rp(res1)\n", + "rp(list(graph.get_state_history(config=config)))" + ], + "id": "1cbdba605cce87bd", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m[\u001B[0m\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'莲花'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'approve_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e51-98b3-674a-8000-5762fb54a298'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m0\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-08T04:53:29.891613+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e51-98b2-664c-bfff-020fbebc602d'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'ca6568b1-b152-b116-17f7-d9fd913efdef'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'approve_node'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'approve_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1;35mInterrupt\u001B[0m\u001B[1m(\u001B[0m\u001B[33mvalue\u001B[0m=\u001B[32m'是否同意调用模型?'\u001B[0m, \u001B[33mid\u001B[0m=\u001B[32m'062a13c08e433c99caa3ca936179c144'\u001B[0m\u001B[1m)\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[3;35mNone\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1;35mInterrupt\u001B[0m\u001B[1m(\u001B[0m\u001B[33mvalue\u001B[0m=\u001B[32m'是否同意调用模型?'\u001B[0m, \u001B[33mid\u001B[0m=\u001B[32m'062a13c08e433c99caa3ca936179c144'\u001B[0m\u001B[1m)\u001B[0m,\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__start__'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e51-98b2-664c-bfff-020fbebc602d'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'input'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m-1\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-08T04:53:29.891178+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'f28a1086-f36c-8943-a7f3-4c963ba3f0e1'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'__start__'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'__start__'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'莲花'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" + ], + "text/html": [ + "
[\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '莲花'},\n",
+       "        next=('approve_node',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f192e51-98b3-674a-8000-5762fb54a298'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'loop', 'step': 0, 'parents': {}},\n",
+       "        created_at='2026-08-08T04:53:29.891613+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f192e51-98b2-664c-bfff-020fbebc602d'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='ca6568b1-b152-b116-17f7-d9fd913efdef',\n",
+       "                name='approve_node',\n",
+       "                path=('__pregel_pull', 'approve_node'),\n",
+       "                error=None,\n",
+       "                interrupts=(Interrupt(value='是否同意调用模型?', id='062a13c08e433c99caa3ca936179c144'),),\n",
+       "                state=None,\n",
+       "                result=None\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=(Interrupt(value='是否同意调用模型?', id='062a13c08e433c99caa3ca936179c144'),)\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={},\n",
+       "        next=('__start__',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f192e51-98b2-664c-bfff-020fbebc602d'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'input', 'step': -1, 'parents': {}},\n",
+       "        created_at='2026-08-08T04:53:29.891178+00:00',\n",
+       "        parent_config=None,\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='f28a1086-f36c-8943-a7f3-4c963ba3f0e1',\n",
+       "                name='__start__',\n",
+       "                path=('__pregel_pull', '__start__'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '莲花'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    )\n",
+       "]\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 7 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T04:54:07.945317Z", + "start_time": "2026-08-08T04:53:29.916351Z" + } + }, + "cell_type": "code", + "source": [ + "input1 = input(res1['__interrupt__'][0].value) == 'y'\n", + "res2 = graph.invoke(Command(resume=input1), config=config)\n", + "# rp(res2)\n", + "rp(list(graph.get_state_history(config=config)))" + ], + "id": "4e7f08d80ff688e0", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m[\u001B[0m\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'莲花'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'这是一首为您原创的七言律诗,遵循古典诗词格律(平水韵下平十一尤),以传统咏物手法写莲之形、\u001B[0m\n", + "\u001B[32m之神、之格:\\n\\n**《咏莲》** \\n澄潭不动自生幽,独拔青茎破浊流。 \\n叶展田田承晓露,花燃灼灼照轻舟。 \u001B[0m\n", + "\u001B[32m\\n纤埃不染君子骨,清气长涵世外秋。 \\n莫问繁华何处觅,炎光深处立汀洲。\\n\\n---\\n\\n📜 **简注与赏析** \\n- \u001B[0m\n", + "\u001B[32m**首联**以“澄潭”“浊流”对照,点明莲生于淤泥却挺立而出的环境,暗合周敦颐“出淤泥而不染”之境。 \\n- \u001B[0m\n", + "\u001B[32m**颔联**“田田”“灼灼”叠字摹态,一写叶承清露的静雅,一写日照繁花的光彩,动静相生。 \\n- \u001B[0m\n", + "\u001B[32m**颈联**转入神韵,“君子骨”“世外秋”将物象升华为人格象征,不倚丹青而自具高洁,呼应古人“中通外直,不蔓不枝”的君子之喻\u001B[0m\n", + "\u001B[32m。 \\n- \u001B[0m\n", + "\u001B[32m**尾联**以问作结,不逐春色,独向盛夏最炽烈处静静生长,喻坚守本心、不随流俗的生命姿态。\\n\\n如需调整为现代自由诗、五\u001B[0m\n", + "\u001B[32m言体、或加入特定意象(如禅意、江南水乡、残荷秋景等),可告知您的偏好,我可为您重新定制。'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'refusal'\u001B[0m: \u001B[3;35mNone\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'token_usage'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'completion_tokens'\u001B[0m: \u001B[1;36m3384\u001B[0m,\n", + " \u001B[32m'prompt_tokens'\u001B[0m: \u001B[1;36m17\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m3401\u001B[0m,\n", + " \u001B[32m'completion_tokens_details'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'accepted_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'audio_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'reasoning_tokens'\u001B[0m: \u001B[1;36m3053\u001B[0m,\n", + " \u001B[32m'rejected_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'text_tokens'\u001B[0m: \u001B[1;36m3384\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'prompt_tokens_details'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'system_fingerprint'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'chatcmpl-7795634a-2f17-95e3-ab44-62a0b510c37a'\u001B[0m,\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'stop'\u001B[0m,\n", + " \u001B[32m'logprobs'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--019fdfb8-22e1-7760-b906-cbbc1152bc1d-0'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m17\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m3384\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m3401\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m3053\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[32m'is_approved'\u001B[0m: \u001B[3;92mTrue\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e53-032e-60d8-8002-97550c7040fb'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m2\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-08T04:54:07.900271+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e51-c538-6b08-8001-1ef3f73723eb'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'莲花'\u001B[0m, \u001B[32m'is_approved'\u001B[0m: \u001B[3;92mTrue\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e51-c538-6b08-8001-1ef3f73723eb'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m1\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-08T04:53:34.559897+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e51-98b3-674a-8000-5762fb54a298'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'90683863-b626-b46a-64b2-ae7a6c7d30ee'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'poem'\u001B[0m: \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'这是一首为您原创的七言律诗,遵循古典诗词格律(平水韵下平十一尤),以传统咏物手法写\u001B[0m\n", + "\u001B[32m莲之形、之神、之格:\\n\\n**《咏莲》** \\n澄潭不动自生幽,独拔青茎破浊流。 \\n叶展田田承晓露,花燃灼灼照轻舟。 \u001B[0m\n", + "\u001B[32m\\n纤埃不染君子骨,清气长涵世外秋。 \\n莫问繁华何处觅,炎光深处立汀洲。\\n\\n---\\n\\n📜 **简注与赏析** \\n- \u001B[0m\n", + "\u001B[32m**首联**以“澄潭”“浊流”对照,点明莲生于淤泥却挺立而出的环境,暗合周敦颐“出淤泥而不染”之境。 \\n- \u001B[0m\n", + "\u001B[32m**颔联**“田田”“灼灼”叠字摹态,一写叶承清露的静雅,一写日照繁花的光彩,动静相生。 \\n- \u001B[0m\n", + "\u001B[32m**颈联**转入神韵,“君子骨”“世外秋”将物象升华为人格象征,不倚丹青而自具高洁,呼应古人“中通外直,不蔓不枝”的君子之喻\u001B[0m\n", + "\u001B[32m。 \\n- \u001B[0m\n", + "\u001B[32m**尾联**以问作结,不逐春色,独向盛夏最炽烈处静静生长,喻坚守本心、不随流俗的生命姿态。\\n\\n如需调整为现代自由诗、五\u001B[0m\n", + "\u001B[32m言体、或加入特定意象(如禅意、江南水乡、残荷秋景等),可告知您的偏好,我可为您重新定制。'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'refusal'\u001B[0m: \u001B[3;35mNone\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'token_usage'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'completion_tokens'\u001B[0m: \u001B[1;36m3384\u001B[0m,\n", + " \u001B[32m'prompt_tokens'\u001B[0m: \u001B[1;36m17\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m3401\u001B[0m,\n", + " \u001B[32m'completion_tokens_details'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'accepted_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'audio_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'reasoning_tokens'\u001B[0m: \u001B[1;36m3053\u001B[0m,\n", + " \u001B[32m'rejected_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'text_tokens'\u001B[0m: \u001B[1;36m3384\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'prompt_tokens_details'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'system_fingerprint'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'chatcmpl-7795634a-2f17-95e3-ab44-62a0b510c37a'\u001B[0m,\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'stop'\u001B[0m,\n", + " \u001B[32m'logprobs'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--019fdfb8-22e1-7760-b906-cbbc1152bc1d-0'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m17\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m3384\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m3401\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m3053\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'莲花'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'approve_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e51-98b3-674a-8000-5762fb54a298'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m0\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-08T04:53:29.891613+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e51-98b2-664c-bfff-020fbebc602d'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'ca6568b1-b152-b116-17f7-d9fd913efdef'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'approve_node'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'approve_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1;35mInterrupt\u001B[0m\u001B[1m(\u001B[0m\u001B[33mvalue\u001B[0m=\u001B[32m'是否同意调用模型?'\u001B[0m, \u001B[33mid\u001B[0m=\u001B[32m'062a13c08e433c99caa3ca936179c144'\u001B[0m\u001B[1m)\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'is_approved'\u001B[0m: \u001B[3;92mTrue\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1;35mInterrupt\u001B[0m\u001B[1m(\u001B[0m\u001B[33mvalue\u001B[0m=\u001B[32m'是否同意调用模型?'\u001B[0m, \u001B[33mid\u001B[0m=\u001B[32m'062a13c08e433c99caa3ca936179c144'\u001B[0m\u001B[1m)\u001B[0m,\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__start__'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e51-98b2-664c-bfff-020fbebc602d'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'input'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m-1\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-08T04:53:29.891178+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'f28a1086-f36c-8943-a7f3-4c963ba3f0e1'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'__start__'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'__start__'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'topic'\u001B[0m: \u001B[32m'莲花'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" + ], + "text/html": [ + "
[\n",
+       "    StateSnapshot(\n",
+       "        values={\n",
+       "            'topic': '莲花',\n",
+       "            'poem': AIMessage(\n",
+       "                content='这是一首为您原创的七言律诗,遵循古典诗词格律(平水韵下平十一尤),以传统咏物手法写莲之形、\n",
+       "之神、之格:\\n\\n**《咏莲》**  \\n澄潭不动自生幽,独拔青茎破浊流。  \\n叶展田田承晓露,花燃灼灼照轻舟。  \n",
+       "\\n纤埃不染君子骨,清气长涵世外秋。  \\n莫问繁华何处觅,炎光深处立汀洲。\\n\\n---\\n\\n📜 **简注与赏析**  \\n- \n",
+       "**首联**以“澄潭”“浊流”对照,点明莲生于淤泥却挺立而出的环境,暗合周敦颐“出淤泥而不染”之境。  \\n- \n",
+       "**颔联**“田田”“灼灼”叠字摹态,一写叶承清露的静雅,一写日照繁花的光彩,动静相生。  \\n- \n",
+       "**颈联**转入神韵,“君子骨”“世外秋”将物象升华为人格象征,不倚丹青而自具高洁,呼应古人“中通外直,不蔓不枝”的君子之喻\n",
+       "。  \\n- \n",
+       "**尾联**以问作结,不逐春色,独向盛夏最炽烈处静静生长,喻坚守本心、不随流俗的生命姿态。\\n\\n如需调整为现代自由诗、五\n",
+       "言体、或加入特定意象(如禅意、江南水乡、残荷秋景等),可告知您的偏好,我可为您重新定制。',\n",
+       "                additional_kwargs={'refusal': None},\n",
+       "                response_metadata={\n",
+       "                    'token_usage': {\n",
+       "                        'completion_tokens': 3384,\n",
+       "                        'prompt_tokens': 17,\n",
+       "                        'total_tokens': 3401,\n",
+       "                        'completion_tokens_details': {\n",
+       "                            'accepted_prediction_tokens': None,\n",
+       "                            'audio_tokens': None,\n",
+       "                            'reasoning_tokens': 3053,\n",
+       "                            'rejected_prediction_tokens': None,\n",
+       "                            'text_tokens': 3384\n",
+       "                        },\n",
+       "                        'prompt_tokens_details': None\n",
+       "                    },\n",
+       "                    'model_provider': 'openai',\n",
+       "                    'model_name': 'qwen3.6-flash',\n",
+       "                    'system_fingerprint': None,\n",
+       "                    'id': 'chatcmpl-7795634a-2f17-95e3-ab44-62a0b510c37a',\n",
+       "                    'finish_reason': 'stop',\n",
+       "                    'logprobs': None\n",
+       "                },\n",
+       "                id='lc_run--019fdfb8-22e1-7760-b906-cbbc1152bc1d-0',\n",
+       "                tool_calls=[],\n",
+       "                invalid_tool_calls=[],\n",
+       "                usage_metadata={\n",
+       "                    'input_tokens': 17,\n",
+       "                    'output_tokens': 3384,\n",
+       "                    'total_tokens': 3401,\n",
+       "                    'input_token_details': {},\n",
+       "                    'output_token_details': {'reasoning': 3053}\n",
+       "                }\n",
+       "            ),\n",
+       "            'is_approved': True\n",
+       "        },\n",
+       "        next=(),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f192e53-032e-60d8-8002-97550c7040fb'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'loop', 'step': 2, 'parents': {}},\n",
+       "        created_at='2026-08-08T04:54:07.900271+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f192e51-c538-6b08-8001-1ef3f73723eb'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '莲花', 'is_approved': True},\n",
+       "        next=('llm_node',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f192e51-c538-6b08-8001-1ef3f73723eb'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'loop', 'step': 1, 'parents': {}},\n",
+       "        created_at='2026-08-08T04:53:34.559897+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f192e51-98b3-674a-8000-5762fb54a298'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='90683863-b626-b46a-64b2-ae7a6c7d30ee',\n",
+       "                name='llm_node',\n",
+       "                path=('__pregel_pull', 'llm_node'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={\n",
+       "                    'poem': AIMessage(\n",
+       "                        content='这是一首为您原创的七言律诗,遵循古典诗词格律(平水韵下平十一尤),以传统咏物手法写\n",
+       "莲之形、之神、之格:\\n\\n**《咏莲》**  \\n澄潭不动自生幽,独拔青茎破浊流。  \\n叶展田田承晓露,花燃灼灼照轻舟。  \n",
+       "\\n纤埃不染君子骨,清气长涵世外秋。  \\n莫问繁华何处觅,炎光深处立汀洲。\\n\\n---\\n\\n📜 **简注与赏析**  \\n- \n",
+       "**首联**以“澄潭”“浊流”对照,点明莲生于淤泥却挺立而出的环境,暗合周敦颐“出淤泥而不染”之境。  \\n- \n",
+       "**颔联**“田田”“灼灼”叠字摹态,一写叶承清露的静雅,一写日照繁花的光彩,动静相生。  \\n- \n",
+       "**颈联**转入神韵,“君子骨”“世外秋”将物象升华为人格象征,不倚丹青而自具高洁,呼应古人“中通外直,不蔓不枝”的君子之喻\n",
+       "。  \\n- \n",
+       "**尾联**以问作结,不逐春色,独向盛夏最炽烈处静静生长,喻坚守本心、不随流俗的生命姿态。\\n\\n如需调整为现代自由诗、五\n",
+       "言体、或加入特定意象(如禅意、江南水乡、残荷秋景等),可告知您的偏好,我可为您重新定制。',\n",
+       "                        additional_kwargs={'refusal': None},\n",
+       "                        response_metadata={\n",
+       "                            'token_usage': {\n",
+       "                                'completion_tokens': 3384,\n",
+       "                                'prompt_tokens': 17,\n",
+       "                                'total_tokens': 3401,\n",
+       "                                'completion_tokens_details': {\n",
+       "                                    'accepted_prediction_tokens': None,\n",
+       "                                    'audio_tokens': None,\n",
+       "                                    'reasoning_tokens': 3053,\n",
+       "                                    'rejected_prediction_tokens': None,\n",
+       "                                    'text_tokens': 3384\n",
+       "                                },\n",
+       "                                'prompt_tokens_details': None\n",
+       "                            },\n",
+       "                            'model_provider': 'openai',\n",
+       "                            'model_name': 'qwen3.6-flash',\n",
+       "                            'system_fingerprint': None,\n",
+       "                            'id': 'chatcmpl-7795634a-2f17-95e3-ab44-62a0b510c37a',\n",
+       "                            'finish_reason': 'stop',\n",
+       "                            'logprobs': None\n",
+       "                        },\n",
+       "                        id='lc_run--019fdfb8-22e1-7760-b906-cbbc1152bc1d-0',\n",
+       "                        tool_calls=[],\n",
+       "                        invalid_tool_calls=[],\n",
+       "                        usage_metadata={\n",
+       "                            'input_tokens': 17,\n",
+       "                            'output_tokens': 3384,\n",
+       "                            'total_tokens': 3401,\n",
+       "                            'input_token_details': {},\n",
+       "                            'output_token_details': {'reasoning': 3053}\n",
+       "                        }\n",
+       "                    )\n",
+       "                }\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'topic': '莲花'},\n",
+       "        next=('approve_node',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f192e51-98b3-674a-8000-5762fb54a298'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'loop', 'step': 0, 'parents': {}},\n",
+       "        created_at='2026-08-08T04:53:29.891613+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f192e51-98b2-664c-bfff-020fbebc602d'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='ca6568b1-b152-b116-17f7-d9fd913efdef',\n",
+       "                name='approve_node',\n",
+       "                path=('__pregel_pull', 'approve_node'),\n",
+       "                error=None,\n",
+       "                interrupts=(Interrupt(value='是否同意调用模型?', id='062a13c08e433c99caa3ca936179c144'),),\n",
+       "                state=None,\n",
+       "                result={'is_approved': True}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=(Interrupt(value='是否同意调用模型?', id='062a13c08e433c99caa3ca936179c144'),)\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={},\n",
+       "        next=('__start__',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f192e51-98b2-664c-bfff-020fbebc602d'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'input', 'step': -1, 'parents': {}},\n",
+       "        created_at='2026-08-08T04:53:29.891178+00:00',\n",
+       "        parent_config=None,\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='f28a1086-f36c-8943-a7f3-4c963ba3f0e1',\n",
+       "                name='__start__',\n",
+       "                path=('__pregel_pull', '__start__'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'topic': '莲花'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    )\n",
+       "]\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 8 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-08T05:02:42.597576Z", + "start_time": "2026-08-08T05:02:42.562927Z" + } + }, + "cell_type": "code", + "source": [ + "for snapshot in graph.get_state_history(config=config):\n", + " rp(snapshot)\n", + " break\n", + " # print(f\"superstep:{snapshot.metadata.get('step')},next={snapshot.next}\")\n", + " # print(f\"values={snapshot.values}\")\n", + " # print(\"=\"*50)" + ], + "id": "699307bed61aaa2", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'topic'\u001B[0m: \u001B[32m'莲花'\u001B[0m,\n", + " \u001B[32m'poem'\u001B[0m: \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'这是一首为您原创的七言律诗,遵循古典诗词格律(平水韵下平十一尤),以传统咏物手法写莲之形、之神\u001B[0m\n", + "\u001B[32m、之格:\\n\\n**《咏莲》** \\n澄潭不动自生幽,独拔青茎破浊流。 \\n叶展田田承晓露,花燃灼灼照轻舟。 \u001B[0m\n", + "\u001B[32m\\n纤埃不染君子骨,清气长涵世外秋。 \\n莫问繁华何处觅,炎光深处立汀洲。\\n\\n---\\n\\n📜 **简注与赏析** \\n- \u001B[0m\n", + "\u001B[32m**首联**以“澄潭”“浊流”对照,点明莲生于淤泥却挺立而出的环境,暗合周敦颐“出淤泥而不染”之境。 \\n- \u001B[0m\n", + "\u001B[32m**颔联**“田田”“灼灼”叠字摹态,一写叶承清露的静雅,一写日照繁花的光彩,动静相生。 \\n- \u001B[0m\n", + "\u001B[32m**颈联**转入神韵,“君子骨”“世外秋”将物象升华为人格象征,不倚丹青而自具高洁,呼应古人“中通外直,不蔓不枝”的君子之喻\u001B[0m\n", + "\u001B[32m。 \\n- \u001B[0m\n", + "\u001B[32m**尾联**以问作结,不逐春色,独向盛夏最炽烈处静静生长,喻坚守本心、不随流俗的生命姿态。\\n\\n如需调整为现代自由诗、五\u001B[0m\n", + "\u001B[32m言体、或加入特定意象(如禅意、江南水乡、残荷秋景等),可告知您的偏好,我可为您重新定制。'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'refusal'\u001B[0m: \u001B[3;35mNone\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'token_usage'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'completion_tokens'\u001B[0m: \u001B[1;36m3384\u001B[0m,\n", + " \u001B[32m'prompt_tokens'\u001B[0m: \u001B[1;36m17\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m3401\u001B[0m,\n", + " \u001B[32m'completion_tokens_details'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'accepted_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'audio_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'reasoning_tokens'\u001B[0m: \u001B[1;36m3053\u001B[0m,\n", + " \u001B[32m'rejected_prediction_tokens'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'text_tokens'\u001B[0m: \u001B[1;36m3384\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'prompt_tokens_details'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'system_fingerprint'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'id'\u001B[0m: \u001B[32m'chatcmpl-7795634a-2f17-95e3-ab44-62a0b510c37a'\u001B[0m,\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'stop'\u001B[0m,\n", + " \u001B[32m'logprobs'\u001B[0m: \u001B[3;35mNone\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--019fdfb8-22e1-7760-b906-cbbc1152bc1d-0'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m17\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m3384\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m3401\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m3053\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[32m'is_approved'\u001B[0m: \u001B[3;92mTrue\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e53-032e-60d8-8002-97550c7040fb'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m2\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-08T04:54:07.900271+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f192e51-c538-6b08-8001-1ef3f73723eb'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
StateSnapshot(\n",
+       "    values={\n",
+       "        'topic': '莲花',\n",
+       "        'poem': AIMessage(\n",
+       "            content='这是一首为您原创的七言律诗,遵循古典诗词格律(平水韵下平十一尤),以传统咏物手法写莲之形、之神\n",
+       "、之格:\\n\\n**《咏莲》**  \\n澄潭不动自生幽,独拔青茎破浊流。  \\n叶展田田承晓露,花燃灼灼照轻舟。  \n",
+       "\\n纤埃不染君子骨,清气长涵世外秋。  \\n莫问繁华何处觅,炎光深处立汀洲。\\n\\n---\\n\\n📜 **简注与赏析**  \\n- \n",
+       "**首联**以“澄潭”“浊流”对照,点明莲生于淤泥却挺立而出的环境,暗合周敦颐“出淤泥而不染”之境。  \\n- \n",
+       "**颔联**“田田”“灼灼”叠字摹态,一写叶承清露的静雅,一写日照繁花的光彩,动静相生。  \\n- \n",
+       "**颈联**转入神韵,“君子骨”“世外秋”将物象升华为人格象征,不倚丹青而自具高洁,呼应古人“中通外直,不蔓不枝”的君子之喻\n",
+       "。  \\n- \n",
+       "**尾联**以问作结,不逐春色,独向盛夏最炽烈处静静生长,喻坚守本心、不随流俗的生命姿态。\\n\\n如需调整为现代自由诗、五\n",
+       "言体、或加入特定意象(如禅意、江南水乡、残荷秋景等),可告知您的偏好,我可为您重新定制。',\n",
+       "            additional_kwargs={'refusal': None},\n",
+       "            response_metadata={\n",
+       "                'token_usage': {\n",
+       "                    'completion_tokens': 3384,\n",
+       "                    'prompt_tokens': 17,\n",
+       "                    'total_tokens': 3401,\n",
+       "                    'completion_tokens_details': {\n",
+       "                        'accepted_prediction_tokens': None,\n",
+       "                        'audio_tokens': None,\n",
+       "                        'reasoning_tokens': 3053,\n",
+       "                        'rejected_prediction_tokens': None,\n",
+       "                        'text_tokens': 3384\n",
+       "                    },\n",
+       "                    'prompt_tokens_details': None\n",
+       "                },\n",
+       "                'model_provider': 'openai',\n",
+       "                'model_name': 'qwen3.6-flash',\n",
+       "                'system_fingerprint': None,\n",
+       "                'id': 'chatcmpl-7795634a-2f17-95e3-ab44-62a0b510c37a',\n",
+       "                'finish_reason': 'stop',\n",
+       "                'logprobs': None\n",
+       "            },\n",
+       "            id='lc_run--019fdfb8-22e1-7760-b906-cbbc1152bc1d-0',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            usage_metadata={\n",
+       "                'input_tokens': 17,\n",
+       "                'output_tokens': 3384,\n",
+       "                'total_tokens': 3401,\n",
+       "                'input_token_details': {},\n",
+       "                'output_token_details': {'reasoning': 3053}\n",
+       "            }\n",
+       "        ),\n",
+       "        'is_approved': True\n",
+       "    },\n",
+       "    next=(),\n",
+       "    config={\n",
+       "        'configurable': {\n",
+       "            'thread_id': '123456',\n",
+       "            'checkpoint_ns': '',\n",
+       "            'checkpoint_id': '1f192e53-032e-60d8-8002-97550c7040fb'\n",
+       "        }\n",
+       "    },\n",
+       "    metadata={'source': 'loop', 'step': 2, 'parents': {}},\n",
+       "    created_at='2026-08-08T04:54:07.900271+00:00',\n",
+       "    parent_config={\n",
+       "        'configurable': {\n",
+       "            'thread_id': '123456',\n",
+       "            'checkpoint_ns': '',\n",
+       "            'checkpoint_id': '1f192e51-c538-6b08-8001-1ef3f73723eb'\n",
+       "        }\n",
+       "    },\n",
+       "    tasks=(),\n",
+       "    interrupts=()\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 12 + } + ], + "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 +} diff --git a/chapter04/04_state_interrupt.ipynb b/chapter04/04_state_interrupt.ipynb new file mode 100644 index 0000000..d06d828 --- /dev/null +++ b/chapter04/04_state_interrupt.ipynb @@ -0,0 +1,719 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-11T13:36:35.691525Z", + "start_time": "2026-08-11T13:36:35.681924Z" + } + }, + "source": [ + "from typing import TypedDict\n", + "from rich import print as rp\n", + "\n", + "\n", + "class OverallState(TypedDict):\n", + " res: str\n", + "\n", + "\n", + "def node_a(state: OverallState):\n", + " print(\"node_a 开始\")\n", + " return {\n", + " \"res\": \"node a运行结束\"\n", + " }\n", + "\n", + "\n", + "def node_b(state: OverallState):\n", + " print(\"node_b 开始\")\n", + " return {\n", + " \"res\": \"node b运行结束\"\n", + " }\n", + "\n", + "\n", + "def node_c(state: OverallState):\n", + " print(\"node_c 开始\")\n", + " return {\n", + " \"res\": \"node c运行结束\"\n", + " }" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-11T13:36:36.049646Z", + "start_time": "2026-08-11T13:36:35.698774Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "builder = StateGraph(state_schema=OverallState)\n", + "builder.add_node(\"node_a\", node_a)\n", + "builder.add_node(\"node_b\", node_b)\n", + "builder.add_node(\"node_c\", node_c)\n", + "builder.add_edge(START, \"node_a\")\n", + "builder.add_edge(\"node_a\", \"node_b\")\n", + "builder.add_edge(\"node_b\", \"node_c\")\n", + "builder.add_edge(\"node_c\", END)\n", + "\n", + "from langgraph.checkpoint.memory import InMemorySaver\n", + "\n", + "checkpointer = InMemorySaver()\n", + "\n", + "graph = builder.compile(\n", + " checkpointer=checkpointer,\n", + " interrupt_after=[\"node_a\", \"node_b\"],\n", + " interrupt_before=[\"node_a\", \"node_b\"]\n", + ")" + ], + "id": "80d40ccb3cab4a1a", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-11T13:36:36.904998Z", + "start_time": "2026-08-11T13:36:36.052231Z" + } + }, + "cell_type": "code", + "source": [ + "from IPython.display import display\n", + "display(graph)" + ], + "id": "770b7adeb2e1709a", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMEAAAIECAIAAAAvmt3lAAAQAElEQVR4nOydB3wUxduA53KXcmmXHgjpFUJJCEVAOkEB6UV6EwEBQZpI7yg1f6RLEQVEQVRAPnqV3gMkIUBIJQnp/Xr53mThOMglh04Ct3fvI7+4N7M7szf77Mzs3O4sT6VSEQShwIQgCB3oEEILOoTQgg4htKBDCC3oEEILj7AcYYH07oX8rFSpuESpVBKZRAmBHBOiUsJfOENUKqWKyzVRKErDTUw4SqXKhMNRlg5oqOAjrKYiKi6Po5S/GOTgcDjMeAePZyKXK18EcSDB0kATLkepeDEaYsIhZWFMIHm5XSmQoEKu4pSmXxrE5XIUildjKKZmHNhDMwsTF3ezBq1tBY58wmY47B0f2heRnJchk0tVPFOOhRWHZ8YFJ+SSsq/DATE4HC4ceXAIjjGBY/wqHAyDtVSltTAcYw7hlB1yZVk0qFAWBZFlYpVtRUqDVKX/03RIxSn9ryyQKBSlq3FeliWzGqMyKVWKKOSv9tzUjMgVKqlEKRUrFbLSDe1dub0nePKtuYSFsNKhXUsTC3PkFtYmdRrZfNjTmbCcK0cyY64XiouJlT1n5Hw/wjZY5tDZ/RkxV4vsXEyHzPIiBsdvaxKzn8n9Q6w6jahJ2AObHNq7PLEoT9FnsptTTXZ3ICpBIpL9tDDJzJIzcgFrKiTWOHRkW2pulnTYbB9iBPyyPN7MgtdvsidhA+xwCDpAsJ/D5xmFQAy/LE8UixSjFrGgNmLB+NDv36fAX6MSCBg809vSkrt3ZRLRe/TdoaireVkpkmFzvYnxMfAb76Ic+fVj2US/0XeHLv6Z06ijHTFWWvZyvHs+n+g3eu3QsZ/TuFzywcdOxFip28yOZ2ZycNMzosfotUOJUcL6LQXEuPmgk316gpjoMfrrUNT1fPitqXlX1g9DU1L/Q3v43e3asSyir+ivQw/+KbCxf9e/H+3fv3/BggXk3zNz5sxDhw6R6sHOyfTJnRKir+ivQ4W5Mnf/dz0eHRMTQ/4T/3nDt8G3vmVJoYLoK/o7xrhpWlzXMTU8g6xJNZCYmLhly5bbt2/D12/QoMGwYcNCQ0PHjBlz584dZoU9e/bUrl173759Fy9ejIqKMjc3DwsLmzBhgru7O8TOmDGDy+XWrFlz165dK1euhI/MVtbW1ufPnydVTUGuZM+ylAlr/Ileoqf1kLRYCmpXk0BSqRR0AQnWr1+/efNmHo83ZcoUsVi8devWevXqffLJJ7du3QKBIiMjV61aFRISsnr16kWLFuXm5s6dO5dJwdTUNK6MiIiIhg0bXr58GQLnzZtXHQIBAgdzDoekPy0ieome3oOWlS4vve+rekhKSgIhBg4cCKLAx+XLl0P1I5fL31itfv360D3y9PQEyeCjTCYD1QoKCgQCAexbWlra7t27LSwsIEoikZBqhkM4uVnKmnr5y4eeOlR661Z1KURAC3t7+4ULF3bp0qVRo0ZQ0zRu3Lj8alBRPXv2bM2aNdCWlZS86NKCfOAQLPj4+DACvRtUL++Z1EP0tC2zr2GiqrYyg87Ntm3bWrZsuXfv3lGjRvXs2fPo0aPlV7tw4cLUqVODg4Nh5Zs3b27YsOGNRMg7BEpD4KinJ7yeOmQlsIC+fmqCkFQP3t7ekydPPnLkCHRo/P3958+fHxsb+8Y6f/31F3S0oR8dGBgIjVdR0XvrjkjFCqiYPQOtiF6iv9f2PB7naWQxqQbgouzw4cOwAI1R69atV6xYAT2ehw8fvrEadH1cXFzUH8+ePUveE1GX86qvZadHfx3i23KTHlZLPQRyLF68eO3atSkpKdC/3rlzJ3SooVcEUR4eHtD7gZYL+j1Q/Vy7dg2u0SD2l19+YbZNT08vnyC0a2CbemVS1Ty+W2yux3du6q9DdZrYFuZU/fEAQJfZs2cfO3asV69effr0uXv3LowV+fr6QlTv3r2h2YL268mTJ+PHj2/RogV0iZo3b/78+XO4vIe+0aRJk44fP14+zc8++wzMmzZtmkgkIlVNdqrcp56eNmREz+9j3DAlrm0/53otjPpn15QnJYc2p38ZoacDjETPf7ev6Wt+/XgOMW5O/5Lp4GpK9Bi9fs61z0SPjVPj4u8X+Taw0boCXJk/ffq0fLhCoYD6lRkbLM/Bgwft7KrlvjYY2obLPa1RsEsmJiYVDZyeOXMGhqPKh+dlSEsKFCMX6vV9wPp+T/7Z/RmPbhaNW6W9Joehv9IHpLUBfduKHLKx0W5klfDfhgAq2qXtc+Lc/PldRtYiegwLnuv4eUmCpQ2XLQ/KVCEHNz/LTpV+vtSX6DcseK5j+DyfvAzZkR2pxJg4sy89I1Gi/wIRFj2j+NOieIEzr9d4o6iNTuxOS44Vj17GAoEIu56V3jYnzsyCa/APmv3yXVJxgXzscnxWunrYF5GclSL1C7XqPJxNsxq8Jad/TY+9WQJX8oO+YdOMFOybOyYhuujErgy5FEaPzFr1dHTx0N8B3LckP0t65tfnz5OkcOHfrr9znSYsG1Nl6xxW9y7k3j6bJyxUmfAI39LE2p7Ht+HxzDlK+WsDMK9mr3rJixnNXh+nKQ1Uvfhbfk3NcHWC6sAXC5zSyxOl6rXUCHm1oWYW8HOyVCqXFCsLc+XCotLf5E3NOQ3b2zX9yJGwEBbPg8Zw/WTWs0fi4jy5XFY6bZ5M+lqs5rRlDGVmvHmDGzN/HofzWmkwx5sJUY8NqhN8JdbLedPUM+e91KV00jWi0pIFzwyGG1WmFhy+Fc8j0LJZF1aqo4b1DlU3O3bskEgk8PsrQSqA9XN6VjcymczUVK9/rnrv4NzCOqjkNxOEAUtHB+iQTrB0dIBtmU7QIR1gPaQTLB0doEM6wdLRATqkEywdHWB/SCfokA6wHtIJlo4O0CGdYOnoAB3SCZaODtAhnWDp6AAd0gmWjg7QIZ1g6egAHdIJlo4O0CGdYOnoAMcYdYIO6QDrIZ1g6egAHdIJlo4O0CGdYOnoAB3SCZaODrBPrRN0SAdYD+kES0cH7u7uWmcoQ9SgQzpITk7GxzgrB58vQ2hBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFpzjXDudOnUyMzODhbS0NFdXVy6XK5fLPTw8fvjhB4K8Dt6Dph1TU1Owh1nOyMiAv7a2tkOGDCFIObAt0069evXeeFNsYGBgq1atCFIOdEg7/fv3d3NzU38UCARYCVUEOqSd0NDQOnXqqD8GBQW1bNmSINpAhyoEKh4nJydSVgkNGjSIIBWADlVISEhIcHAwLAQEBGAlVAm6r8tkEmVOulRYrCDGR5e2I7OTud3DB8RHlRDjg29l4uhmZmau4/E6HeND//yZFRdZbCXg8a1xFMDoUMiVGcnigIY2HQa4VLJaZQ4d25luX9OibnN7ghgxj+8UpMQW9/jCjfP6S3DVVOjQqV8y7FzNazexI4jRkxBdlBxT3PVz7e+D196nzkgRi0VKFAhh8KlrwzPlpDwWao3V7lBuupRnipdsyCtMLbg5aVKtUdpFKSmU2zmZEQR5ib2rubBQrjVK+9WWUgF9cvw9H3mFQqaSybQrgQ0WQgs6hNCCDiG0oEMILegQQgs6hNCCDiG0oEMILegQQgs6hNCCDiG0oEMVMnLUp2u/X04QXaBDCC3oEEKLAd5pn5Dw9LPP+2/a+PPevTsvXT7v7OzSru1HY0ZPZF7/IxQKI9Z+Gxl5q6io0NvLt3PnHj179GM2TEyMX75iQVJyQmho42FDPtdMMzr6/s+7tsbGRgvs7Js3azV82BgrK6vKd6O4uPj3A3tu3LyamPjU0cGpRYs2n40cZ2FhQQwOA3SIeWXdmoilQwaPmj/vu5iYB5OnjgkIqB3eoROEz5w9SS6XL1m8xq1mrSP/99f361YEBQXXqV1XJpN9M2tiYECdRQtXiUTCnT9tycnJZhJ8lpoyfcZ4SGHD+p1KpXLDxtVTpo4BRyt/r9mff/2299ef5sxeKhDYFRcXrd+wCiQeO2YSMTgMti1r0zq8bZtw8CkkJAx0efz4IQReu375wYPIr6fNA2ng0A4eNLJ+/VCoYCDqn4tnMzMzJoyf5upaw9vbd9LEGXDgmaROnz5myjNdsmi1p6c3RE2fNu9J3COo4SrfgU/7Ddm+9VfYh4ahjVu1bAd14Y2bV4ghYrBPjQUGvnpa3trahhEiISEOWhMfH79XqwXUOXP2OCykpqZAVI0aLx5dcHR0cnFxZZajo+/VLnOO+QjruLm5339wF/yoZAdA35u3rkLjGPf0MdR8EGJv70AMEYN1yMRESxULzZOFBV8zxNLSElouWCgsLODzLTWjzM1f9F3Av9hHMe06NNaMzcvNIZWyddv6o0cPjh37VZPGzaFu275j49Fjh4ghYlxPr0JHWCwWaYaUCEucHJ1J6RRVAkYmNULhi+ejHRydoMkbOeILzViBbWUPTqlUqr+P/NG3z6Cun/RiQtQto+FhXA4FBQaLxWLozQT4BzEhDx9GeZc1bTVca0JUfHycr68/fIyLe5ydncWs4+cbcPLU/4U0CFPXbXAF5+7uWUlG0EMXiUROTi8eMZZKpVeu/kMMFOMaH2ratAV0ZSIilkHblJubs+PHTeBQ/35DIQquvc3MzFZHLAWTwJ7FS2dBzcRs1bfv4NLLsU1rIColJemHretg7CA+Ia6SjCAp6IAfO344Ne1ZQUH+ytWL69cLhdGEkhIDnPvBuByCq/Gli9eAHOMnDB80pPvtOzeWLF4N7RQp7Xdbf7tsrUIu79q9zYjP+kIz5OXlw2xla2O7Y/s+vgV/7Lghw0b0ibx3++vp8wIDalee17w531qYW4wY2XfIsJ6Nwpp+/vmX8LFXn/D052nEsND+vP2NE7lSMQlpa5jXEch/IPZGgbBQ2qaPc/ko/K0DoQVnFfrvzJozOepBpNaoLl16jvtiMjEO0KH/zvSpc6Uy7dMYWL4+1GTYoEP/HRjLJgj2hxB60CGEFnQIoQUdQmhBhxBa0CGEFnQIoaVqxocO/LnT2tqWIKzCwcGhaeN2hJqqccjR0fHDD/H9cCzDpIoaoapxqFXLTsyTNwiLUJGqeY9P1TjE4+Jk1uyDQ6rmtMc+NUILOoTQgg4htKBDCC3oEEILOoTQgg4htKBDCC3oEEILOoTQgg4htKBDCC3oEEILOoTQ8n4cunnrWs/elU1meP/+3Sdxj0j1c+LEkaJ/P0OZXC7v+HGz+Pi4t1lZLBYvXPRNuw6Nt23fQKoNzVwyMp5fvHSOvCvez7PSTRo3O/jn6UpW+H79iulT55JqJi8vd8Om1R07diH/krinj83Nzb29fd9m5Tt3bkRF3zt14lrlcxFTopnLug2rmAkC3w3chQsXlg9NfSpSyEkNbz6pHiZ+NQpO5aCg4AkTR+bkZG/e8r+Dh3+/eu1ScHB9Gxvb8V+OSEiIS05JdHWtybfgf/vd/B9/2nL02MF79+7UqV3PsKDvAAAAEABJREFUysr6+o0rc+ZOiX0UvXv39o4dP/lqyujk5MTt2zeUlBRnZWfOnTetT+8BTEYDBnWt5ebh6Oj8UafmcNT379+zaXNEQsLTBg3CMjLSJ08drVQqr9+43KplezOzf3Eb3eUrF4oKC2/evLpw8cwrVy7Y2AoYn9ZvXL1x05rjx/8+d+5krVoeLi41jh47tHFzBJfLvXrtYniHzrfv3FizZunBQ/sPHz6gUCpr164LW0EhqPe/Xr2Q8om8kTvU4lu3rlsTsfTM2RMqlQoS0cwlMTH+wB97hSXFIpGwbnADrampc+zWtfdbfuXsVIlMovAO1jKz+/uph+LiHo0fNxW+P7ji6OC0etVma2vrWXMmnzjx98gRX3T9pBcU8dqI0mmjFy+ZJRDYbVj3I6jz/boVq9csWbliw7OUpLzcnP79hjJzJyYnJXh5+vywZQ8sQ02unqGssKgQanUwNSkpHj76ePsNHDC8oCB/5KhP69cP7dK5R0hIIzuB/RuTvECO586f0gwBP3bu2K8Z8uhRDMj65YTp38xY+OtvP8FBatsm/NDhAw8fRn27bK17LQ9oImfOnvTH7ychlzNnjjdv3qpvn0EPHkQu+3bu8u/W1Q4KhkM4afLncFChStbcf62JgP3qrKHNWrJ09ojhY+fP+w4khkJr2rSFZi5p6an79u/+X8RWCwuLilLTzJGe99AfSkpKkEgkAf5BqakpsDB9+jwQCMLlMhkznS+0FP5lc25CocOJNWbMJNAIqug2bcKfxj9hVvigWUtGILCkuKR48ODPmMQhKuClQ0+exDo6Ojk4OELXqnGjD5o1awmBkJS7u2d+fh4pU9nfL/CN3YNjc+7MLc1/bwgEPHocM3zYGD+/ADgeYQ2bQmpCoXDb9vWfjRwHRwtWCA/vXFJSAlUdLD9+/DDAv3SXtu3Y0KN7XxAIlj09vf18A2AHNPe/kkTUgBmHD57t3as/1DpNmjRX38auzgW+NagJq1WU2hslRs97qIfg28LhBydiH8X4+vjb2rx4qCg2Nrpv38Gk7NC2b/cxLNyNvAWnXfcer55fgaIvTeHJQziEL7Z6FA3HspabO/MRtoVzUb3M+PT06eO6dRuoE8nNyQaToDGFRi1A17SK5WGmj4Wzn/mYnZMFqUFecIS+njFBc01ra5v052lwwKAuhOyiou5NGD9NHZtfkGdrK9Dc/4oS0fwIWf+8aytkCnWhQqGwsrJyq1lLnQvzZZlZbytK7UFUpGaJ0fMeHCqtKl6eMX4vq4Hs7CwohTp16jHhY0eXvtdCKpVAh3f2zMWam8MhhGMfGPBiGnww0t/vxUTB0LXKzc1RVy1QWEy7BvVQePtOTGBmZkZq2rOGDZsw/WJGSk10tmVw8Ph8vuDlrLHQWISGNJJIJa6uNX7be+SN1P65eNbNzR1qBdhtaLvNzV60SgWFBVAf168XeuLkEfX+V5SImuLi4slTRk+dOoeZoh+aqgsXTjMlxuTCfNl6dUMqSU2zxKqE99CWwRdmzn44UQI12h0XF1eok0AmKO4aNdwg0MfHPybmAfRgYDnmYdTKVYulUimsaWVppX4pApSIOhFmknJmFmmo5G7fvg4ZwckKva77D+4y6+zavQ0aNTh3U1KSoINZfjp9nW0ZNGRQqYA6pEz9M2ePd+vaBzpbYPDjJ7EQ+Px5OnTdIH3N7wgH2MvLh3llB2weEbEsrGETMFhz/ytK5GFs9J9//gYLubnZMBIBysIyFMvx44eZc0CzJJ89S4ZrkUpS08yxSngP9RBIAI00eb1JevKy3YF2wdnZBa6ntmza3a5tx5ycrFGjB/D5lmKxCDqwcPVUWgQa7+KAtmDoy/dEQUenX9/BM2d/VVRUCAtw3oOF0HuFTkNYWNNPB3SBgwdt0DdfLyBlRZyW9qxPv48P7D/O4XDIWwM6Dho4Yt36lUKRUCGXj/tiSkhIGIQvWbQausyQVGbmc+jzenh4EY1agVlhw6Y1hw79DteerVt36N1rwBv77+TkrDWR8+dPwa727j0AjOnerQ/0o+FsCa5Tv1Wr9nAJ1rhxM81coCGDFGAFuObSmppmjlWC4c8tfOrU0UN/H4ArO8JaLl++AH3h3i8HLN4LlcwtXDX10K7d298IgXEXrW9d6dWrv83rncTqBvo90HMnbEYkFkG5EX2lahwaNrQq68aqBa5TPvywLWEzzNv79BbDnxd29apNBKlO8Hd7hBZ0CKEFHUJoQYcQWtAhhBZ0CKEFHUJoQYcQWtAhhBZ0CKEFHUJoQYcQWtAhhBbtv9tbWHKVCiVBkJeYcDmW1trnRNdeDwmceOmJIoIgL8lIFNo6mWqN0u6Qe4ClVFQ1L3NADANhkdwjUPtzz9od4vI4H3RyOLkrlSAIIWf2pjVoJbC00d7z0X5PPkPqU9GJXc9D2zjYuZrzrQ3/jkfkDSQiRU6aOPpqfqueTj51rSparTKHgOJ8+Z2zec8TxaIiI23axBKJubn5v3h0yICwtuc51DALbWtn71LZhBY6HEJatGhx7tw5zVkTkDfA8SGEFnQIoQUdQmhBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFnQIoQUdQmjBp1d1UL9+fYJUCjqkgwcPHhCkUrAtQ2hBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFpzjXDv9+/c3MzPjcDgxMTH+/v6mpqZQUAKBYOPGjQR5HbwHTTtxcXEgkHoZ/oJGs2bNIkg5sC3TTlhYmFL52lsAfXx8unfvTpByoEPaGTJkiIODg/ojtGsDBw4kiDbQIe20adMGKh71R09Pz27duhFEG+hQhUBVZGdnBwvm5uaDBg0iSAWgQxUCVZGvry9cjrm7u2NPqBLe6rpMLlOKio3xNdN9egxJepo5sN9nRXlyYnyYW5qYmeuuZXSMDz28UXj/YkHuc2lF76VGDBilivBMSUgbuwYt7SpZrTKHbpzMzU6ThbZxsHEwJYhRUpQri76Sx7c2adnDqaJ1KnTo+vHcwhx5s64uBDF67pzOBlPa9HbWGqu9tcvLlGanSlAghCEs3Ak6xBlJYq2x2h0CgVQq43yXMqIdLpeT9UyiNUq7Q8UFCmcPC4IgLwEfSgq1X5xqv7aXSZQy7fUWYqTIJCqxUPv4Do4xIrSgQwgt6BBCCzqE0IIOIbSgQwgt6BBCCzqE0IIOIbSgQwgt6BBCCzpUISNHfbr2++Xkv7Jg4Yxp08cRIwAdQmhBhxBaDPB5+4SEp5993n/Txp/37t156fJ5Z2eXdm0/GjN6Ipdb+liBUCiMWPttZOStoqJCby/fzp179OzRj9kwMTF++YoFSckJoaGNhw35XDPN6Oj7P+/aGhsbLbCzb96s1fBhY6ysrHTuCYfDuXX7+r59u6Ki7/n5BU6aOCMwoDYxOAywHjI1LX2CYE3E0g4dOp08fnXOrKX7f99z7vwpJnbm7Elpac+WLF6z/7ejrVt3+H7dioex0RAuk8m+mTXR2dn1px8PjB096bd9u3JysplNnqWmTJ8xXiwRb1i/c8mi1fHxT6ZMHSOX635aCHQ8eGj/oEEjv122VqlUzp031SBnWTHYtqxN6/C2bcLBp5CQMLeatR4/fgiB165ffvAg8utp8+rUrisQ2A0eNLJ+/VCoYCDqn4tnMzMzJoyf5upaw9vbF+qM4uIiJqnTp4+Z8kzBHk9Pb4iaPm3ek7hHUMPp3Ie8vNzJk2Y2DG0M/4YNHZ2VlXnv3h1icBisQ4GBddTL1tY2jBAJCXEWFhY+Pn6vVguo8+hRDCykpqZAVI0aNZlwR0cnFxdXZjk6+l7tMueYj7COm5v7/Qd3de6Dn2+Ak9OLZyHq1Q2Bv2npz4jBYbDzD5mYaDk9oHmysOBrhlhaWopEQlgoLCzg8y01o8zNX9xRDv7FPopp16GxZmxebg7RhZWVtWZGTC7E4DCuOaygIywWizRDSoQlTo6lVYWtrYCRSY1QWMIsODg6QZM3csQXmrEC28oe/WQQaeRVXFLM5EIMDuNyKCgwWCwWQ28mwD+ICXn4MMq7rGmr4VoTouLj43x9/Unp3GePs7OzmHWgSTp56v9CGoSp6za4gnN399SZXXJyAqQJTSQsMy2mey3dW7EO4xofatq0BXRlIiKWQduUm5uz48dN4FD/fkMhqkWLNmZmZqsjlsJRB3sWL52lrjP69h0MV1UbNq2BqJSUpB+2roOxg/iEOJ3ZQbu5es2SwqLC/Py8X/b+CB0sqM+IwWFcDvF4vKWL14Ac4ycMHzSk++07N5YsXs0cV2tra7gCV8jlXbu3GfFZ3759Bnl5vZjDytbGdsf2fXwL/thxQ4aN6BN57/bX0+fpHOmRyWXQj/b09On3aad+/TsrFIqlSyLUczwaEtqft79xIlcqJiFtHQiClBF7o0BYKG3TR8sj9/hbB0ILzi3835k1Z3LUg0itUV269Bz3xWRiHKBD/53pU+dKZVKtUZavDzUZNujQfwfGsgmC/SGEHnQIoQUdQmhBhxBa0CGEFnQIoQUdQmipmvGh4yf/sLNzJAirMDMzCwttQaipGockElGdOkEEYRWWluakKqgah9q372xtZUMQVqFUSUlVUDUO2VhhQ8Y+uBwzUhVgnxqhBR1CaEGHEFrQIYQWdAihBR1CaEGHEFrQIYQWdAihBR1CaEGHEFrQIYQWdAihBR1CaHk/Dt28da1n7/BKVrh//+6TuEek+jlx4kjRy7k73x65XN7x42bx8bqnIALEYvHCRd+069B42/YNpNrQzCUj4/nFS+fIu+L9PCvdpHGzg3+ermSF79evmD51Lqlm8vJyN2xa3bFjF/IviXv62Nzc3Nvb921WvnPnRlT0vVMnrvF41Vjamrms27CKmSDw3cBduHBh+dDUpyKFnNTw5pPqYeJXo+BUDgoKnjBxZE5O9uYt/zt4+Per1y4FB9e3sbEd/+WIhIS45JREV9eafAv+t9/N//GnLUePHbx3706d2vWsrKyv37gyZ+6U2EfRu3dv79jxk6+mjE5OTty+fUNJSXFWdubcedP69B7AZDRgUNdabh6Ojs4fdWoOR33//j2bNkckJDxt0CAsIyN98tTRSqXy+o3LrVq2NzP7FzdkXb5yoaiw8ObNqwsXz7xy5YKNrYDxaf3G1Rs3rTl+/O9z507WquXh4lLj6LFDGzdHcLncq9cuhnfofPvOjTVrlh48tP/w4QMKpbJ27bqwFRSCev/r1Qspn8gbuUMtvnXrujURS8+cPaFSqSARzVwSE+MP/LFXWFIsEgnrBjfQmpo6x25de7/lV85OlcgkCu9gLTO7v596KC7u0fhxpRN+gyuODk6rV222traeNWfyiRN/jxzxRddPekERr40onTZ68ZJZAoHdhnU/gjrfr1uxej78HaAAABAASURBVM2SlSs2PEtJysvN6d9vKDN3YnJSgpenzw9b9sAy1OTqGcoKiwqhVgdTk5Li4aOPt9/AAcMLCvJHjvq0fv3QLp17hIQ0shPYvzHJC+SonhCdAfzYuWO/ZsijRzEg65cTpn8zY+Gvv/0EB6ltm/BDhw88fBj17bK17rU8oImcOXvSH7+fhFzOnDnevHmrvn0GPXgQuezbucu/W1c7KBgO4aTJn8NBhSpZc/+1JgL2q7OGNmvJ0tkjho+dP+87kBgKrWnTFpq5pKWn7tu/+38RWy0sLCpKTTNHet5DfygpKUEikQT4B6WmpsDC9OnzQCAIl8tkzHS+0FL4l825CYUOJ9aYMZNAI6ii27QJfxr/hFnhg2YtGYHAkuKS4sGDP2MSh6iAlw49eRLr6Ojk4OAIXavGjT5o1qwlBEJS7u6e+fl5pExlf7/AN3YPjs25M7c0/70hEPDocczwYWP8/ALgeIQ1bAqpCYXCbdvXfzZyHBwtWCE8vHNJSQlUdbD8+PHDAP/SXdq2Y0OP7n1BIFj29PT28w2AHdDc/0oSUQNmHD54tnev/lDrNGnSnHmBhGYu8K1BTVitotTeKDF63kM9BN8WDj84EfsoxtfH39bGlgmPjY3u23cwKTu07dt9DAt3I2/Bade9Rzv1tlD0pSk8eQiH8MVWj6LhWNZyc2c+wrZwLqqXGZ+ePn1ct24DdSK5OdlgEjSm0KgF/PsXaDDTx8LZz3zMzsmC1CAvOEJfz5iguaa1tU368zQ4YFAXQnZRUfcmjJ+mjs0vyLO1FWjuf0WJaH6ErH/etRUyhbpQoVBYWVm51aylzoX5ssystxWl9iAqUrPE6HkPDpVWFS/PGL+X1UB2dhaUQp069ZjwsaMnwYJUKoEO7+yZizU3h0MIxz4w4MU0+GCkv9+Lx5Kga5Wbm6OuWqCwmHYN6qHw9p2YwMzMjNS0Zw0bNmH6xYyUmuhsy+Dg8fl8wctZY6GxCA1pJJFKXF1r/Lb3yBup/XPxrJubO9QKsNvQdpubvWiVCgoLoD6uXy/0xMkj6v2vKBE1xcXFk6eMnjp1DjSdpKzhu3DhNFNiTC7Ml2Xm5K8oNc0SqxLeQ1sGX5g5++FECdRod1xcXKFOApmguGvUcINAHx//mJgH0IOB5ZiHUStXLZZKpbCmlaWV+qUIUCLqRJhJyplZpKGSu337OmQEJyv0utSvRti1exs0anDupqQkQQez/HT6OtsyaMigUgF1SJn6Z84e79a1D3S2wODHT2Ih8PnzdOi6Qfqa3xEOsJeXz42bV0jZ0EBExLKwhk3AYM39ryiRh7HRf/75Gyzk5mbDSAQoC8tQLMePH2bOAc2SfPYsGa5FKklNM8cq4T3UQyABNNLk9Sbpyct2B9oFZ2cXuJ7asml3u7Ydc3KyRo0ewOdbisUi6MDC1VNpEWi8iwPagqEv3xMFHZ1+fQfPnP1VUVEhLMB5DxZC7xU6DWFhTT8d0AUOHrRB33y9gJQVcVrasz79Pj6w//i/mvIXdBw0cMS69SuFIqFCLh/3xZSQkDAIX7JoNXSZIanMzOfQ5/Xw8CIatQKzwoZNaw4d+h2uPVu37tC714A39t/JyVlrIufPn4Jd7d17ABjTvVsf6EfD2RJcp36rVu3hEqxx42aauUBDBinACnDNpTU1zRyrBMOfW/jUqaOH/j4AV3aEtVy+fAH6wr1fDli8FyqZW7hq6qFdu7e/EQLjLlrfutKrV38b63f6RCz0e6DnTtiMSCyCciP6StU4NGxoVdaNVQtcp3z4YVvCZsI7dCJ6jOHPC7t61SaCVCf4uz1CCzqE0IIOIbSgQwgt6BBCCzqE0IIOIbSgQwgt6BBCCzqE0IIOIbSgQwgt6BBCi/bf7c0sOEryL27tQwweU1MTC0vtNY72UBt706wkEUGQl2SkiKzttdc42h1y8TDnYDWEaKBUKF09LbRGVVgP1fK3+OeP5wRBCLl2JNPexdTJTft7hrTfk88QfbXgSWRxSBtHe1czLg9730aHUqnKSZfEXM2r6WPRqL19RatV5hCQEF0SeSH/eYKYa2qkbZtCoeRyjfT8MeFy7JxMQ1oLAhpW9hiFDofUSERKYpR89NFHf//9t+asCcaDuYXJ21ydv+09+eZ8Iz0XZQohfHdzc2zKKwSLBqEFHUJoQYcQWtAhhBZ0CKEFHUJoQYcQWtAhhBZ0CKEFHUJoQYcQWtAhhBZ0CKEFHUJoQYcQWtAhhBZ0CKEFHUJoQYcQWtAhhBZ0CKEFHUJoMfz3dVASEhJCkEpBh3Rw7949glQKtmUILegQQgs6hNCCDiG0oEMILegQQgs6hNCCDiG0oEMILegQQgs6hNCCDiG0oEMILegQQgs6hNCCDiG0vO08+cZGWFgYs8Ape4ESlJKJicnYsWNHjx5NkNfBekg7fn5+JmVwyoAFb2/vIUOGEKQc6JB2Bg0apPmODh6P16NHDz6fT5ByoEPa6dWrl4eHh/qju7t77969CaINdKhC+vfvz1RFXC63e/fuVlZWBNEGOlQh6qoI/vbt25cgFYAOVUa/fv2gD9StWzdLS0uCVADLru0vHc5OfSIy4XHyMqTknSCTyU1N39FTeAJHU5WSuPlbtPjEkWfGmtObNQ6JihU75iW06etqbW9q62RmkKNaMJBQmCspypNd+jNzyGwvG3t2PEHKDodEJYo9y5L6z/DhGM0r0/9Ym9hrQi2BkynRe9hRYf7zZ1b4UDfjEQjoONTt4sEswgZY4JBCoYqLLHZysyDGhK2j2fMEMbTgRO9hgUM5aVLfBjbE+PAKtslJlxC9hwW9NpVSVZj9jq7C9IriAplCTvQfHB9CaEGHEFrQIYQWdAihBR1CaEGHEFrQIYQWdAihBR1CaEGHEFrQIYQWdAihBR2qkLXfLx856lOC6AIdQmhBhxBaDPO9QYsWz+RwOOEdOi9fuVAkEgYH1/9izFd16tRjYi9fvvDzrq1JyQkCgZ2/f9BXE79xda0B4UKhcNl3c+/evenj49+j22sPlMnl8h0/brp2/VJm5vN69UJ79fi0WbOWOnejsKjwhx++P3rsEGTUuNEHoz+fyGRkYBhmPcTj8aJj7p86fXTL5t3H/u+SuZn5dysWMFG3bl+fv/Drjz76ZP9vRxfMW56Rkb523XImavWaJc+eJa9etXnJotUJiU/BGHWC69avPPDH3l49++/95e82rTssWDTjwj9nKt8H0G7mrEnZOVkRa7ZM/PLrzKyMmbMnQSAxOAy2LRMJhV9Pn+9Wsxb41KF9p5SUJKhmIPzHnZtbt2rft88gqBvq1m0wftzUa9cuxT6Kyc7OOnf+1MABw4Pr1HNwcBw7ZpK5+Ys7uCUSyYmTRwYNHNG9Wx+BraBL5x6Q4K7d2yrfAVDw4cOoCeOmNgxt3KH9x19OmO7nF5ibm0MMDoN1yMPTW/1wqrV16e3YRUWF8Dc+/knt2nXVqwUFBsPf2Njo9PRUWPDy8n0VFRTMLDx+/FAqlTZp3FwdFRrSKD4+rqCwoJIdePr0CeyAp6c38zEwoPbc2UtdXFyJwWGw71E0MdFyehQXF0Oloq5gAMYzobCkoDC/9CP/1TPRfAv+y62K4O/Er0a9kVpebg5US6QCSkqKNTMyYIzrXZwWFqUHVSwWqUNKhCXw19HBSWBrVxolEaujhGVRpbFOzvB32tQ5tWp5aKbm4lJZB9nS0gq680qlUqvNhoRxXdtD3ygosE509H11CLPs6xdQo4YbLERFvXh7q0wmg943s+xey5OZRAZ6Nsw/by9fL0+fyidyqB0ULBaLHz1+yHxMTk6cPHUMNHDE4DC68SG4trp0+fwff/wKF953I29t2hwR1rBJgH+Qs7NLvXohP/20BXrf0N4tXTZH/VgtuDJi+FjoRD94EAkdI7gimz5jPIxiV55R48bNoN7aunXdxUvnbt66ButnZWZ4efkQg8Po3isNV/VZ2Zn7ft+9YdMaGK1p3KjZ6M+/ZKJmzVy8du13Y74YDJVQp4+7wfUX2MZEDeg/DK6q9v720507N6ysrOsGN5g2bW7lGUGdt3rlpu9WzJ+/4Gv42Lx5q+++/R4CicHBgjkbMpLE5w9kdfncgxgZp39JC2tn51VH36c+wt86EFqMri2rQqB7NHvO5Ipi9+w+CMOYxAhAh/479euH7t37d0WxNtbGMs8EOkSF8YhSCdgfQmhBhxBa0CGEFnQIoQUdQmhBhxBa0CGEFnQIoYUN88KqVNb2LJguvsqxtOGxYlZ3FtRDAmeztDghMT6eJwrxXQtVA9+K6+xhIRYa4FM1laCQq6zteLYOLGgo2NEfCm0ruPB7BjEmLvyeXv9DAceEBY0Za949FR9VfOdMftv+Ncz5Bv47sVSivPjH86DGNnWasOMHXTa9Ay8xpiTyfH5OurRWgGVJ/jtq2hQKBZfLJe8E6ESnJwrtnEwbtLLzD7UmLIFl71EESgrl+Zky8q6YMGHC2rVrTU3fRd9WRVR2TmbQDSKsgn3tgpUtD/6Rd0VmUWxNX3PNd90jb4BjjAgt6BBCCzqE0IIOIbSgQwgt6BBCCzqE0IIOIbSgQwgt6BBCCzqE0IIOIbSgQwgt6BBCCzqE0IIOIbSgQwgt6BBCCzqE0IIOIbSgQwgt6BBCC84trAN/f38OK2bfeH+gQzqIj49XKBQEqRh0SAc8Hs8gX+RbhaBDOkCHdIIO6QAd0gk6pAN0SCfokA7QIZ2gQzpAh3SCDukAHdIJOqQDdEgn6JAO0CGdoEM6QId0gg7pAB3SCTqkA1NTU5ns3U0hykbQIR1gPaQTdEgH6JBO0CEdoEM6QYd0gA7phH3z5L8bwsPDmbnxCwsLzc3NLSwsTExMwKeDBw8S5HWwHtKOvb19QkICsyyRSMAkONk+/vhjgpQD78nXzqBBg/h8vmaIk5PTkCFDCFIOdEg7vXr18vHx0QwJLoMg5UCHKmTw4MHqqsjZ2XnYsGEE0QY6VCHQ+wkKCmKWfX19GzZsSBBtoEOVMXToUFtbW4FAAN0jglSAgVzbXz6SmfpEXJQnl0tVKiXR+kAYh0M0vquqNKDs2cNKCgC2UCghWmViwuWUbaM1zfJ/K8iUcHkcExMVz4xjZctz87No1dOFsB92O3T/cv6tk7miIiWHy+GampjyeWbmPA6Pq7N2ValAIPjmKg6p7BnWUtFe/dW2clmc2hxOBSmoKXVbqZCJFVKhTCFTKOXEwtokrI0gLNyRsBa2OpSVKjq0JU0iVPEF5jWDHflWrHzPoVQsS43KKsmXmJtzPhrm4lWbHS8BfgNWOnRoy7OUJ2IbJ75XaA1iECTdzyzKKHH1Nus3yZOwDfY59OOCeKmM1G7lRQyOxxeTuFzOqCU+hFWw7Lps/9oUqVRlkAIBga28FBzOnuVJhFWwqR76cWG8QmkS0NyDGDRPr6eq5PLPl/oSlsCaeujAuhSZhBi8QIDfB7WUSs6vq5IJS2CHQ/HR+c/UeZLPAAAFRElEQVQTJEGtDbMJK09gK8+cNGnkxSzCBtjh0ImdOYKaVsSYcPSxvfRXAWEDLHDoyv9lKlUqj/qGMKT79tQMKB11PLUnneg9LHDowcUiKwcLoq/88ffKVesHkmpAUNPycWQJ0Xv03SFxsVQmVXmH1STGh0c9V5WCJD8qIvqNvjt0dn+OMU/LyjXl3Dyp770ifb+fOj1RaMqvRtFv3jly9eZf6RlxNV39Q+uHt2o+gFF2wXcff9xhTIkw/+TZ7eZm/KCAZj06T7W1dSKlt1cLfzkwPy7+FmzSvElvUp2YW5vlZkiIfqPv9ZBEpLIUVNfvqXfundj31xJ3t6DZU//q3HHcP1d+O3T0f0wUl2t6/tIeDsdk8ayTMybtT0i6d+LcNiZq/8Fl2TkpY0dsGD5wxfPM+NjHl0m1YSUwl4n0fRBY3x1SKgjftrocunH7kK9Xw97dZthYOwT4NoaK5/L134uKc5lYJwf38DYj+XwbqH6C/Js9S42FwILCrHtRp9u1HOrlUc/WxrHrx1+a8qqxv893MFfq/e8I+u4QNCw8s2ppcJVKZULy/cCAD9QhoJFKpUxIjGQ+uteqo47i823FkmJYyM1Lhb+uLq9+FvXQWK3KMbUw0//OoL73h0pvFVOS6kAulyoUsuOnt8A/zfCiklx15uW3KhGW9nDNzSzVIWZmfFJ9KAjRe4n03yEilVTL1C1mZhagQqPQLg3qttcMd3SoVclWVpYC+CuVidUhYkk1DuFIhFL9vyrVd4d4ZkRYWF0XJm41A0XiIn/fRsxHuVyWk5dqJ3CtZBN7Ozf4m5h8n2nCYJMnT29YWdmT6qEkX8zl6rtE+t4fshbwpMXVNYVUl47joh5euH77cGnfKClyz/45P+ycAG1cJZvYCVy8PUNOnN2amZUkk0l++X0eqc6KQlQgtrDW92Ok7/vnEcSXS6rrtT0+XqFTxu2CTvTCFZ1++GmiSFw8cvAqU1Mdl4ED+yzwdK+7dvOwOUvbWfJtm4Z1J9V2D5ZMJKvpo++3irPgHrQNU+N8mtawElRn11Uvkclkj849+/J//kS/YcFvrnbOvPSYbGJ8JN/JtLRlwQFiwdwx4UNc/1ibWskKF6/ugw6K1ijoslTUNg3oPb9enTakioDu1I4907RGQQcLRr21/uo3sM/CurVbkQoQF0nDBzkTvYcd91PvXpYokXL8m7lrjYV+jEhUqDWqRFhoZWmrNcraygEu70nVkZuXpjVcLC62sLDWGgUXdOYVDC89vZHGUco/W8SCZzxYc0/+xmlx7g2cBC6sfIrv3yIWSuMup34Zoe89IQbW3JPftp/zs/vG0iuKv5baqKOAsATWOFS3mSCgkVX0mQRi6ESfTfCqbdm8Mwt6Qgwse8415XHJ4a3pdTuw7EnQtyfmXGKHAY5BYXaEPbBsTk+PQKsGLW3vn04QuFm5BxvUXfrPn+TkJBUGhlmxSyDC0jkbCnLFv654plJxnP3tnTxY02+oiNy0oszHuSqlsvsXNWr5WRO2weL5h47uTE2IEnFMiIWtuZO3va0TywayS3JEmYn5ogIJ/FTiHsjvPqYWYSesnwft/IHnT++JRCWlv6mVzjLGNSmdt0zbLUdls1apygVq+bGr/JpaJ0FT6bq3p3zipSkTJYQqFSpYMuWb+NS1DB/I7hlwDGee/Lio/MT74pJChUyqlIq1fCkejyOXvxluwuXA4dS5pnb/yqZGe5UUh7xx32r5xE1NTWBc09KG51XXMrCh9sFP1oHvWkBowXlhEVrQIYQWdAihBR1CaEGHEFrQIYSW/wcAAP//R611JgAAAAZJREFUAwBHc2lhaJxcwwAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-11T13:37:53.782233Z", + "start_time": "2026-08-11T13:37:53.754893Z" + } + }, + "cell_type": "code", + "source": [ + "config={\n", + " \"configurable\":{\n", + " \"thread_id\":\"123456\"\n", + " }\n", + "}\n", + "\n", + "res1=graph.invoke({},config=config)\n", + "print(res1)" + ], + "id": "1fce13f46b8328f", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-11T13:38:57.227794Z", + "start_time": "2026-08-11T13:38:57.155139Z" + } + }, + "cell_type": "code", + "source": "rp(list(graph.get_state_history(config=config)))", + "id": "ca78a2f4c26a1975", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m[\u001B[0m\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_a'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f19589d-ab61-69f2-8000-67dbde7e71ee'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m0\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-11T13:37:53.762143+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f19589d-ab5f-6616-bfff-a0da9c108bf9'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'05629eea-6f54-a3b6-8990-4a3c8dad1296'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_a'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_a'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[3;35mNone\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__start__'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f19589d-ab5f-6616-bfff-a0da9c108bf9'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'input'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m-1\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-11T13:37:53.761225+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'c3e85fa9-5a80-658e-8d10-b4a6dbabaffd'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'__start__'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'__start__'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" + ], + "text/html": [ + "
[\n",
+       "    StateSnapshot(\n",
+       "        values={},\n",
+       "        next=('node_a',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f19589d-ab61-69f2-8000-67dbde7e71ee'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'loop', 'step': 0, 'parents': {}},\n",
+       "        created_at='2026-08-11T13:37:53.762143+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f19589d-ab5f-6616-bfff-a0da9c108bf9'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='05629eea-6f54-a3b6-8990-4a3c8dad1296',\n",
+       "                name='node_a',\n",
+       "                path=('__pregel_pull', 'node_a'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result=None\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={},\n",
+       "        next=('__start__',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f19589d-ab5f-6616-bfff-a0da9c108bf9'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'input', 'step': -1, 'parents': {}},\n",
+       "        created_at='2026-08-11T13:37:53.761225+00:00',\n",
+       "        parent_config=None,\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='c3e85fa9-5a80-658e-8d10-b4a6dbabaffd',\n",
+       "                name='__start__',\n",
+       "                path=('__pregel_pull', '__start__'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    )\n",
+       "]\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 6 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-11T13:39:50.473448Z", + "start_time": "2026-08-11T13:39:50.452125Z" + } + }, + "cell_type": "code", + "source": [ + "res2=graph.invoke(None,config=config)\n", + "print(res2)" + ], + "id": "9c559c2304dd84c9", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "node_a 开始\n", + "{'res': 'node a运行结束'}\n" + ] + } + ], + "execution_count": 7 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-11T13:40:02.988125Z", + "start_time": "2026-08-11T13:40:02.964223Z" + } + }, + "cell_type": "code", + "source": [ + "res3=graph.invoke(None,config=config)\n", + "print(res3)" + ], + "id": "f55ecf68ecf7cc5", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "node_b 开始\n", + "{'res': 'node b运行结束'}\n" + ] + } + ], + "execution_count": 8 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-11T13:40:11.848406Z", + "start_time": "2026-08-11T13:40:11.818220Z" + } + }, + "cell_type": "code", + "source": [ + "res3=graph.invoke(None,config=config)\n", + "print(res3)" + ], + "id": "df6d5b70adf40632", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "node_c 开始\n", + "{'res': 'node c运行结束'}\n" + ] + } + ], + "execution_count": 9 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-11T13:40:25.449655Z", + "start_time": "2026-08-11T13:40:25.428945Z" + } + }, + "cell_type": "code", + "source": [ + "res4=graph.invoke(None,config=config)\n", + "print(res4)" + ], + "id": "c00d45e5f62ccf45", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'res': 'node c运行结束'}\n" + ] + } + ], + "execution_count": 11 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-11T13:40:39.970941Z", + "start_time": "2026-08-11T13:40:39.941565Z" + } + }, + "cell_type": "code", + "source": "rp(list(graph.get_state_history(config=config)))", + "id": "a43ecef7aabeb280", + "outputs": [ + { + "data": { + "text/plain": [ + "\u001B[1m[\u001B[0m\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'res'\u001B[0m: \u001B[32m'node c运行结束'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f1958a2-d00a-6060-8003-2deaf576350d'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m3\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-11T13:40:11.823714+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f1958a2-7b97-6d8e-8002-246a78f29696'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'res'\u001B[0m: \u001B[32m'node b运行结束'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_c'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f1958a2-7b97-6d8e-8002-246a78f29696'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m2\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-11T13:40:02.968906+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f1958a2-0443-6724-8001-9e535ac3c137'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'223039b4-0f0a-8424-45bd-a122bd68d9f8'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_c'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_c'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'res'\u001B[0m: \u001B[32m'node c运行结束'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'res'\u001B[0m: \u001B[32m'node a运行结束'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_b'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f1958a2-0443-6724-8001-9e535ac3c137'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m1\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-11T13:39:50.456283+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f19589d-ab61-69f2-8000-67dbde7e71ee'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'a8933cc9-c374-1e96-6aee-ea35763af4c2'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_b'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_b'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'res'\u001B[0m: \u001B[32m'node b运行结束'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'node_a'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f19589d-ab61-69f2-8000-67dbde7e71ee'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'loop'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m0\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-11T13:37:53.762143+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f19589d-ab5f-6616-bfff-a0da9c108bf9'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'05629eea-6f54-a3b6-8990-4a3c8dad1296'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'node_a'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'node_a'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'res'\u001B[0m: \u001B[32m'node a运行结束'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mStateSnapshot\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mvalues\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mnext\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__start__'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[33mconfig\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'configurable'\u001B[0m: \u001B[1m{\u001B[0m\n", + " \u001B[32m'thread_id'\u001B[0m: \u001B[32m'123456'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m''\u001B[0m,\n", + " \u001B[32m'checkpoint_id'\u001B[0m: \u001B[32m'1f19589d-ab5f-6616-bfff-a0da9c108bf9'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mmetadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'source'\u001B[0m: \u001B[32m'input'\u001B[0m, \u001B[32m'step'\u001B[0m: \u001B[1;36m-1\u001B[0m, \u001B[32m'parents'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mcreated_at\u001B[0m=\u001B[32m'2026-08-11T13:37:53.761225+00:00'\u001B[0m,\n", + " \u001B[33mparent_config\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mtasks\u001B[0m=\u001B[1m(\u001B[0m\n", + " \u001B[1;35mPregelTask\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mid\u001B[0m=\u001B[32m'c3e85fa9-5a80-658e-8d10-b4a6dbabaffd'\u001B[0m,\n", + " \u001B[33mname\u001B[0m=\u001B[32m'__start__'\u001B[0m,\n", + " \u001B[33mpath\u001B[0m=\u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'__start__'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33merror\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[33mstate\u001B[0m=\u001B[3;35mNone\u001B[0m,\n", + " \u001B[33mresult\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[33minterrupts\u001B[0m=\u001B[1m(\u001B[0m\u001B[1m)\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m]\u001B[0m\n" + ], + "text/html": [ + "
[\n",
+       "    StateSnapshot(\n",
+       "        values={'res': 'node c运行结束'},\n",
+       "        next=(),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f1958a2-d00a-6060-8003-2deaf576350d'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'loop', 'step': 3, 'parents': {}},\n",
+       "        created_at='2026-08-11T13:40:11.823714+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f1958a2-7b97-6d8e-8002-246a78f29696'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'res': 'node b运行结束'},\n",
+       "        next=('node_c',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f1958a2-7b97-6d8e-8002-246a78f29696'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'loop', 'step': 2, 'parents': {}},\n",
+       "        created_at='2026-08-11T13:40:02.968906+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f1958a2-0443-6724-8001-9e535ac3c137'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='223039b4-0f0a-8424-45bd-a122bd68d9f8',\n",
+       "                name='node_c',\n",
+       "                path=('__pregel_pull', 'node_c'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'res': 'node c运行结束'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={'res': 'node a运行结束'},\n",
+       "        next=('node_b',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f1958a2-0443-6724-8001-9e535ac3c137'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'loop', 'step': 1, 'parents': {}},\n",
+       "        created_at='2026-08-11T13:39:50.456283+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f19589d-ab61-69f2-8000-67dbde7e71ee'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='a8933cc9-c374-1e96-6aee-ea35763af4c2',\n",
+       "                name='node_b',\n",
+       "                path=('__pregel_pull', 'node_b'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'res': 'node b运行结束'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={},\n",
+       "        next=('node_a',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f19589d-ab61-69f2-8000-67dbde7e71ee'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'loop', 'step': 0, 'parents': {}},\n",
+       "        created_at='2026-08-11T13:37:53.762143+00:00',\n",
+       "        parent_config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f19589d-ab5f-6616-bfff-a0da9c108bf9'\n",
+       "            }\n",
+       "        },\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='05629eea-6f54-a3b6-8990-4a3c8dad1296',\n",
+       "                name='node_a',\n",
+       "                path=('__pregel_pull', 'node_a'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={'res': 'node a运行结束'}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    ),\n",
+       "    StateSnapshot(\n",
+       "        values={},\n",
+       "        next=('__start__',),\n",
+       "        config={\n",
+       "            'configurable': {\n",
+       "                'thread_id': '123456',\n",
+       "                'checkpoint_ns': '',\n",
+       "                'checkpoint_id': '1f19589d-ab5f-6616-bfff-a0da9c108bf9'\n",
+       "            }\n",
+       "        },\n",
+       "        metadata={'source': 'input', 'step': -1, 'parents': {}},\n",
+       "        created_at='2026-08-11T13:37:53.761225+00:00',\n",
+       "        parent_config=None,\n",
+       "        tasks=(\n",
+       "            PregelTask(\n",
+       "                id='c3e85fa9-5a80-658e-8d10-b4a6dbabaffd',\n",
+       "                name='__start__',\n",
+       "                path=('__pregel_pull', '__start__'),\n",
+       "                error=None,\n",
+       "                interrupts=(),\n",
+       "                state=None,\n",
+       "                result={}\n",
+       "            ),\n",
+       "        ),\n",
+       "        interrupts=()\n",
+       "    )\n",
+       "]\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 12 + } + ], + "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 +} diff --git a/chapter04/05_tool_node.ipynb b/chapter04/05_tool_node.ipynb new file mode 100644 index 0000000..127e469 --- /dev/null +++ b/chapter04/05_tool_node.ipynb @@ -0,0 +1,244 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-13T09:13:07.272315Z", + "start_time": "2026-08-13T09:13:07.236883Z" + } + }, + "source": [ + "from typing import Literal\n", + "\n", + "from dotenv import load_dotenv\n", + "from langchain.chat_models import init_chat_model\n", + "import os\n", + "\n", + "from langchain_core.messages import ToolMessage\n", + "from langgraph.graph import MessagesState, StateGraph, START, END\n", + "\n", + "from loguru import logger\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")\n", + "\n", + "from langchain.tools import tool\n", + "\n", + "\n", + "@tool(parse_docstring=True)\n", + "def get_weather(city: str) -> str:\n", + " \"\"\"\n", + " 查询指定城市天气\n", + "\n", + " Args:\n", + " city: 城市名称\n", + " \"\"\"\n", + " return f\"{city}今天天气不错\"\n", + "\n", + "\n", + "@tool(parse_docstring=True)\n", + "def get_new(home_or_abroad: bool) -> str:\n", + " \"\"\"\n", + " 查询国内外新闻\n", + "\n", + " Args:\n", + " home_or_abroad: True,查询国内新闻。False,查询国外新闻\n", + " \"\"\"\n", + " if home_or_abroad:\n", + " return \"Kimi 3 发布\"\n", + " return \"Anthropic破产\"\n", + "\n", + "\n", + "llm_with_tools = llm.bind_tools(tools=[get_weather, get_new])\n", + "\n", + "tools_by_name = {\n", + " \"get_new\": get_new,\n", + " \"get_weather\": get_weather\n", + "}" + ], + "outputs": [], + "execution_count": 21 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-13T09:13:07.285909Z", + "start_time": "2026-08-13T09:13:07.279693Z" + } + }, + "cell_type": "code", + "source": [ + "def llm_node(state: MessagesState) -> MessagesState:\n", + " response = llm_with_tools.invoke(state[\"messages\"])\n", + " return {\n", + " \"messages\": [response]\n", + " }\n", + "\n", + "\n", + "def tool_node(state: MessagesState) -> MessagesState:\n", + " last_msg = state[\"messages\"][-1]\n", + " if not last_msg.tool_calls:\n", + " return {}\n", + "\n", + " tool_msgs = []\n", + " for tool_call in last_msg.tool_calls:\n", + " tool = tools_by_name[tool_call[\"name\"]]\n", + " logger.info(f\"工具{tool_call[\"name\"]}被调用,对应的tool_call:{tool_call}\")\n", + " tool_res = tool.invoke(tool_call[\"args\"])\n", + " tool_msg = ToolMessage(\n", + " name=tool_call[\"name\"],\n", + " content=tool_res,\n", + " tool_call_id=tool_call[\"id\"]\n", + " )\n", + " tool_msgs.append(tool_msg)\n", + " return {\n", + " \"messages\": tool_msgs\n", + " }\n", + "\n", + "\n", + "def router(state: MessagesState) -> Literal[\"tool_node\", END]:\n", + " if state[\"messages\"][-1].tool_calls:\n", + " return \"tool_node\"\n", + " return END" + ], + "id": "e051edcefb42aafc", + "outputs": [], + "execution_count": 22 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-13T09:13:07.301903Z", + "start_time": "2026-08-13T09:13:07.290355Z" + } + }, + "cell_type": "code", + "source": [ + "builder = StateGraph(state_schema=MessagesState)\n", + "builder.add_node(\"llm_node\", llm_node)\n", + "builder.add_node(\"tool_node\", tool_node)\n", + "builder.add_edge(START, \"llm_node\")\n", + "builder.add_conditional_edges(\"llm_node\", router, path_map=[\"tool_node\", END])\n", + "builder.add_edge(\"tool_node\", \"llm_node\")\n", + "graph = builder.compile()" + ], + "id": "1695e819ed39edbf", + "outputs": [], + "execution_count": 23 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-13T09:13:07.684483Z", + "start_time": "2026-08-13T09:13:07.303149Z" + } + }, + "cell_type": "code", + "source": [ + "from IPython.display import display\n", + "display(graph)" + ], + "id": "4ae360e2c27a3e2e", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 24 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-13T09:13:12.940772Z", + "start_time": "2026-08-13T09:13:07.686510Z" + } + }, + "cell_type": "code", + "source": [ + "from langchain_core.messages import HumanMessage\n", + "from rich import print as rp\n", + "res = graph.invoke({\"messages\": [HumanMessage(\"今天北京天气如何?国内有哪些新闻\")]})\n", + "for msg in res['messages']:\n", + " msg.pretty_print()" + ], + "id": "dda5c6bba6414183", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001B[32m2026-08-13 17:13:11.686\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mtool_node\u001B[0m:\u001B[36m16\u001B[0m - \u001B[1m工具get_weather被调用,对应的tool_call:{'name': 'get_weather', 'args': {'city': '北京'}, 'id': 'call_01c0669d3c4f455c83d7ae26', 'type': 'tool_call'}\u001B[0m\n", + "\u001B[32m2026-08-13 17:13:11.688\u001B[0m | \u001B[1mINFO \u001B[0m | \u001B[36m__main__\u001B[0m:\u001B[36mtool_node\u001B[0m:\u001B[36m16\u001B[0m - \u001B[1m工具get_new被调用,对应的tool_call:{'name': 'get_new', 'args': {'home_or_abroad': True}, 'id': 'call_03a2fd499a4d4065ae65fc4f', 'type': 'tool_call'}\u001B[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================\u001B[1m Human Message \u001B[0m=================================\n", + "\n", + "今天北京天气如何?国内有哪些新闻\n", + "==================================\u001B[1m Ai Message \u001B[0m==================================\n", + "Tool Calls:\n", + " get_weather (call_01c0669d3c4f455c83d7ae26)\n", + " Call ID: call_01c0669d3c4f455c83d7ae26\n", + " Args:\n", + " city: 北京\n", + " get_new (call_03a2fd499a4d4065ae65fc4f)\n", + " Call ID: call_03a2fd499a4d4065ae65fc4f\n", + " Args:\n", + " home_or_abroad: True\n", + "=================================\u001B[1m Tool Message \u001B[0m=================================\n", + "Name: get_weather\n", + "\n", + "北京今天天气不错\n", + "=================================\u001B[1m Tool Message \u001B[0m=================================\n", + "Name: get_new\n", + "\n", + "Kimi 3 发布\n", + "==================================\u001B[1m Ai Message \u001B[0m==================================\n", + "\n", + "北京今天的天气不错~另外从国内新闻查询结果来看,有“Kimi 3 发布”这一新闻动态~\n" + ] + } + ], + "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 +} diff --git a/chapter04/06_tool_node_2.ipynb b/chapter04/06_tool_node_2.ipynb new file mode 100644 index 0000000..261938a --- /dev/null +++ b/chapter04/06_tool_node_2.ipynb @@ -0,0 +1,240 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-13T09:21:13.074558Z", + "start_time": "2026-08-13T09:21:12.287225Z" + } + }, + "source": [ + "from typing import Literal\n", + "\n", + "from dotenv import load_dotenv\n", + "from langchain.chat_models import init_chat_model\n", + "import os\n", + "\n", + "from langchain_core.messages import ToolMessage\n", + "from langgraph.graph import MessagesState, StateGraph, START, END\n", + "\n", + "from loguru import logger\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")\n", + "\n", + "from langchain.tools import tool\n", + "\n", + "\n", + "@tool(parse_docstring=True)\n", + "def get_weather(city: str) -> str:\n", + " \"\"\"\n", + " 查询指定城市天气\n", + "\n", + " Args:\n", + " city: 城市名称\n", + " \"\"\"\n", + " return f\"{city}今天天气不错\"\n", + "\n", + "\n", + "@tool(parse_docstring=True)\n", + "def get_new(home_or_abroad: bool) -> str:\n", + " \"\"\"\n", + " 查询国内外新闻\n", + "\n", + " Args:\n", + " home_or_abroad: True,查询国内新闻。False,查询国外新闻\n", + " \"\"\"\n", + " if home_or_abroad:\n", + " return \"Kimi 3 发布\"\n", + " return \"Anthropic破产\"\n", + "\n", + "\n", + "llm_with_tools = llm.bind_tools(tools=[get_weather, get_new])\n", + "\n", + "tools_by_name = {\n", + " \"get_new\": get_new,\n", + " \"get_weather\": get_weather\n", + "}" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-13T09:21:13.097176Z", + "start_time": "2026-08-13T09:21:13.079676Z" + } + }, + "cell_type": "code", + "source": [ + "def llm_node(state: MessagesState) -> MessagesState:\n", + " response = llm_with_tools.invoke(state[\"messages\"])\n", + " return {\n", + " \"messages\": [response]\n", + " }\n", + "\n", + "\n", + "# def tool_node(state: MessagesState) -> MessagesState:\n", + "# last_msg = state[\"messages\"][-1]\n", + "# if not last_msg.tool_calls:\n", + "# return {}\n", + "#\n", + "# tool_msgs = []\n", + "# for tool_call in last_msg.tool_calls:\n", + "# tool = tools_by_name[tool_call[\"name\"]]\n", + "# logger.info(f\"工具{tool_call[\"name\"]}被调用,对应的tool_call:{tool_call}\")\n", + "# tool_res = tool.invoke(tool_call[\"args\"])\n", + "# tool_msg = ToolMessage(\n", + "# name=tool_call[\"name\"],\n", + "# content=tool_res,\n", + "# tool_call_id=tool_call[\"id\"]\n", + "# )\n", + "# tool_msgs.append(tool_msg)\n", + "# return {\n", + "# \"messages\": [tool_msgs]\n", + "# }\n", + "\n", + "\n", + "def router(state: MessagesState) -> Literal[\"tool_node\", END]:\n", + " if state[\"messages\"][-1].tool_calls:\n", + " return \"tool_node\"\n", + " return END" + ], + "id": "197859b38e6cdc8f", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-13T09:21:13.105691Z", + "start_time": "2026-08-13T09:21:13.098337Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.prebuilt.tool_node import ToolNode\n", + "\n", + "builder = StateGraph(state_schema=MessagesState)\n", + "builder.add_node(\"llm_node\", llm_node)\n", + "builder.add_node(\"tool_node\", ToolNode(tools=[get_new, get_weather]))\n", + "builder.add_edge(START, \"llm_node\")\n", + "builder.add_conditional_edges(\"llm_node\", router, path_map=[\"tool_node\", END])\n", + "builder.add_edge(\"tool_node\", \"llm_node\")\n", + "graph = builder.compile()" + ], + "id": "d7535e27f7e7d3f", + "outputs": [], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-13T09:21:15.673171Z", + "start_time": "2026-08-13T09:21:13.110948Z" + } + }, + "cell_type": "code", + "source": [ + "from IPython.display import display\n", + "\n", + "display(graph)" + ], + "id": "d8691d77b8857251", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPwAAAD5CAIAAACMBM+DAAAQAElEQVR4nOydB3wUxR7HZ6/nLr2QXgklCRACIVIkERKp0puUB1IEURSkCUpHEEF4PEGqgiYKKEaKGECQJmAIXUggISSkkd4ul3Jt7/3vLlwCXEICucve7nzlc87O7O5dZn/73//8Z3aGo1KpEAbDJFgIg2EYWPQYxoFFj2EcWPQYxoFFj2EcWPQYxsFBmAZTlk/euliU/1gmq1QqlUhRRT5VDAYEMgiEngSBVQQitGldJkuFSEJ3BMFCKqUKEUTNJqk+j4qEnZ62R3AiFVH9FbUPJ59JqFS1zg/whCw2m+AL2Y4e/E69bHlmCEPgOP0LKStUHtuTVZgtA+GyOYSZOZvDZ0FCXql8aj8WgUiNgp9UaY0Wn+SxWARJ1lQ4AZsgUpVO9ISKVGkyVcQzl0VzcoINNwmqfbhKczbdFz1zVwA8M45SQcqkKmmFUiEnOTx2Czf+8FkuiMFg0b+APStSy0sV5tYc/xCr1/rbIhPn4pHipBul5WK5rQN//KceiJFg0ddJzJ6ch3fKnDzNRs1xQ/RCKUP7v0oXF8o6vmHbfZDJ38mNBYtePz+sTpNVKd9d44PoS26G/NA3GTYOvDHz6HZX1w8WvR5+3ZwFTc+Rs10RA4hcle7iaxYxzgExBiz6Z/l2SaqVPX/UHAY19X74PA3a5RMWMcXFx3H6p/jpiwxLOx6jFA9MWuKplKuO7spGzACLvoZLRwolYvnojxnh1TzDpKWemQ8qMhMrEQPAoq/h1oWSfv9hbgC7fXerY3seIwaARV8NNF6FFhxPfwFiKj2H2UPf2bmD+YjuYNFXk5dZ9cYwBkUw9NI22DLxehmiO1j0av4+XMjhsbwDhciILFq06MiRI6jxvPnmm1lZWcgAhI6wVypVGYlSRGuw6NWk/Cuxc+Yh45KQkIAaT3Z2dnFxMTIY5tacuJMFiNbgOL2aHQtTug+y79DTEhmAR48e7dix4/r161DVHTp0mDhxYseOHYODg7Wl5ubm586dk0gkP/744z///PPw4UN7e/uwsLCZM2cKBOoGxsKFC9lstrOzc2Rk5IwZM3bu3Kk9EPbZuHEjamr+/LEgM0kyZZUXoi94aLF6WCI80w2keJlMNn369C5dumzZsgW0u3v37o8//vj48eOXLl3q0aPH0qVLhwwZArsdOHDg+++///zzz62trcvKyjZs2AA7f/TRR1DE5XKTkpLKy8s3bdrUvn17Pz+/OXPmgF/k6mqQ0GrL9qKH/5YiWoNFj1LuVrLYyECkpaUVFRWNHTu2bdu2sLlu3bobN24oFAqQcu3dJkyYEB4e7u3trd28ffv25cuXtaInCOLx48dRUVFaw29oWrYzqz34mZZg0SNJqRQRyEB4eHjY2NisWLFiwIABnTt3DgwM1Do2UulTjUW4B8C3Wb58ORh1uCUgx9a2ZvAj3AzGUbwaNri8hKQImdN38CVuyCJSoW7ZIMPA5/PBpXn99df37ds3derUoUOHxsTEPL8bOD+7du0aNmzY4cOHr127Nnny5GdOgoyIikAqpET0BYseiax4KsOZeoS8vLzACz927Bg45b6+vsuWLbt//37tHaCBGx0dPWbMGBC9k5MT5IBbj5oRUmVhYzCHjwJg0SNPP6HhIlgQujl69CgkwD8JDQ398ssvORzOvXv3au8jl8srKytbtGih3YS274ULF1AzkX5PCq0IQxqB5geLHmnflU68Wo4MQGlp6apVqzZv3pyRkQGN2r1794LLDp49eCyg8tjYWHBmWCwWPA3g3sjMzCwpKYH9IaYpFoshYvP8CWFP+Dx16tTdu3eRAUi+JWZzaS15LHotPAErIa4EGQDQ96effgoxSnBdRowYcfPmTYjZ+/ioX8iaMmXK1atX582bB2Z+7dq18CgYOXIkOP0hISGzZs2CzYiICIjbPHNCNze3QYMGwUmgGYAMQGZKpaU1F9Ea3Dml5mRkbmpC+Xvr6PxyYAPZOjc5bLhD+9etEH3Bll5N34mOCilZkq9AzOb66RLosqC34hGO0+uwceT98d3j8XW/MgeOBzjcz+crlUpwyglCvx8MIUjoZEUG4NatWxAU0ltU/086e/ZsXUU3zxV7tBEhuoPdmxrgyT59bUueQL8gcnJySJJEjcTFxYBvpTzv8TeEun5S/OWyc9G5H2z0RXQHW/oaPNoIf1j96N013npLtRF0StG0d9Tfh/I6h9sjBoB9+hoGz3Bhc1knvs9BzOPnjZlWDryuAwziiVENLPqnmLLCM+1++dWTBglfUpZjO3MkJYqxC90RM8A+vR52LU7xDbLqPdoOMYBf/5slk5HjPmGK4hEWfV3sXJxiYc2lvRR+WJ1GKlSTV3ohJoFFXydRX6inOO3Qw7rnMBo27/6MzEu6LXbxMRv+AePm+cGir4/bf4svH1VPieHkJXhzvLO5tck3gQoyZOcP5eekVQqE7AGTXZ19jP1mMBXAon8xcSeLb10ollaQPAHLTMQ2t+LwRWwul5BW1Qw653AJhfzJWgxqVDUxfZZmIRJSvSKDds0GsnolBXUa/q/eJLQF6uUVEKpO1PpUdyaR6vUa1DtqE092IzTLMaiqf4Dmq9X5bEK9xglCXAGblKOKMkVZsbyyXEkqVRY23JB+9n5d6N8JVRdY9I0g7kRJZnJFeakC5A7VppDVVB2bp570vRrNyFxdvbLUdaxeWESjYJVGldrd1MvzIK3WNUeRSlI9qpfFUukWNNGu26M74ZMEoTmf5jykNgTHZhNKpeb1D835Cc2XQj6PryLYbC6PZWHF8fIXdexF8yEGDQGLnkJ88cUXbdq0GT58OMIYEtwjSyEUCgWHg6+IwcFVTCGw6I0DrmIKgUVvHHAVUwi5XI5FbwRwFVMIbOmNA65iCoFFbxxwFVMILHrjgKuYQoBP/8wclxhDgEVPIbClNw64iikEFr1xwFVMIbDojQOuYgqBRW8ccBVTCNyQNQ5Y9BQCW3rjgKuYQmDRGwdcxRQCi9444CqmEM8vwIYxBFj0FAJbeuOAq5hCYNEbB1zFFEKpVLLZdF7hjCJg0VMFMPNY8cYBi54q4J4po4FFTxWwQ280cC1TBZIk3d0ZNHVwM4JFTxVUKtXLLaeDaSx4UQYM48CixzAOLHoM48CixzAOLHoM48CixzAOLHoM48CixzAOLHoM48CixzAOLHoM48CixzAOLHoM48CixzAOLHoM48CLJzczU6dOzcnJ4XA4JElCwtnZmSAIuVweExODMIYBW/pmZty4cWKxOCsrKzs7W/seCaRZLHxdDAiu3GYmPDy8VatWz2QGBgYijMHAom9+xo8fLxKJdJtOTk5g/hHGYGDRNz9g7L29vXWbQUFBAQEBCGMwsOgpwcSJE7XG3tHRcezYsQhjSLDoKUHv3r21xr5Tp07+/v4IY0jwFCDVyKWqgsfScrECNRNDImaQZYciuk1Ivi1BzQGLRZhbcWydeRwugWgNjtOrOfdrPkjNpgWPb8bc2SS5fFZxnlQpV7XqZB7SxxbRFyx69PvubCcvYdsQK4TRcP1UIZuj6jnUHtEUpov++A85zt6iloEWCFOLm2cKOTzUfaAdoiOMbsjmpFaRJIEV/zxBve0eP6wqFysRHWG06AuypVwezRttLw3BQsW5MkRHGC368jKltQMfYfRh68gvK5YjOsLokCWpgBYNiTD6kMlIkqZ1gzunMIwDix7DOLDoMYwDix7DOLDoMYwDix7DOLDoMYwDix7DOLDoMYwDix7DOLDoMYwDi75xDB0eERn1LSSifzsQ0ec1RCU2/2/d5KmjEeZFYNFjGAcWPYZx4NkQmgDwed6ZNCMzMz36t/3W1jbduvac9cH8teuWXrp03t3dc8K4KX36DKz/DCtXLSIIIiK8/7r1KyorK/z92783fbafXzttKZznh8hdaempVlbWvr5tZn/4iaOjE+RXVFSs+WLJzZtXvb19hwwaWfuECoXiuz3bYq9czMvLadeu47Aho7t2fR1hNGBL3wRwudwDP//g4eF18vjlaVM/OH7i6Mdzp4f37nfqZGyvN97csHF1maSs/jNwOJz4hH9PnY7ZsT3q+B8X+Tz+F18u1xZdu35l2YoFcNv8ciBm+dJ1ubnZm79epy36auNquNO+2rB99cqvUh89BInrTvj1lvW/Ru8bNnTMvp9+DwsNX75y4fkLfyGMBiz6pqGVb9vBg0bweLw3wt6EzYCADiB3kHKvN/qA0U1PS33hGSorKhbMX+bi7ApHwQ2TkZEGhhzy9+zdHtqz98gR48DMw2nfnzk3Nvbi/cSEgoL8s+dOjX17kr9fO1tbuxnTP+LzBdpTSaXSk38eGzf2HfhJVpZWA/oPgRNGRu1GGA1Y9E0DmHltQjs7n5dXS+2mmZkQPsvKxC88g7uHl1Ao1KbNzS10R6WkPGjbtmZqyzat1fOf3b8fn52dBQlPT5+aojbVU6MlJd2TyWRdgrvpijoGdk5JSRY34GcwAezTNw3gkdfefIkJ5vUeIpFIwGzrTDigvTEqKspLxSXqTTOhrshMYPbkKLU39eHsqc+crbio0NLCEjEeLHpKIxCo5V5VVanLKa8oh087W3srS2t1kbRKV1ShKVKX2jvA57y5n7m6utc+m4ODI8Jg0VMc8O/btPaLj/9Xl6NN+7RsZW1lA4m7d2/DDpCQy+XQ5IXYEaTdXD34fPUsD0Edg7VHFRcXqVQqnfvEcLBPT3UgAnPx0rno6P3gkd+8dW3b9k2dgrq08m3j4NCiXbvA77/fAU1ecIE+X/OZzsUCcUMIFVqud+7cAuce4jbzF74P/bUIowFbeqoDwcr8gryfD0Zt3bYRwvPBnbu+O22WtmjxolWbN38x/b3xYOb79R0EURq4PbRFb4+Z2LJl630Hvr9xI04kMg/w7zBv3hKE0cDouSz/+aNQpWK172mDMM9x+VieW0tBQFcaNnyxe4NhHNi9MRKLP5tz984tvUUDBgyd+d4chDEWWPRGYv7cJTK5/vlQa8faMUYAi95I2NnRdo0DkwP79BjGgUWPYRxY9BjGgUWPYRxY9BjGgUWPYRxY9BjGgUWPYRxY9BjGwegeWb6QrZDjdWT1wxeweQJ62kRGW3pre25uWgXC6CMrudzWkYfoCKNF795aWFVOz5XgXxGoFqEF284Zi552cPlEcITN6Z8eI8zT/LXvcegwB0RTGP3mlJbMB5Wn9+e272Fr48jji9iIqbBYhKRYXlYsj43JH7fQw9qBi2gKFr0acZHi1vmSgixpaaG0tLTUzs4WGR24EBKJxMLCAhmFgoJCFkGwWCw2Rw2bzeILWSJzgZOXIKSvLZtD5/Y9Fn01UA8EQWzZsuWtt97y9vZGRqekpGTkyJGnT59GRmH06NFJSUmEBi6Xa21tLRAI+Hy+i4vL5s2bEa3BolcTHR2dmpo6f/581HzI5fLz589HREQgo3DixIn169eLxU9N9EeS5I0bNxDdYXrnlFQqLSgoAJvXvIpHEpivaQAAEABJREFUmqmPjaZ4oF+/fp6enqByXQ5DFI8YLvoNGzbk5+dbWVktXrwYNTcVFRXr1hl1Pqbp06fb2dnpNs3MzBAzYK7ot27dCqbOzc0NTCyiADKZzGgOvZZu3bq1a9dO699CW3bWrFlDhgxJTk5GdIdxPn1WVtaBAwfmzZunVCrZbAoFKI3s02tJSEhYsGBBTk7O9evXkaZyoGb69OkzZcoURF8YZ+nBdx80aBAkKKV4ZHSfXou/vz/Ye52T4+rqChYB2jmTJk0qLCxENIUplv7s2bOg8tDQUERVwKf/+uuvFy1ahChAfHw8mHxw+ocPH45oByMsfVxcXExMTPfu3RGFMb5PXw8BAQEQ00xMTJw9ezb4gYhesFesWIHoS1RUVGBgILTShg0b9hKrgxgTeBC5u7v7+PggytCzZ09LS8sxY8bAr2qWDjsDQWf3Zs6cOcHBwRMmTECYV2PhwoUQ0Fy5ciWiBTR0b8rKyrR+wtKlS01I8caP0zcc6LsNCQnp1asXPXqv6CZ66F4dPHiw1kmo3fNCfSjl0z/PwIEDjx49umPHDhqMzKGP6G/evCkWixUKBQRqKOUZNxCRSESR0E1dWFhY7Nq1y97eHhpIqakvXhmXstDEpz9y5MixY8d27txJ8dYqPcjIyJg7dy7Y/nfeeQeZICYvkdjYWKReQ9hz9+7dJq14Kvv0zwBRpoMHD0okEui4LS4uRqaGCauEJElop+bl5UG6Y8eOyMShuE//PLNmzYL42OjRo+Exi0wKU3Vv0tPTHR0dHz161KZNG0QLmmXsTZOwevVqsPebNm1CJoLpWfqHDx927doVwsZ8Pp82ikfNNPamSYDQ8NChQ7t06QI3LTIFTEn0WVlZ8JmdnX3p0iUHB7q9q29CPv3zhIaGXr16FWKaYPUR5TEZ0e/du3fjxo2QeP3116k2QLJJMDmf/nngAgUGBsLz6vbt24jCmIBPDwbe1dX10KFDEB5G9MV0ffpnKC0thYAmhBY+/PBDREkobemlUimECLReDb0Vj0zZp38GKyur7777Dj5HjhyZlpaGqAelLX1cXBzEJaHZihgA+PQQAFmyZAmiCxBbmzdv3qhRo95++21EJShq6X/++WdoGIWEhDBE8Uhj6SHwV15ejuiCl5dXdHQ0WK4rV64gKkFR0YORMOnRHS8BiB4agoWFhbm5uYhGlJSUUG2eBYqKfvz48WFhYYh5eHh4gMP5ySefILqQkJDg7++PqARFRe/m5gYdroiRODk59enT5/LlyzQYC5icnAxODodDrbU/KLoSyeHDhwUCQb9+/RAjCQ8Pr6ysBD8HIledO3dGJgsFzTyirKXPycnJzMxEDAb8YDD5u3btun//PjJZ4Me3bdsWUQyKWvohQ4bgmWWBnTt33rx5E5ksYOkHDBiAKAZFLb2zs7OLiwvCIBQUFASfY8aMqT3ZqqkAlt7Pzw9RDIqK/vjx4yY3StugrF279ptvvkEmRVJSko+PDwUHSlFU9Pn5+enp6QjzhJYtW2qHsvzxxx/IRKCmmUeUFX3fvn1pP9jm5QBbYCrPQHDosegbAQTpIVSPMM8xc+ZMaPAgUwBb+sZx/vz5/fv3I4w+QkJC4HPKlCnUHMOoA1v6xlFYWMi0sTeNZc+ePXv37kVUJTExsVWrVtScn4Kiog8LCxs/fjzC1It28t3ff/8dUY979+5R08wjyorezs7O09MTYRqAra3tggULEMUA0VNwAIIWioo+Li4OHt8I0wB69OgxefJkSBQVFSHKAKKn4AAELRQVfWlp6YMHDxCmYWhtKoTwoVOvdn4zhn2xpW80Xbp0mTZtGsI0hv/85z+XL1+unQPBgA8++AAZHQhWUnlKIoqK3traGvogEaaRaKedOXPmDHx2796dw+EkJyffvXsXGRdqjijWQVHRw3XaunUrwrwUAQEBnTt3lslkSDOgIzIyEhkXao4o1kFR0UskEpMeR968gJ9DEIQ2DZFysCBG7sbClv5lAFv10UcfIUzjGTx48DNhnNzc3IMHDyIjAj1T2NI3GgsLi9atWyNM41GpVBC5B0uvWwoT0ufOnTPaRPKUHX2gg6JvTj18+PC3336jYJ8LpaiQKOVVz75Z8uPe327cuJGenh4fH5+Tk6NQKMrKysRF4v2RR4zTyX33Zop/q+DSAjkyOgIhmy98sR2n1gxnEKYEb54kSfiEZ7STkxOYq6qqqlOnTiFMLa4cL4qPLRVacmSVL3idSkXCfwBptCkJSFIFDQpdo8KYqDR/b4ee1p16WdezG7UsPTwWf/rpJ90oJe274fb29ghTiz/25Ni5mA1810NoQcPZm18RSYkiMa70zC/5vUfXOZk7tXz6CRMmuLu7184Bq9+tWzeEecKxb7OdvYUB3ayw4vVibs3p3MeOL+T8dSCvrn2oJXpHR8f+/fvXznFwcBg7dizCaEj5t9zchteqkyXC1EuHnjbQjH+cUqW3lHLRG5B47XemAgMDcRhHR25GFY+P1wxtEGw2kZ9pIqK3srIaOHCg9hV6Ozs76GdBmCdUVZA2znyEaQB2roJysVJvERXNxrhx47SePfTqtW/fHmGeUClRkArTm/2mWVDIyLpCW68UvamsQNdOFmanVpWLZdIqFYsgtOEqiIKqPzRRK3VAVBMUhQ+Wtoh4kgmBLUiQSEWgJxlIe/gbXmuUbkouh7djUSp6ElQldIc/+dTlqw+vFXqF8E/tmZHYHHVAiMMnRBZst9bCrv1tEYbBvKTo/4zKe5QgkUtVLA4LnCcWj8MTEgSImtRKt5YACU1mtVKfFGk0q85haW4O7V2gQrrYLh/+Q/pOpbmfIA/Cseqvq85/aq+aPXVbal+JrZAp87PlOelF1/4sMrPg+L9m2W0gVj8TabToj+/NTY2XEGzC0sHcNcAOmSAKKZkVX3DzXMmtCyVBYdZdB2DpM4vGiX7Xp6ngNri3d7RoQa21JRoFh8/y7NQCEnkPSq//VZx0tWzicvw+LoNoaEM2O0W6dW6ypb2obZiHSSu+Ni1aWQVEeJEEZ9vCFIRhDA0SvbhIGf1Npl+Yp5OfSfoz9ePVxamFt9038x8iDDN4sejT71X+uDatXYQXm0fbbhF7L3PvINdt87DuGcGLdfz7d9mtX6P/tJJCW66dh/XORdjPoT8vEP3uzx5Z2As55owY2+TY2prgsPavz0AYWlOf6M/+UiCTKj0CHRBjaN3DvTBHmpshQxj6Up/oE+JKWnjbIIYhtBIc2c7oNd5oT52iv3S4EKkIBx8rRElu3Tk9f+lrkvKmf+/TJ8RZVkmWFSkRRsPQ4RGRUd8iw3P23Kle4cElJQZ/l7dO0d+7JhbZCBAj4fDZJyNzEC1YuWpRzHG8etdT1Cn6qgqlY2saRuUbgqWDKP9xFaIFiYkJCPM0+ochxMdKWCzCzIKLDMOj9H//PPttRmaCucjGr83rfXpNEwhEkH8p9uCp83tmTtkeeWBxbl6Ks6NvaPexXTq9pT3q2Ikt127H8HnCoA59W9h7IIPh5GtTlCVGpg94C/C54avV23f89/cj5yB96dL5HyJ3paWnWllZ+/q2mf3hJ46OTtqd6yl6IYcO/xL147ebN+1avnLho0cpPj6+o0aO79d3kLY0Pf3R5v+tS3pwj83meHn5vDNpRlDHYG3Rjp3/+/PUH0IzYXh4Pze3pwaDnDj5+9Hfo1NTk729fXv36jNi+Nimetlcv6XPTCpncw31znhBYcbO7z+Uy6Wzpn87adyX2bkPtu+ZqVQqkHoMMLeysuzwH1+NHvrphlWxHdr1/uXw58Ulak/jclz05bhfhw9cMHvGXjsbl1Nnv0MGg8VjESwi6boEmTgnYi7B54L5S7WKv3b9yrIVC/r0GfjLgZjlS9fl5mZv/nqdds96ihoCl8uVSMq+3rJ+wbylZ05fDQuNWL9hVW6u+sIVFxfN+nByixZOu3bu+2bLXhtr29Wff1pRUQFFR47+euTowdkffbJtW6Szs2tk1G7dCU//deLL9Stbt2q778ej06Z+8Gv0vq3bNqImQr/oxYUKwmDdrzdun+Cwue+M/dLRwcuphc+oIZ9lZSfevXdeW6pUyt/sNc3TvT3c1sEdB6pUqqzsJMi/+M8vHQLC4TYQCi3B9vv6BCNDwmazCh43w8wtBmXP3u2hPXuPHDEObHlAQIf3Z86Njb14X+P/1FPUQORy+aSJ0/391Reub5+34MIlJydC/sFff+Lx+fPnLXFxdnVz81gwf1llZQVoHYp+O3QAbo+w0HBLC0t4LHQK6qI7W0zM4Q4dgubMXmRjYwv5kye9d/jwL6XiUtQUsOr4A5TIYPOWgG/j7uYvElXPTGJr42xn65aadku3g4drgDYhNFO/AV1ZVQY1WFCU4djCW7ePm4uBZ41TqSRiKaIXKSkP2rYN0G22aa2ebvL+/fj6ixqO7gwWFuoLB7ZffebU5Fat2upm3RGJRO5unklJ99TmLCsDvB3d4a1bV8+LRpLk3fjbXYJrZsEICuoCmdq76NWpw4chDKd5ELEkIysBAo61M8VlhTVf/tx3V0nLSVLJ5wt1OTyegUd6gjUgm2G6IsMhkUikUimfXxOREwrV9VlRUV5PEWoMen3uosICV9enpnURmJlVVFaUl5crlUozs5prKhBUX1OZTAbPje/2bIN/tQ8UN5Gl1y96LpelIg0VqLawsPP27Ni39/TamSJRfR0CAr6IxWLL5TURFamsAhkSlQoJLSg65+HLIRCoNV1VVanLKddo2s7Wvp4i9MoIRaIq6VOhsMqKCjdXDzD5bDZbWqsI3B7dT4W7rs+bA0NDw2sf6OHuhZoC/dfV2o5flNO4u7zhuDi2un47xscrSDeTWU5eioNdfdEYMCE21s6P0u+E9ajOuZd4CRkSUqly8aLJawNawMFo09ovPv5fXY427dOyVT1F6JUBT+nkn8fAckNjF6kf6WIIEEGLGa6po6Oz+otGVe8Ze+Wi7qiWLVuXScp0QR44PDs7y9a2aWLo+n16z7ZChcJQlh6ikOCfHT3+X5msKi8/7djJrRu3jsvOTa7/qMB2EXcSzkJHLKTP/B2ZlmnA1TVkEiUiVT4dhcjE4fP5Dg4trl2LvXnrmkKhGDZ0zMVL56Kj94PyIGfb9k3QRmzlq14np56iV2TQoBHl5ZKNm9ZAMAeimV+sWybgCwb0HwpFvd5488LfZ6AjFtL7D/yQkHBHd9S7U2ddunQOutVAKnfu3Fq1evHc+e/Bn4CaAv2WvnUX0akDqKJQJrTjoaYGwi/zZ+07+3fU5h2T8vIfebgFjBr62QsbphFhk8vLiw/HbPzxl8/AOxrcf86+g8sMNPts7qMSNl3mVBo/bsre73fEXb28f98xsK/5BXk/H4yC8B/E4IM7d3132iztbvUUvSJuru7Ll62Livr27XFvQWjIz6/d/zZ/C74NFE0YP7WkpHjL1g2g6fbtO0LIaM3aJdprCpu7dvz00769O8hSF7sAAAOXSURBVHd9DX5XgH+Hz1dv0j4rXp06Zy3eu+KRiuD4hDgj5pF4Lt3RUzD0fcr97TF7sz39LTzamiPMi0i8Viopkr0xSs8Y4TrtWccwm8oyusXsGghEbCmoeExTUWeAIqiXVezxgpzEEqc2+qf6ho7Sjd/on+TfjG9eKdXfnenk4DNr+m7UdCxZE15XEfTyQr/38/leHh2m/ee/dR318MpjkaWhxl+YLos/m3P3zi29RQMGDJ353hxkOtQXlevUy/b6meK6RG9pYT/3/Si9RdBC5fH0j9BksZo4DljXb1D/DLmUx9Uz8yOHXV9DpapMOm2NL8I8zfy5S2Ry/e/WCM1MrMVfnwRf62+TEFeaei3bO1jPsx6MqK2NC2pumvY3JF3IcPEV8Rk6pLo+7OzoszTGC2IUk5d7VZXJxLk0GWdbP4/jC9gsNGwm9uZpzosDc+9+7pNxhyZvVNRDzv3i0rzyqWu8EIbuvFj0HB76YH3Lu6dSxTmG7flvRjLvFJbmimeu90EYBtCwLhg2mrXRN/1ubupVGpr8xL8zyoskM9ZhxTOFBvc7EmrdI1KecOZRbrKRluE1NOm38+EJZmnFxopnFI0LIE5e4RUbU3TrfHFRhtjMSuDoa2dmaXpDEUtzyvMflkgr5VwBa/C7bh5+OFjDLBot2a4DbOFf3PHi+DhxylX1/DAEi2BzWARBsFiESrcAiHb9hdpDHAj1kAfiqSVEtOuHELX30R6lW6+kejf0/LILqHqXZ4ZRPLMISfVfyUJK6KtSkQqFUqFisQmRJeeNEc6+QSY/pAzzEryknQ7pbwP/kHqEQ3nybbG4SFFVoSRUtd67IJ6suaPLUKtRvURPjeZZmvQzS42o/3tqaRHNbip9oodvg9vsqWwWhySfG4rH4pJsPosvYFs78P1CrNzb0GrMMKaxvKpz0iZYBP8QBmM60OrlINojsuKAJ4kwDYDLYwlE+icexjVoSgjM2AVZjOgdf3XyM6tEVlj0po+zt0BaiSfZbBAKOenkqb/xhkVvSni0FapI1a1zRQhTL1di8i1tOQ5u+ofTEgZ64w5jOC4cKiBJwtPP3M6FT9BqmpJXBeLRhdnSxGulLdx4wRF1zjKPRW+S3P1HnBBbKpeqJCV0m4btVeCZsSysuYGh1q2C6nujEovehIFLp5Dhy1cDl0egBjz6sOgxjAM3ZDGMA4sewziw6DGMA4sewziw6DGMA4sewzj+DwAA//+i3lQfAAAABklEQVQDAGsoDNKoc/DAAAAAAElFTkSuQmCC" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-13T09:21:26.253094Z", + "start_time": "2026-08-13T09:21:15.695629Z" + } + }, + "cell_type": "code", + "source": [ + "from langchain_core.messages import HumanMessage\n", + "from rich import print as rp\n", + "\n", + "res = graph.invoke({\"messages\": [HumanMessage(\"今天北京天气如何?国内有哪些新闻\")]})\n", + "for msg in res['messages']:\n", + " msg.pretty_print()" + ], + "id": "90799a0baaf94a1a", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================\u001B[1m Human Message \u001B[0m=================================\n", + "\n", + "今天北京天气如何?国内有哪些新闻\n", + "==================================\u001B[1m Ai Message \u001B[0m==================================\n", + "Tool Calls:\n", + " get_weather (call_763ec6c0b813497aba36bbfe)\n", + " Call ID: call_763ec6c0b813497aba36bbfe\n", + " Args:\n", + " city: 北京\n", + " get_new (call_7ed3fab8ae8a45ddac811c62)\n", + " Call ID: call_7ed3fab8ae8a45ddac811c62\n", + " Args:\n", + " home_or_abroad: True\n", + "=================================\u001B[1m Tool Message \u001B[0m=================================\n", + "Name: get_weather\n", + "\n", + "北京今天天气不错\n", + "=================================\u001B[1m Tool Message \u001B[0m=================================\n", + "Name: get_new\n", + "\n", + "Kimi 3 发布\n", + "==================================\u001B[1m Ai Message \u001B[0m==================================\n", + "\n", + "北京今天的天气情况为不错。关于国内的新闻,目前获取到的信息显示有“Kimi 3 发布”这一动态,若需了解更全面的国内新闻详情,可能需要进一步查询补充。\n" + ] + } + ], + "execution_count": 5 + } + ], + "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 +} diff --git a/chapter05/01_output_values_updates.ipynb b/chapter05/01_output_values_updates.ipynb new file mode 100644 index 0000000..538c88b --- /dev/null +++ b/chapter05/01_output_values_updates.ipynb @@ -0,0 +1,233 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-15T15:53:29.792161Z", + "start_time": "2026-08-15T15:53:29.765234Z" + } + }, + "source": [ + "from typing import TypedDict\n", + "from langgraph.graph import StateGraph, START, END\n", + "from rich import print as rp\n", + "\n", + "\n", + "class OverallState(TypedDict):\n", + " initial_state: str\n", + " node_a_output: str\n", + " node_b_output: str\n", + "\n", + "\n", + "def node_a(state: OverallState):\n", + " return {\n", + " \"node_a_output\": \"节点A执行完毕\"\n", + " }\n", + "\n", + "\n", + "def node_b(state: OverallState):\n", + " return {\n", + " \"node_b_output\": \"节点B执行完毕\"\n", + " }" + ], + "outputs": [], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-15T15:53:30.127515Z", + "start_time": "2026-08-15T15:53:29.793490Z" + } + }, + "cell_type": "code", + "source": [ + "builder = StateGraph(state_schema=OverallState)\n", + "builder.add_node(\"node_a\", node_a)\n", + "builder.add_node(\"node_b\", node_b)\n", + "builder.add_edge(START, \"node_a\")\n", + "builder.add_edge(\"node_a\", \"node_b\")\n", + "builder.add_edge(\"node_b\", END)\n", + "\n", + "graph = builder.compile()\n", + "\n", + "from IPython.display import display\n", + "\n", + "display(graph)" + ], + "id": "e08b64a75c2e22d7", + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-15T15:53:30.210535Z", + "start_time": "2026-08-15T15:53:30.128380Z" + } + }, + "cell_type": "code", + "source": [ + "for chunk in graph.stream(\n", + " {\"initial_state\": \"初始化状态,调用的时候传入\"},\n", + " stream_mode=[\"values\",\"updates\"],\n", + "):\n", + " print(\"=\" * 50)\n", + " rp(chunk)" + ], + "id": "b634146ae211a527", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\u001B[32m'values'\u001B[0m, \u001B[1m{\u001B[0m\u001B[32m'initial_state'\u001B[0m: \u001B[32m'初始化状态,调用的时候传入'\u001B[0m\u001B[1m}\u001B[0m\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
('values', {'initial_state': '初始化状态,调用的时候传入'})\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\u001B[32m'updates'\u001B[0m, \u001B[1m{\u001B[0m\u001B[32m'node_a'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'node_a_output'\u001B[0m: \u001B[32m'节点A执行完毕'\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
('updates', {'node_a': {'node_a_output': '节点A执行完毕'}})\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\u001B[32m'values'\u001B[0m, \u001B[1m{\u001B[0m\u001B[32m'initial_state'\u001B[0m: \u001B[32m'初始化状态,调用的时候传入'\u001B[0m, \u001B[32m'node_a_output'\u001B[0m: \u001B[32m'节点A执行完毕'\u001B[0m\u001B[1m}\u001B[0m\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
('values', {'initial_state': '初始化状态,调用的时候传入', 'node_a_output': '节点A执行完毕'})\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\u001B[32m'updates'\u001B[0m, \u001B[1m{\u001B[0m\u001B[32m'node_b'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'node_b_output'\u001B[0m: \u001B[32m'节点B执行完毕'\u001B[0m\u001B[1m}\u001B[0m\u001B[1m}\u001B[0m\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
('updates', {'node_b': {'node_b_output': '节点B执行完毕'}})\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'values'\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'initial_state'\u001B[0m: \u001B[32m'初始化状态,调用的时候传入'\u001B[0m,\n", + " \u001B[32m'node_a_output'\u001B[0m: \u001B[32m'节点A执行完毕'\u001B[0m,\n", + " \u001B[32m'node_b_output'\u001B[0m: \u001B[32m'节点B执行完毕'\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'values',\n",
+       "    {\n",
+       "        'initial_state': '初始化状态,调用的时候传入',\n",
+       "        'node_a_output': '节点A执行完毕',\n",
+       "        'node_b_output': '节点B执行完毕'\n",
+       "    }\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 6 + } + ], + "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 +} diff --git a/chapter05/02_output_messages.ipynb b/chapter05/02_output_messages.ipynb new file mode 100644 index 0000000..49c99d3 --- /dev/null +++ b/chapter05/02_output_messages.ipynb @@ -0,0 +1,13665 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2026-08-15T16:12:20.756187Z", + "start_time": "2026-08-15T16:12:20.180591Z" + } + }, + "source": [ + "import os\n", + "from langchain.chat_models import init_chat_model\n", + "from dotenv import load_dotenv\n", + "from langchain_core.messages import HumanMessage\n", + "from langgraph.graph import MessagesState\n", + "from langgraph.types import Command, interrupt\n", + "from loguru import logger\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "llm = init_chat_model(\n", + " model=\"openai:qwen3.6-flash\",\n", + " base_url=os.getenv(\"BASE_URL\"),\n", + " api_key=os.getenv(\"API_KEY\")\n", + ")" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-15T16:12:20.764257Z", + "start_time": "2026-08-15T16:12:20.757920Z" + } + }, + "cell_type": "code", + "source": [ + "def llm_node(state: MessagesState):\n", + " response = llm.invoke(state[\"messages\"])\n", + " return {\n", + " \"messages\": [response]\n", + " }" + ], + "id": "96219f0dc368b2f4", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-15T16:12:20.769343Z", + "start_time": "2026-08-15T16:12:20.764859Z" + } + }, + "cell_type": "code", + "source": [ + "from langgraph.graph import StateGraph, START, END\n", + "\n", + "builder = StateGraph(state_schema=MessagesState)\n", + "builder.add_node(\"llm_node\", llm_node)\n", + "builder.add_edge(START, \"llm_node\")\n", + "builder.add_edge(\"llm_node\", END)\n", + "\n", + "graph = builder.compile()" + ], + "id": "fb99823e99a8e5ed", + "outputs": [], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-08-15T16:12:28.554444Z", + "start_time": "2026-08-15T16:12:20.769732Z" + } + }, + "cell_type": "code", + "source": [ + "from rich import print as rp\n", + "\n", + "for chunk in graph.stream(\n", + " {\n", + " \"messages\": [HumanMessage(content=\"你好!\")]\n", + " },\n", + " stream_mode=[\"values\", \"messages\"],\n", + "):\n", + " print(\"=\" * 50)\n", + " rp(chunk)" + ], + "id": "a16a8c41b51bf1f2", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'values'\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m: \u001B[1m[\u001B[0m\n", + " \u001B[1;35mHumanMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'你好!'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'8b06c8cb-1403-43c4-8e7f-2803e23d7c91'\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m]\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'values',\n",
+       "    {\n",
+       "        'messages': [\n",
+       "            HumanMessage(\n",
+       "                content='你好!',\n",
+       "                additional_kwargs={},\n",
+       "                response_metadata={},\n",
+       "                id='8b06c8cb-1403-43c4-8e7f-2803e23d7c91'\n",
+       "            )\n",
+       "        ]\n",
+       "    }\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'你好呀!很高兴'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='你好呀!很高兴',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'和你聊天。请问'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='和你聊天。请问',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'今天'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='今天',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'有什么我可以帮你的'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='有什么我可以帮你的',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'吗?'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='吗?',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={'model_provider': 'openai'},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'stop'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={\n",
+       "                'finish_reason': 'stop',\n",
+       "                'model_name': 'qwen3.6-flash',\n",
+       "                'model_provider': 'openai'\n",
+       "            },\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m12\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m581\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m593\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m561\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            usage_metadata={\n",
+       "                'input_tokens': 12,\n",
+       "                'output_tokens': 581,\n",
+       "                'total_tokens': 593,\n",
+       "                'input_token_details': {},\n",
+       "                'output_token_details': {'reasoning': 561}\n",
+       "            },\n",
+       "            tool_call_chunks=[]\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m,\n", + " \u001B[1m(\u001B[0m\n", + " \u001B[1;35mAIMessageChunk\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m''\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mtool_call_chunks\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33mchunk_position\u001B[0m=\u001B[32m'last'\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'ls_integration'\u001B[0m: \u001B[32m'langchain_chat_model'\u001B[0m,\n", + " \u001B[32m'langgraph_step'\u001B[0m: \u001B[1;36m1\u001B[0m,\n", + " \u001B[32m'langgraph_node'\u001B[0m: \u001B[32m'llm_node'\u001B[0m,\n", + " \u001B[32m'langgraph_triggers'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'branch:to:llm_node'\u001B[0m,\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_path'\u001B[0m: \u001B[1m(\u001B[0m\u001B[32m'__pregel_pull'\u001B[0m, \u001B[32m'llm_node'\u001B[0m\u001B[1m)\u001B[0m,\n", + " \u001B[32m'langgraph_checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'checkpoint_ns'\u001B[0m: \u001B[32m'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca'\u001B[0m,\n", + " \u001B[32m'ls_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m,\n", + " \u001B[32m'ls_model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'ls_model_type'\u001B[0m: \u001B[32m'chat'\u001B[0m,\n", + " \u001B[32m'ls_temperature'\u001B[0m: \u001B[3;35mNone\u001B[0m,\n", + " \u001B[32m'lc_versions'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'langchain-core'\u001B[0m: \u001B[32m'1.5.2'\u001B[0m, \u001B[32m'langchain'\u001B[0m: \u001B[32m'1.3.14'\u001B[0m, \u001B[32m'langchain-openai'\u001B[0m: \u001B[32m'1.4.1'\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'messages',\n",
+       "    (\n",
+       "        AIMessageChunk(\n",
+       "            content='',\n",
+       "            additional_kwargs={},\n",
+       "            response_metadata={},\n",
+       "            id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "            tool_calls=[],\n",
+       "            invalid_tool_calls=[],\n",
+       "            tool_call_chunks=[],\n",
+       "            chunk_position='last'\n",
+       "        ),\n",
+       "        {\n",
+       "            'ls_integration': 'langchain_chat_model',\n",
+       "            'langgraph_step': 1,\n",
+       "            'langgraph_node': 'llm_node',\n",
+       "            'langgraph_triggers': ('branch:to:llm_node',),\n",
+       "            'langgraph_path': ('__pregel_pull', 'llm_node'),\n",
+       "            'langgraph_checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'checkpoint_ns': 'llm_node:7e500cf5-0884-7769-5d7c-84a8655edbca',\n",
+       "            'ls_provider': 'openai',\n",
+       "            'ls_model_name': 'qwen3.6-flash',\n",
+       "            'ls_model_type': 'chat',\n",
+       "            'ls_temperature': None,\n",
+       "            'lc_versions': {'langchain-core': '1.5.2', 'langchain': '1.3.14', 'langchain-openai': '1.4.1'}\n",
+       "        }\n",
+       "    )\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==================================================\n" + ] + }, + { + "data": { + "text/plain": [ + "\u001B[1m(\u001B[0m\n", + " \u001B[32m'values'\u001B[0m,\n", + " \u001B[1m{\u001B[0m\n", + " \u001B[32m'messages'\u001B[0m: \u001B[1m[\u001B[0m\n", + " \u001B[1;35mHumanMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'你好!'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'8b06c8cb-1403-43c4-8e7f-2803e23d7c91'\u001B[0m\n", + " \u001B[1m)\u001B[0m,\n", + " \u001B[1;35mAIMessage\u001B[0m\u001B[1m(\u001B[0m\n", + " \u001B[33mcontent\u001B[0m=\u001B[32m'你好呀!很高兴和你聊天。请问今天有什么我可以帮你的吗?'\u001B[0m,\n", + " \u001B[33madditional_kwargs\u001B[0m=\u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[33mresponse_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'finish_reason'\u001B[0m: \u001B[32m'stop'\u001B[0m,\n", + " \u001B[32m'model_name'\u001B[0m: \u001B[32m'qwen3.6-flash'\u001B[0m,\n", + " \u001B[32m'model_provider'\u001B[0m: \u001B[32m'openai'\u001B[0m\n", + " \u001B[1m}\u001B[0m,\n", + " \u001B[33mid\u001B[0m=\u001B[32m'lc_run--01a00632-15d3-76c0-9677-6d86c25785d6'\u001B[0m,\n", + " \u001B[33mtool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33minvalid_tool_calls\u001B[0m=\u001B[1m[\u001B[0m\u001B[1m]\u001B[0m,\n", + " \u001B[33musage_metadata\u001B[0m=\u001B[1m{\u001B[0m\n", + " \u001B[32m'input_tokens'\u001B[0m: \u001B[1;36m12\u001B[0m,\n", + " \u001B[32m'output_tokens'\u001B[0m: \u001B[1;36m581\u001B[0m,\n", + " \u001B[32m'total_tokens'\u001B[0m: \u001B[1;36m593\u001B[0m,\n", + " \u001B[32m'input_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[1m}\u001B[0m,\n", + " \u001B[32m'output_token_details'\u001B[0m: \u001B[1m{\u001B[0m\u001B[32m'reasoning'\u001B[0m: \u001B[1;36m561\u001B[0m\u001B[1m}\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + " \u001B[1m)\u001B[0m\n", + " \u001B[1m]\u001B[0m\n", + " \u001B[1m}\u001B[0m\n", + "\u001B[1m)\u001B[0m\n" + ], + "text/html": [ + "
(\n",
+       "    'values',\n",
+       "    {\n",
+       "        'messages': [\n",
+       "            HumanMessage(\n",
+       "                content='你好!',\n",
+       "                additional_kwargs={},\n",
+       "                response_metadata={},\n",
+       "                id='8b06c8cb-1403-43c4-8e7f-2803e23d7c91'\n",
+       "            ),\n",
+       "            AIMessage(\n",
+       "                content='你好呀!很高兴和你聊天。请问今天有什么我可以帮你的吗?',\n",
+       "                additional_kwargs={},\n",
+       "                response_metadata={\n",
+       "                    'finish_reason': 'stop',\n",
+       "                    'model_name': 'qwen3.6-flash',\n",
+       "                    'model_provider': 'openai'\n",
+       "                },\n",
+       "                id='lc_run--01a00632-15d3-76c0-9677-6d86c25785d6',\n",
+       "                tool_calls=[],\n",
+       "                invalid_tool_calls=[],\n",
+       "                usage_metadata={\n",
+       "                    'input_tokens': 12,\n",
+       "                    'output_tokens': 581,\n",
+       "                    'total_tokens': 593,\n",
+       "                    'input_token_details': {},\n",
+       "                    'output_token_details': {'reasoning': 561}\n",
+       "                }\n",
+       "            )\n",
+       "        ]\n",
+       "    }\n",
+       ")\n",
+       "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 4 + } + ], + "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 +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d38a8e8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,37 @@ +services: + postgres: + image: pgvector/pgvector:pg17 + container_name: pgvector + restart: unless-stopped + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: postgres + ports: + - "5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"] + interval: 10s + timeout: 5s + retries: 5 + + redis: + image: redis:7.4-alpine + container_name: redis + restart: unless-stopped + command: redis-server --appendonly yes + ports: + - "6379:6379" + volumes: + - redisdata:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + pgdata: + redisdata: diff --git a/lg_common/__init__.py b/lg_common/__init__.py new file mode 100644 index 0000000..da43ec7 --- /dev/null +++ b/lg_common/__init__.py @@ -0,0 +1,6 @@ +from lg_common.env import load_env +from lg_common.llm import get_llm + +load_env() + +__all__ = ["get_llm"] diff --git a/lg_common/env.py b/lg_common/env.py new file mode 100644 index 0000000..a48f2e0 --- /dev/null +++ b/lg_common/env.py @@ -0,0 +1,14 @@ +"""环境变量加载。""" + +from pathlib import Path + +from dotenv import load_dotenv + +# lg_common 位于项目根目录下,所以根目录是它的上一级 +_PROJECT_ROOT = Path(__file__).resolve().parent.parent +_DEFAULT_ENV_FILE = _PROJECT_ROOT / ".env" + + +def load_env() -> None: + """加载项目根目录下的 .env,覆盖已有同名环境变量。""" + load_dotenv(dotenv_path=_DEFAULT_ENV_FILE, override=True) diff --git a/lg_common/llm.py b/lg_common/llm.py new file mode 100644 index 0000000..6563495 --- /dev/null +++ b/lg_common/llm.py @@ -0,0 +1,17 @@ +import os + +from langchain.chat_models import init_chat_model + + +def get_llm( + model: str = "openai:qwen3.6-flash", + base_url: str | None = None, + api_key: str | None = None, + **kwargs, +): + """初始化 ChatModel,默认从环境变量读取 BASE_URL / API_KEY。""" + if base_url is None: + base_url = os.getenv("BASE_URL") + if api_key is None: + api_key = os.getenv("API_KEY") + return init_chat_model(model=model, base_url=base_url, api_key=api_key, **kwargs) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..01abe5f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,24 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["lg_common"] + +[project] +name = "venv" +version = "0.1.0" +requires-python = ">=3.13" +dependencies = [ + "langchain>=1.3.14", + "langchain-openai", + "langgraph", + "langgraph-checkpoint", + "langgraph-sdk", + "rich", + "pydantic", + "ipykernel>=7.3.0", + "python-dotenv", + "loguru>=0.7.3", + "langgraph-checkpoint-postgres>=3.1.1", +] \ No newline at end of file diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..3df2b11 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1589 @@ +version = 1 +revision = 3 +requires-python = ">=3.13" + +[[package]] +name = "annotated-types" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, +] + +[[package]] +name = "anyio" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/1e/faf0f247f6f881b98fc4d6d07e14085cb89d13665084e6d6ac1dc2c03d0b/asttokens-3.0.2.tar.gz", hash = "sha256:3ecdbd8f2cc195f53ccada3a613538bb5f9ef6f6869129f13e03c30a677b8fe2", size = 63136, upload-time = "2026-07-12T03:31:49.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/2b/04b8a15f3a1c77bc79ddf5c73875327f34b4fa75982df2b76e45e402d364/asttokens-3.0.2-py3-none-any.whl", hash = "sha256:9da13157f5b28becde0bd374fc677dcd3c290614264eff096f167c469cd9f933", size = 28702, upload-time = "2026-07-12T03:31:47.542Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "cffi" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda", size = 194331, upload-time = "2026-07-06T21:33:03.697Z" }, + { url = "https://files.pythonhosted.org/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b", size = 196966, upload-time = "2026-07-06T21:33:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e9/45c3a76ad8d43ad9261f4c95436da61128d3ca545d72b9612c0ab5be0b1c/cffi-2.1.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a", size = 184795, upload-time = "2026-07-06T21:33:06.699Z" }, + { url = "https://files.pythonhosted.org/packages/84/4c/82f132cb4418ee6d953d982b19191e87e2a6372c8a4ce36e50b69d6ade4a/cffi-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea", size = 184746, upload-time = "2026-07-06T21:33:08.071Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db", size = 214747, upload-time = "2026-07-06T21:33:09.671Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f", size = 222392, upload-time = "2026-07-06T21:33:10.896Z" }, + { url = "https://files.pythonhosted.org/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d", size = 210285, upload-time = "2026-07-06T21:33:12.251Z" }, + { url = "https://files.pythonhosted.org/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0", size = 208801, upload-time = "2026-07-06T21:33:13.617Z" }, + { url = "https://files.pythonhosted.org/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224", size = 221808, upload-time = "2026-07-06T21:33:15.466Z" }, + { url = "https://files.pythonhosted.org/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c", size = 225241, upload-time = "2026-07-06T21:33:16.869Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a", size = 223588, upload-time = "2026-07-06T21:33:18.239Z" }, + { url = "https://files.pythonhosted.org/packages/c6/4b/e706f67279140f92939da3475ad610df18bfd52d50f14953a8e5fede71d5/cffi-2.1.0-cp313-cp313-win32.whl", hash = "sha256:db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2", size = 175248, upload-time = "2026-07-06T21:33:19.799Z" }, + { url = "https://files.pythonhosted.org/packages/5a/47/59eb7975cb0e4ef0afa764ea945b29a5bb4537a9f771cb7d6c8a5dd74c95/cffi-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512", size = 185717, upload-time = "2026-07-06T21:33:21.47Z" }, + { url = "https://files.pythonhosted.org/packages/5a/af/34fee85c48f8d94efc8597bc09470c9dd274c145f1c12e0fbc6ab6d38d74/cffi-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f", size = 180114, upload-time = "2026-07-06T21:33:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f0/81478e482afa03f6d18dc8f2afb5edc45b3080853b634b5ed91961be0998/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a", size = 194142, upload-time = "2026-07-06T21:33:23.657Z" }, + { url = "https://files.pythonhosted.org/packages/7d/95/8de304305cd9204974b0ca051b86d307cafca13aa575a0ef1b44d92c0d8c/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3", size = 196819, upload-time = "2026-07-06T21:33:25.007Z" }, + { url = "https://files.pythonhosted.org/packages/20/71/7c8372d30e42415602ed9f268f7cfd66f1b855fed881ecd168bcb45dbc0b/cffi-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1ff3456eab0d889592d1936d6125bbfbc7ae4d3354a700f8bd80450a66445d4d", size = 184965, upload-time = "2026-07-06T21:33:26.605Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5c/584e626835f0375c928176c04137c96927165cb8733cdb3150ec04e5ee5e/cffi-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c4165821e131d6d4ca444347c2b694e2311bcfa3fe5a861cc72968f28867beac", size = 184952, upload-time = "2026-07-06T21:33:27.823Z" }, + { url = "https://files.pythonhosted.org/packages/2e/d2/065fcae1c73979fac8e054462478d0ff8a29c40cdc2ed7ea5676a061df53/cffi-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6", size = 222353, upload-time = "2026-07-06T21:33:29.178Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a5/e8bbb1ce5b3ac2f53ad6a10bde44318a5a8d99d4f4a000d44a6e39aeb3e4/cffi-2.1.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913", size = 210051, upload-time = "2026-07-06T21:33:30.534Z" }, + { url = "https://files.pythonhosted.org/packages/28/ed/c127d3ac36e899c965e3361357c3befacd6578c03f40125183e41c3b219e/cffi-2.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d", size = 208630, upload-time = "2026-07-06T21:33:31.753Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d7/97d3136f81db489ec8d1d67748c110d6c994268fd7528014aa9f2b085e4e/cffi-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5", size = 221593, upload-time = "2026-07-06T21:33:33.044Z" }, + { url = "https://files.pythonhosted.org/packages/d3/27/93195977168ee63aed233a1a0993a2178798654d1f4bddcdd321d6fd3b21/cffi-2.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce", size = 225146, upload-time = "2026-07-06T21:33:34.224Z" }, + { url = "https://files.pythonhosted.org/packages/b3/c1/6dbd291ee2ae5a50a034aa057207081f545923bbf15dad4511e985aafff5/cffi-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326", size = 223240, upload-time = "2026-07-06T21:33:35.57Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/ade5ce9863a57992a6ea3d0d10d7e29b8749fc127204b3d493d667b2815f/cffi-2.1.0-cp314-cp314-win32.whl", hash = "sha256:1854b724d00f6654c742097d5387569021be12d3a0f770eae1df8f8acfcc6acd", size = 177723, upload-time = "2026-07-06T21:33:51.626Z" }, + { url = "https://files.pythonhosted.org/packages/41/de/92b9eeed4ae4a21d6fd9b2a2c8505cbed573299902ea73981cc13f7ff62c/cffi-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:1b96bfe2c4bd825681b7d311ad6d9b7280a091f43e8f63da5729638083cd3bfb", size = 187937, upload-time = "2026-07-06T21:33:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1a/cc6ae6c2913a03aab8898eee57963cf1035b8df5872ed8b9115fcc7e2be8/cffi-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:7d28dff1db6764108bc30788d85d61c876beff416d9a49cb9dd7c5a9f34f5804", size = 183001, upload-time = "2026-07-06T21:33:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/14/f0/134c00ce0779ec86dea2aa1aac69339c2741a8045072676763512363a2ea/cffi-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7ea6b3e2c4250ff1de21c630fe72d0f63eb95c2c32ffbf64a358cf4a8836d714", size = 188538, upload-time = "2026-07-06T21:33:36.792Z" }, + { url = "https://files.pythonhosted.org/packages/50/d8/3b86aba791cb610d24e8a3e1b2cd529e71fa15096b04e4d4e360049d4a4c/cffi-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6af371f3767faeffc6ac1ef57cdfd25844403e9d3f476c5537caee499de96376", size = 188230, upload-time = "2026-07-06T21:33:38.011Z" }, + { url = "https://files.pythonhosted.org/packages/14/d0/117dcd9209255ad8571fbc8c92ef32593a1d294dcec91ddc4e4db50606f2/cffi-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98", size = 223899, upload-time = "2026-07-06T21:33:39.514Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3d/f20f8b886b254e3ad10e15cd4186d3aed49f3e6a35ab37aab9f8f25f7c03/cffi-2.1.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13", size = 211652, upload-time = "2026-07-06T21:33:40.851Z" }, + { url = "https://files.pythonhosted.org/packages/28/3b/fad54de07260b93ddeef4b96d0131d57ea900675df1d410ae1deee52d7a6/cffi-2.1.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d", size = 210755, upload-time = "2026-07-06T21:33:42.183Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/3d5c705acb7abbba9bbd7d79b8e62e0f25b6120eb7ae6ac49f1b721722fe/cffi-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056", size = 223933, upload-time = "2026-07-06T21:33:43.603Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d0/47e338384ab6b1004241002fa616301020cea4fc95f283506565d252f276/cffi-2.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4", size = 226749, upload-time = "2026-07-06T21:33:45.046Z" }, + { url = "https://files.pythonhosted.org/packages/70/25/65bd5b58ea4bfdfc15cde02cb5365f89ef8ab8b2adfb8fe5c4bd4233382f/cffi-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94", size = 225703, upload-time = "2026-07-06T21:33:46.374Z" }, + { url = "https://files.pythonhosted.org/packages/dc/78/aa01ac599a8a4322533d45a1f9bc93b338276d2d59dabbe7c6d92a775c81/cffi-2.1.0-cp314-cp314t-win32.whl", hash = "sha256:7d034dcffa09e9a46c93fa3a3be402096cb5354ac6e41ab8e5cc9cd8b642ad76", size = 182857, upload-time = "2026-07-06T21:33:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/b9/26/d00496b22de4d4228f32dde94ad996f350c8aad676d63bcca0743c8dea4d/cffi-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0582a58f3051372229ca8e7f5f589f9e5632678208d8636fea3676711fdf7fe5", size = 194065, upload-time = "2026-07-06T21:33:48.953Z" }, + { url = "https://files.pythonhosted.org/packages/d5/dd/0c7dbf815a579ff005008a2d815a55d6bb047c349eef536d9dc53d3f0a8d/cffi-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:510aeeeac94811b138077451da1fb18b308a5feab47dd2b603af55804155e1c8", size = 186404, upload-time = "2026-07-06T21:33:50.309Z" }, + { url = "https://files.pythonhosted.org/packages/55/c7/8c8c50cb11c6750051daf12164098a9a6f027ac4356967fd4d800a07f242/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c", size = 194121, upload-time = "2026-07-06T21:33:56.109Z" }, + { url = "https://files.pythonhosted.org/packages/99/e2/67680bf19a6b60d2bb7ff83baefa2a4c3d2d7dc0f3277034b802e1fc504c/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001", size = 196820, upload-time = "2026-07-06T21:33:57.288Z" }, + { url = "https://files.pythonhosted.org/packages/ed/da/4bbe583a3b3a5c8c60892124fe17f3fa3656523faf0d3484eae90f091853/cffi-2.1.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:95f2954c2c9473d892eca6e0409f3568b37ab62a8eedb122461f73cc273476e3", size = 184936, upload-time = "2026-07-06T21:33:58.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4b/1f4c36ab273980d7aa75bb126ea4f8971f24a96108acad3a0a084028c57b/cffi-2.1.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:cdf2448aab5f661c9315308ec8b93f4e8a1a67a3c733f8631067a2b67d5913dc", size = 185045, upload-time = "2026-07-06T21:34:00.085Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c3/ad299dc38f3583f8d916b299f028af418a9ec98bc695fcbebeae7420691c/cffi-2.1.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699", size = 222342, upload-time = "2026-07-06T21:34:01.814Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d8/df4543cc087245044ed02ef3ad8e0a26619d0075ac7a77a12dc81177851b/cffi-2.1.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022", size = 210073, upload-time = "2026-07-06T21:34:03.255Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/fac738d73728c6cea2a88a2883dca54892496cbba88a1dc1f2909cb8a6f5/cffi-2.1.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0", size = 208551, upload-time = "2026-07-06T21:34:04.433Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/0b04a700dd64f465c93020253a793a82c9b4dff9961f48facd0df945d9b8/cffi-2.1.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1", size = 221649, upload-time = "2026-07-06T21:34:06.157Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/b7379a5704c79eda57ce075869ba70a0368d1c850f803b3c0d078d39dcaf/cffi-2.1.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28", size = 225203, upload-time = "2026-07-06T21:34:07.489Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/d5e6c43ea85c41bda2a184a3418f195fe7cf602967a8d2b94e085b83deef/cffi-2.1.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629", size = 223263, upload-time = "2026-07-06T21:34:08.712Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d8/772b8259bf75749adffb1c546828978381fb516f60cf701f6c83daf60c85/cffi-2.1.0-cp315-cp315-win32.whl", hash = "sha256:0a42c688d19fca6e095a53c6a6e2295a5b050a8b289f109adab02a9e61a25de6", size = 177696, upload-time = "2026-07-06T21:34:26.355Z" }, + { url = "https://files.pythonhosted.org/packages/2f/dd/afa2191fc6d57fedd26e5844a2fe2fcc0bbfa00961bbaa5a41e4921e7cca/cffi-2.1.0-cp315-cp315-win_amd64.whl", hash = "sha256:bccbbb5ee76a61f9d99b5bf3846a51d7fca4b6a732fe46f89295610edaf41853", size = 187914, upload-time = "2026-07-06T21:34:27.58Z" }, + { url = "https://files.pythonhosted.org/packages/05/ef/6cd4f8c671517162379dc79cfae5aea9106bc38abb89628d5c16adf6a838/cffi-2.1.0-cp315-cp315-win_arm64.whl", hash = "sha256:8d35c139744adb3e727cd51b1a18324bbe44b8bd41bf8322bca4d41289f48eda", size = 183004, upload-time = "2026-07-06T21:34:28.905Z" }, + { url = "https://files.pythonhosted.org/packages/11/b6/12fc55092817a5faa26fb8c40c7f9d662e11a46ee248c137aafc42517d92/cffi-2.1.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f9912624a0c0b834b7520d7769b3644453aabc0a7e1c839da7359f050750e9bc", size = 188378, upload-time = "2026-07-06T21:34:09.926Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2e/cdac88979f295fde5daa69622c7d2111e56e7ceb94f211357fbe452339e4/cffi-2.1.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:df92f2aba50eb4d96718b68ef76f2e57a57b54f2fa62333496d16c6d585a85ca", size = 188319, upload-time = "2026-07-06T21:34:11.101Z" }, + { url = "https://files.pythonhosted.org/packages/e0/27/1d0b408497e41a74795af122d7b603c418c5fed0171450f899afd04e594f/cffi-2.1.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d", size = 223904, upload-time = "2026-07-06T21:34:12.606Z" }, + { url = "https://files.pythonhosted.org/packages/8b/31/e115c985105dd7ffb32444505f18ceb874bb42d992af05d5dced7ecf1980/cffi-2.1.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8", size = 211554, upload-time = "2026-07-06T21:34:13.987Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/9e6e09409336d9e515c58367e7cfcf4f89df06ad25252675595a58eb59d5/cffi-2.1.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd", size = 210795, upload-time = "2026-07-06T21:34:15.972Z" }, + { url = "https://files.pythonhosted.org/packages/19/e5/d3cc82a4a0be7902af279c04181ad038449c096734464a5ae1de3e1401bd/cffi-2.1.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f", size = 223843, upload-time = "2026-07-06T21:34:17.509Z" }, + { url = "https://files.pythonhosted.org/packages/b9/65/b434abc97ce7cecc2c640fde160507c0ecc7e21544b483ba3325d2e2ea17/cffi-2.1.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc", size = 226773, upload-time = "2026-07-06T21:34:19.05Z" }, + { url = "https://files.pythonhosted.org/packages/b5/9f/d4dc66ca651eb1145a133314cda721abf13cfac3d28c4a0402263ae6ad75/cffi-2.1.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9", size = 225719, upload-time = "2026-07-06T21:34:20.576Z" }, + { url = "https://files.pythonhosted.org/packages/68/5a/e536c528bc8057496c360c0978559a2dc45653f89dd6151078aa7d8fca1a/cffi-2.1.0-cp315-cp315t-win32.whl", hash = "sha256:cb96698e3c7413d906ce83f8ffd245ec1bd94707541f299d0ce4d6b0193e982b", size = 182760, upload-time = "2026-07-06T21:34:22.059Z" }, + { url = "https://files.pythonhosted.org/packages/d3/0b/0ffe8b82d3875bced5fa1e7986a7a46b748262a40ab7f60b475eb9fb1bb3/cffi-2.1.0-cp315-cp315t-win_amd64.whl", hash = "sha256:f146d154428a2523f9cc7936c02353c2459b8f6cf07d3cd1ee1c0a611109c5d5", size = 193769, upload-time = "2026-07-06T21:34:23.589Z" }, + { url = "https://files.pythonhosted.org/packages/a0/17/1073b53b68c9b5ca6914adf5f8bf55aacc2d3be102418c90700160ea8605/cffi-2.1.0-cp315-cp315t-win_arm64.whl", hash = "sha256:cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210", size = 186405, upload-time = "2026-07-06T21:34:24.857Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614", size = 317688, upload-time = "2026-07-07T14:33:35.408Z" }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9", size = 150622, upload-time = "2026-07-07T14:33:50.711Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115", size = 161947, upload-time = "2026-07-07T14:33:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012", size = 152594, upload-time = "2026-07-07T14:33:53.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380", size = 317253, upload-time = "2026-07-07T14:33:54.994Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" }, + { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" }, + { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48", size = 151095, upload-time = "2026-07-07T14:34:10.901Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b", size = 162796, upload-time = "2026-07-07T14:34:12.47Z" }, + { url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519", size = 153334, upload-time = "2026-07-07T14:34:14.044Z" }, + { url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198", size = 338848, upload-time = "2026-07-07T14:34:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" }, + { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" }, + { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226", size = 155580, upload-time = "2026-07-07T14:34:31.884Z" }, + { url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177", size = 167620, upload-time = "2026-07-07T14:34:33.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501", size = 158037, upload-time = "2026-07-07T14:34:35.018Z" }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "debugpy" +version = "1.8.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/aa/12037145b7a56eaa5b29b41872f7a21b538e807e13f32c4d3c46e59be084/debugpy-1.8.21.tar.gz", hash = "sha256:a3c53278e84c94e11bd87c53970ec391d1a67396c8b22609fcac576520e611a6", size = 1697577, upload-time = "2026-06-01T19:30:35.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/6b/d817e1f8cc77aa055d37fba092e0febfdff40fe652d8d53d4cd7a86ad98d/debugpy-1.8.21-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:13678151fc401e2d68c9880b91e28714f797d40422994572b24560ef80910a88", size = 2477398, upload-time = "2026-06-01T19:30:57.644Z" }, + { url = "https://files.pythonhosted.org/packages/48/57/412421516afc3055fa577516f00beec3d663f9b0ab330639547ae6c57720/debugpy-1.8.21-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ecbd158386c31ffe71d46f72d44d56e66331ab9b16cad649156d514368f23ab2", size = 3962096, upload-time = "2026-06-01T19:30:59.235Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2c616337cf6ba7b07ebbc97f02c6c945a8e2f76b365e33ee809c32ee36d1/debugpy-1.8.21-cp313-cp313-win32.whl", hash = "sha256:2c2ae706dec41d99a9ca1f7ebc987a83e65578363be6f6b3ac9067504917fae1", size = 5336288, upload-time = "2026-06-01T19:31:00.79Z" }, + { url = "https://files.pythonhosted.org/packages/f8/99/9175103392f84c4b1bf7622888cdc68da07f0ff7d9e581266428f6776033/debugpy-1.8.21-cp313-cp313-win_amd64.whl", hash = "sha256:aa648733047443eb1d07682c4ef287d36a54507b643ffdf38b09a3ef002c72a0", size = 5376567, upload-time = "2026-06-01T19:31:02.56Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3d/f4bbb323a548bfab2af3d6b4ffd9bf22636e55956a1285d317a1de643aad/debugpy-1.8.21-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9bb2a685287a2ac9b181cde89edcec64845cb51de7faaa75badb9a698bc24782", size = 2477209, upload-time = "2026-06-01T19:31:04.157Z" }, + { url = "https://files.pythonhosted.org/packages/8c/2d/6e7ec524984a1702777868de49a4c53202bddac2a432a76a093469587750/debugpy-1.8.21-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:3d6922439bf33fd38a3e2c447869ebc7b97da5cd3d329ff1ef9bc06c4903437e", size = 3927115, upload-time = "2026-06-01T19:31:05.863Z" }, + { url = "https://files.pythonhosted.org/packages/97/47/d1aa6d64005a98a9144647d99306b419396f9ad7bf1d73c119e17a81fb4d/debugpy-1.8.21-cp314-cp314-win32.whl", hash = "sha256:15d4963bd5ffa48f0da0947fd06757fa7621945048a14ad7705431566d3c0e7c", size = 5336724, upload-time = "2026-06-01T19:31:07.711Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/b905b90d163af11878c1af8abafa4a25206335e112e284e413454543a6da/debugpy-1.8.21-cp314-cp314-win_amd64.whl", hash = "sha256:fe0744a12353406de0ae8ccff0d0a4a666f00801a3db8fd04e7a5f761cd520e8", size = 5373803, upload-time = "2026-06-01T19:31:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/95/51/67e7cf11a53e40694f720457d5b3a1cdaaa3d5a9a633e482f225456b93ff/debugpy-1.8.21-py2.py3-none-any.whl", hash = "sha256:b1e37d333663c8851516a47364ef473da127f9caebe4417e6df6f5825a7e9a92", size = 5352888, upload-time = "2026-06-01T19:31:25.186Z" }, +] + +[[package]] +name = "decorator" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "ipykernel" +version = "7.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio2" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/c4/e4a38f579de4225a561305666f7541cdabb30075def2aa1ac17bd73c1fb5/ipykernel-7.3.0.tar.gz", hash = "sha256:9acaaaf97d16355166e4085afe9d225bfbdf2b7ef520f9df3be8f2b248275e09", size = 184899, upload-time = "2026-06-10T08:41:25.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/02/77b271f5dc58bfbc0b577c877b2365d1ffea2afe66a80c13f2312820348c/ipykernel-7.3.0-py3-none-any.whl", hash = "sha256:897eb64da762549ef610698fca5e9675195ec6ac8ec7f19d81ce1ca20c876057", size = 120583, upload-time = "2026-06-10T08:41:23.648Z" }, +] + +[[package]] +name = "ipython" +version = "9.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "psutil", marker = "sys_platform != 'cygwin' and sys_platform != 'emscripten'" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/59/165d3b4d75cc34add3122c4417ecb229085140ac573103c223cd01dde96f/ipython-9.15.0.tar.gz", hash = "sha256:da2819ce2aa83135257df830660b1176d986c3d2876db24df01974fa955b2756", size = 4442580, upload-time = "2026-06-26T11:03:35.913Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/3a/948263ca3b9d65bb2b1b0c521b3a49fad5d59ada58724bd87d2bd5ff3f36/ipython-9.15.0-py3-none-any.whl", hash = "sha256:515ad9c3cdf0c932a5a9f6245419e8aba706b7bd03c3e1d3a1c83d9351d6aa6e", size = 630895, upload-time = "2026-06-26T11:03:33.809Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + +[[package]] +name = "jiter" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/1f/10936e16d8860c70698a1aa939a46aa0224813b782bce4e000e637da0b2d/jiter-0.16.0.tar.gz", hash = "sha256:7b24c3492c5f4f84a37946ad9cf504910cf6a782d6a4e0689b6673c5894b4a1c", size = 176431, upload-time = "2026-06-29T13:05:13.657Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/c0/555fc60473d30d66894ba825e63615e3be7524fac23858356afa7a38906c/jiter-0.16.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:41977aa5654023948c2dae2a81cbf9c43343954bef1cd59a154dd15a4d84c195", size = 306203, upload-time = "2026-06-29T13:03:36.243Z" }, + { url = "https://files.pythonhosted.org/packages/d0/2b/c3eaf16f5d7c9bad66ea32f40a95bd169b29a91217fcc7f081375157e99c/jiter-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d28bb3c26762358dadf3e5bf0bccd29ae987d65e6988d2e6f49829c76b003c09", size = 306489, upload-time = "2026-06-29T13:03:37.846Z" }, + { url = "https://files.pythonhosted.org/packages/96/3f/02fdfc6705cad96127d883af5c34e4867f554f29ec7705ec1a46156400a9/jiter-0.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0542a7189c26920778658fc8fcf2af8bae05bae9924577f71804acef37996536", size = 335453, upload-time = "2026-06-29T13:03:39.221Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a6/e4bda5920d4b0d7c5dfb7174ce4a6b2e4d3e11c9162c452ef0eab4cdbdbd/jiter-0.16.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8fb8de1e23a0cb2a7f53c335049c7b72b6db41aa6227cdcc0972a1de5cb39450", size = 361625, upload-time = "2026-06-29T13:03:40.597Z" }, + { url = "https://files.pythonhosted.org/packages/b7/97/4e6b59b2c6e55cbb3e183595f81ad65dcfb21c915fee5e19e335df21bc55/jiter-0.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72d0b2990ca754a9102779ac98d8597b7cb31678958562214a007f909eab78e", size = 456958, upload-time = "2026-06-29T13:03:42.074Z" }, + { url = "https://files.pythonhosted.org/packages/15/e0/97e9557686d2f94f4b93786eccb7eed28e9228ad132ea8237f44727314a7/jiter-0.16.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f91b1c27fc22a57993d5a5cb8a627cb8ed4b10502716fac1ffbfe1d19d84e8", size = 372017, upload-time = "2026-06-29T13:03:43.658Z" }, + { url = "https://files.pythonhosted.org/packages/0f/94/db768b6938e0df35c86beeba3dfbbb025c9ee5c19e1aa271f2396e50864d/jiter-0.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c682bea068a90b764577bdb78a60a4c1d1606daf9cd4c893832a37c7cc9d9026", size = 343320, upload-time = "2026-06-29T13:03:45.226Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d6/5a59d938244a30735fe62d9433fd325f9021ea29d89780ea4596ea93bc89/jiter-0.16.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:8d031aabecc4f1b6276adfb42e3aabb77c89d468bf616600e8d3a11328929053", size = 350520, upload-time = "2026-06-29T13:03:46.671Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/c4a857f49c9af125f6bbcac7e3eee7f7978ed89682833062e2dbf62576b1/jiter-0.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eab2cd170150e70153de16896a1774e3a1dca80154c56b54d7a812c479a7165e", size = 387550, upload-time = "2026-06-29T13:03:48.361Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d6/5fbc2f7d6b67b754caa61a993a2e626e815dec47ffc2f9e35f01adfebec7/jiter-0.16.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6edb63a46e65a82c26800a868e49b2cac30dd5a4218b88d74bc2c848c8ad60bb", size = 515424, upload-time = "2026-06-29T13:03:49.881Z" }, + { url = "https://files.pythonhosted.org/packages/ed/54/284f0164b64a5fed915fea6ba7e9ba9b3d8d37c67d59cf2e3bb99d45cdfe/jiter-0.16.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:659039cc50b5addcc35fcc87ae2c1833b7c0a8e5326ef631a75e4478447bcf84", size = 546981, upload-time = "2026-06-29T13:03:51.363Z" }, + { url = "https://files.pythonhosted.org/packages/13/c5/2a467585a576594384e1d2c43e1224deaafc085f24e243529cf98beef8e1/jiter-0.16.0-cp313-cp313-win32.whl", hash = "sha256:c9c53be232c2e206ef9cdbad81a48bfa74c3d3f08bcf8124630a8a748aad993e", size = 202853, upload-time = "2026-06-29T13:03:53.015Z" }, + { url = "https://files.pythonhosted.org/packages/88/6a/de61d04b9eec69c71719968d2f716532a3bc121170c44a39e14979c6be81/jiter-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:baad945ed47f163ad833314f8e3288c396118934f94e7bbb9e243ce4b341a4fd", size = 196160, upload-time = "2026-06-29T13:03:54.447Z" }, + { url = "https://files.pythonhosted.org/packages/19/4b/b390ed59bafb3f31d008d1218578f10327714484b334439947f7e5b11e7f/jiter-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:3c1fd2dbe1b0af19e987f03fe66c5f5bd105a2229c1aff4ab14890b24f41d21a", size = 189862, upload-time = "2026-06-29T13:03:55.754Z" }, + { url = "https://files.pythonhosted.org/packages/a7/89/bc4f1b57d5da938fd344a466396541e586d161320d70bffd929aaafcd8f4/jiter-0.16.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b2c61484666ad42726029af0c00ef4541f0f3b5cdc550221f56c2343208018ee", size = 308239, upload-time = "2026-06-29T13:03:57.205Z" }, + { url = "https://files.pythonhosted.org/packages/65/7a/c415453e5213001bf3b411ff65dec3d303b0e76a4a2cfea9768cd4960994/jiter-0.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:63efadc657488f45db1c676d81e704cac2abf3fdb892def1faea61db053127e2", size = 308928, upload-time = "2026-06-29T13:03:58.643Z" }, + { url = "https://files.pythonhosted.org/packages/11/fc/1f4fb7ebf9a724c7741994f4aae18fba1e2f3133df14521a79194952c34a/jiter-0.16.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf0d73f50e7b6935677854f6e8e31d499ca7064dd24734f703e060f5b237d883", size = 336998, upload-time = "2026-06-29T13:04:00.071Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8d/72cadaac05ccfa7cc3a0a2232862e6c72443ca40cf300ba8b57f9f18b69b/jiter-0.16.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3ea07d9bc8e7d03a9fbc051295462e6dbc295b894fd72457c3136e3e43d898", size = 362112, upload-time = "2026-06-29T13:04:01.52Z" }, + { url = "https://files.pythonhosted.org/packages/58/4a/c4b0d5f651fda90a24ffce9f8d56cde462a2e09d31ae3de3c68cef34c04e/jiter-0.16.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26798522707abb47d767db536e4148ceac1b14446bf028ee85e579a2e043cfe5", size = 459807, upload-time = "2026-06-29T13:04:03.214Z" }, + { url = "https://files.pythonhosted.org/packages/80/58/ef77879ea9aa56b50824edc5a445e226422c7a8d211f3fd2a56bcb9493cf/jiter-0.16.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc837c1b9631be10abfe0191537fe8009838204cec7e44827401ace390ddb567", size = 373181, upload-time = "2026-06-29T13:04:04.629Z" }, + { url = "https://files.pythonhosted.org/packages/49/2e/ffbc3f254e4d8a66da3062c624a7df4b7c2b2cf9e1fe43cf394b3e104041/jiter-0.16.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49060fd70737fad59d33ba9dcc0d83247dc9e77187de26053a19c16c9f32bd69", size = 344927, upload-time = "2026-06-29T13:04:06.067Z" }, + { url = "https://files.pythonhosted.org/packages/9a/f6/0be5dc6d64a89f80aa8fec984f94dedb2973e251edcae55841d60786d578/jiter-0.16.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:adbb8edeadd431bc4477879d5d371ece7cb1334486584e0f252656dd7ffada29", size = 352754, upload-time = "2026-06-29T13:04:07.477Z" }, + { url = "https://files.pythonhosted.org/packages/da/6e/7d31243b3b91cd261dd19e9d3557fc3251a80883d3d8049c86174e7ab7af/jiter-0.16.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:31aaee5b80f672c1dc21272bcfb9cbdcfc1ea04ff50f00ed5af500b80c44fa93", size = 390553, upload-time = "2026-06-29T13:04:08.92Z" }, + { url = "https://files.pythonhosted.org/packages/25/33/51ae371fde3c88897520f62b4d5f8b27ad7103e2bb10812ff52195609853/jiter-0.16.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:6722bcef4ffc86c835574b1b2fac6b33b9fb4a889c781e67950e891591f3c55a", size = 516900, upload-time = "2026-06-29T13:04:10.407Z" }, + { url = "https://files.pythonhosted.org/packages/a0/45/6449b3d123ea439ba79507c657288f461d55049e7bcbdc2cf8eb8210f491/jiter-0.16.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:5ab4f50ff971b611d656554ea10b75f80097392c827bc32923c6eeb6386c8b00", size = 548754, upload-time = "2026-06-29T13:04:12.046Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e7/fd2fb11ae3e2649333da3aa170d04d7b3000bbdc3b270f6513382fdf4e04/jiter-0.16.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:710cc51d4ebdcd3c1f70b232c1db1ea1344a075770422bbd4bede5708335acbe", size = 122381, upload-time = "2026-06-29T13:04:13.413Z" }, + { url = "https://files.pythonhosted.org/packages/26/80/f0b147a62c315a164ed2168908286ca302310824c218d3aae52b06c0c9a9/jiter-0.16.0-cp314-cp314-win32.whl", hash = "sha256:57b37fc887a32d44798e4d8ebfa7c9683ff3da1d5bf38f08d1bb3573ccb39106", size = 204578, upload-time = "2026-06-29T13:04:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e6/4758a14304b4523a6f5adb2419340086aa3593bd4327c2b25b5948a90548/jiter-0.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:cbd18dd5e2df96b580487b5745adf57ef64ad89ba2d9662fc3c19386acce7db8", size = 198154, upload-time = "2026-06-29T13:04:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/26/be/41fa54a2e7ea41d6c99f1dc5b1f0fd4cb474680304b5d268dd518e81da3a/jiter-0.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:a32d2027a9fa67f109ff245a3252ece3ccc32cc56703e1deab6cc846a59e0585", size = 191458, upload-time = "2026-06-29T13:04:17.707Z" }, + { url = "https://files.pythonhosted.org/packages/81/6b/59127338b86d9fe4d99418f5a15118bea778103ee0fe9d9dd7e0af174e95/jiter-0.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2577196f4474ef3fc4779a088a23b0897bbf86f9ea3679c372d45b8383b43207", size = 316739, upload-time = "2026-06-29T13:04:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/2d/95/49461034d5388196d3dabf98748935f017b7785d8f3f5349f834bcc4ed0d/jiter-0.16.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e89e008a93c01104161c75b4988e58716b01d62307ebfe161e52a56d2a818", size = 340911, upload-time = "2026-06-29T13:04:21.257Z" }, + { url = "https://files.pythonhosted.org/packages/cd/97/a4369f2fb82cb3dda13b98622f31249b2e014b223fe64ee534413ad72294/jiter-0.16.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2e9efbe042210df657bade597f66d6d75723e3d8f45a12ea6d8167ff8bbce3", size = 361747, upload-time = "2026-06-29T13:04:22.677Z" }, + { url = "https://files.pythonhosted.org/packages/28/51/49b6ed456261646e1906016a6760367a28aacd3c24805e4e5fe64116c1db/jiter-0.16.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f4d9e473a5ce7d27fef8b848df4dc16e283893d3f53b4a585e72c9595f3c284", size = 460225, upload-time = "2026-06-29T13:04:24.441Z" }, + { url = "https://files.pythonhosted.org/packages/33/b5/5689aff4f66c5b60be63106e591dbfcba2190df97d2c9c7cf052361ddb98/jiter-0.16.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d30a4a1c87713060c8d1cc59a7b6c8fb6b8ef0a6900368014c76c87922a2929", size = 373169, upload-time = "2026-06-29T13:04:25.884Z" }, + { url = "https://files.pythonhosted.org/packages/a2/96/3ae1b85ee0d6d6cab254fb7f8da018272b932bbf2d69b07e98aa2a96c746/jiter-0.16.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae96332410f866e5900d809298b1ed82735932986c672495f9701daacd80620", size = 350332, upload-time = "2026-06-29T13:04:27.302Z" }, + { url = "https://files.pythonhosted.org/packages/15/32/c99d7bafd78986556c95bf60ce84c6cc98786eac56066c12d7f828bb6747/jiter-0.16.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:da3d7ec75dc83bb18bca888b5edfae0656a26849056c59e05a7728badd17e7af", size = 353377, upload-time = "2026-06-29T13:04:28.731Z" }, + { url = "https://files.pythonhosted.org/packages/0e/4b/f99a8e571287c3dec766bcc18528bbe8e8fb5365522ab5e6d64c93e87066/jiter-0.16.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ee6162b77d49a9939229df666dfa8af3e656b6701b54c4c84966d740e189264e", size = 387746, upload-time = "2026-06-29T13:04:30.319Z" }, + { url = "https://files.pythonhosted.org/packages/75/69/c78a5b3f71040e34eb5917df26fb7ae9a2174cad1ccbf277512507c53a6e/jiter-0.16.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:63ffdbdae7d4499f4cda14eadc12ddcabef0fc0c081191bdc2247489cb698077", size = 517292, upload-time = "2026-06-29T13:04:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f7/095b38eda4c70d03651c403f29a5590f16d12ddc5d544aac9f9cddf72277/jiter-0.16.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a111256a7193bea0759267b10385e5870949c239ed7b6ddbaaf57573edb38734", size = 549259, upload-time = "2026-06-29T13:04:33.721Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c5/6a0207d90e5f656d95af98ebd0934f382d37674416f215aeda2ff8063e51/jiter-0.16.0-cp314-cp314t-win32.whl", hash = "sha256:de5ba8763e56b793561f43bed197c9ea55776daa5e9a6b91eed68a909bc9cdbf", size = 206523, upload-time = "2026-06-29T13:04:35.068Z" }, + { url = "https://files.pythonhosted.org/packages/a5/31/c757d5f30a8980fd945ce7b98be10be9e4ff59c7c42f5fd86804c2e87db8/jiter-0.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b8a3f9a6008048fe9def7bf465180564a6e458047d2ce499149cfbe73c3ae9db", size = 200366, upload-time = "2026-06-29T13:04:36.61Z" }, + { url = "https://files.pythonhosted.org/packages/7c/a2/d88de6d313d734a544a7901353ad5db67cb38dcfcd91713b7979dafc345d/jiter-0.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0fa25b09b13075c46f5bc174f2690525a925a4fc2f7c82969a2bbabff22386ce", size = 190516, upload-time = "2026-06-29T13:04:38.004Z" }, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpointer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699, upload-time = "2023-06-26T12:07:29.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898, upload-time = "2023-06-16T21:01:28.466Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl", hash = "sha256:8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca", size = 7659, upload-time = "2026-03-23T22:32:31.568Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/dc/5512503b088997c2250b8bf18258fba9d9ce5ead641183700960d3c9d342/jupyter_client-8.9.1.tar.gz", hash = "sha256:a58f730dd9e728ba16ba1d62ebccf7ffe1ebbdbce4e95cfae941b7321ae1f4fa", size = 359256, upload-time = "2026-06-09T13:15:01.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/6f/56d39bf385c5c27988aebaf0c18a2a17e960575740100973511018bd904e/jupyter_client-8.9.1-py3-none-any.whl", hash = "sha256:0b7a295bc46e8751e9adae84781f726c851c1d911bd793edc4a3bde942e3da81", size = 109828, upload-time = "2026-06-09T13:14:58.835Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "langchain" +version = "1.3.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langgraph" }, + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/68/a6dbad9c22df4087a0f9e79ddd46226c442b30128bfeee538d5889492a73/langchain-1.3.14.tar.gz", hash = "sha256:1b6696c72ba3bbbce54d745e0180742c9f6ece8bbc59ed5a46c3e20b9a435929", size = 645181, upload-time = "2026-07-16T13:28:18.29Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/ec/0f942e78a621f8e3162ff1ed24284f469aaf51fb4607ee5831c626f2b2bc/langchain-1.3.14-py3-none-any.whl", hash = "sha256:4d10dbe91005952cddd56d0dc77aa108964da6bae90ab20063653957e901f782", size = 139560, upload-time = "2026-07-16T13:28:16.498Z" }, +] + +[[package]] +name = "langchain-core" +version = "1.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpatch" }, + { name = "langchain-protocol" }, + { name = "langsmith" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "tenacity" }, + { name = "typing-extensions" }, + { name = "uuid-utils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/58/3ad53096eee1e07728e8219ded30ae308b0f2b8b7b26b8ebb6371917c0f5/langchain_core-1.5.2.tar.gz", hash = "sha256:2d13ab35b42eec63d4669a483776b8cdd778ee764107149369fb369d84c08c41", size = 972322, upload-time = "2026-07-28T16:38:37.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/e4/024e402a65f5ee2eb6ae9667b5ffc5f08776cb4e712f5a11ee1997d56083/langchain_core-1.5.2-py3-none-any.whl", hash = "sha256:a687dd7c3b22c6c1294e1c1eeb61fb6f3a308e6015a1d75b576b3836ad5b5aed", size = 561643, upload-time = "2026-07-28T16:38:36.38Z" }, +] + +[[package]] +name = "langchain-openai" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "openai" }, + { name = "tiktoken" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/1b/a83bf6cae4632363cef0b6f2ee1b4f62c8a5ebcf22cd8ef24430a736c2a8/langchain_openai-1.4.1.tar.gz", hash = "sha256:6d16be615d997db80294731b8e768783f1fb8e0313668e64acd50cd68acbad20", size = 3262416, upload-time = "2026-07-23T20:31:13.053Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/1c/8b604dc8be2735c8ae5c655e520066231057d1301958c20c776e62bd00fb/langchain_openai-1.4.1-py3-none-any.whl", hash = "sha256:8528bb34cc78fdfd2d895573c7917f9441cbb82db5f18ae0e6b3b75d95bdefb3", size = 122067, upload-time = "2026-07-23T20:31:11.809Z" }, +] + +[[package]] +name = "langchain-protocol" +version = "0.0.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d2/59/b5959aea96faa9146e2e49a7a22882b3528c62efafe9a6a95beab30c2305/langchain_protocol-0.0.18.tar.gz", hash = "sha256:ec3e11782f1ed0c9db38e5a9ed01b0e7a0d3fba406faa8aef6594b73c56a63e6", size = 6150, upload-time = "2026-06-18T17:08:26.959Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/2e/d82db9eec13ad0f72e7aaad5c4bc730ab111934fdc83c85523206eb9b0a0/langchain_protocol-0.0.18-py3-none-any.whl", hash = "sha256:70b53a86fbf9cedc863555effe44da192ab02d556ddbf2cf95b8873adcf41b5a", size = 7221, upload-time = "2026-06-18T17:08:25.996Z" }, +] + +[[package]] +name = "langgraph" +version = "1.2.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langgraph-checkpoint" }, + { name = "langgraph-prebuilt" }, + { name = "langgraph-sdk" }, + { name = "pydantic" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/1d/a32f3caf4b3d60651656c0d64976b48d168653e81c71bb7512e9a31541aa/langgraph-1.2.10.tar.gz", hash = "sha256:05a183a746ed570a06c7c1b879920163509a75df9e44e92dd2238218d677fd37", size = 723404, upload-time = "2026-07-28T18:33:51.441Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/4d/3fc3e2535ee2c731130d71371848ebc6d4a9d2e8ae6060b11987ba134951/langgraph-1.2.10-py3-none-any.whl", hash = "sha256:52c48bd42fa31a1de0e1c0f0ebfe342e11ca2957b8b3563f83dbd60d8e30f921", size = 247753, upload-time = "2026-07-28T18:33:50.028Z" }, +] + +[[package]] +name = "langgraph-checkpoint" +version = "4.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "ormsgpack" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/47/886af6f886f0bff2273164a45f008694e48a96ff3cd25ff0228f2aa9480e/langgraph_checkpoint-4.1.1.tar.gz", hash = "sha256:6c2bdb530c91f91d7d9c1bd100925d0fc4f498d418c17f3587d1526279482a25", size = 184020, upload-time = "2026-05-22T16:57:38.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/b4/71425e3e38be92611300b9cc5e46a5bf98ab23f5ea8a75b73d02a2f1413c/langgraph_checkpoint-4.1.1-py3-none-any.whl", hash = "sha256:25d29144b082827218e7bc3f1e9b0566a4bb007895cd6cc26f66a8428739f56e", size = 56212, upload-time = "2026-05-22T16:57:37.203Z" }, +] + +[[package]] +name = "langgraph-checkpoint-postgres" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langgraph-checkpoint" }, + { name = "orjson" }, + { name = "psycopg" }, + { name = "psycopg-pool" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/92/1e8959f8cd1b56e672fde3227f6fd642be85af6c5fd662d73921074aa39d/langgraph_checkpoint_postgres-3.1.1.tar.gz", hash = "sha256:d320e147ddad8c374cd546df0b52b532dd54d0541dd9fd23fc738cbd5de76f41", size = 150413, upload-time = "2026-07-30T19:15:39.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/32/ba457698a48a0e18d786caa770033067049fbe36d6846f8e50f13b594b51/langgraph_checkpoint_postgres-3.1.1-py3-none-any.whl", hash = "sha256:6e353aecd8150de144fef8e51a49076f58b7d6830d4cf51392b7ad4d79832ba7", size = 50778, upload-time = "2026-07-30T19:15:37.405Z" }, +] + +[[package]] +name = "langgraph-prebuilt" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langgraph-checkpoint" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/66/ed9b93f56bc17ef22d551892f0ac2b225a97fe0fcf23a511b857f70d590b/langgraph_prebuilt-1.1.0.tar.gz", hash = "sha256:3c579cf6eed2d17f9c157c2d0fcaddcd8688524e7022d3b22b37a3bf4589d528", size = 178833, upload-time = "2026-05-12T03:37:49.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/43/3fe1a700b8490ed02679cdbbc8c915eb23a092faf496c9c1118abcd10be3/langgraph_prebuilt-1.1.0-py3-none-any.whl", hash = "sha256:51e311747d755b751d5c6b39b0c1446124d3a7643d2515017e6714b323508fc9", size = 41043, upload-time = "2026-05-12T03:37:48.007Z" }, +] + +[[package]] +name = "langgraph-sdk" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, + { name = "langchain-core" }, + { name = "langchain-protocol" }, + { name = "orjson" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/2b/bd8ac26d4e97f6df88ef05ce5b6a38945a3903e1025d926f4752aa88aa97/langgraph_sdk-0.4.2.tar.gz", hash = "sha256:b88f0f5f6328ac0680d6790614a905b2bcfa257f2276dba4e38f0e86db0aa738", size = 348327, upload-time = "2026-06-01T17:51:19.856Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/05/aac507337cceae773c2cc9ab91eb6301963af7aeeb55b4217a00e15aff17/langgraph_sdk-0.4.2-py3-none-any.whl", hash = "sha256:75fa5096c1177ce39c847096a8fe3745ffd480ddb412995f836e9f5f884c43dd", size = 160521, upload-time = "2026-06-01T17:51:18.849Z" }, +] + +[[package]] +name = "langsmith" +version = "0.10.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "requests-toolbelt" }, + { name = "sniffio" }, + { name = "typing-extensions" }, + { name = "uuid-utils" }, + { name = "websockets" }, + { name = "xxhash" }, + { name = "zstandard" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c1/99/b88ebe607ae2a1f383343290592864df7ed65245932f57714486e78df068/langsmith-0.10.11.tar.gz", hash = "sha256:47f8c4278933a0db2c1a22db06ff57b2e0c67c00f9eb71f8495eed484d5d7383", size = 4742894, upload-time = "2026-07-28T14:35:05.634Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/3c/988253a1623c7b83df6ed0cfcbd522b86302b9b7eebcb88080553a5166f9/langsmith-0.10.11-py3-none-any.whl", hash = "sha256:37ac446cd5655393738689e6205f9b8a54e6665405faf007f2eb85fe9ce51180", size = 676544, upload-time = "2026-07-28T14:35:03.637Z" }, +] + +[[package]] +name = "loguru" +version = "0.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "win32-setctime", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload-time = "2024-12-06T11:20:56.608Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload-time = "2024-12-06T11:20:54.538Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "nest-asyncio2" +version = "1.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/73/731debf26e27e0a0323d7bda270dc2f634b398e38f040a09da1f4351d0aa/nest_asyncio2-1.7.2.tar.gz", hash = "sha256:1921d70b92cc4612c374928d081552efb59b83d91b2b789d935c665fa01729a8", size = 14743, upload-time = "2026-02-13T00:34:04.386Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/3c/3179b85b0e1c3659f0369940200cd6d0fa900e6cefcc7ea0bc6dd0e29ffb/nest_asyncio2-1.7.2-py3-none-any.whl", hash = "sha256:f5dfa702f3f81f6a03857e9a19e2ba578c0946a4ad417b4c50a24d7ba641fe01", size = 7843, upload-time = "2026-02-13T00:34:02.691Z" }, +] + +[[package]] +name = "openai" +version = "2.50.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/f5/e7735f2af272ee179a287911a698b3cbdb59d7a4ac4874571363adf1e4de/openai-2.50.0.tar.gz", hash = "sha256:5128f7caf4a6b01aefd6e7e93efe170a2c3427b8de286b9af5cdff3aa47e02c8", size = 1081965, upload-time = "2026-07-28T22:16:31.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/ca/db315b3bb748c26c644a3f85b7d509e774354d6518d47080b1446005ee41/openai-2.50.0-py3-none-any.whl", hash = "sha256:90bdddcc5a2fa529b350fac9c5780d87e5c361dcc6090ab57b0d470b0d7af7fa", size = 1650721, upload-time = "2026-07-28T22:16:29.48Z" }, +] + +[[package]] +name = "orjson" +version = "3.11.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/0c/964746fcafbd16f8ff53219ad9f6b412b34f345c75f384ad434ceaadb538/orjson-3.11.9.tar.gz", hash = "sha256:4fef17e1f8722c11587a6ef18e35902450221da0028e65dbaaa543619e68e48f", size = 5599163, upload-time = "2026-05-06T15:11:08.309Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/33/93fcc25907235c344ae73122f8a4e01d2d393ef062b4af7d2e2487a32c37/orjson-3.11.9-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4bab1b2d6141fe7b32ae71dac905666ece4f94936efbfb13d55bb7739a3a6021", size = 228458, upload-time = "2026-05-06T15:10:20.079Z" }, + { url = "https://files.pythonhosted.org/packages/8f/27/b1e6dadb3c080313c03fdd8067b85e6a0460c7d8d6a1c3984ef77b904e4d/orjson-3.11.9-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:844417969855fc7a41be124aafe83dc424592a7f77cd4501900c67307122b92c", size = 128368, upload-time = "2026-05-06T15:10:21.549Z" }, + { url = "https://files.pythonhosted.org/packages/21/0f/c9ede0bf052f6b4051e64a7d4fa91b725cccf8321a6a786e86eb03519f00/orjson-3.11.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe02797b5e9f3a9d8292ddcd289b474ad13e81ad83cd1891a240811f1d2cb81", size = 132070, upload-time = "2026-05-06T15:10:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/fd/26/d398e28048dc18205bbe812f2c88cb9b40313db2470778e25964796458fe/orjson-3.11.9-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e4eed3b200023042814d2fc8a5d2e880f13b52e1ed2485e83da4f3962f7dc1a", size = 127892, upload-time = "2026-05-06T15:10:24.714Z" }, + { url = "https://files.pythonhosted.org/packages/66/60/52b0054c4c700d5aa7fc5b7ca96917400d8f061307778578e67a10e25852/orjson-3.11.9-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aff7da9952a5ad1cef8e68017724d96c7b9a66e99e91d6252e1b133d67a7b10", size = 135217, upload-time = "2026-05-06T15:10:26.084Z" }, + { url = "https://files.pythonhosted.org/packages/d5/97/1e3dc2b2a28b7b2528f403d2fc1d79ec5f39af3bc143ab65d3ec26426385/orjson-3.11.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d4e98d6f3b8afed8bc8cd9718ec0cdf46661826beefb53fe8eafb37f2bf0362", size = 145980, upload-time = "2026-05-06T15:10:28.062Z" }, + { url = "https://files.pythonhosted.org/packages/fc/39/31fbfe7850f2de32dee7e7e5c09f26d403ab01e440ac96001c6b01ad3c99/orjson-3.11.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a81d52442a7c99b3662333235b3adf96a1715864658b35bb797212be7bddb97", size = 132738, upload-time = "2026-05-06T15:10:29.727Z" }, + { url = "https://files.pythonhosted.org/packages/a1/08/dca0082dd2a194acb93e5457e73455388e2e2ca464a2672449a9ddbb679d/orjson-3.11.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e39364e726a8fff737309aff059ff67d8a8c8d5b677be7bb49a8b3e84b7e218", size = 134033, upload-time = "2026-05-06T15:10:31.152Z" }, + { url = "https://files.pythonhosted.org/packages/11/d4/5bdb0626801230139987385554c5d4c42255218ac906525bf4347f22cd95/orjson-3.11.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4fd66214623f1b17501df9f0543bef0b833979ab5b6ded1e1d123222866aa8c9", size = 141492, upload-time = "2026-05-06T15:10:32.641Z" }, + { url = "https://files.pythonhosted.org/packages/fa/88/a21fb53b3ede6703aede6dce4710ed4111e5b201cfa6bbff5e544f9d47d7/orjson-3.11.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8ecc30f10465fa1e0ce13fd01d9e22c316e5053a719a8d915d4545a09a5ff677", size = 415087, upload-time = "2026-05-06T15:10:34.438Z" }, + { url = "https://files.pythonhosted.org/packages/3d/57/1b30daf70f0d8180e9a73cefbfbdd99e4bf19eb020466502b01fba7e0e50/orjson-3.11.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:97db4c94a7db398a5bd636273324f0b3fd58b350bbbac8bb380ceb825a9b40f4", size = 148031, upload-time = "2026-05-06T15:10:36.358Z" }, + { url = "https://files.pythonhosted.org/packages/04/83/45fbb6d962e260807f99441db9613cee868ceda4baceda59b3720a563f97/orjson-3.11.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f78cf8fec5bd627f4082b8dfeac7871b43d7f3274904492a43dab39f18a19a0", size = 136915, upload-time = "2026-05-06T15:10:38.013Z" }, + { url = "https://files.pythonhosted.org/packages/5f/cc/2d10025f9056d376e4127ec05a5808b218d46f035fdc08178a5411b34250/orjson-3.11.9-cp313-cp313-win32.whl", hash = "sha256:d4087e5c0209a0a8efe4de3303c234b9c44d1174161dcd851e8eea07c7560b32", size = 131613, upload-time = "2026-05-06T15:10:39.569Z" }, + { url = "https://files.pythonhosted.org/packages/67/bd/2775ff28bfe883b9aa1ff348300542eb2ef1ee18d8ae0e3a49846817a865/orjson-3.11.9-cp313-cp313-win_amd64.whl", hash = "sha256:051b102c93b4f634e89f3866b07b9a9a98915ada541f4ec30f177067b2694979", size = 127086, upload-time = "2026-05-06T15:10:41.262Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/d26799e580939e32a7da9a39531bc9e58e15ca32ffaa6a8cb3e9bb0d22cd/orjson-3.11.9-cp313-cp313-win_arm64.whl", hash = "sha256:cce9127885941bd28f080cecf1f1d288336b7e0d812c345b08be88b572796254", size = 126696, upload-time = "2026-05-06T15:10:42.651Z" }, + { url = "https://files.pythonhosted.org/packages/8e/eb/5da01e356015aee6ecfa1187ced87aef51364e306f5e695dd52719bf0e78/orjson-3.11.9-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b6ef1979adc4bc243523f1a2ba91418030a8e29b0a99cbe7e0e2d6807d4dce6e", size = 228465, upload-time = "2026-05-06T15:10:44.097Z" }, + { url = "https://files.pythonhosted.org/packages/64/62/3e0e0c14c957133bcd855395c62b55ed4e3b0af23ffea11b032cb1dcbdb1/orjson-3.11.9-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:f36b7f32c7c0db4a719f1fc5824db4a9c6f8bd1a354debb91faf26ebf3a4c71e", size = 128364, upload-time = "2026-05-06T15:10:45.839Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5a/07d8aa117211a8ed7630bda80c8c0b14d04e0f8dcf99bcf49656e4a710eb/orjson-3.11.9-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08f4d8ebb44925c794e535b2bebc507cebf32209df81de22ae285fb0d8d66de0", size = 132063, upload-time = "2026-05-06T15:10:47.267Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ec/4acaf21483e18aa945be74a474c74b434f284b549f275a0a39b9f98956e9/orjson-3.11.9-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6cc7923789694fd58f001cbcac7e47abc13af4d560ebbfcf3b41a8b1a0748124", size = 122356, upload-time = "2026-05-06T15:10:48.765Z" }, + { url = "https://files.pythonhosted.org/packages/13/d8/5f0555e7638801323b7a75850f92e7dfa891bc84fe27a1ba4449170d1200/orjson-3.11.9-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea5c46eb2d3af39e806b986f4b09d5c2706a1f5afde3cbf7544ce6616127173c", size = 129592, upload-time = "2026-05-06T15:10:50.13Z" }, + { url = "https://files.pythonhosted.org/packages/b6/30/ed9860412a3603ceb3c5955bfd72d28b9d0e7ba6ed81add14f83d7114236/orjson-3.11.9-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5d89a2ed90731df3be64bab0aa44f78bff39fdc9d71c291f4a8023aa46425b7", size = 140491, upload-time = "2026-05-06T15:10:51.582Z" }, + { url = "https://files.pythonhosted.org/packages/d0/17/adc514dea7ac7c505527febf884934b815d34f0c7b8693c1a8b39c5c4a57/orjson-3.11.9-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25e4aed0312d292c09f61af25bba34e0b2c88546041472b09088c39a4d828af1", size = 127309, upload-time = "2026-05-06T15:10:53.329Z" }, + { url = "https://files.pythonhosted.org/packages/76/3e/c0b690253f0b82d86e99949af13533363acfb5432ecb5d53dd5b3bce9c34/orjson-3.11.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaea64f3f467d22e70eeed68bdccb3bc4f83f650446c4a03c59f2cba28a108db", size = 134030, upload-time = "2026-05-06T15:10:54.988Z" }, + { url = "https://files.pythonhosted.org/packages/c1/7a/bc82a0bb25e9faaf92dc4d9ef002732efc09737706af83e346788641d4a7/orjson-3.11.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a028425d1b440c5d92a6be1e1a020739dfe67ea87d96c6dbe828c1b30041728b", size = 141482, upload-time = "2026-05-06T15:10:56.663Z" }, + { url = "https://files.pythonhosted.org/packages/01/55/e69188b939f77d5d32a9833745ace31ea5ccae3ab613a1ec185d3cd2c4fb/orjson-3.11.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5b192c6cf397e4455b11523c5cf2b18ed084c1bbd61b6c0926344d2129481972", size = 415178, upload-time = "2026-05-06T15:10:58.446Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1a/b8a5a7ac527e80b9cb11d51e3f6689b709279183264b9ec5c7bc680bb8b5/orjson-3.11.9-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea407d4ccf5891d667d045fecae97a7a1e5e87b3b97f97ae1803c2e741130be0", size = 148089, upload-time = "2026-05-06T15:11:00.441Z" }, + { url = "https://files.pythonhosted.org/packages/97/4e/00503f64204bf859b37213a63927028f30fb6268cd8677fb0a5ad48155e1/orjson-3.11.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f63aaf97afd9f6dec5b1a68e1b8da12bfccb4cb9a9a65c3e0b6c847849e7586", size = 136921, upload-time = "2026-05-06T15:11:02.176Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ba/a23b82a0a8d0ed7bed4e5f5035aae751cad4ff6a1e8d2ecd14d8860f5929/orjson-3.11.9-cp314-cp314-win32.whl", hash = "sha256:e30ab17845bb9fa54ccf67fa4f9f5282652d54faa6d17452f47d0f369d038673", size = 131638, upload-time = "2026-05-06T15:11:03.696Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/0c6798456bade745c75c452342dabacce5798196483e77e643be1f53877d/orjson-3.11.9-cp314-cp314-win_amd64.whl", hash = "sha256:32ef5f4283a3be81913947d19608eacb7c6608026851123790cd9cc8982af34b", size = 127078, upload-time = "2026-05-06T15:11:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/16/21/5a3f1e8913103b703a436a5664238e5b965ec392b555fe68943ea3691e6b/orjson-3.11.9-cp314-cp314-win_arm64.whl", hash = "sha256:eebdbdeef0094e4f5aefa20dcd4eb2368ab5e7a3b4edea27f1e7b2892e009cf9", size = 126687, upload-time = "2026-05-06T15:11:06.602Z" }, +] + +[[package]] +name = "ormsgpack" +version = "1.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/0c/f1761e21486942ab9bb6feaebc610fa074f7c5e496e6962dea5873348077/ormsgpack-1.12.2.tar.gz", hash = "sha256:944a2233640273bee67521795a73cf1e959538e0dfb7ac635505010455e53b33", size = 39031, upload-time = "2026-01-18T20:55:28.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/29/bb0eba3288c0449efbb013e9c6f58aea79cf5cb9ee1921f8865f04c1a9d7/ormsgpack-1.12.2-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5ea60cb5f210b1cfbad8c002948d73447508e629ec375acb82910e3efa8ff355", size = 378661, upload-time = "2026-01-18T20:55:57.765Z" }, + { url = "https://files.pythonhosted.org/packages/6e/31/5efa31346affdac489acade2926989e019e8ca98129658a183e3add7af5e/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3601f19afdbea273ed70b06495e5794606a8b690a568d6c996a90d7255e51c1", size = 203194, upload-time = "2026-01-18T20:56:08.252Z" }, + { url = "https://files.pythonhosted.org/packages/eb/56/d0087278beef833187e0167f8527235ebe6f6ffc2a143e9de12a98b1ce87/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29a9f17a3dac6054c0dce7925e0f4995c727f7c41859adf9b5572180f640d172", size = 210778, upload-time = "2026-01-18T20:55:17.694Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a2/072343e1413d9443e5a252a8eb591c2d5b1bffbe5e7bfc78c069361b92eb/ormsgpack-1.12.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39c1bd2092880e413902910388be8715f70b9f15f20779d44e673033a6146f2d", size = 212592, upload-time = "2026-01-18T20:55:32.747Z" }, + { url = "https://files.pythonhosted.org/packages/a2/8b/a0da3b98a91d41187a63b02dda14267eefc2a74fcb43cc2701066cf1510e/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:50b7249244382209877deedeee838aef1542f3d0fc28b8fe71ca9d7e1896a0d7", size = 387164, upload-time = "2026-01-18T20:55:40.853Z" }, + { url = "https://files.pythonhosted.org/packages/19/bb/6d226bc4cf9fc20d8eb1d976d027a3f7c3491e8f08289a2e76abe96a65f3/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5af04800d844451cf102a59c74a841324868d3f1625c296a06cc655c542a6685", size = 482516, upload-time = "2026-01-18T20:55:42.033Z" }, + { url = "https://files.pythonhosted.org/packages/fb/f1/bb2c7223398543dedb3dbf8bb93aaa737b387de61c5feaad6f908841b782/ormsgpack-1.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cec70477d4371cd524534cd16472d8b9cc187e0e3043a8790545a9a9b296c258", size = 425539, upload-time = "2026-01-18T20:55:24.727Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e8/0fb45f57a2ada1fed374f7494c8cd55e2f88ccd0ab0a669aa3468716bf5f/ormsgpack-1.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:21f4276caca5c03a818041d637e4019bc84f9d6ca8baa5ea03e5cc8bf56140e9", size = 117459, upload-time = "2026-01-18T20:55:56.876Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d4/0cfeea1e960d550a131001a7f38a5132c7ae3ebde4c82af1f364ccc5d904/ormsgpack-1.12.2-cp313-cp313-win_arm64.whl", hash = "sha256:baca4b6773d20a82e36d6fd25f341064244f9f86a13dead95dd7d7f996f51709", size = 111577, upload-time = "2026-01-18T20:55:43.605Z" }, + { url = "https://files.pythonhosted.org/packages/94/16/24d18851334be09c25e87f74307c84950f18c324a4d3c0b41dabdbf19c29/ormsgpack-1.12.2-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bc68dd5915f4acf66ff2010ee47c8906dc1cf07399b16f4089f8c71733f6e36c", size = 378717, upload-time = "2026-01-18T20:55:26.164Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a2/88b9b56f83adae8032ac6a6fa7f080c65b3baf9b6b64fd3d37bd202991d4/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46d084427b4132553940070ad95107266656cb646ea9da4975f85cb1a6676553", size = 203183, upload-time = "2026-01-18T20:55:18.815Z" }, + { url = "https://files.pythonhosted.org/packages/a9/80/43e4555963bf602e5bdc79cbc8debd8b6d5456c00d2504df9775e74b450b/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c010da16235806cf1d7bc4c96bf286bfa91c686853395a299b3ddb49499a3e13", size = 210814, upload-time = "2026-01-18T20:55:33.973Z" }, + { url = "https://files.pythonhosted.org/packages/78/e1/7cfbf28de8bca6efe7e525b329c31277d1b64ce08dcba723971c241a9d60/ormsgpack-1.12.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18867233df592c997154ff942a6503df274b5ac1765215bceba7a231bea2745d", size = 212634, upload-time = "2026-01-18T20:55:28.634Z" }, + { url = "https://files.pythonhosted.org/packages/95/f8/30ae5716e88d792a4e879debee195653c26ddd3964c968594ddef0a3cc7e/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b009049086ddc6b8f80c76b3955df1aa22a5fbd7673c525cd63bf91f23122ede", size = 387139, upload-time = "2026-01-18T20:56:02.013Z" }, + { url = "https://files.pythonhosted.org/packages/dc/81/aee5b18a3e3a0e52f718b37ab4b8af6fae0d9d6a65103036a90c2a8ffb5d/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:1dcc17d92b6390d4f18f937cf0b99054824a7815818012ddca925d6e01c2e49e", size = 482578, upload-time = "2026-01-18T20:55:35.117Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/71c9ba472d5d45f7546317f467a5fc941929cd68fb32796ca3d13dcbaec2/ormsgpack-1.12.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f04b5e896d510b07c0ad733d7fce2d44b260c5e6c402d272128f8941984e4285", size = 425539, upload-time = "2026-01-18T20:56:04.009Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a6/ac99cd7fe77e822fed5250ff4b86fa66dd4238937dd178d2299f10b69816/ormsgpack-1.12.2-cp314-cp314-win_amd64.whl", hash = "sha256:ae3aba7eed4ca7cb79fd3436eddd29140f17ea254b91604aa1eb19bfcedb990f", size = 117493, upload-time = "2026-01-18T20:56:07.343Z" }, + { url = "https://files.pythonhosted.org/packages/3a/67/339872846a1ae4592535385a1c1f93614138566d7af094200c9c3b45d1e5/ormsgpack-1.12.2-cp314-cp314-win_arm64.whl", hash = "sha256:118576ea6006893aea811b17429bfc561b4778fad393f5f538c84af70b01260c", size = 111579, upload-time = "2026-01-18T20:55:21.161Z" }, + { url = "https://files.pythonhosted.org/packages/49/c2/6feb972dc87285ad381749d3882d8aecbde9f6ecf908dd717d33d66df095/ormsgpack-1.12.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7121b3d355d3858781dc40dafe25a32ff8a8242b9d80c692fd548a4b1f7fd3c8", size = 378721, upload-time = "2026-01-18T20:55:52.12Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9a/900a6b9b413e0f8a471cf07830f9cf65939af039a362204b36bd5b581d8b/ormsgpack-1.12.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ee766d2e78251b7a63daf1cddfac36a73562d3ddef68cacfb41b2af64698033", size = 203170, upload-time = "2026-01-18T20:55:44.469Z" }, + { url = "https://files.pythonhosted.org/packages/87/4c/27a95466354606b256f24fad464d7c97ab62bce6cc529dd4673e1179b8fb/ormsgpack-1.12.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:292410a7d23de9b40444636b9b8f1e4e4b814af7f1ef476e44887e52a123f09d", size = 212816, upload-time = "2026-01-18T20:55:23.501Z" }, + { url = "https://files.pythonhosted.org/packages/73/cd/29cee6007bddf7a834e6cd6f536754c0535fcb939d384f0f37a38b1cddb8/ormsgpack-1.12.2-cp314-cp314t-win_amd64.whl", hash = "sha256:837dd316584485b72ef451d08dd3e96c4a11d12e4963aedb40e08f89685d8ec2", size = 117232, upload-time = "2026-01-18T20:55:45.448Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "parso" +version = "0.8.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/9b/560e4be8e26f6fd133a03630a8df0c663b9e8d61b4ade152b72005aec83b/platformdirs-4.11.0.tar.gz", hash = "sha256:0555d18370482847566ffabcaa53ad7c6c1c29f195989ae1ed634a05f76ea1e0", size = 31953, upload-time = "2026-07-21T13:09:36.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/68/d8d58938dfb1370b266a1a729e6d77a985be23689a0496498ee17b2cbf90/platformdirs-4.11.0-py3-none-any.whl", hash = "sha256:360ccded2b7fce0af0ff80cc8f5942a1c5d99b0e856033acb030bfc634709e74", size = 23247, upload-time = "2026-07-21T13:09:35.422Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.53" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/ea/39b988c938f75cb75d7045b5c69f8bfed47ee2152c8837fb403de29d6fb8/prompt_toolkit-3.0.53.tar.gz", hash = "sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6", size = 435492, upload-time = "2026-07-26T20:56:14.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/6f/84908cad2d6aa5144abcf7b42709fe4fdb459bc640ec7ac5786e7693dabc/prompt_toolkit-3.0.53-py3-none-any.whl", hash = "sha256:01c0891d7f9237d5e339f7d3e42cdae80b7534abb1c7c0e3352efba6231492f2", size = 392288, upload-time = "2026-07-26T20:56:12.512Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "psycopg" +version = "3.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/2f/cb91e5502ec9de1de6f1b76cfbf69531932725361168bb06963620c77e2e/psycopg-3.3.4.tar.gz", hash = "sha256:e21207764952cff81b6b8bdacad9a3939f2793367fdac2987b3aac36a651b5bc", size = 165799, upload-time = "2026-05-01T23:31:55.179Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/e0/7b3dee031daae7743609ce3c746565d4a3ed7c2c186479eb48e34e838c64/psycopg-3.3.4-py3-none-any.whl", hash = "sha256:b6bbc25ccf05c8fad3b061d9db2ef0909a555171b84b07f29458a447253d679a", size = 213001, upload-time = "2026-05-01T23:20:50.816Z" }, +] + +[[package]] +name = "psycopg-pool" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/82/7a23d26039827ecd4ebe93905651029ddd307c5182ad59296dfb6f67b528/psycopg_pool-3.3.1.tar.gz", hash = "sha256:b10b10b7a175d5cc1592147dc5b7eec8a9e0834eb3ed2c4a92c858e2f51eb63c", size = 31661, upload-time = "2026-05-01T23:31:59.809Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/ed/89c2c620af0e1660354cd8aabf9f5b21f911597ce22acb37c805d6c86bc8/psycopg_pool-3.3.1-py3-none-any.whl", hash = "sha256:2af5b432941c4c9ad5c87b3fa410aec910ec8f7c122855897983a06c45f2e4b5", size = 40023, upload-time = "2026-05-01T23:31:53.136Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, +] + +[[package]] +name = "regex" +version = "2026.7.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/98/04b13f1ddfb63158025291c02e03eb42fbb7acb51d091d541050eb4e35e8/regex-2026.7.19.tar.gz", hash = "sha256:7e77b324909c1617cbb4c668677e2c6ae13f44d7c1de0d4f15f2e3c10f3315b5", size = 416440, upload-time = "2026-07-19T00:19:48.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/3d/84165e4299ff76f3a40fe1f2abf939e976f693383a08d2beea6af62bd2c1/regex-2026.7.19-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f035d9dc1d25eff9d361456572231c7d27b5ccd473ca7dc0adfce732bd006d40", size = 496552, upload-time = "2026-07-19T00:17:36.808Z" }, + { url = "https://files.pythonhosted.org/packages/02/a2/a65293e6e4cf28eb7ee1be5335a5386c40d6742e9f47fafc8fec785e16c7/regex-2026.7.19-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42572142ed0b9d5d261ba727157c426510da78e20828b66bbb855098b8a4e38", size = 296983, upload-time = "2026-07-19T00:17:38.816Z" }, + { url = "https://files.pythonhosted.org/packages/95/47/2d0564e93d87bc48618360ddca232a2ca612bbdf53ce8465d45ca5ce14ee/regex-2026.7.19-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40b34dd88658e4fedd2fddbf0275ac970d00614b731357f425722a3ed1983d11", size = 291832, upload-time = "2026-07-19T00:17:40.726Z" }, + { url = "https://files.pythonhosted.org/packages/07/cd/42dfbabff3dfc9603c501c0e2e2c5adbb09d127b267bf5348de0af338c15/regex-2026.7.19-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c41c63992bf1874cebb6e7f56fd7d3c007924659a604ae3d90e427d40d4fd13", size = 796775, upload-time = "2026-07-19T00:17:42.382Z" }, + { url = "https://files.pythonhosted.org/packages/df/5d/f6a4839f2b934e3eed5973fd07f5929ee97d4c98939fb275ea23c274ee16/regex-2026.7.19-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d3372064506b94dd2c67c845f2db8062e9e9ba84d04e33cb96d7d33c11fe1ae", size = 865687, upload-time = "2026-07-19T00:17:44.185Z" }, + { url = "https://files.pythonhosted.org/packages/14/b0/b47d6c36049bc59806a50bd4c86ced70bbe058d787f80281b1d7a9b0e024/regex-2026.7.19-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fce7760bf283405b2c7999cab3da4e72f7deca6396013115e3f7a955db9760da", size = 911962, upload-time = "2026-07-19T00:17:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/2a/be/ff61f28f9273658cfe23acbbac5217221f6519960ed401e61dfdab12bc35/regex-2026.7.19-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0d702548d89d572b2929879bc883bb7a4c4709efafe4512cadee56c55c9bd15", size = 801817, upload-time = "2026-07-19T00:17:48.25Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bb/8b4f7f26b333f9f79e1b453613c39bb4776f51d38ae66dd0ba31d6b354ca/regex-2026.7.19-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d446c6ac40bb6e05025ccee55b84d80fe9bf8e93010ffc4bb9484f13d498835f", size = 776908, upload-time = "2026-07-19T00:17:50.183Z" }, + { url = "https://files.pythonhosted.org/packages/09/13/610110fc5921d380516d03c26b652555f08aa0d23ea78a771231873c3638/regex-2026.7.19-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4c3501bfa814ab07b5580741f9bf78dfdfe146a04057f82df9e2402d2a975939", size = 784426, upload-time = "2026-07-19T00:17:52.454Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f5/1ef9e2a83a5947c57ebff0b377cb5727c3d5ec1992317a320d035cd0dbb6/regex-2026.7.19-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c4585c3e64b4f9e583b4d2683f18f5d5d872b3d71dcf24594b74ecc23602fa96", size = 860600, upload-time = "2026-07-19T00:17:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/a0/02/073af33a3ec149241d11c80acea91e722aa0adbf05addd50f251c4fe89c3/regex-2026.7.19-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:571fde9741eb0ccde23dd4e0c1d50fbae910e901fa7e629faf39b2dda740d220", size = 765950, upload-time = "2026-07-19T00:17:56.041Z" }, + { url = "https://files.pythonhosted.org/packages/81/a9/d1e9f819dc394a568ef370cd56cf25394e957a2235f8370f23b576e5a475/regex-2026.7.19-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:15b364b9b98d6d2fe1a85034c23a3180ff913f46caddc3895f6fd65186255ccc", size = 851794, upload-time = "2026-07-19T00:17:57.897Z" }, + { url = "https://files.pythonhosted.org/packages/03/3a/8ae83eda7579feacdf984e71fb9e70635fb6f832eeddca58427ec4fca926/regex-2026.7.19-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffd8893ccc1c2fce6e0d6ca402d716fe1b29db70c7132609a05955e31b2aa8f2", size = 789845, upload-time = "2026-07-19T00:17:59.97Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/c195cbfe5a75fdec64d8f6554fd15237b837919d2c61bdc141d7c807b08b/regex-2026.7.19-cp313-cp313-win32.whl", hash = "sha256:f0fa4fa9c3632d708742baf2282f2055c11d888a790362670a403cbf48a2c404", size = 267135, upload-time = "2026-07-19T00:18:01.958Z" }, + { url = "https://files.pythonhosted.org/packages/b2/80/a11de8404b7272b70acb45c1c05987cce60b45d5693da2e176f0e390d564/regex-2026.7.19-cp313-cp313-win_amd64.whl", hash = "sha256:d51ffd3427640fa2da6ade574ceba932f210ad095f65fcc450a2b0a0d454868e", size = 277747, upload-time = "2026-07-19T00:18:04.121Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/0f5c8eff1b4f1f3d83276d365fccecf666afcc7d947420943bf394d07adb/regex-2026.7.19-cp313-cp313-win_arm64.whl", hash = "sha256:c670fe7be5b6020b76bc6e8d2196074657e1327595bca93a389e1a76ab130ad8", size = 277129, upload-time = "2026-07-19T00:18:05.821Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4c/44b74742052cedda40f9ae469532a037112f7311a36669a891fba8984bb0/regex-2026.7.19-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db47b561c9afd884baa1f96f797c9ca369872c4b65912bc691cfa99e68340af2", size = 501134, upload-time = "2026-07-19T00:18:07.567Z" }, + { url = "https://files.pythonhosted.org/packages/f0/45/bbd038b5e39ee5613a5a689290145b40058cc152c41de9cc23639d2b9734/regex-2026.7.19-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65dcd28d3eba2ab7c2fd906485cc301392b47cc2234790d27d4e4814e02cdfda", size = 299418, upload-time = "2026-07-19T00:18:09.38Z" }, + { url = "https://files.pythonhosted.org/packages/65/38/c5bde94b4cedfd5850d64c3f08222d8e1600e84f6ee71d9b44b4b8163f74/regex-2026.7.19-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f2e7f8e2ab6c2922be02c7ec45185aa5bd771e2e57b95455ee343a44d8130dff", size = 294486, upload-time = "2026-07-19T00:18:11.188Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6a/2f5e107cb26c960b781967178899daf2787a7ab151844ed3c01d6fc95474/regex-2026.7.19-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe31f28c94402043161876a258a9c6f757cb485905c7614ce8d6cd40e6b7bdc1", size = 811643, upload-time = "2026-07-19T00:18:12.975Z" }, + { url = "https://files.pythonhosted.org/packages/37/d4/a2f963406d7d73a62eed84ba05a258afb6cad1b21aa4517443ce40506b78/regex-2026.7.19-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f8f6fa298bb4f7f58a33334406218ba74716e68feddf5e4e54cd5d8082705abf", size = 871081, upload-time = "2026-07-19T00:18:14.733Z" }, + { url = "https://files.pythonhosted.org/packages/45/a3/44be546340bedb15f13063f5e7fe16793ea4d9ea2e805d09bd174ac27724/regex-2026.7.19-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cc1b2440423a851fad781309dd87843868f4f66a6bcd1ddb9225cf4ec2c84732", size = 917372, upload-time = "2026-07-19T00:18:16.724Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f6/e0870b0fd2a40dba0074e4b76e514b21313d37946c9248453e34ec43923e/regex-2026.7.19-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ac59a0900474a52b7c04af8196affc22bd9842acb0950df12f7b813e983609a", size = 816089, upload-time = "2026-07-19T00:18:18.617Z" }, + { url = "https://files.pythonhosted.org/packages/ae/27/957e8e22690ad6634572b39b71f130a6105f4d0718bb16849eac00fff147/regex-2026.7.19-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4896db1f4ce0576765b8272aa922df324e0f5b9bb2c3d03044ff32a7234a9aba", size = 785206, upload-time = "2026-07-19T00:18:20.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/a4/186e410941e731037c01166069ab86da9f65e8f8110c18009ccf4bd623ee/regex-2026.7.19-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4e6883a021db30511d9fb8cfb0f222ce1f2c369f7d4d8b0448f449a93ba0bdfc", size = 800431, upload-time = "2026-07-19T00:18:22.716Z" }, + { url = "https://files.pythonhosted.org/packages/73/9f/e4e10e023d291d64a33e246610b724493bf1ce98e0e59c9b7c837e5acfb7/regex-2026.7.19-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:09523a592938aa9f587fb74467c63ff0cf88fc3df14c82ab0f0517dcf76aaa62", size = 864906, upload-time = "2026-07-19T00:18:24.772Z" }, + { url = "https://files.pythonhosted.org/packages/24/57/ccb20b6be5f1f52a053d1ba2a8f7a077edb9d918248b8490d7506c6832b3/regex-2026.7.19-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:1ebac3474b8589fce2f9b225b650afd61448f7c73a5d0255a10cc6366471aed1", size = 773559, upload-time = "2026-07-19T00:18:27.008Z" }, + { url = "https://files.pythonhosted.org/packages/a3/82/f3b263cf8fad927dc102891da8502e718b7ff9d19af7a2a07c03865d7188/regex-2026.7.19-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4a0530bb1b8c1c985e7e2122e2b4d3aedd8a3c21c6bfddae6767c4405668b56e", size = 857739, upload-time = "2026-07-19T00:18:29.107Z" }, + { url = "https://files.pythonhosted.org/packages/47/2e/1687bd1b6c2aed5e672ccf845fc11557821fe7366d921b50889ea5ce57bf/regex-2026.7.19-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2ef7eeb108c47ce7bcc9513e51bcb1bf57e8f483d52fce68a8642e3527141ae0", size = 804522, upload-time = "2026-07-19T00:18:31.362Z" }, + { url = "https://files.pythonhosted.org/packages/76/7c/cc4e7655181b2d9235b704f2c5e19d8eff002bbc437bae59baee0e381aca/regex-2026.7.19-cp313-cp313t-win32.whl", hash = "sha256:64b6ca7391a1395c2638dd5c7456d67bea44fc6c5e8e92c5dc8aa6a8f23292b4", size = 269141, upload-time = "2026-07-19T00:18:33.479Z" }, + { url = "https://files.pythonhosted.org/packages/bb/14/961b4c7b05a2391c32dbc85e27773076671ef8f97f36cec70fe414734c02/regex-2026.7.19-cp313-cp313t-win_amd64.whl", hash = "sha256:f04b9f56b0e0614c0126be12c2c2d9f8850c1e57af302bd0a63bed379d4af974", size = 280036, upload-time = "2026-07-19T00:18:35.419Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/795644550d788ddbb6dc458c95895f8009978ea6d6ea76b005eb3f45e8c9/regex-2026.7.19-cp313-cp313t-win_arm64.whl", hash = "sha256:fcee38cd8e5089d6d4f048ba1233b3ad76e5954f545382180889112ff5cb712d", size = 279394, upload-time = "2026-07-19T00:18:37.454Z" }, + { url = "https://files.pythonhosted.org/packages/d2/25/0c4c452f8ef3efe456745b2f33195f5904b573fb4c2ff3f0cb9ec188461e/regex-2026.7.19-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:a81758ed242b861b72e778ba34d41366441a2e10b16b472784c88da2dea7e2dd", size = 496750, upload-time = "2026-07-19T00:18:39.633Z" }, + { url = "https://files.pythonhosted.org/packages/24/9e/b70ca6c1704f6c7cd32a9e143c86cc5968d10981eca284bad670c245ea7d/regex-2026.7.19-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4aa5435cdb3eb6f55fe98a171b05e3fbcd95fadaa4aa32acf62afd9b0cfdbcac", size = 297093, upload-time = "2026-07-19T00:18:41.583Z" }, + { url = "https://files.pythonhosted.org/packages/87/74/0b692da2520d51fbff19c88b83d97e4c702909dd02386c585998b7e2dbed/regex-2026.7.19-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:60be8693a1dadc210bbcbc0db3e26da5f7d01d1d5a3da594e99b4fa42df404f5", size = 292043, upload-time = "2026-07-19T00:18:43.347Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a7/1d478e614016045a33feae57446215f9fd65b665a5ceb2f891fb3183bc52/regex-2026.7.19-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d19662dbedbe783d323196312d38f5ba53cf56296378252171985da6899887d3", size = 797214, upload-time = "2026-07-19T00:18:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ae/11b9c9411d92c30e3d2db32df5a31133e4a99a8fc397a604fd08f6c4bffb/regex-2026.7.19-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d15df07081d91b76ff20d43f94592ee110330152d617b730fdbe5ef9fb680053", size = 866433, upload-time = "2026-07-19T00:18:47.315Z" }, + { url = "https://files.pythonhosted.org/packages/b1/62/2b2efc4992f91d6d204b24c647c9f9412e85379d92b7c0ab9fdae622327e/regex-2026.7.19-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:56ad4d9f77df871a99e25c37091052a02528ec0eb059de928ee33956b854b45b", size = 911360, upload-time = "2026-07-19T00:18:49.588Z" }, + { url = "https://files.pythonhosted.org/packages/14/71/986ceea9aa3da548bf1357cad89b63915ec6d21ec957c8113b29ece567df/regex-2026.7.19-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7322ec6cc9fba9d49ab888bb82d67ac5625627aa168f0165139b17018df3fb8a", size = 801275, upload-time = "2026-07-19T00:18:51.767Z" }, + { url = "https://files.pythonhosted.org/packages/15/be/ce9d9534b2cda96eab32c548261224b9b4e220a4126f098f60f42ae7b4cd/regex-2026.7.19-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9c7472192ebfad53a6be7c4a8bfb2d64b81c0e93a1fc8c57e1dd0b638297b5d1", size = 777131, upload-time = "2026-07-19T00:18:54.053Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/58b5c710f2c3929515a25f3a1ca0dad0dcd4518d4fff3cf23bc7adb8dcd2/regex-2026.7.19-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c10b82c2634df08dfb13b1f04e38fe310d086ee092f4f69c0c8da234251e556e", size = 785020, upload-time = "2026-07-19T00:18:56.579Z" }, + { url = "https://files.pythonhosted.org/packages/84/03/5fe091935b74f15fe0f97998c215cae418d1c0413f6258c7d4d2e83aa37f/regex-2026.7.19-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:17ed5692f6acc4183e98331101a5f9e4f64d72fe58b753da4d444a2c77d05b12", size = 861263, upload-time = "2026-07-19T00:18:58.64Z" }, + { url = "https://files.pythonhosted.org/packages/d8/fa/d60bf82e10841eef62a9e32aac401468f05fddfbcb2942e342b1ba3d2433/regex-2026.7.19-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:22a992de9a0d91bda927bf02b94351d737a0302905432c88a53de7c4b9ce62e2", size = 766199, upload-time = "2026-07-19T00:19:00.705Z" }, + { url = "https://files.pythonhosted.org/packages/bf/5d/11e64d151b0662b81d6bf644c74dc118d461df85bdf2577fadbbf751788a/regex-2026.7.19-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:618a0aed532be87294c4477b0481f3aa0f1520f4014a4374dd4cf789b4cd2c97", size = 851317, upload-time = "2026-07-19T00:19:03.015Z" }, + { url = "https://files.pythonhosted.org/packages/7c/34/532efb87488d90807bae6a443d357ee5e2728a478c597619c8aaa17cc0bd/regex-2026.7.19-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ce9e679f776649746729b6c86382da519ef649c8e34cc41df0d2e5e0f6c36d4", size = 789557, upload-time = "2026-07-19T00:19:05.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/90/3a8d5ca977171ec3ae21a71207d2228b2663bde14d7f7ef0e6363ecf9290/regex-2026.7.19-cp314-cp314-win32.whl", hash = "sha256:73f272fba87b8ccfe70a137d02a54af386f6d27aa509fbffdd978f5947aae1aa", size = 272531, upload-time = "2026-07-19T00:19:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/96/e1/8862885e70409de70e8c005f57fb2e7be8d9ef0317250d60f4c9660a300d/regex-2026.7.19-cp314-cp314-win_amd64.whl", hash = "sha256:d721e53758b2cca74990185eb0671dd466d7a388a1a45d0c6f4c13cef41a68ac", size = 280831, upload-time = "2026-07-19T00:19:09.46Z" }, + { url = "https://files.pythonhosted.org/packages/08/82/2693e53e29f9104d9de95d37ce4dd826bd32d5f9c0085d3aa6ac042675c4/regex-2026.7.19-cp314-cp314-win_arm64.whl", hash = "sha256:65fa6cb38ed5e9c3637e68e544f598b39c3b86b808ed0627a67b68320384b459", size = 281099, upload-time = "2026-07-19T00:19:11.398Z" }, + { url = "https://files.pythonhosted.org/packages/92/b7/9a01aa16461a18cde9d7b9c3ab21e501db2ce33725f53014342b91df2b0a/regex-2026.7.19-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:5a2721c8720e2cb3c209925dfb9200199b4b07361c9e01d321719404b21458b3", size = 501121, upload-time = "2026-07-19T00:19:13.425Z" }, + { url = "https://files.pythonhosted.org/packages/f3/5e/bbaeca815dc9191c424c94a4fdc5c87c75748a64a6271821212ebdd4e1a3/regex-2026.7.19-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:199535629f25caf89698039af3d1ad5fcae7f933e2112c73f1cdf49165c99518", size = 299415, upload-time = "2026-07-19T00:19:15.43Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d6/0dd1a321afaab95eb7ff44aa0f637301786f1dc71c6b797b9ed236ed8890/regex-2026.7.19-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9b60d7814174f059e5de4ab98271cc5ba9259cfea55273a81544dceea32dc8d9", size = 294483, upload-time = "2026-07-19T00:19:17.879Z" }, + { url = "https://files.pythonhosted.org/packages/92/5f/40bacf91d0904f812e13bbbab3864604c463eced8afdc54aeaa50492ea95/regex-2026.7.19-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbece16025afda5e3031af0c4059207e61dcf73ef13af844964f57f387d1c435", size = 811833, upload-time = "2026-07-19T00:19:20.102Z" }, + { url = "https://files.pythonhosted.org/packages/94/7c/4902744261f775aeede8b5627314b38482da29cf49a57b66a6fb753246c5/regex-2026.7.19-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d24ecb4f5e009ea0bd275ee37ad9953b32005e2e5e60f8bbae16da0dbbf0d3a0", size = 871270, upload-time = "2026-07-19T00:19:22.365Z" }, + { url = "https://files.pythonhosted.org/packages/16/70/6980c9be6bf21c0a60ed3e0aea39cf419ecf3b08d1d9947bc56e196ef186/regex-2026.7.19-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8cae6fd77a5b72dae505084b1a2ee0360139faf72fedbab667cd7cc65aae7a6a", size = 917534, upload-time = "2026-07-19T00:19:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/52/92/8b2bd872782ce8c42691e39acb38eb8efe014e5ddb78ad7d943d6f197ce9/regex-2026.7.19-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9724e6cb5e478cd7d8cabf027826178739cb18cf0e117d0e32814d479fa02276", size = 816135, upload-time = "2026-07-19T00:19:26.919Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/33a602f657bdc4041f17d79f92ab18261d255d91a06117a6e29df023e5e2/regex-2026.7.19-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:572fc57b0009c735ee56c175ea021b637a15551a312f56734277f923d6fd0f6c", size = 785492, upload-time = "2026-07-19T00:19:29.192Z" }, + { url = "https://files.pythonhosted.org/packages/9e/36/0987cf4cb271680064a70d24a475873775a151d0b7058698a006cb0cae4a/regex-2026.7.19-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:20568e182eb82d39a6bf7cff3fd58566f14c75c6f74b2c8c96537eecf9010e3a", size = 800658, upload-time = "2026-07-19T00:19:31.392Z" }, + { url = "https://files.pythonhosted.org/packages/a8/24/c14f31c135e1ba55fa4f9a58ca98d0842512bf6188230763c31c8f449e3b/regex-2026.7.19-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:1d58561843f0ff7dc78b4c28b5e2dc388f3eff94ebc8a232a3adba961fc00009", size = 865073, upload-time = "2026-07-19T00:19:33.485Z" }, + { url = "https://files.pythonhosted.org/packages/14/85/181a12211f22469f24d2de1ebddfe397d2396e2c29013b9a58134a91069a/regex-2026.7.19-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:61bb1bd45520aacd56dd80943bd34991fb5350afdd1f36f2282230fd5154a218", size = 773684, upload-time = "2026-07-19T00:19:35.599Z" }, + { url = "https://files.pythonhosted.org/packages/23/58/bd1a0c1a62251366f8d21f41b1ea3c76994962071b8b6ea42f72d505c0f0/regex-2026.7.19-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:cd3584591ea4429026cdb931b054342c2bcf189b44ff367f8d5c15bc092a2966", size = 857769, upload-time = "2026-07-19T00:19:37.738Z" }, + { url = "https://files.pythonhosted.org/packages/e4/4f/f7e2dad6756b2fe1fe75dd90a628c3b45f249d39f948dd90cd2476325417/regex-2026.7.19-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cc26a66e212fa5d6c6170c3a40d99d888db3020c6fdab1523250d4341382e44", size = 804546, upload-time = "2026-07-19T00:19:40.229Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d7/01d31d5bdb09bc026fab77f59a371fdf8f9b292e4810546c56182ca70498/regex-2026.7.19-cp314-cp314t-win32.whl", hash = "sha256:2c4e61e2e1be56f63ec3cc618aa9e0de81ef6f43d177205451840022e24f5b78", size = 274526, upload-time = "2026-07-19T00:19:42.398Z" }, + { url = "https://files.pythonhosted.org/packages/52/0e/cea4ce73bc0a8247a0748228ae6669984c7e1f8134b6fa66e59c0572e0ea/regex-2026.7.19-cp314-cp314t-win_amd64.whl", hash = "sha256:c639ea314df70a7b2811e8020448c75af8c9445f5a60f8a4ced81c306a9380c2", size = 283763, upload-time = "2026-07-19T00:19:44.644Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b6/26e41975febae63b7a6e3e02f32cff6cff2e4f10d19c929082f56aebf7c6/regex-2026.7.19-cp314-cp314t-win_arm64.whl", hash = "sha256:9a15e785f244f3e07847b984ce8773fc3da10a9f3c131cc49a4c5b4d672b4547", size = 283451, upload-time = "2026-07-19T00:19:46.639Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "tenacity" +version = "9.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/c6/ee486fd809e357697ee8a44d3d69222b344920433d3b6666ccd9b374630c/tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a", size = 49413, upload-time = "2026-02-07T10:45:33.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55", size = 28926, upload-time = "2026-02-07T10:45:32.24Z" }, +] + +[[package]] +name = "tiktoken" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986, upload-time = "2026-05-15T04:51:27.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/83/b096c859c2a47c11731bf2f5885f4028b809dfe2396582883eed9cae372f/tiktoken-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5df5d1507bd245f1ccad4a074698240021239e455eb0bb4ced4e3d7181872154", size = 1034228, upload-time = "2026-05-15T04:50:40.988Z" }, + { url = "https://files.pythonhosted.org/packages/53/61/c68e123b6d753e3fc2751e9b18e732c9d8bf1e1926762e736eee935d931c/tiktoken-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8fe806a50664e83a6ffd56cbd1e4f5dcc6cd32a3e7538f70dc38b1a271384545", size = 982978, upload-time = "2026-05-15T04:50:42.195Z" }, + { url = "https://files.pythonhosted.org/packages/ef/8b/96cc178cc584e65d363134500f297790b06cd48cdeb1e8fcf7bbe60f4715/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:125bc05005e747f993a83dc67934249932d6e4209854452cd4c0b1d53fba3ba2", size = 1116355, upload-time = "2026-05-15T04:50:43.564Z" }, + { url = "https://files.pythonhosted.org/packages/86/f5/bab735d2c72ea55404b295d02d092644eb5f7cc6205e34d35eb9abfb9ab2/tiktoken-0.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:5e6358911cab4adee6712da27d65573496a4f68cf8a2b5fca6a4ad10fc5748cf", size = 1135772, upload-time = "2026-05-15T04:50:44.782Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b9/6de04ebdf904edfaad87788011b3735087a0c9ea671b9027e1e4e965e8c8/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:975cbd78d085d75d26b59660e262736dcaed1e35f8f142cd6291025c01d25486", size = 1182415, upload-time = "2026-05-15T04:50:46.422Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9c/470a05f3b1caf038f44880e334d47ab674e0c80d514c66b375d14d5afa10/tiktoken-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ab9bc99fa020a4c283424590ecd7f3afd70c1c281cb3fa3192a6c3af9f9615", size = 1239879, upload-time = "2026-05-15T04:50:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/42/a6/c1936d16055436cb32e6c6128d68629622e00f4768562f55653752d34768/tiktoken-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b1615f0ff71953d19729ceb18865429c185b0a23c5353f1bbca34a394bf60f7", size = 874829, upload-time = "2026-05-15T04:50:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/d6/07/acb5992c3772b5a36284f742cfb7a5895aa4471d1848ac31464ad50d7fdf/tiktoken-0.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6eb4a5bfbc6426938026b1a334e898ac53541360d62d8c689870160cc80abd67", size = 1033600, upload-time = "2026-05-15T04:50:50.4Z" }, + { url = "https://files.pythonhosted.org/packages/14/e9/742e9aec30f59b9f161f7ff7cd072e02ea836c9e1c0854a8076dfcd40d5c/tiktoken-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:43cee3e5400573b2046fbf092cc7a5bc30164f9e4c95ce20714da929df48737a", size = 982516, upload-time = "2026-05-15T04:50:52.03Z" }, + { url = "https://files.pythonhosted.org/packages/72/74/ca1541b053e7648254d2e4b42a253e1bb4359f2c91a0a8d49228c794e1a0/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7de52e3f566d19b3b11bd37eea552c6c305ad74081f736882bd44d148ed4c48d", size = 1115518, upload-time = "2026-05-15T04:50:53.543Z" }, + { url = "https://files.pythonhosted.org/packages/46/e3/93825eaf5a4a504795b787e5d5dea07fbeb3dabf97aa7b450be8bde59c89/tiktoken-0.13.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:51384448aa508e4df84c0f7c1dc3211c7f7b8096325660ee5fc82f3e11b381ce", size = 1136867, upload-time = "2026-05-15T04:50:55.191Z" }, + { url = "https://files.pythonhosted.org/packages/8c/46/002b68de6827091d5ae90b048f326e8aad8d953520950e5ce1508879414f/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e28157350f7ebf35008dd8e9e0fdb621f976e4230c881099c85e8cf07eaa50e2", size = 1181826, upload-time = "2026-05-15T04:50:56.296Z" }, + { url = "https://files.pythonhosted.org/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489, upload-time = "2026-05-15T04:50:57.918Z" }, + { url = "https://files.pythonhosted.org/packages/b7/4d/bc07d1f1635d4897a202acc0ae11c2886eaa7325c359ba4741b47bf8e225/tiktoken-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6c43a675ca14f6f2749ba7f12075d37456015a24b859f2517b9beb4ef30807ec", size = 873820, upload-time = "2026-05-15T04:50:59.528Z" }, + { url = "https://files.pythonhosted.org/packages/8c/93/0dd6adca026a616c3a92974566b43381eea4b475ce1f36c062b8271a9ac5/tiktoken-0.13.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaaaef47c2406277181d2086484c317bf7fc433e2d5d03ff94f56b0dcec87471", size = 1034977, upload-time = "2026-05-15T04:51:00.957Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5ec6e6bc5b30bed6d93f7f2162d8f6b32437b3ba27cb527cfe004f6109c9/tiktoken-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ca8b310bd93b3772cb1b7922d915446864860f562bdfe4825c63a0aed3fb28cd", size = 983635, upload-time = "2026-05-15T04:51:02.629Z" }, + { url = "https://files.pythonhosted.org/packages/94/b0/c8ae9aff00d625c50659b4513e707a0462c4bf5d4d6cc1b802103225c02e/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:32e0c12305105002c047b3bb1070b0dd9a73b0cb3b2856a8972b810e7a4f5881", size = 1116036, upload-time = "2026-05-15T04:51:04.082Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ac/6a5dddd1d0a6018ecb389bd0353e6b4a515eb4d2286611bd0ace1937b9e1/tiktoken-0.13.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:5ba5fd62507a932d1241346179e3b39bc7bf7408f03c272652d93b3bedf5db24", size = 1135544, upload-time = "2026-05-15T04:51:05.229Z" }, + { url = "https://files.pythonhosted.org/packages/f4/b8/585032b4384b2f7dcdaddcb52865c83a701a420d09e3c2b4a2be1c450c57/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d108bc2d470fc53c8ecd24f2c0fd2b5f98c33e87cdb6aa2e9b8c5dced703d273", size = 1182217, upload-time = "2026-05-15T04:51:06.517Z" }, + { url = "https://files.pythonhosted.org/packages/cd/b6/993ff1ded3958215fd341a847b8e5ffeb5de473f435296870d314fc91ac4/tiktoken-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cb99cb5127449f58d0a2d5f5ccfb390d8dbdfd919c221246caaee29d8725ed51", size = 1239404, upload-time = "2026-05-15T04:51:07.843Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3d/fef7e06e3b33e7538db0ced734cf9fe23b6832d2ac4990c119c377aec55e/tiktoken-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:115c4f26ffa11caac8b54eea35c2ad38c612c20a48d35dd15d70a02ac6f51f58", size = 918686, upload-time = "2026-05-15T04:51:08.925Z" }, + { url = "https://files.pythonhosted.org/packages/c1/82/a7fc44582bc32ab00de988a2299bf77c077f59068b233109e34b7d6ca7e6/tiktoken-0.13.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:472527e9132952f2fbf77cd290658bacf003d4d5a3fabc18e5fbd407cbae4d9b", size = 1034454, upload-time = "2026-05-15T04:51:10.035Z" }, + { url = "https://files.pythonhosted.org/packages/37/d0/24d8a890c14f432a05cea669c17bebeaa99f96a7c79523b590f564246411/tiktoken-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e2f67d27c9626cdd25fe33d9313c5cdb3d8d82da646b68d6eb8e7e9c20e6448", size = 982976, upload-time = "2026-05-15T04:51:11.23Z" }, + { url = "https://files.pythonhosted.org/packages/49/b7/2ab43f62788a9266187a9bfc1d3af99ad83e5eaa25fbef168a69cd5ad14f/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2b920b35805cd64585a37c3dc7ce65fba4d2d36016be01e1d7942482ca29093a", size = 1115526, upload-time = "2026-05-15T04:51:12.608Z" }, + { url = "https://files.pythonhosted.org/packages/64/39/1494321ed323ce7a14d88e3cd6cb9058625977df1c6961ddc492bd10a9f3/tiktoken-0.13.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:493af3aa28a4aaf2e3d2600a2ee717252c9bf5ab38fff94eb5a02db5ab77e5ad", size = 1136466, upload-time = "2026-05-15T04:51:13.926Z" }, + { url = "https://files.pythonhosted.org/packages/96/d9/dfd086aa2d918c563a140720e0ce296cada1634efd2783d5cf51e05f984e/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6644c9c2b5cf3916f5a3641d7d12fdb3f006a7b3d9ff6acdaec44e29ab1ff91e", size = 1181863, upload-time = "2026-05-15T04:51:15.025Z" }, + { url = "https://files.pythonhosted.org/packages/2f/68/a18b4f307086954fdae32714cb4f85562e34f9d34ab206e61f1816aa6018/tiktoken-0.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5cb65b60b9408563676d874a3a4ee573370066f0dc4e29d84e82e989c6517424", size = 1239218, upload-time = "2026-05-15T04:51:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/16/5b/f2aa703a4fc5d2dff73460a7d46cc2f3f44aa0f3dd8eeb20d2a0ecf68862/tiktoken-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:85b78cc3a2c3d48723ca751fa981f1fedccd54194ca0471b957364353a898b07", size = 918110, upload-time = "2026-05-15T04:51:17.237Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/24/95ec527ad67b76d59299e5465b3935d05e4294b7e0290a3924b7487df30b/tornado-6.5.7.tar.gz", hash = "sha256:66c513a76cda70d53907bc27cf1447557699c2e95aa48ba27a442ff61c3ddfc2", size = 519252, upload-time = "2026-06-08T17:34:51.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/dc/c7043cab6fed8ae159fc1923ce829ada35c4dbd797d408a43858ffaf9639/tornado-6.5.7-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:148b2eb15c2c765a50796172c1e499649b35f30d2e3c3d3e15913cfa56bfb163", size = 448543, upload-time = "2026-06-08T17:34:38.052Z" }, + { url = "https://files.pythonhosted.org/packages/92/4f/090b1431e5a43df696feceffc268c5383cc079ecb5f08ce58f917109aafe/tornado-6.5.7-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9da38de27f1da3b78a966f0dae12b5a1ea9afe72ca805d84ff06508272ddf100", size = 446707, upload-time = "2026-06-08T17:34:39.594Z" }, + { url = "https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972", size = 449774, upload-time = "2026-06-08T17:34:41.204Z" }, + { url = "https://files.pythonhosted.org/packages/35/37/d434c73f4c6e014b745b9b37085f34f40c022f007efff3d7fe65991899f3/tornado-6.5.7-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b", size = 450745, upload-time = "2026-06-08T17:34:42.531Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2b/56b9aff361d7f1ab728a805ec7d7ea835f8807afa9f5cc690ea0e630efb9/tornado-6.5.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92", size = 450578, upload-time = "2026-06-08T17:34:43.787Z" }, + { url = "https://files.pythonhosted.org/packages/02/30/a7444fb23aa76860a14198fab96ac79f1866b0a6e19e26c4381b0938e50f/tornado-6.5.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5", size = 449985, upload-time = "2026-06-08T17:34:45.326Z" }, + { url = "https://files.pythonhosted.org/packages/5c/42/5f0e56c01e8d9d36f4e23f367b85ae6cae0c1ecddd5e6977d8388ad27488/tornado-6.5.7-cp39-abi3-win32.whl", hash = "sha256:f8de3bf12d3efdd0cbe7c8887868198f8a91415e3f29fcf258d9b8eb7b1d9ae4", size = 451047, upload-time = "2026-06-08T17:34:46.784Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/b393076ffb21b469eec5b328a0534cf03a3b90bfc6b1f09507cdd075d938/tornado-6.5.7-cp39-abi3-win_amd64.whl", hash = "sha256:de942f843533a039ef9fa3d9c88c7cd8a7c94553fb5ad0154270989b3d99a2c4", size = 451485, upload-time = "2026-06-08T17:34:48.248Z" }, + { url = "https://files.pythonhosted.org/packages/71/2e/7b1c769803121b809112cf9a00681c472eae1d80e32d7ec0e0bd61d0d0e1/tornado-6.5.7-cp39-abi3-win_arm64.whl", hash = "sha256:ff934fce95643af5f11efdae618eaa73d469dc588641e5c8d19295a0c65c4796", size = 450506, upload-time = "2026-06-08T17:34:49.702Z" }, +] + +[[package]] +name = "tqdm" +version = "4.70.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/3b/6c24bec5be5e743ffd99576daa5cc077722fc7d5bbc00bd133fa0c698dc6/tqdm-4.70.0.tar.gz", hash = "sha256:55b0b0dbd97462d06ebee91e4dac24ed4d4702be82b24f07e6c1d27e08cea220", size = 795438, upload-time = "2026-07-27T11:33:15.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/1c/01bfd571a64e7f270e6bab5e33777debe0edc56759233ce84f27dec92d14/tqdm-4.70.0-py3-none-any.whl", hash = "sha256:7f585706bfddbdebf89daac705b2dfcc16890130727d3197ca62c732b4310953", size = 80184, upload-time = "2026-07-27T11:33:13.167Z" }, +] + +[[package]] +name = "traitlets" +version = "5.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/a9/a2584b8313b89f94869ddb3c4074617a691de1812a614d2d50e32ca5a7a6/traitlets-5.15.1.tar.gz", hash = "sha256:7b1c07854fe25acb39e009bae49f11b79ff6cbb2f27999104e9110e7a6b53722", size = 163344, upload-time = "2026-06-03T12:26:06.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/8d/1080ee4c231f361b6ce4470d556c8c435b67c7e0753aaa641497ee92f88b/traitlets-5.15.1-py3-none-any.whl", hash = "sha256:770a53705f84b81ac107e83a1b3328ff2dae16094d8fc3cfc004e4b22dfd8e92", size = 85858, upload-time = "2026-06-03T12:26:04.395Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "uuid-utils" +version = "0.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/91/63938e0e7e7876658e5e40178e7c0735b53527886fe11797a11699c55edd/uuid_utils-0.17.0.tar.gz", hash = "sha256:abb5667a36119019b3fa320c4d10c21ebccfcc87c8a739e6a0056cee7f48dde2", size = 43220, upload-time = "2026-07-09T13:49:58.433Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/dd/614fb9912157ac0128e6050859ccf06d9f13df9a944a803e8f80f6157e38/uuid_utils-0.17.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d11a7bc1e02da8984d32e6de9e0826c6edac00eac17de270f372bf32f9a0af63", size = 557259, upload-time = "2026-07-09T13:48:45.664Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/d072711704de3d21bec08b6c2f36a215200ca1d5e01a390ea1ac434080a0/uuid_utils-0.17.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7a49f47ac26df3e431c56b825c1bae8e6d3d591fdbb7438c227cc9845a7e3d73", size = 286271, upload-time = "2026-07-09T13:48:47.018Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/8a63e5eb2d5a6ba69a6c2036e305075bd6f5a022e7ea25fc6ce0eb7c51d2/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32df1944808877702ceea398c103881c09a679bb672a215e01c2a84231266bf9", size = 320025, upload-time = "2026-07-09T13:48:48.208Z" }, + { url = "https://files.pythonhosted.org/packages/f7/2d/bdc2caf9719d9090d7c46043242ae6136cba4f7a7ee384992ab905ad9aa1/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98c88d3edd08e7245562e9815996dbc6f0bd4745e1c76462f24af5ae4e187dd1", size = 327931, upload-time = "2026-07-09T13:48:49.673Z" }, + { url = "https://files.pythonhosted.org/packages/b6/33/9219d09d51ead282b578b2a4e0a515c2cce3ec52076cada8bfb7e35727d5/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a4370089c8b2e42f1db51d76408c7fa8eaa2934bf854d17983d16179c07c098", size = 438537, upload-time = "2026-07-09T13:48:50.842Z" }, + { url = "https://files.pythonhosted.org/packages/d8/79/e8e0f8b3955f2081c116157119d87659937893242eb834aa170da04d660b/uuid_utils-0.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09a55b7a5ae764985cb46467496a1787678d0a1400356157a080ad95b1a36869", size = 320656, upload-time = "2026-07-09T13:48:52.164Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5e/d1ceddc430ff04b6e21704b2030d4438074a2f478b265dab43da957791c1/uuid_utils-0.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56aa6488b931246fae11924e4bd0e2b32677e63945eecb71c29e3c2ca0dc3131", size = 345310, upload-time = "2026-07-09T13:48:54.076Z" }, + { url = "https://files.pythonhosted.org/packages/d5/62/89438e12f389a843e626b7e37691319a057b3d6b80914609106891faadda/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:309a35f12d99dde19032bc2259cda6431c85eeac0879134dc777cc3087d7e1cb", size = 496771, upload-time = "2026-07-09T13:48:55.365Z" }, + { url = "https://files.pythonhosted.org/packages/87/d2/eedcd99f522d60e238ead03844f0d51743ba84d33044959e230b756bf212/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:21c79b61ff750abcf057163dd764ccb6196cde7a26cda1b31b45cd97769e03b3", size = 603631, upload-time = "2026-07-09T13:48:56.746Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a8/bb1b38aaddd7243b6e562c6694f499bf094800918316192fd8cb2cdc2620/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4134353bfe3026ddab8e886002dc52bc5a0ab04611aabb0eaae23c32e6e57f64", size = 562008, upload-time = "2026-07-09T13:48:58.241Z" }, + { url = "https://files.pythonhosted.org/packages/b4/77/5f7ed930dc105e293845c09e4d5bd84076318a12f45a46783e1af64906d7/uuid_utils-0.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7c89359affecebe2e39e6a116d069b363c936511a9572b308402489a26957d89", size = 525527, upload-time = "2026-07-09T13:48:59.784Z" }, + { url = "https://files.pythonhosted.org/packages/fd/25/1b55697adf6811a6f92cff6340e6b03e31fd6bc51066a5c10698c29b3679/uuid_utils-0.17.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:6a019a31bc4db89a0903a3e4f6b218571f3a6ff0ad4b3d3fe1c8f91a05ff6e3e", size = 97965, upload-time = "2026-07-09T13:49:01.217Z" }, + { url = "https://files.pythonhosted.org/packages/26/bf/cd729343de4684230be8a966bad7bfc2cf10ce3e643b1189a8b5370dbe35/uuid_utils-0.17.0-cp313-cp313-win32.whl", hash = "sha256:b3131a82d0c7611f0aa480a6d36929e001a3f54ba0fc029a8118a5863cce513c", size = 167316, upload-time = "2026-07-09T13:49:02.354Z" }, + { url = "https://files.pythonhosted.org/packages/76/f0/e602ae0a1b139a7826e5189b93d91902564def06d5006324fd2faf82c8fc/uuid_utils-0.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:9e311f908d2f842fca4c7dcebc4f10306b8089b204ef04cf6704b4332c9ff6ff", size = 173630, upload-time = "2026-07-09T13:49:03.529Z" }, + { url = "https://files.pythonhosted.org/packages/1a/52/024ebece265b387154115dc4f1d9727174ef82623069f4bec8b7ed7e73f7/uuid_utils-0.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:c351737e2e65497c7200ab4ffb8af97e9f48be6488309abdd265fe08d66ee92f", size = 173214, upload-time = "2026-07-09T13:49:04.836Z" }, + { url = "https://files.pythonhosted.org/packages/56/44/e2fd3fdf356e1b55d2acf1b956b4f3f29ffb215a99c387eba04b1c5fba66/uuid_utils-0.17.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:673d89cc434cc9b97a0b4cf61272f6fca70a81f64eb0afbface2a0d9f77f06cd", size = 562232, upload-time = "2026-07-09T13:49:06.201Z" }, + { url = "https://files.pythonhosted.org/packages/19/28/65e0980d668a6d44e699f59d1acf43d6b5d4893592c115ce7c680bb4dfa1/uuid_utils-0.17.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:387cf7437c94ddec08651a0f1081381299c7075bc48a6251d8922bf39973378a", size = 287858, upload-time = "2026-07-09T13:49:07.45Z" }, + { url = "https://files.pythonhosted.org/packages/8f/8d/5e97bcebc90fb6a10f98af3dc1ba552e04183aba59e2edc0b9cf486dd998/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:220b52746d99e11964badac3c0869016e0c24bafb70a7dd5c2c072a6be3da9cc", size = 321587, upload-time = "2026-07-09T13:49:09.489Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d7/88b2a2370cc3d455ba0515fb6f5c8f7ac0c0f55a86801b6e56a432f22c17/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0ab4a66e7a035ad6625cfc1fbdb34f5c2d25a80ae1ef4bfee458ea2036333c6d", size = 328964, upload-time = "2026-07-09T13:49:11.292Z" }, + { url = "https://files.pythonhosted.org/packages/bd/0f/181c5da673953dfc0958cb4fb3a4984a9098673ddb05cac68e994bc8511b/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5641071337eb11d61a001ea08793bf72216f3241f0a433ed2764804b2a3e3cc7", size = 442909, upload-time = "2026-07-09T13:49:12.644Z" }, + { url = "https://files.pythonhosted.org/packages/ec/38/5c5e665af542884a8fd3c61725c38453239e13940326b5b70f3ef8881a97/uuid_utils-0.17.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9082e709014946b1f6e96ae6ecd93652efca2d2a6a3ab67dbe151c8b4bf193a4", size = 323076, upload-time = "2026-07-09T13:49:13.897Z" }, + { url = "https://files.pythonhosted.org/packages/f5/35/7de97de18cbf226c2a4f2104ad15e56ca4491717c81c0b71795c0c585b4e/uuid_utils-0.17.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1fd6f0e8a162dc0e9255b6aebe3cd175e76c33202f1bf39da9e6294b93db0099", size = 347360, upload-time = "2026-07-09T13:49:15.237Z" }, + { url = "https://files.pythonhosted.org/packages/26/a1/9915d5dd59fdd1957ded5d188c0ea0b9db5a1d84d42c8d8828a7b83b366e/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d63010803d7c368963bbe6f7ec379593e76dd581d7db0f29118d88713c9e0354", size = 499267, upload-time = "2026-07-09T13:49:16.774Z" }, + { url = "https://files.pythonhosted.org/packages/c0/05/88108405262ec850cea0f95733445d6873e5772af3292baabd9ef8457740/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a46bedc273b6f58f11dee816ff74999625ef8d007890f411b7a4975bf1c89330", size = 604940, upload-time = "2026-07-09T13:49:18.147Z" }, + { url = "https://files.pythonhosted.org/packages/89/d5/6dbcd300de47cc443cff2656cd5327a385751213dcb2101cfee7388170b2/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:405233a5f625b3d995648f4647fa6befa4567cf3f74e1f6b9837e16f7310f0e0", size = 564172, upload-time = "2026-07-09T13:49:19.593Z" }, + { url = "https://files.pythonhosted.org/packages/ab/94/e8057f2288a415fba8a978bca4b589f5cb6b91a028a5dc07a1775938b33f/uuid_utils-0.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b6c5d2d71e1f17329150ad9427d27f4a3f29a01792e7ecdc64a98ac5368fc4d5", size = 528533, upload-time = "2026-07-09T13:49:21.075Z" }, + { url = "https://files.pythonhosted.org/packages/f0/6b/31713148c77e48e62f51aa042a98a54a8be0396912ea5130f83f52ae722d/uuid_utils-0.17.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f7e9b8728ba07a3cb2f29d5aa1a266c2664eb8ef0fd43afa34627c92f7fac8f0", size = 99197, upload-time = "2026-07-09T13:49:22.351Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f3/ca6f6ac5428312df8ed632f6dd9f9e6aba23090471fcdeae53eab027e8b3/uuid_utils-0.17.0-cp314-cp314-win32.whl", hash = "sha256:58838921e377791ef22c64cc92141bfae030f43651ff9272f0f28a208a9e6a5a", size = 169540, upload-time = "2026-07-09T13:49:23.563Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cd/7ede0db66411fa09817d79b680f7454ea9bee2d374e1922e4efd065760a3/uuid_utils-0.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:42275ebd0e8e74e32cdbfb8bd88fc99576567d51d54a508020611fd8f4f463a0", size = 175984, upload-time = "2026-07-09T13:49:24.703Z" }, + { url = "https://files.pythonhosted.org/packages/f0/81/533b5f80cd4918c0693f4e1b7b90ceb1caa45f4266ae8b528135d7ecca5d/uuid_utils-0.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:b5d11cccba076a32321ef1380dea956821f0b51794ef59df64e58fb1cd543aae", size = 174749, upload-time = "2026-07-09T13:49:25.886Z" }, + { url = "https://files.pythonhosted.org/packages/a0/13/f400ac39d06fd8be5b099c09e41bb975205926722a3e8d53348817cb7ff9/uuid_utils-0.17.0-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fae8b282f0cb22a5de222999f7723f4e5ec04f6fcdf4aaef879b5b36625ae2b0", size = 562610, upload-time = "2026-07-09T13:49:27.374Z" }, + { url = "https://files.pythonhosted.org/packages/03/8c/c71c8312304c56f6d0bcba87cd402fa79bec35d18ffc8c41954196ca68e5/uuid_utils-0.17.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:967955620df45e6cffe2e9950cb9903cb455649396f896b26b04363a91a5054b", size = 289473, upload-time = "2026-07-09T13:49:28.989Z" }, + { url = "https://files.pythonhosted.org/packages/bb/cd/522117e2e5184ca1d4f0f85ee833e9e21bd8c6b99eff8a4d1a8e5a194e33/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375cde148430d60a4a07c03abaa0774c4fddfdd90de99b4ba02f24088bc9d750", size = 321600, upload-time = "2026-07-09T13:49:30.4Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f4/0d81f9bd346fc717bc561c08fa6457e0328966eb76e536b938fe77d56459/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:975c17da26c5b9d46c336b03c52a057ac28378d6f9d98b58d32a038589bb3912", size = 329569, upload-time = "2026-07-09T13:49:31.732Z" }, + { url = "https://files.pythonhosted.org/packages/5e/41/26e1363f36a94c9e8ec2dd21d5f63088d3e7c723adbb12dcc8fdc77be417/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3150d836290c88f1d26eb59c4db280d87417dd3bfaadd2889c77416c8f0ff6fa", size = 442051, upload-time = "2026-07-09T13:49:33.024Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a7/2c1ed1b34d7df7fdcc11c28fd26d94d44843b37d9af2435ff9fd8abdbc08/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9472a8de37faf8bd216c628e0e68c8f6bef730d3ba0a5060f3b0fa460c992ac2", size = 324372, upload-time = "2026-07-09T13:49:34.554Z" }, + { url = "https://files.pythonhosted.org/packages/78/bf/328d3c6bb22c496944a1b3b732207d71aa6964eb604e5e3b9dcb91ed0a00/uuid_utils-0.17.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d27c531edb8d1f38ca2eddaa1fa24913a460aeb721f2efd4ef42a124ce94e354", size = 348548, upload-time = "2026-07-09T13:49:35.898Z" }, + { url = "https://files.pythonhosted.org/packages/3e/76/a07de5cb7b90582fdbbc830fd19be129cbbb9897cfe239fef469d7bd2d09/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5670c52a438e21483ce715776144914a4e2a2a5c62d9dee15f8a3e90cf128ae6", size = 498985, upload-time = "2026-07-09T13:49:37.142Z" }, + { url = "https://files.pythonhosted.org/packages/f4/62/9966e46ae34fcec6b06119631fb3c09705ea78835035ce3a82d3348eb61a/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:6f29689a76fe7a49cbd629a794d0ec1eab48814e323a00a146a741b0195bde68", size = 605183, upload-time = "2026-07-09T13:49:38.648Z" }, + { url = "https://files.pythonhosted.org/packages/d7/4e/bb962ba0fe31e903b199f22cf4c1a6cba35a8987aef526d287277ab8ca8b/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4441600447d340ae103a353f01dbcd22ff680e5ee1a22988efe8d7b791d8fdb3", size = 565412, upload-time = "2026-07-09T13:49:40.115Z" }, + { url = "https://files.pythonhosted.org/packages/ce/9e/122adfeeeae8a84ccfd43bce627b104d12a2180a93bffd2c0e1b54dad7a6/uuid_utils-0.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b04935a79c03c41ad08d0a5f390aac968bfb561f1268897bc5b0f077971efd", size = 529885, upload-time = "2026-07-09T13:49:41.513Z" }, + { url = "https://files.pythonhosted.org/packages/b3/4f/257304dded339dc35fc9bf35722ac68fd4fdb930f255b8f7bccdf74ebba9/uuid_utils-0.17.0-cp314-cp314t-win32.whl", hash = "sha256:239d8a281fe10bae33205b5d43185834d556b18434e0a113b5dc1dfb2fd97e91", size = 169472, upload-time = "2026-07-09T13:49:42.871Z" }, + { url = "https://files.pythonhosted.org/packages/35/c8/e78c06db7e9ce317ce7b8759ff2058333eac75caa8c22b75f0059589c9be/uuid_utils-0.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e288a06cbbbcd01b44386e767985c9e21d2ad9bf59829aa7058d9a2a494804ab", size = 176271, upload-time = "2026-07-09T13:49:44.105Z" }, + { url = "https://files.pythonhosted.org/packages/a7/11/bd1c70e1ad3301163cebe66c8d26de26e6814d52f642a849448bd2833626/uuid_utils-0.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1776a80d16369999b21627028cc5dbce819be83e1e079fdd7a51b587d2916db9", size = 175004, upload-time = "2026-07-09T13:49:45.591Z" }, +] + +[[package]] +name = "venv" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "ipykernel" }, + { name = "langchain" }, + { name = "langchain-openai" }, + { name = "langgraph" }, + { name = "langgraph-checkpoint" }, + { name = "langgraph-checkpoint-postgres" }, + { name = "langgraph-sdk" }, + { name = "loguru" }, + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "rich" }, +] + +[package.metadata] +requires-dist = [ + { name = "ipykernel", specifier = ">=7.3.0" }, + { name = "langchain", specifier = ">=1.3.14" }, + { name = "langchain-openai" }, + { name = "langgraph" }, + { name = "langgraph-checkpoint" }, + { name = "langgraph-checkpoint-postgres", specifier = ">=3.1.1" }, + { name = "langgraph-sdk" }, + { name = "loguru", specifier = ">=0.7.3" }, + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "rich" }, +] + +[[package]] +name = "wcwidth" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253, upload-time = "2026-06-29T18:11:11.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166, upload-time = "2026-06-29T18:11:09.888Z" }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +] + +[[package]] +name = "win32-setctime" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload-time = "2024-12-07T15:28:28.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload-time = "2024-12-07T15:28:26.465Z" }, +] + +[[package]] +name = "xxhash" +version = "3.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/63/71aa56b151a1b28770037a61bd4e461c2619cfc8866a4fcaf1548605e325/xxhash-3.8.1.tar.gz", hash = "sha256:b0de4bf3aa66363552d52c6a89003c479911f12098cd48a53d44a0f7a25f7c46", size = 86223, upload-time = "2026-07-06T10:49:58.937Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/8c/446bb782cd0d27007a917b5569a08dd73219c3e8d6e459014db104b27bdb/xxhash-3.8.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:3c682fcd96eb4bf64be32a4d95f96107e1588005831bd8a741b324fdda01b913", size = 38562, upload-time = "2026-07-06T10:45:12.425Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ec/c0c45627eaa6be7a5d6117423adf8f7a15b17ee74b4b17072cca5959a225/xxhash-3.8.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:036a024d8b9c01f70782e09ed98d532e76fd23f950ae7154bd950fe94e90ebec", size = 36656, upload-time = "2026-07-06T10:45:13.932Z" }, + { url = "https://files.pythonhosted.org/packages/f6/94/8324c04cc7597154caaeba6c094e01fbd2e7601d01e7a13eea9f5420e77b/xxhash-3.8.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d6a5c0bce213b23b0166fe0d35bcbbe23ce4b968f257cc7eb6fd57cb8e1e6297", size = 31169, upload-time = "2026-07-06T10:45:15.687Z" }, + { url = "https://files.pythonhosted.org/packages/40/a4/beb6bb26e1184e126dbe7a5682330214ef54dcfbf882078aa9f4b5428d42/xxhash-3.8.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:5177aa44eddaa97c6ef0cc00c6d540edb64d51781d2f8fb941612ec61a92c9ed", size = 32177, upload-time = "2026-07-06T10:45:17.035Z" }, + { url = "https://files.pythonhosted.org/packages/56/0f/fc4c92a5a528f839b34b6419b2e53c8597f2a629d5a1f5d721f65bfa1fd6/xxhash-3.8.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7801b7223db017b9c0c9ccf37e44524edb35a1544a1c032add22c061c6af0276", size = 34642, upload-time = "2026-07-06T10:45:18.39Z" }, + { url = "https://files.pythonhosted.org/packages/d4/58/edbfb141d4000767ac6a9694f8ac0763e2c2e983e65c9e31620ba56e2667/xxhash-3.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9e80238259655bf69d7bcd08226a970d7f42605f3157786bfa76dd13472d7fa0", size = 34684, upload-time = "2026-07-06T10:45:20.033Z" }, + { url = "https://files.pythonhosted.org/packages/07/3f/5072f1f0f5714186f0ac2a0b5a4929ce30d4b845e94886b6c01b6ebda0be/xxhash-3.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bcab50a389cc04d87f90092af78a6adba2ab3deca63175a3344ca83514045315", size = 32401, upload-time = "2026-07-06T10:45:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/49/c7/802ea2f9c2ed59219934d6d65c470d502b1788043eae277a52af8658bda6/xxhash-3.8.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a2489d3a776fa380cb8e71f54c7fda268a9baf3de9b1395093fd280f95735907", size = 220617, upload-time = "2026-07-06T10:45:23.234Z" }, + { url = "https://files.pythonhosted.org/packages/99/a8/e10488efd31fcb13fcd6acbc6e788f10c6f8e3a0cc4ae3eb89dc19c55a12/xxhash-3.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ab1e5432690276e71192be7401b55f96db2d0eedea5d44eb1f164505669cc0", size = 241295, upload-time = "2026-07-06T10:45:25.364Z" }, + { url = "https://files.pythonhosted.org/packages/18/cc/14180b17d44892a631f8ae7323c30bfbb1328efc8209e528a480293528ac/xxhash-3.8.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b30e01a0b97a4bc3f519a4d7a82da3dc53251fb0de5eeea8660dcd4ff094c0c2", size = 264688, upload-time = "2026-07-06T10:45:27.09Z" }, + { url = "https://files.pythonhosted.org/packages/a9/72/a14019d0c5f6c41ee407a503036ae32787c91325ca218a96a9b5627be651/xxhash-3.8.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1f44275ddb0978b67a58a951501903f04d49335a91f7681c9ce122ecb8ccb329", size = 242740, upload-time = "2026-07-06T10:45:28.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/08/92550e556c6fcfcb96c6a336945eb53a431ed43120ed749636debb16c5cf/xxhash-3.8.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e3b87cbd974512c0c5fc7b469c36b2cdc9ee6d76e4ec78bccb2c7184611c49b0", size = 473599, upload-time = "2026-07-06T10:45:30.524Z" }, + { url = "https://files.pythonhosted.org/packages/29/83/e361d3c1acd1b21e1d489616de6fa4aaf843365d8179f612e3743eac20a9/xxhash-3.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98ee81b4b7f3023c9cb04a78cc67610baffcb5812d92f2096cb5a5efc6f19437", size = 220559, upload-time = "2026-07-06T10:45:32.979Z" }, + { url = "https://files.pythonhosted.org/packages/05/01/006a4243c2c2a6831827f9999f6d1c23feeef100eb023c1f886022a00bf3/xxhash-3.8.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2666f059a1588a99267e33605365ed89cea92f424b3522806a9f4bd8ad2e3d62", size = 310383, upload-time = "2026-07-06T10:45:35.875Z" }, + { url = "https://files.pythonhosted.org/packages/d8/20/af388e8bf9f9a0f89eeef7d2a1935d176ee1c20bc6adeda05035879379cf/xxhash-3.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0093cf7eeb91b84776e8742113afa4bdf47533d36cf719179aaaf1f56f6f8bf", size = 238228, upload-time = "2026-07-06T10:45:38.02Z" }, + { url = "https://files.pythonhosted.org/packages/63/6b/4666579a87eebd1744663c404297355fa0658617b015cedfa58810ee7036/xxhash-3.8.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3a800912a2e5e975d4128969d645c4a2a80aa886ccd6c9b1c6f44529e327e8cf", size = 269137, upload-time = "2026-07-06T10:45:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/de/d3/e963a8a46f900a137d91b02144d8ea07a8f812971b138204a3b2f8b8e55c/xxhash-3.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0fe37f72a207223d22a4eddc3149d4298993385aa9daef25c039246ca5a309f3", size = 225068, upload-time = "2026-07-06T10:45:41.718Z" }, + { url = "https://files.pythonhosted.org/packages/aa/80/9d181dbcde4b0fe48375f48833a5832d4b8cd2b349b15110c92ee472d874/xxhash-3.8.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5db43f249b4be9f99ef4b967863f37094fb40e67effafb78ba4f0356b6396104", size = 240874, upload-time = "2026-07-06T10:45:43.414Z" }, + { url = "https://files.pythonhosted.org/packages/39/15/ce3ab5a1cd27ead25a5196e55a7284220f6ad6e316da494ffd900b2b600f/xxhash-3.8.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c4ed42965c2cd9081f011be22f69d0e65d3b6165fe7734072fd0c232840bbd4e", size = 300702, upload-time = "2026-07-06T10:45:45.135Z" }, + { url = "https://files.pythonhosted.org/packages/96/c0/2281a8ab5f2a62dbf57a23c58a01ccc1d98abf40f71193c8a81f59e759b5/xxhash-3.8.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3557bec8fcb11738a8920eeb68974bc76b75262f6947998d3147954ce0a4b893", size = 443351, upload-time = "2026-07-06T10:45:47.188Z" }, + { url = "https://files.pythonhosted.org/packages/81/2e/071a58c1a53a52d4f7a3aa0987be0c396dffd40da8204805fe1b130a81f4/xxhash-3.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00de40f3b42240db23a82a5c682b55d7263d84a26a953240c1aee463409660e3", size = 217396, upload-time = "2026-07-06T10:45:48.925Z" }, + { url = "https://files.pythonhosted.org/packages/68/44/36ab58134badd9d3433fc7b53c4ca8d113d8e807782885628640f8297a4d/xxhash-3.8.1-cp313-cp313-win32.whl", hash = "sha256:b5196cc2574cfec572a5f3fb7cfa5ade27305ae3d06516a082132441aff4c83a", size = 31974, upload-time = "2026-07-06T10:45:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/96/2a/2a0b84798448e766f7b89ceed073cb0cb5a43fc9ebbacbdea74a38de18e3/xxhash-3.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:538f5f865df6cd8c32dd63158a0e5b4f5dd08d732a7da8b7228a5a0776c8ce55", size = 32739, upload-time = "2026-07-06T10:45:52.221Z" }, + { url = "https://files.pythonhosted.org/packages/d4/60/bb51dbf7c363ff88a7cbd50b7959718219577ef44d7cf255929ffc4a2194/xxhash-3.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:a6617f30641ba0d8baa1635fbefb1dffc5165ec36d26921bd5cee13497cd937a", size = 29239, upload-time = "2026-07-06T10:45:53.714Z" }, + { url = "https://files.pythonhosted.org/packages/56/d3/827ca123c2ee5443a6aaed3c5dd199237dc2f010e2bebd7ec09ef36f3a5f/xxhash-3.8.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:bfcd82852c62a60e314670a9602de354c4460f8adad916e2e42a20860c7870bc", size = 34964, upload-time = "2026-07-06T10:45:55.535Z" }, + { url = "https://files.pythonhosted.org/packages/05/67/67ae2a3ccdeb8b8ef025d35aee9edd1d26c3abe5051d47da9286232afbf8/xxhash-3.8.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:08ea2081f5e88615fec8622a9f87fbe21b8ea58d88cfc02163ca11026ee62a92", size = 32697, upload-time = "2026-07-06T10:45:57.288Z" }, + { url = "https://files.pythonhosted.org/packages/38/5a/3d3994346e1f45493679cb5c1ffc2bf454e410e9d1e8a662d253becee91e/xxhash-3.8.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2e32855b6f9e5b18f449e59d45e3d5778bdeb660632ef2693cca267a11246c75", size = 225954, upload-time = "2026-07-06T10:45:58.897Z" }, + { url = "https://files.pythonhosted.org/packages/3f/2c/53169270309b7cd8e05504e07fe123bac053b89d00ac63617faacf0a2ec0/xxhash-3.8.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6e088bd7870775624256a0d84c2a6714afd223b2eeb56b0ca58398e52a32fda", size = 249776, upload-time = "2026-07-06T10:46:00.977Z" }, + { url = "https://files.pythonhosted.org/packages/70/e0/5c551d8d592f944506f7c5185e210255c15e672a3c6008c156a1bd9b775e/xxhash-3.8.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:72eb5ae575cc7ae2b23f6f8064a8b10f638c7149819ae9cc6d20ebd4d37a1629", size = 274776, upload-time = "2026-07-06T10:46:02.869Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/d3a762270cee2d7bcd0e25e28c623e5f3f5c0dc637b66e3e47dd5b0bb3f0/xxhash-3.8.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d0b48cdf690a64cedf7258c3dc9506cc41fc86edd7739c40e3098952265dc068", size = 252056, upload-time = "2026-07-06T10:46:04.688Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8f/b78e4373b2cb6d1c42af60ea2d7e9146ad0710b239ac7f706d5d31d5bb98/xxhash-3.8.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb9e256a357dfcede7818c6d34e70db2d6b664394803d1de4b6984d2de76c0f1", size = 482108, upload-time = "2026-07-06T10:46:06.498Z" }, + { url = "https://files.pythonhosted.org/packages/e6/0d/642d923336ea61a15f8ce64fc7e078729e6e06c3a026e517fa79b2c23b7a/xxhash-3.8.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51f71a6e2ad071e70c937e41fcb6c19f82c3f9f49831eba850ed4a106ffbb647", size = 226739, upload-time = "2026-07-06T10:46:08.598Z" }, + { url = "https://files.pythonhosted.org/packages/a6/0a/a37d6da6427d45a8d23e3ee3a0ca9c9d4a90364849c6637fe2963a755f9b/xxhash-3.8.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e4a6443968c4e8dc69967e12776776a5952c119cc1bd94168ad1c5ad667c2be1", size = 319658, upload-time = "2026-07-06T10:46:10.504Z" }, + { url = "https://files.pythonhosted.org/packages/4a/51/ebbd40da8a3f1bc53b4b7a9a87f8e28bd95c5f21bc14b8a57860cf367d1b/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:714503083a1f2065c9ad15340dd49ac8a8e948a505a705ffa1750cb951519113", size = 246059, upload-time = "2026-07-06T10:46:12.634Z" }, + { url = "https://files.pythonhosted.org/packages/24/4c/d9014030147e1f0bb26e7da47aa240dd9ec61c763c573e558111d869f8e1/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:77f74e45a1e5574bbbf80181c8027b3a4c65c2248fffbd557bd596fff13102f9", size = 275535, upload-time = "2026-07-06T10:46:14.614Z" }, + { url = "https://files.pythonhosted.org/packages/84/86/caee2db41fadcd5a25aa4323213f9afec5a8586d4e419241e3d659362bd7/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e0e1b0fb0259c1b75d1251ac0bb4d7ab675d36f7a6bf4ba6aa630dae94f9ffa", size = 231292, upload-time = "2026-07-06T10:46:16.452Z" }, + { url = "https://files.pythonhosted.org/packages/0b/60/f52f08bcdc904c4514ea5c25caa19e9f3214144434a6ff96dc82dc1cbddd/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:10e4393ec33633c2f05ad01869e546ad080b1a18f2650503731f153774608b31", size = 250490, upload-time = "2026-07-06T10:46:18.318Z" }, + { url = "https://files.pythonhosted.org/packages/24/a0/94dc7ae310838f250669c6ad7168e6d6fca17d49dac1053f06dc232c4a56/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b3ba794c3d885803db6c3116686923f1ec13bc86e621e169a375282b63ea1cc6", size = 309861, upload-time = "2026-07-06T10:46:20.503Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f9/adeead7d0eb28cdfc2832544ea639ffbc6749ccde47a8e228d667459182e/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:57189a69c0891e4818853feaa521c972d22c880a001453addea015f48e3c3398", size = 448739, upload-time = "2026-07-06T10:46:22.79Z" }, + { url = "https://files.pythonhosted.org/packages/04/a4/22ec0e07db57d901c9298ae98aa3cf2be45bafded6f07c13131e85b89032/xxhash-3.8.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d59e71153fe9ff85648d00e18649b07e9b22c797291abb7e27274fa06df8b838", size = 223657, upload-time = "2026-07-06T10:46:24.831Z" }, + { url = "https://files.pythonhosted.org/packages/94/32/8a9531f37b59e5a013003db7cb7414baf4ce7e0e1268e0d5947cd3d6a2df/xxhash-3.8.1-cp313-cp313t-win32.whl", hash = "sha256:5b96f0024e9840f449bd91b2d005c921a4b666055a0d1b6492463799f32aae22", size = 32377, upload-time = "2026-07-06T10:46:26.86Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/2ca45fd7f671de5f81fc297ef1c95080b40c86ec6be0cc6034b8f7707ac8/xxhash-3.8.1-cp313-cp313t-win_amd64.whl", hash = "sha256:37d5a56c36dcc0b9a87b814cd992598d33863ff683749de6c86081f278d5e629", size = 33274, upload-time = "2026-07-06T10:46:28.39Z" }, + { url = "https://files.pythonhosted.org/packages/5a/54/20d7163463ddb6438b73a427d1655a77a502cf9b9b0c3ada3599629d9c0a/xxhash-3.8.1-cp313-cp313t-win_arm64.whl", hash = "sha256:6696c8752aded28ff3b16f33ef28ce28fb5d209b80c206746f943199fcf5fd65", size = 29375, upload-time = "2026-07-06T10:46:29.962Z" }, + { url = "https://files.pythonhosted.org/packages/c2/8b/df2ba04f22a6cd6b39f96a6577329a8471a55c90ef8d8e2f7c102363613f/xxhash-3.8.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:9db455cb649dcfe4504d6d68a6d83a7315a99a3ca59871dc3ff840671f99adba", size = 38430, upload-time = "2026-07-06T10:46:31.496Z" }, + { url = "https://files.pythonhosted.org/packages/b2/4f/6a059e8ad3ca8deedc91dfe335b211204900895152212c03ebbe721de68b/xxhash-3.8.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:affb37f152e55b5e4494bb9d0107f7bb08515c6704fbed82d9f61214d74adc17", size = 36558, upload-time = "2026-07-06T10:46:33.078Z" }, + { url = "https://files.pythonhosted.org/packages/cb/95/40be178205acce092ae418feb20ac737b32a02c7b864926ed0717354c9f8/xxhash-3.8.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:460261045936975193bfd20549a0de1cd52a33b405cbb972f0d80940c42266cd", size = 31181, upload-time = "2026-07-06T10:46:34.793Z" }, + { url = "https://files.pythonhosted.org/packages/3f/89/2da4dbf051bafa156c0e3f12012db2b0ac3b84ff37ca1f021f6bfffcdfbb/xxhash-3.8.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:38c887aedb696ef8bca19983206d270848558cfae4a91afa6a2fb05dde58ffc5", size = 32192, upload-time = "2026-07-06T10:46:36.393Z" }, + { url = "https://files.pythonhosted.org/packages/7c/4e/e000bbae3566bc8e0be771a8a0f294aa99075e3f0bc4ef43922ebffdebc8/xxhash-3.8.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:594131ce1aad18db3689781f806db1b065cdaa04f4df36b4c038d2013aefd0bf", size = 34691, upload-time = "2026-07-06T10:46:38.1Z" }, + { url = "https://files.pythonhosted.org/packages/b4/4a/ea954aacc7d1c8711880ac2b55da94429a9b4296b151c4fc0966549ca1ee/xxhash-3.8.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:78c794b643d214f1522e7a288bcf5a2de120d26cd170516749a4009dc92722c9", size = 34807, upload-time = "2026-07-06T10:46:39.647Z" }, + { url = "https://files.pythonhosted.org/packages/ca/29/df598e738ff37558ac627264deb2e560902d9bf7f46d3bd5175c9eee593e/xxhash-3.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:af0c9fedc4a2c24e8664953882fe8185f3790b8338c9c700f76f5ad660817711", size = 32410, upload-time = "2026-07-06T10:46:41.359Z" }, + { url = "https://files.pythonhosted.org/packages/59/9c/81ab40e7d33ada0b3df5d1bc884894d15dbf4f805cd645b685e4606bb8e0/xxhash-3.8.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:115772daeb71b2f3b9381177017f53e6cf3f3439c840737fdabd21aba6e54920", size = 220564, upload-time = "2026-07-06T10:46:43.463Z" }, + { url = "https://files.pythonhosted.org/packages/fd/6f/62ae6f5c8606320a0e2a41c2dc8c6d91cc5d63d0f84dd9582e9543779dd8/xxhash-3.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:000435984a0469b0f822fe76f35bddea0f96a4d6521b3339a60a6428cdee1edc", size = 241462, upload-time = "2026-07-06T10:46:45.509Z" }, + { url = "https://files.pythonhosted.org/packages/15/a1/9c3a0ec6cb524396f551eddd102a76690a795494eb9784fc67542b0daa37/xxhash-3.8.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2f1c68394818e0595569c2ff3cbc1e6d5a36a434e796f5c526b987b80c8a8c62", size = 264491, upload-time = "2026-07-06T10:46:47.655Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/700a4674e4308eb59d2fdb973977e82eae231bea5044753fee5c9eec0e0c/xxhash-3.8.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:46b39976d008e2a845758650f0ff7136bca004f40da0c8798bd37ac37860154f", size = 242905, upload-time = "2026-07-06T10:46:49.857Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8a/72d9874375c8d4cbc64a8cd1d659d5695a8765c3db82efa82dc5bd9f14d0/xxhash-3.8.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d5006c65ec507a333479e76e00e2c368781f16c24ededa764763956b32a0e93e", size = 473873, upload-time = "2026-07-06T10:46:51.953Z" }, + { url = "https://files.pythonhosted.org/packages/03/f0/6db07590ed7e0a77f186ef0bcea8d52553bf1ba57833e09467a2411f0f2d/xxhash-3.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31a2649bcf1fe97cf11c79848d761df33ac46b3896942d31b640557b486ff6b", size = 220765, upload-time = "2026-07-06T10:46:55.41Z" }, + { url = "https://files.pythonhosted.org/packages/8f/10/00d12d8b8beabbf49a8bbc626fb9f40445145a8887eb41a6acfb69149ac4/xxhash-3.8.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f759eed402448c2bdbb492e4fba1f20668ffe29688605ea61f0f67f9e4e386d", size = 310478, upload-time = "2026-07-06T10:46:57.729Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f9/12a82394eefb0f185d15a7f7b9f627c61c475a72dd83718436a5b84b42ac/xxhash-3.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5f97ecfede10d5b2870383620e2d25c8561e217c7bf9081073802b54248d2b", size = 238393, upload-time = "2026-07-06T10:46:59.87Z" }, + { url = "https://files.pythonhosted.org/packages/20/f3/53f963e320b9ce678337aa7273f39ce692ded8b99e3d22a866ec722159ab/xxhash-3.8.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:1da930bbcac3e8fbe2191850e2abb57977a99348c12c4b385e1058ac1b0a9ecc", size = 268704, upload-time = "2026-07-06T10:47:01.806Z" }, + { url = "https://files.pythonhosted.org/packages/0a/50/5b5badbd87c82d9f9b5f58ac74a3f29ef08f6fc387b324b8fd482450b862/xxhash-3.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:747476436f6891b9773374ce8d48edcc8b12cb5b61b67c6fb6289633747d088f", size = 225015, upload-time = "2026-07-06T10:47:03.784Z" }, + { url = "https://files.pythonhosted.org/packages/30/93/3ca68265afe7b4e69435e08a7b6a1d9d0f2a071e889da1f8041ed00fe878/xxhash-3.8.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef09bbc2519a93cd0f95f2ceb5f7b85919dffea643278e02362bf40e3c4bed1", size = 240951, upload-time = "2026-07-06T10:47:05.816Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a6/27e19670c40f46b5e76e11f2f4713d21054804568425d870670e757172ad/xxhash-3.8.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:a5eed9d41995a83f3332b4e3396abb7f433cac584222bd7e305b606d8353861e", size = 300751, upload-time = "2026-07-06T10:47:07.95Z" }, + { url = "https://files.pythonhosted.org/packages/bc/fb/b33e27689959fe7ed2ae0b830af41560d65213943983afa9db3a8d481bce/xxhash-3.8.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:53f3ed9118397074ff63a79b66b7fec1c84c782eecde35c5bc94e420a971c231", size = 443480, upload-time = "2026-07-06T10:47:10Z" }, + { url = "https://files.pythonhosted.org/packages/26/60/0e0d973be5fe280753ef02fbc89349492ad6e903bf1dcb870b668f94b662/xxhash-3.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d247b34bf433c92b41689318fd25d246313cab2275a6a47e2efac178b80d6efe", size = 217657, upload-time = "2026-07-06T10:47:12.196Z" }, + { url = "https://files.pythonhosted.org/packages/ad/68/c9e3ecef4a9a417d464cb5bd200aa12f73192dee677901b9e08e0ad0d1bb/xxhash-3.8.1-cp314-cp314-win32.whl", hash = "sha256:d58ce8b6cfa9c4d2f230557f69caf7c06369e318015d0b19485095bc2c5963ab", size = 32690, upload-time = "2026-07-06T10:47:14.204Z" }, + { url = "https://files.pythonhosted.org/packages/d7/99/e9e44588c0b62837bbec5ba7927816de0afa03406b1a0b6c7a7e1d1a30a0/xxhash-3.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:6cee733fe4ccb1737e0997135283c82341e5cfa9cf214b165f9087fb663aaf4f", size = 33460, upload-time = "2026-07-06T10:47:16.021Z" }, + { url = "https://files.pythonhosted.org/packages/45/2b/64f36d86380b3657ad9031967ab814f3ef31307174650853f69c18932ebc/xxhash-3.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:58346024d47e84f7d8b3e7f5d6faa1d58acbbe49a8771497872059f58c1d8ea5", size = 30092, upload-time = "2026-07-06T10:47:17.81Z" }, + { url = "https://files.pythonhosted.org/packages/92/cb/18b64bff88c58a0ca209dc533e63cf02d7ae5aa6b1b9a9fd14e81b5dbd60/xxhash-3.8.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:01cab782f8a0a05ecad2c63d7ef10f7ab475f660e0d6419d069418c14d88de7c", size = 35024, upload-time = "2026-07-06T10:47:19.821Z" }, + { url = "https://files.pythonhosted.org/packages/af/1d/72d8a70520e5dcddb472ea0486d299da3240745a10658290cd7b5690ede2/xxhash-3.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:717b12fdc51819833704e85e6926d76981ffa3f780ef92e33ebb8b26d46bb230", size = 32697, upload-time = "2026-07-06T10:47:21.649Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b8/e041f555903c56db3d0a731b3d72a6575d75e0ed868b1bd2e5176111ca44/xxhash-3.8.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ec55d80e9b8a519d742669e0b49e8ce9e6747be42bf3c138158b6543a9c8e489", size = 226044, upload-time = "2026-07-06T10:47:23.612Z" }, + { url = "https://files.pythonhosted.org/packages/3a/7e/5cdcf06bf6ec4b5d2ac073feb23432ec1d603fd438864cbd2c09c7cb45e1/xxhash-3.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98d8ac1129b4dd39098cffed94d1284aceb61c3aa396757ccc736ac392e4cee5", size = 249899, upload-time = "2026-07-06T10:47:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c0/eb7e059cb5e1dba11fd30d2fdf882f56e5a417a3eaa43669d43623767f45/xxhash-3.8.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3bc0fa90830df1e1277f33cc6e55de9990b83c0319fd8c7412866cfde38b025e", size = 274892, upload-time = "2026-07-06T10:47:27.931Z" }, + { url = "https://files.pythonhosted.org/packages/66/74/a600aaf7cd39957fd1510adeedb1749c1e7eb82bd632a1153d9c664c3135/xxhash-3.8.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c73b6f652f0745425aa6378319c331293b5341756262e9408ed3d45f183375e6", size = 252243, upload-time = "2026-07-06T10:47:30.288Z" }, + { url = "https://files.pythonhosted.org/packages/ad/04/78d88fa75a6763e5d09bf1b947a392a27988903381b219006f92f3c68fc8/xxhash-3.8.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6114692261eff4266386cdec0f7d87eee24e317ab397c218b7ae6a76b4c6339", size = 482191, upload-time = "2026-07-06T10:47:32.45Z" }, + { url = "https://files.pythonhosted.org/packages/7f/06/07a8aea1108d682de8791ce608cdf367d75ff4e7e57cd3c154bdc6f47b23/xxhash-3.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4df57c0b161ec1b3ed0526a67b0db0914b557e86ee8aae51887aec941b261542", size = 226877, upload-time = "2026-07-06T10:47:34.705Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b5/86bade5618a524d2c06c4041aa2fe8e5749ce16e88afba60d67c1684a21f/xxhash-3.8.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9043877a917be88ccf230aa5667c1bd059bce80f4c2727e4defa1b29b7f48b08", size = 319794, upload-time = "2026-07-06T10:47:37.08Z" }, + { url = "https://files.pythonhosted.org/packages/23/69/9b1a2b89b1621bb740fbcb7beb512f60f99480c1bdc680c0c90e1f56ff75/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:559e3cabe522231909f9de98ef06929edbd53782046bd21aae0c72db6f2a0775", size = 246202, upload-time = "2026-07-06T10:47:39.676Z" }, + { url = "https://files.pythonhosted.org/packages/08/ea/662ed6cb49f1d34078b6a3a3e0f3d29ff93fd7b5a03c0bc9ecfd9b2159c3/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:264710bd335016f303763ce1275c6486df30bb57c2245c91b224c983d7ac39b8", size = 275628, upload-time = "2026-07-06T10:47:41.99Z" }, + { url = "https://files.pythonhosted.org/packages/13/f5/49fc9e4c6728a5a3bd8fe639199d2fa67609b3a84f938aff6e8568dd3e4f/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e14800b9b10bb39d7a60ad4a310e403164d7b8988a27ae933d4e40618a44088e", size = 231390, upload-time = "2026-07-06T10:47:44.233Z" }, + { url = "https://files.pythonhosted.org/packages/64/9d/3acaf8f599c0e0b30e910a3a11ba32929da53c86dc73c7c55fe6a010b4e9/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:ea6a3e734b0fd41b82784a400be946821900daebe610c050a5e0760838a34f99", size = 250600, upload-time = "2026-07-06T10:47:47.611Z" }, + { url = "https://files.pythonhosted.org/packages/23/64/8acab4c5ec60dbe664b5b9858fd44c2413b07e535b09556a0a5022e78aa6/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cf399fac542a1c7a4734a435b93df2c55e858c7d31abf6c1bdf46f9ae67fbfd0", size = 310032, upload-time = "2026-07-06T10:47:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/56/47/a0288d7329b1fe63e2734a32d19d444a96ae2b4810f545bc61e561224917/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:44c89d915a75c11d2547eaee9098fcd80398987c4bff2974a0497a925bf92c07", size = 448882, upload-time = "2026-07-06T10:47:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/01/e7/3071dfd3beb5c38204ce1cf56bf7749fce08de900fa92714b81d1d8ca1f2/xxhash-3.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:358650d5bda9c635da699c53adf4e8134af492ecc79c960f917eebf088bb6799", size = 223728, upload-time = "2026-07-06T10:47:55.093Z" }, + { url = "https://files.pythonhosted.org/packages/12/11/b99949f0ba2b07e9f9ffe83b9c86faa685f9080725dc21a916a607313be5/xxhash-3.8.1-cp314-cp314t-win32.whl", hash = "sha256:c240939e963653054fc7e4a17c382829cda4aa88a7daf0af841715dbded1b497", size = 33150, upload-time = "2026-07-06T10:47:57.274Z" }, + { url = "https://files.pythonhosted.org/packages/54/1c/09703eb341f8416e74e58d6c6732d4b5c46de59c942363203cb237cc95b0/xxhash-3.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:7258ee276e8772599bc19e14b36f6260306e21b637190cd7cb489a2449d48684", size = 34005, upload-time = "2026-07-06T10:47:59.434Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f9/6ed7251bb6a8af10ac73b1821c60583d2826e5b2064e45a979c935287c98/xxhash-3.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:8f454166c2ffed45636c8d501741e649851ba2f346c4eb73a64c07ac00428f20", size = 30239, upload-time = "2026-07-06T10:48:01.874Z" }, +] + +[[package]] +name = "zstandard" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/0b/8df9c4ad06af91d39e94fa96cc010a24ac4ef1378d3efab9223cc8593d40/zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94", size = 795735, upload-time = "2025-09-14T22:17:26.042Z" }, + { url = "https://files.pythonhosted.org/packages/3f/06/9ae96a3e5dcfd119377ba33d4c42a7d89da1efabd5cb3e366b156c45ff4d/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1", size = 640440, upload-time = "2025-09-14T22:17:27.366Z" }, + { url = "https://files.pythonhosted.org/packages/d9/14/933d27204c2bd404229c69f445862454dcc101cd69ef8c6068f15aaec12c/zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f", size = 5343070, upload-time = "2025-09-14T22:17:28.896Z" }, + { url = "https://files.pythonhosted.org/packages/6d/db/ddb11011826ed7db9d0e485d13df79b58586bfdec56e5c84a928a9a78c1c/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea", size = 5063001, upload-time = "2025-09-14T22:17:31.044Z" }, + { url = "https://files.pythonhosted.org/packages/db/00/87466ea3f99599d02a5238498b87bf84a6348290c19571051839ca943777/zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e", size = 5394120, upload-time = "2025-09-14T22:17:32.711Z" }, + { url = "https://files.pythonhosted.org/packages/2b/95/fc5531d9c618a679a20ff6c29e2b3ef1d1f4ad66c5e161ae6ff847d102a9/zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551", size = 5451230, upload-time = "2025-09-14T22:17:34.41Z" }, + { url = "https://files.pythonhosted.org/packages/63/4b/e3678b4e776db00f9f7b2fe58e547e8928ef32727d7a1ff01dea010f3f13/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a", size = 5547173, upload-time = "2025-09-14T22:17:36.084Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d5/ba05ed95c6b8ec30bd468dfeab20589f2cf709b5c940483e31d991f2ca58/zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611", size = 5046736, upload-time = "2025-09-14T22:17:37.891Z" }, + { url = "https://files.pythonhosted.org/packages/50/d5/870aa06b3a76c73eced65c044b92286a3c4e00554005ff51962deef28e28/zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3", size = 5576368, upload-time = "2025-09-14T22:17:40.206Z" }, + { url = "https://files.pythonhosted.org/packages/5d/35/398dc2ffc89d304d59bc12f0fdd931b4ce455bddf7038a0a67733a25f550/zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b", size = 4954022, upload-time = "2025-09-14T22:17:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/9a/5c/36ba1e5507d56d2213202ec2b05e8541734af5f2ce378c5d1ceaf4d88dc4/zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851", size = 5267889, upload-time = "2025-09-14T22:17:43.577Z" }, + { url = "https://files.pythonhosted.org/packages/70/e8/2ec6b6fb7358b2ec0113ae202647ca7c0e9d15b61c005ae5225ad0995df5/zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250", size = 5433952, upload-time = "2025-09-14T22:17:45.271Z" }, + { url = "https://files.pythonhosted.org/packages/7b/01/b5f4d4dbc59ef193e870495c6f1275f5b2928e01ff5a81fecb22a06e22fb/zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98", size = 5814054, upload-time = "2025-09-14T22:17:47.08Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e5/fbd822d5c6f427cf158316d012c5a12f233473c2f9c5fe5ab1ae5d21f3d8/zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf", size = 5360113, upload-time = "2025-09-14T22:17:48.893Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/69a553d2047f9a2c7347caa225bb3a63b6d7704ad74610cb7823baa08ed7/zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09", size = 436936, upload-time = "2025-09-14T22:17:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/d9/82/b9c06c870f3bd8767c201f1edbdf9e8dc34be5b0fbc5682c4f80fe948475/zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5", size = 506232, upload-time = "2025-09-14T22:17:50.402Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/60c3c01243bb81d381c9916e2a6d9e149ab8627c0c7d7abb2d73384b3c0c/zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049", size = 462671, upload-time = "2025-09-14T22:17:51.533Z" }, + { url = "https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3", size = 795887, upload-time = "2025-09-14T22:17:54.198Z" }, + { url = "https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f", size = 640658, upload-time = "2025-09-14T22:17:55.423Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/8b6b71b1ddd517f68ffb55e10834388d4f793c49c6b83effaaa05785b0b4/zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c", size = 5379849, upload-time = "2025-09-14T22:17:57.372Z" }, + { url = "https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439", size = 5058095, upload-time = "2025-09-14T22:17:59.498Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ad/eb659984ee2c0a779f9d06dbfe45e2dc39d99ff40a319895df2d3d9a48e5/zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043", size = 5551751, upload-time = "2025-09-14T22:18:01.618Z" }, + { url = "https://files.pythonhosted.org/packages/61/b3/b637faea43677eb7bd42ab204dfb7053bd5c4582bfe6b1baefa80ac0c47b/zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859", size = 6364818, upload-time = "2025-09-14T22:18:03.769Z" }, + { url = "https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0", size = 5560402, upload-time = "2025-09-14T22:18:05.954Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ae/56523ae9c142f0c08efd5e868a6da613ae76614eca1305259c3bf6a0ed43/zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7", size = 4955108, upload-time = "2025-09-14T22:18:07.68Z" }, + { url = "https://files.pythonhosted.org/packages/98/cf/c899f2d6df0840d5e384cf4c4121458c72802e8bda19691f3b16619f51e9/zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2", size = 5269248, upload-time = "2025-09-14T22:18:09.753Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c0/59e912a531d91e1c192d3085fc0f6fb2852753c301a812d856d857ea03c6/zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344", size = 5430330, upload-time = "2025-09-14T22:18:11.966Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/7e31db1240de2df22a58e2ea9a93fc6e38cc29353e660c0272b6735d6669/zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c", size = 5811123, upload-time = "2025-09-14T22:18:13.907Z" }, + { url = "https://files.pythonhosted.org/packages/f6/49/fac46df5ad353d50535e118d6983069df68ca5908d4d65b8c466150a4ff1/zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088", size = 5359591, upload-time = "2025-09-14T22:18:16.465Z" }, + { url = "https://files.pythonhosted.org/packages/c2/38/f249a2050ad1eea0bb364046153942e34abba95dd5520af199aed86fbb49/zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12", size = 444513, upload-time = "2025-09-14T22:18:20.61Z" }, + { url = "https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2", size = 516118, upload-time = "2025-09-14T22:18:17.849Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ef/da163ce2450ed4febf6467d77ccb4cd52c4c30ab45624bad26ca0a27260c/zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d", size = 476940, upload-time = "2025-09-14T22:18:19.088Z" }, +]