{ "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 }