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