Files
langgraph/examples/subgraph.ipynb
T

476 lines
76 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# How to create subgraphs\n",
"\n",
"Graphs such as [StateGraph](https://langchain-ai.github.io/langgraph/reference/graphs/#langgraph.graph.StateGraph)'s naturally can be composed. Creating subgraphs lets you build things like [multi-agent teams](./multi_agent/hierarchical_agent_teams.ipynb), where each team can track its own separate state.\n",
"\n",
"You can add a `StateGraph` instance as a node by first [compiling](https://langchain-ai.github.io/langgraph/reference/graphs/#langgraph.graph.MessageGraph.compile) it to translate it to its lower-level Pregel operations.\n",
"\n",
"The main thing you should note is ensuring the \"handoff\" from the calling graph to the called graph behaves as expected.\n",
"\n",
"Below are a couple of examples showing how to do so!\n",
"\n",
"First, install LangGraph."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%%capture --no-stderr\n",
"%pip install -U langgraph"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Optionally, we can set API key for [LangSmith tracing](https://smith.langchain.com/), which will give us best-in-class observability."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import getpass\n",
"import os\n",
"\n",
"\n",
"def _set_env(var: str):\n",
" if not os.environ.get(var):\n",
" os.environ[var] = getpass.getpass(f\"{var}: \")\n",
"\n",
"\n",
"os.environ[\"LANGCHAIN_TRACING_V2\"] = \"true\"\n",
"_set_env(\"LANGCHAIN_API_KEY\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create Parent + Child Graphs\n",
"\n",
"For this example, we will create two graphs: a parent graph with a few nodes, and a child graph that is added as a node in the parent.\n",
"\n",
"For this example we will use the same `State` in both graphs, though we will show how using the same keys can be a stumbling block if you're not careful."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from typing import Annotated\n",
"\n",
"from typing_extensions import TypedDict\n",
"\n",
"from langgraph.graph import StateGraph, START, END\n",
"\n",
"\n",
"def reduce_list(left: list | None, right: list | None) -> list:\n",
" if not left:\n",
" left = []\n",
" if not right:\n",
" right = []\n",
" return left + right\n",
"\n",
"\n",
"class ChildState(TypedDict):\n",
" name: str\n",
" path: Annotated[list[str], reduce_list]\n",
"\n",
"\n",
"class ParentState(TypedDict):\n",
" name: str\n",
" path: Annotated[list[str], reduce_list]\n",
"\n",
"\n",
"child_builder = StateGraph(ChildState)\n",
"\n",
"child_builder.add_node(\"child_start\", lambda state: {\"path\": [\"child_start\"]})\n",
"child_builder.add_edge(START, \"child_start\")\n",
"child_builder.add_node(\"child_middle\", lambda state: {\"path\": [\"child_middle\"]})\n",
"child_builder.add_node(\"child_end\", lambda state: {\"path\": [\"child_end\"]})\n",
"child_builder.add_edge(\"child_start\", \"child_middle\")\n",
"child_builder.add_edge(\"child_middle\", \"child_end\")\n",
"child_builder.add_edge(\"child_end\", END)\n",
"\n",
"builder = StateGraph(ParentState)\n",
"\n",
"builder.add_node(\"grandparent\", lambda state: {\"path\": [\"grandparent\"]})\n",
"builder.add_edge(START, \"grandparent\")\n",
"builder.add_node(\"parent\", lambda state: {\"path\": [\"parent\"]})\n",
"builder.add_node(\"child\", child_builder.compile())\n",
"builder.add_node(\"sibling\", lambda state: {\"path\": [\"sibling\"]})\n",
"builder.add_node(\"fin\", lambda state: {\"path\": [\"fin\"]})\n",
"\n",
"# Add connections\n",
"builder.add_edge(\"grandparent\", \"parent\")\n",
"builder.add_edge(\"parent\", \"child\")\n",
"builder.add_edge(\"parent\", \"sibling\")\n",
"builder.add_edge(\"child\", \"fin\")\n",
"builder.add_edge(\"sibling\", \"fin\")\n",
"builder.add_edge(\"fin\", END)\n",
"graph = builder.compile()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "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",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from IPython.display import Image, display\n",
"\n",
"# Setting xray to 1 will show the internal structure of the nested graph\n",
"display(Image(graph.get_graph(xray=1).draw_mermaid_png()))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[36;1m\u001b[1;3m[0:tasks]\u001b[0m \u001b[1mStarting step 0 with 1 task:\n",
"\u001b[0m- \u001b[32;1m\u001b[1;3m__start__\u001b[0m -> {'name': 'test'}\n",
"\u001b[36;1m\u001b[1;3m[0:writes]\u001b[0m \u001b[1mFinished step 0 with writes to 1 channel:\n",
"\u001b[0m- \u001b[33;1m\u001b[1;3mname\u001b[0m -> 'test'\n",
"\u001b[36;1m\u001b[1;3m[0:checkpoint]\u001b[0m \u001b[1mState at the end of step 0:\n",
"\u001b[0m{'name': 'test', 'path': []}\n",
"\u001b[36;1m\u001b[1;3m[1:tasks]\u001b[0m \u001b[1mStarting step 1 with 1 task:\n",
"\u001b[0m- \u001b[32;1m\u001b[1;3mgrandparent\u001b[0m -> {'name': 'test', 'path': []}\n",
"\u001b[36;1m\u001b[1;3m[1:writes]\u001b[0m \u001b[1mFinished step 1 with writes to 1 channel:\n",
"\u001b[0m- \u001b[33;1m\u001b[1;3mpath\u001b[0m -> ['grandparent']\n",
"\u001b[36;1m\u001b[1;3m[1:checkpoint]\u001b[0m \u001b[1mState at the end of step 1:\n",
"\u001b[0m{'name': 'test', 'path': ['grandparent']}\n",
"\u001b[36;1m\u001b[1;3m[2:tasks]\u001b[0m \u001b[1mStarting step 2 with 1 task:\n",
"\u001b[0m- \u001b[32;1m\u001b[1;3mparent\u001b[0m -> {'name': 'test', 'path': ['grandparent']}\n",
"\u001b[36;1m\u001b[1;3m[2:writes]\u001b[0m \u001b[1mFinished step 2 with writes to 1 channel:\n",
"\u001b[0m- \u001b[33;1m\u001b[1;3mpath\u001b[0m -> ['parent']\n",
"\u001b[36;1m\u001b[1;3m[2:checkpoint]\u001b[0m \u001b[1mState at the end of step 2:\n",
"\u001b[0m{'name': 'test', 'path': ['grandparent', 'parent']}\n",
"\u001b[36;1m\u001b[1;3m[3:tasks]\u001b[0m \u001b[1mStarting step 3 with 2 tasks:\n",
"\u001b[0m- \u001b[32;1m\u001b[1;3mchild\u001b[0m -> {'name': 'test', 'path': ['grandparent', 'parent']}\n",
"- \u001b[32;1m\u001b[1;3msibling\u001b[0m -> {'name': 'test', 'path': ['grandparent', 'parent']}\n",
"\u001b[36;1m\u001b[1;3m[3:writes]\u001b[0m \u001b[1mFinished step 3 with writes to 2 channels:\n",
"\u001b[0m- \u001b[33;1m\u001b[1;3mname\u001b[0m -> 'test'\n",
"- \u001b[33;1m\u001b[1;3mpath\u001b[0m -> ['grandparent', 'parent', 'child_start', 'child_middle', 'child_end'], ['sibling']\n",
"\u001b[36;1m\u001b[1;3m[3:checkpoint]\u001b[0m \u001b[1mState at the end of step 3:\n",
"\u001b[0m{'name': 'test',\n",
" 'path': ['grandparent',\n",
" 'parent',\n",
" 'grandparent',\n",
" 'parent',\n",
" 'child_start',\n",
" 'child_middle',\n",
" 'child_end',\n",
" 'sibling']}\n",
"\u001b[36;1m\u001b[1;3m[4:tasks]\u001b[0m \u001b[1mStarting step 4 with 1 task:\n",
"\u001b[0m- \u001b[32;1m\u001b[1;3mfin\u001b[0m -> {'name': 'test',\n",
" 'path': ['grandparent',\n",
" 'parent',\n",
" 'grandparent',\n",
" 'parent',\n",
" 'child_start',\n",
" 'child_middle',\n",
" 'child_end',\n",
" 'sibling']}\n",
"\u001b[36;1m\u001b[1;3m[4:writes]\u001b[0m \u001b[1mFinished step 4 with writes to 1 channel:\n",
"\u001b[0m- \u001b[33;1m\u001b[1;3mpath\u001b[0m -> ['fin']\n",
"\u001b[36;1m\u001b[1;3m[4:checkpoint]\u001b[0m \u001b[1mState at the end of step 4:\n",
"\u001b[0m{'name': 'test',\n",
" 'path': ['grandparent',\n",
" 'parent',\n",
" 'grandparent',\n",
" 'parent',\n",
" 'child_start',\n",
" 'child_middle',\n",
" 'child_end',\n",
" 'sibling',\n",
" 'fin']}\n"
]
},
{
"data": {
"text/plain": [
"{'name': 'test',\n",
" 'path': ['grandparent',\n",
" 'parent',\n",
" 'grandparent',\n",
" 'parent',\n",
" 'child_start',\n",
" 'child_middle',\n",
" 'child_end',\n",
" 'sibling',\n",
" 'fin']}"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"graph.invoke({\"name\": \"test\"}, debug=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice here that the `[\"grandparent\", \"parent\"]` sequence is duplicated! This is because our child state has received the full parent state and returns the full parent state once it terminates. To avoid duplication or conflicts in state, you typically would do one or more of the following:\n",
"\n",
"1. Handle duplicates in your `reducer` function.\n",
"2. Call the child graph from within a python function. In that function, handle the state as needed. \n",
"3. Update the child graph keys to avoid conflicts. You would still need to ensure the output can be interpreted by the parent, however.\n",
"\n",
"Let's re-implement the graph using technique (1) and add unique IDs for every value in the list. This is what is done in [`MessageGraph`](https://langchain-ai.github.io/langgraph/reference/graphs/#langgraph.graph.MessageGraph)."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"import uuid\n",
"\n",
"\n",
"def reduce_list(left: list | None, right: list | None) -> list:\n",
" \"\"\"Append the right-hand list, replacing any elements with the same id in the left-hand list.\"\"\"\n",
" if not left:\n",
" left = []\n",
" if not right:\n",
" right = []\n",
" left_, right_ = [], []\n",
" for orig, new in [(left, left_), (right, right_)]:\n",
" for val in orig:\n",
" if not isinstance(val, dict):\n",
" val = {\"val\": val}\n",
" if \"id\" not in val:\n",
" val[\"id\"] = str(uuid.uuid4())\n",
" new.append(val)\n",
" # Merge the two lists\n",
" left_idx_by_id = {val[\"id\"]: i for i, val in enumerate(left_)}\n",
" merged = left_.copy()\n",
" for val in right_:\n",
" if (existing_idx := left_idx_by_id.get(val[\"id\"])) is not None:\n",
" merged[existing_idx] = val\n",
" else:\n",
" merged.append(val)\n",
" return merged\n",
"\n",
"\n",
"class ChildState(TypedDict):\n",
" name: str\n",
" path: Annotated[list[str], reduce_list]\n",
"\n",
"\n",
"class ParentState(TypedDict):\n",
" name: str\n",
" path: Annotated[list[str], reduce_list]"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"child_builder = StateGraph(ChildState)\n",
"\n",
"child_builder.add_node(\"child_start\", lambda state: {\"path\": [\"child_start\"]})\n",
"child_builder.add_edge(START, \"child_start\")\n",
"child_builder.add_node(\"child_middle\", lambda state: {\"path\": [\"child_middle\"]})\n",
"child_builder.add_node(\"child_end\", lambda state: {\"path\": [\"child_end\"]})\n",
"child_builder.add_edge(\"child_start\", \"child_middle\")\n",
"child_builder.add_edge(\"child_middle\", \"child_end\")\n",
"child_builder.add_edge(\"child_end\", END)\n",
"\n",
"builder = StateGraph(ParentState)\n",
"\n",
"builder.add_node(\"grandparent\", lambda state: {\"path\": [\"grandparent\"]})\n",
"builder.add_edge(START, \"grandparent\")\n",
"builder.add_node(\"parent\", lambda state: {\"path\": [\"parent\"]})\n",
"builder.add_node(\"child\", child_builder.compile())\n",
"builder.add_node(\"sibling\", lambda state: {\"path\": [\"sibling\"]})\n",
"builder.add_node(\"fin\", lambda state: {\"path\": [\"fin\"]})\n",
"\n",
"# Add connections\n",
"builder.add_edge(\"grandparent\", \"parent\")\n",
"builder.add_edge(\"parent\", \"child\")\n",
"builder.add_edge(\"parent\", \"sibling\")\n",
"builder.add_edge(\"child\", \"fin\")\n",
"builder.add_edge(\"sibling\", \"fin\")\n",
"builder.add_edge(\"fin\", END)\n",
"graph = builder.compile()"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "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eR+Tqj8NyuwXrNr/ALR8YTq3S3OiIvtHxwiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgKg7Svh3FP29R+CVflBZRh9HlnYZqpqqnkpHufFJSS824Et3Tx07xXuUVRVTM5ZxMc4mF1muLdyKp6musowuwZvRxUmQ2WgvdLFJzscNfTtmYx+hG8A4EA6EjX61Wv8A4f8AZnpp0AxvTvexcP8AKto+1VQ+GL357/RPaqofDF789/osOPwqumMovfFrzjbM7ZpULG9lGF4dchcLFilms9eGGMVNDQxxSbp6xvNAOh0VrUl7VVD4Yvfnv9E9qqh8MXvz3+ijP4TNW2bscpSjHWo2REo1FrTlLUtbsvxrE62xXu6Rz3LKLdaagz1HOAwTPcJABpwOg4HuLbvtVUPhi9+e/wBF55H/APLHKXvlC1wlDVtFT3KiqKSrhjqaWojdFLDK0OZIxw0c1wPAggkEKjjYBszaQRgOOAjiCLXCCP8A2raPtVUPhi9+e/0T2qqHwxe/Pf6KUfhVVO69EfpKM46zVvpaxg2C7N6WeOaHA8dimjcHsey2QhzXA6gg7vAqd2gfEPI/J1R+G5XH2qqHwxe/Pf6LyrNj1ruFJNS1N0vM1PMx0ckbq3g5pGhB4d0K+z+GzReouV3c9GYndPVLzptmImIhe0RFqsIREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQc78tr4k7P/8AHVm/EcuiFzvy2viTs/8A8dWb8Ry6IQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREHO/La+JOz//AB1ZvxHLohc78tr4k7P/APHVm/EcuiEBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERARRl+yKgxqkbUV8/Nh7tyKJjS+SZ+mu6xg4uOgJ0A4AEngCVT5toN+q3E0VjpqOHhum41ZMpH1sja4D/AFn12026qoz3R79n+11Fqu55sNhota9M8u/RrJ/qmTpnl36NZP8AVMpaqO1HNb0S9wbKRa16Z5d+jWT/AFTJ0zy79Gsn+qZNVHajmdEvcHym5bWwo7DNuN0pqKnEOOXnW52vcboyON7jvwjuDm37zQP7u4T1ru//AKb2xObZlsWkyW4Rvhu+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",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from IPython.display import Image, display\n",
"\n",
"# Setting xray to 1 will show the internal structure of the nested graph\n",
"display(Image(graph.get_graph(xray=1).draw_mermaid_png()))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[36;1m\u001b[1;3m[0:tasks]\u001b[0m \u001b[1mStarting step 0 with 1 task:\n",
"\u001b[0m- \u001b[32;1m\u001b[1;3m__start__\u001b[0m -> {'name': 'test'}\n",
"\u001b[36;1m\u001b[1;3m[0:writes]\u001b[0m \u001b[1mFinished step 0 with writes to 1 channel:\n",
"\u001b[0m- \u001b[33;1m\u001b[1;3mname\u001b[0m -> 'test'\n",
"\u001b[36;1m\u001b[1;3m[0:checkpoint]\u001b[0m \u001b[1mState at the end of step 0:\n",
"\u001b[0m{'name': 'test', 'path': []}\n",
"\u001b[36;1m\u001b[1;3m[1:tasks]\u001b[0m \u001b[1mStarting step 1 with 1 task:\n",
"\u001b[0m- \u001b[32;1m\u001b[1;3mgrandparent\u001b[0m -> {'name': 'test', 'path': []}\n",
"\u001b[36;1m\u001b[1;3m[1:writes]\u001b[0m \u001b[1mFinished step 1 with writes to 1 channel:\n",
"\u001b[0m- \u001b[33;1m\u001b[1;3mpath\u001b[0m -> ['grandparent']\n",
"\u001b[36;1m\u001b[1;3m[1:checkpoint]\u001b[0m \u001b[1mState at the end of step 1:\n",
"\u001b[0m{'name': 'test',\n",
" 'path': [{'id': '79a81f03-d16d-4d12-94a6-4ba29fc9ce49', 'val': 'grandparent'}]}\n",
"\u001b[36;1m\u001b[1;3m[2:tasks]\u001b[0m \u001b[1mStarting step 2 with 1 task:\n",
"\u001b[0m- \u001b[32;1m\u001b[1;3mparent\u001b[0m -> {'name': 'test',\n",
" 'path': [{'id': '79a81f03-d16d-4d12-94a6-4ba29fc9ce49', 'val': 'grandparent'}]}\n",
"\u001b[36;1m\u001b[1;3m[2:writes]\u001b[0m \u001b[1mFinished step 2 with writes to 1 channel:\n",
"\u001b[0m- \u001b[33;1m\u001b[1;3mpath\u001b[0m -> ['parent']\n",
"\u001b[36;1m\u001b[1;3m[2:checkpoint]\u001b[0m \u001b[1mState at the end of step 2:\n",
"\u001b[0m{'name': 'test',\n",
" 'path': [{'id': '79a81f03-d16d-4d12-94a6-4ba29fc9ce49', 'val': 'grandparent'},\n",
" {'id': '2a6f0263-3949-4e47-a210-57f817e6097d', 'val': 'parent'}]}\n",
"\u001b[36;1m\u001b[1;3m[3:tasks]\u001b[0m \u001b[1mStarting step 3 with 2 tasks:\n",
"\u001b[0m- \u001b[32;1m\u001b[1;3mchild\u001b[0m -> {'name': 'test',\n",
" 'path': [{'id': '79a81f03-d16d-4d12-94a6-4ba29fc9ce49', 'val': 'grandparent'},\n",
" {'id': '2a6f0263-3949-4e47-a210-57f817e6097d', 'val': 'parent'}]}\n",
"- \u001b[32;1m\u001b[1;3msibling\u001b[0m -> {'name': 'test',\n",
" 'path': [{'id': '79a81f03-d16d-4d12-94a6-4ba29fc9ce49', 'val': 'grandparent'},\n",
" {'id': '2a6f0263-3949-4e47-a210-57f817e6097d', 'val': 'parent'}]}\n",
"\u001b[36;1m\u001b[1;3m[3:writes]\u001b[0m \u001b[1mFinished step 3 with writes to 2 channels:\n",
"\u001b[0m- \u001b[33;1m\u001b[1;3mname\u001b[0m -> 'test'\n",
"- \u001b[33;1m\u001b[1;3mpath\u001b[0m -> [{'id': '79a81f03-d16d-4d12-94a6-4ba29fc9ce49', 'val': 'grandparent'},\n",
" {'id': '2a6f0263-3949-4e47-a210-57f817e6097d', 'val': 'parent'},\n",
" {'id': 'd1c1bab0-6e19-4846-a470-e9cc2eb85088', 'val': 'child_start'},\n",
" {'id': 'e0fcb647-1e9e-4ae4-b560-0046515d5783', 'val': 'child_middle'},\n",
" {'id': '669dd810-360f-4694-a9f3-49597f23376a', 'val': 'child_end'}], ['sibling']\n",
"\u001b[36;1m\u001b[1;3m[3:checkpoint]\u001b[0m \u001b[1mState at the end of step 3:\n",
"\u001b[0m{'name': 'test',\n",
" 'path': [{'id': '79a81f03-d16d-4d12-94a6-4ba29fc9ce49', 'val': 'grandparent'},\n",
" {'id': '2a6f0263-3949-4e47-a210-57f817e6097d', 'val': 'parent'},\n",
" {'id': 'd1c1bab0-6e19-4846-a470-e9cc2eb85088', 'val': 'child_start'},\n",
" {'id': 'e0fcb647-1e9e-4ae4-b560-0046515d5783', 'val': 'child_middle'},\n",
" {'id': '669dd810-360f-4694-a9f3-49597f23376a', 'val': 'child_end'},\n",
" {'id': '137dbc2f-b33c-4ea4-8b04-a62215ba9718', 'val': 'sibling'}]}\n",
"\u001b[36;1m\u001b[1;3m[4:tasks]\u001b[0m \u001b[1mStarting step 4 with 1 task:\n",
"\u001b[0m- \u001b[32;1m\u001b[1;3mfin\u001b[0m -> {'name': 'test',\n",
" 'path': [{'id': '79a81f03-d16d-4d12-94a6-4ba29fc9ce49', 'val': 'grandparent'},\n",
" {'id': '2a6f0263-3949-4e47-a210-57f817e6097d', 'val': 'parent'},\n",
" {'id': 'd1c1bab0-6e19-4846-a470-e9cc2eb85088', 'val': 'child_start'},\n",
" {'id': 'e0fcb647-1e9e-4ae4-b560-0046515d5783', 'val': 'child_middle'},\n",
" {'id': '669dd810-360f-4694-a9f3-49597f23376a', 'val': 'child_end'},\n",
" {'id': '137dbc2f-b33c-4ea4-8b04-a62215ba9718', 'val': 'sibling'}]}\n",
"\u001b[36;1m\u001b[1;3m[4:writes]\u001b[0m \u001b[1mFinished step 4 with writes to 1 channel:\n",
"\u001b[0m- \u001b[33;1m\u001b[1;3mpath\u001b[0m -> ['fin']\n",
"\u001b[36;1m\u001b[1;3m[4:checkpoint]\u001b[0m \u001b[1mState at the end of step 4:\n",
"\u001b[0m{'name': 'test',\n",
" 'path': [{'id': '79a81f03-d16d-4d12-94a6-4ba29fc9ce49', 'val': 'grandparent'},\n",
" {'id': '2a6f0263-3949-4e47-a210-57f817e6097d', 'val': 'parent'},\n",
" {'id': 'd1c1bab0-6e19-4846-a470-e9cc2eb85088', 'val': 'child_start'},\n",
" {'id': 'e0fcb647-1e9e-4ae4-b560-0046515d5783', 'val': 'child_middle'},\n",
" {'id': '669dd810-360f-4694-a9f3-49597f23376a', 'val': 'child_end'},\n",
" {'id': '137dbc2f-b33c-4ea4-8b04-a62215ba9718', 'val': 'sibling'},\n",
" {'id': 'a4328c5f-845a-43de-b3d7-53a39208e316', 'val': 'fin'}]}\n"
]
},
{
"data": {
"text/plain": [
"{'name': 'test',\n",
" 'path': [{'val': 'grandparent', 'id': '79a81f03-d16d-4d12-94a6-4ba29fc9ce49'},\n",
" {'val': 'parent', 'id': '2a6f0263-3949-4e47-a210-57f817e6097d'},\n",
" {'val': 'child_start', 'id': 'd1c1bab0-6e19-4846-a470-e9cc2eb85088'},\n",
" {'val': 'child_middle', 'id': 'e0fcb647-1e9e-4ae4-b560-0046515d5783'},\n",
" {'val': 'child_end', 'id': '669dd810-360f-4694-a9f3-49597f23376a'},\n",
" {'val': 'sibling', 'id': '137dbc2f-b33c-4ea4-8b04-a62215ba9718'},\n",
" {'val': 'fin', 'id': 'a4328c5f-845a-43de-b3d7-53a39208e316'}]}"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"graph.invoke({\"name\": \"test\"}, debug=True)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}