diff --git a/docs/docs/how-tos/streaming-from-final-node.ipynb b/docs/docs/how-tos/streaming-from-final-node.ipynb index bdd1e5340..aef5d346a 100644 --- a/docs/docs/how-tos/streaming-from-final-node.ipynb +++ b/docs/docs/how-tos/streaming-from-final-node.ipynb @@ -13,7 +13,31 @@ "id": "964686a6-8fed-4360-84d2-958c48186008", "metadata": {}, "source": [ - "A common use case is streaming from an agent is to stream LLM tokens from inside the final node. This guide demonstrates how you can do this.\n", + "
\n", + "

Prerequisites

\n", + "

\n", + " This guide assumes familiarity with the following:\n", + "

\n", + "

\n", + "
\n", + "\n", + "A common use case when streaming from an agent is to stream LLM tokens from inside the final node. This guide demonstrates how you can do this.\n", "\n", "## Setup\n", "\n", @@ -33,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "c87e4a47-4099-4d1a-907c-a99fa857165a", "metadata": {}, "outputs": [], @@ -60,7 +84,7 @@ "

\n", " Sign up for LangSmith to quickly spot issues and improve the performance of your LangGraph projects. LangSmith lets you use trace data to debug, test, and monitor your LLM apps built with LangGraph — read more about how to get started here. \n", "

\n", - " " + "" ] }, { @@ -73,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "5e62618d-0e0c-483c-acd3-40a26e61894a", "metadata": {}, "outputs": [], @@ -120,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "8c7339d2-1835-4b5a-a99c-a60e150280af", "metadata": {}, "outputs": [], @@ -164,28 +188,28 @@ " return {\"messages\": [response]}\n", "\n", "\n", - "workflow = StateGraph(MessagesState)\n", + "builder = StateGraph(MessagesState)\n", "\n", - "workflow.add_node(\"agent\", call_model)\n", - "workflow.add_node(\"tools\", tool_node)\n", + "builder.add_node(\"agent\", call_model)\n", + "builder.add_node(\"tools\", tool_node)\n", "# add a separate final node\n", - "workflow.add_node(\"final\", call_final_model)\n", + "builder.add_node(\"final\", call_final_model)\n", "\n", - "workflow.add_edge(START, \"agent\")\n", - "workflow.add_conditional_edges(\n", + "builder.add_edge(START, \"agent\")\n", + "builder.add_conditional_edges(\n", " \"agent\",\n", " should_continue,\n", ")\n", "\n", - "workflow.add_edge(\"tools\", \"agent\")\n", - "workflow.add_edge(\"final\", END)\n", + "builder.add_edge(\"tools\", \"agent\")\n", + "builder.add_edge(\"final\", END)\n", "\n", - "app = workflow.compile()" + "graph = builder.compile()" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "id": "2ab6d079-ba06-48ba-abe5-e72df24407af", "metadata": {}, "outputs": [ @@ -203,7 +227,7 @@ "source": [ "from IPython.display import display, Image\n", "\n", - "display(Image(app.get_graph().draw_mermaid_png()))" + "display(Image(graph.get_graph().draw_mermaid_png()))" ] }, { @@ -214,19 +238,6 @@ "## Stream outputs from the final node" ] }, - { - "cell_type": "code", - "execution_count": 5, - "id": "84d65cbe-4cfe-44f8-b49e-b37632887c91", - "metadata": {}, - "outputs": [], - "source": [ - "import warnings\n", - "from langchain_core._api import LangChainBetaWarning\n", - "\n", - "warnings.filterwarnings(\"ignore\", category=LangChainBetaWarning)" - ] - }, { "cell_type": "markdown", "id": "5cfaeb64-5506-4546-96c0-4891e6288ad9", @@ -260,8 +271,8 @@ "source": [ "from langchain_core.messages import HumanMessage\n", "\n", - "inputs = [HumanMessage(content=\"what is the weather in sf\")]\n", - "async for msg, metadata in app.astream({\"messages\": inputs}, stream_mode=\"messages\"):\n", + "inputs = {\"messages\": [HumanMessage(content=\"what is the weather in sf\")]}\n", + "for msg, metadata in graph.stream(inputs, stream_mode=\"messages\"):\n", " if (\n", " msg.content\n", " and not isinstance(msg, HumanMessage)\n", @@ -296,13 +307,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Well| folks|,| looks| like| we|'ve| got| some| cloudy| skies| in| the| Big| Apple| today|.| So| grab| your| umbrella| just| in| case|,| and| don|'t| let| those| clouds| rain| on| your| parade|!|" + "Looks| like| we|'ve| got| some| clouds| roll|in|'| in| over| the| Big| Apple| today|,| folks|!| Keep| an| eye| out| for| some| over|cast| skies| in| NYC|.|" ] } ], "source": [ - "inputs = {\"messages\": [(\"human\", \"what's the weather in nyc?\")]}\n", - "async for event in app.astream_events(inputs, version=\"v2\"):\n", + "inputs = {\"messages\": [HumanMessage(content=\"what's the weather in nyc?\")]}\n", + "async for event in graph.astream_events(inputs, version=\"v2\"):\n", " kind = event[\"event\"]\n", " tags = event.get(\"tags\", [])\n", " # filter on the custom tag\n", diff --git a/docs/docs/how-tos/subgraph.ipynb b/docs/docs/how-tos/subgraph.ipynb index 0c48a7b7d..85addf889 100644 --- a/docs/docs/how-tos/subgraph.ipynb +++ b/docs/docs/how-tos/subgraph.ipynb @@ -11,7 +11,31 @@ "source": [ "# How to create subgraphs\n", "\n", - "For more complex systems, subgraphs are a useful design principle. Subgraphs allow you to create and manage different states in different parts of your graph. This allows you build things like [multi-agent teams](https://langchain-ai.github.io/langgraph/tutorials/multi_agent/hierarchical_agent_teams/), where each team can track its own separate state.\n", + "
\n", + "

Prerequisites

\n", + "

\n", + " This guide assumes familiarity with the following:\n", + "

\n", + "

\n", + "
\n", + "\n", + "For more complex systems, subgraphs are a useful design principle. Subgraphs allow you to create and manage different states in different parts of your graph. This allows you build things like [multi-agent teams](https://langchain-ai.github.io/langgraph/tutorials/multi_agent/hierarchical_agent_teams/), where each team can track its own separate state. This guide shows how you can add subgraphs to your graph.\n", "\n", "![Screenshot 2024-07-11 at 1.01.28 PM.png](attachment:71516aef-9c00-4730-a676-a54e90cb6472.png)" ] diff --git a/docs/docs/how-tos/visualization.ipynb b/docs/docs/how-tos/visualization.ipynb index 1a112863b..544f7e66a 100644 --- a/docs/docs/how-tos/visualization.ipynb +++ b/docs/docs/how-tos/visualization.ipynb @@ -7,7 +7,7 @@ "source": [ "# How to visualize your graph\n", "\n", - "This notebook walks through how to visualize the graphs you create. This works with ANY [Graph](https://langchain-ai.github.io/langgraph/reference/graphs/).\n", + "This guide walks through how to visualize the graphs you create. This works with ANY [Graph](https://langchain-ai.github.io/langgraph/reference/graphs/).\n", "\n", "## Setup\n", "\n", @@ -32,7 +32,7 @@ "source": [ "## Set up Graph\n", "\n", - "You can visualize any arbitrary Graph, including StateGraph's and MessageGraph's. Let's have some fun by drawing fractals :)." + "You can visualize any arbitrary [Graph](https://langchain-ai.github.io/langgraph/reference/graphs/), including [StateGraph](https://langchain-ai.github.io/langgraph/reference/graphs/#langgraph.graph.state.StateGraph). Let's have some fun by drawing fractals :)." ] }, { @@ -109,80 +109,6 @@ "app = build_fractal_graph(3)" ] }, - { - "cell_type": "markdown", - "id": "f4fc9378-b141-4b65-b86c-3afba77f7161", - "metadata": { - "ExecuteTime": { - "end_time": "2024-04-18T12:18:30.605220Z", - "start_time": "2024-04-18T12:18:30.587191Z" - } - }, - "source": [ - "## Ascii\n", - "\n", - "We can easily visualize this graph in ascii" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a0b22e88-7f78-4215-afdd-4eedef9e2b9b", - "metadata": {}, - "outputs": [], - "source": [ - "%pip install --quiet grandalf" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "ca9b980d-1f0a-4286-9157-a870e3d55134", - "metadata": { - "ExecuteTime": { - "end_time": "2024-04-19T11:25:37.303260Z", - "start_time": "2024-04-19T11:25:37.273032Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " +-----------+ \n", - " | __start__ | \n", - " +-----------+ \n", - " * \n", - " * \n", - " * \n", - " .......+------------+******** \n", - " ................ *****.| entry_node |....... **************** \n", - " ................ ***********...... +------------+ ****............ **************** \n", - " ............... ************ ..... . ****** ............. *************** \n", - " ................ ************ ...... . ****** ............ **************** \n", - " ................ ******* ...... . ****** ............ **************** \n", - " ........ +-------------------+ .... . **** ........ ******** \n", - " . | node_entry_node_B |****** .. . * .. ** \n", - " ... +-------------------+ ************. . * ... *** \n", - " . **** *** ... *********** . * ... *** \n", - " ... **** ** .. ************ . * .. ** \n", - " . ** ** .. ****** . * .. ** \n", - "+--------------------------+ +--------------------------+ +--------------------------+ **** +-------------------+ \n", - "| node_node_entry_node_B_B |........ | node_node_entry_node_B_C | | node_node_entry_node_B_A | ****** ......| node_entry_node_A | \n", - "+--------------------------+ ...+--------------------------+........ +--------------------------+ ****** ............... +-------------------+ \n", - " ............... .......... . ******* ............. \n", - " ............. ......... . ****** ............... \n", - " ............... ..... . **** ............. \n", - " .....+---------+........ \n", - " | __end__ | \n", - " +---------+ \n" - ] - } - ], - "source": [ - "app.get_graph().print_ascii()" - ] - }, { "cell_type": "markdown", "id": "edcd9ad2",