diff --git a/examples/branching.ipynb b/examples/branching.ipynb index af4396e7f..b4f75214d 100644 --- a/examples/branching.ipynb +++ b/examples/branching.ipynb @@ -25,10 +25,18 @@ "%pip install -U langgraph" ] }, + { + "cell_type": "markdown", + "id": "d6c05fc4-ecd8-483f-a9fd-b1a055f922d9", + "metadata": {}, + "source": [ + "## Parallel node fan-out and fan-in" + ] + }, { "cell_type": "code", - "execution_count": 3, - "id": "88a23fb3-cf33-41ec-95bf-1ab9e7616ea9", + "execution_count": 1, + "id": "09372b8b-edea-4b9d-9ec3-3d93ce1ba819", "metadata": {}, "outputs": [], "source": [ @@ -40,16 +48,8 @@ "\n", "class State(TypedDict):\n", " # The operator.add reducer fn makes this append-only\n", - " aggregate: Annotated[list, operator.add]" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "05fb0173", - "metadata": {}, - "outputs": [], - "source": [ + " aggregate: Annotated[list, operator.add]\n", + "\n", "from typing import Any\n", "\n", "\n", @@ -59,16 +59,8 @@ "\n", " def __call__(self, state: State) -> Any:\n", " print(f\"Adding {self._value} to {state['aggregate']}\")\n", - " return {\"aggregate\": [self._value]}" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "5d468801", - "metadata": {}, - "outputs": [], - "source": [ + " return {\"aggregate\": [self._value]}\n", + "\n", "builder = StateGraph(State)\n", "builder.add_node(\"a\", ReturnNodeValue(\"I'm A\"))\n", "builder.set_entry_point(\"a\")\n", @@ -85,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "id": "66f52a20", "metadata": {}, "outputs": [ @@ -108,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "id": "38846b01", "metadata": {}, "outputs": [ @@ -128,7 +120,105 @@ "{'aggregate': [\"I'm A\", \"I'm B\", \"I'm C\", \"I'm D\"]}" ] }, - "execution_count": 7, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "graph.invoke({\"aggregate\": []})" + ] + }, + { + "cell_type": "markdown", + "id": "08d8162e-1785-4ae1-993f-6d2ed48c22ae", + "metadata": {}, + "source": [ + "## Parallel node fan-out and fan-in with extra steps\n", + "\n", + "The above example showed how to fan-out and fan-in when each path was only one step. But what if one path had more than one step?" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "259a7704-5aa0-4e4c-aeef-cca04e8be0ff", + "metadata": {}, + "outputs": [], + "source": [ + "from langgraph.graph import StateGraph\n", + "from typing_extensions import TypedDict\n", + "from typing import Annotated\n", + "import operator\n", + "\n", + "\n", + "class State(TypedDict):\n", + " # The operator.add reducer fn makes this append-only\n", + " aggregate: Annotated[list, operator.add]\n", + "\n", + "\n", + "builder = StateGraph(State)\n", + "builder.add_node(\"a\", ReturnNodeValue(\"I'm A\"))\n", + "builder.set_entry_point(\"a\")\n", + "builder.add_node(\"b\", ReturnNodeValue(\"I'm B\"))\n", + "builder.add_node(\"b2\", ReturnNodeValue(\"I'm B2\"))\n", + "builder.add_node(\"c\", ReturnNodeValue(\"I'm C\"))\n", + "builder.add_node(\"d\", ReturnNodeValue(\"I'm D\"))\n", + "builder.add_edge(\"a\", \"b\")\n", + "builder.add_edge(\"a\", \"c\")\n", + "builder.add_edge(\"b\", \"b2\")\n", + "builder.add_edge([\"b2\", \"c\"], \"d\")\n", + "builder.set_finish_point(\"d\")\n", + "graph = builder.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "83320227-8ab3-44c0-b6cf-064a7a425b9f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.display import Image, display\n", + "\n", + "display(Image(graph.get_graph().draw_mermaid_png()))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3f971fa3-29e4-466f-a85e-2863bfecf7fe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adding I'm A to []\n", + "Adding I'm B to [\"I'm A\"]\n", + "Adding I'm C to [\"I'm A\"]\n", + "Adding I'm B2 to [\"I'm A\", \"I'm B\", \"I'm C\"]\n", + "Adding I'm D to [\"I'm A\", \"I'm B\", \"I'm C\", \"I'm B2\"]\n" + ] + }, + { + "data": { + "text/plain": [ + "{'aggregate': [\"I'm A\", \"I'm B\", \"I'm C\", \"I'm B2\", \"I'm D\"]}" + ] + }, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -151,7 +241,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "id": "95f5e026", "metadata": {}, "outputs": [], @@ -200,7 +290,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "id": "1d0e6c56", "metadata": {}, "outputs": [ @@ -223,7 +313,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "id": "7134f652", "metadata": {}, "outputs": [ @@ -232,8 +322,8 @@ "output_type": "stream", "text": [ "Adding I'm A to []\n", - "Adding I'm B to [\"I'm A\"]\n", "Adding I'm C to [\"I'm A\"]\n", + "Adding I'm B to [\"I'm A\"]\n", "Adding I'm E to [\"I'm A\", \"I'm B\", \"I'm C\"]\n" ] }, @@ -243,7 +333,7 @@ "{'aggregate': [\"I'm A\", \"I'm B\", \"I'm C\", \"I'm E\"], 'which': 'bc'}" ] }, - "execution_count": 10, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -254,7 +344,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "id": "b130e694", "metadata": {}, "outputs": [ @@ -263,8 +353,8 @@ "output_type": "stream", "text": [ "Adding I'm A to []\n", - "Adding I'm C to [\"I'm A\"]\n", "Adding I'm D to [\"I'm A\"]\n", + "Adding I'm C to [\"I'm A\"]\n", "Adding I'm E to [\"I'm A\", \"I'm C\", \"I'm D\"]\n" ] }, @@ -274,7 +364,7 @@ "{'aggregate': [\"I'm A\", \"I'm C\", \"I'm D\", \"I'm E\"], 'which': 'cd'}" ] }, - "execution_count": 11, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -299,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "id": "836bc12d", "metadata": {}, "outputs": [], @@ -391,7 +481,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "932c497e", "metadata": {}, "outputs": [ @@ -414,7 +504,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "933b3afd", "metadata": {}, "outputs": [ @@ -435,7 +525,7 @@ " 'which': 'bc'}" ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -446,7 +536,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "e30531bf", "metadata": {}, "outputs": [ @@ -467,7 +557,7 @@ " 'which': 'cd'}" ] }, - "execution_count": 15, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -501,7 +591,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.11.1" } }, "nbformat": 4,