From b0ed8fdd3b29dc63237a48298e4917f608c1e29e Mon Sep 17 00:00:00 2001 From: Harrison Chase Date: Wed, 26 Jun 2024 21:56:31 -0700 Subject: [PATCH] Harrison/final nits (#845) * final nits * cr * cr * cr --- docs/docs/cloud/how-tos/index.md | 23 +- docs/docs/cloud/quick_start.md | 14 +- docs/docs/concepts/index.md | 38 +- docs/docs/tutorials/index.md | 6 +- docs/mkdocs.yml | 23 +- examples/introduction.ipynb | 118 ++-- examples/sdk/img/graph_diagram.png | Bin 56102 -> 0 bytes examples/sdk/img/thread_diagram.png | Bin 110865 -> 0 bytes examples/sdk/js_sdk.ipynb | 800 ---------------------------- examples/sdk/python_sdk.ipynb | 728 ------------------------- 10 files changed, 118 insertions(+), 1632 deletions(-) delete mode 100644 examples/sdk/img/graph_diagram.png delete mode 100644 examples/sdk/img/thread_diagram.png delete mode 100644 examples/sdk/js_sdk.ipynb delete mode 100644 examples/sdk/python_sdk.ipynb diff --git a/docs/docs/cloud/how-tos/index.md b/docs/docs/cloud/how-tos/index.md index be24adf34..d64d541df 100644 --- a/docs/docs/cloud/how-tos/index.md +++ b/docs/docs/cloud/how-tos/index.md @@ -46,10 +46,25 @@ When creating complex graphs, leaving every decision up to the LLM can be danger ## LangGraph Studio -- [Test Cloud Deployment](https://langchain-ai.github.io/langgraph/cloud/how-tos/test_deployment/) -- [Invoke graph in LangGraph Studio](https://langchain-ai.github.io/langgraph/cloud/how-tos/invoke_studio/) +LangGraph Studio is a built-in UI for visualizing, testing, and debugging your agents. + +- [How to enter LangGraph Studio](https://langchain-ai.github.io/langgraph/cloud/how-tos/test_deployment/) +- [How to test your graph in LangGraph Studio](https://langchain-ai.github.io/langgraph/cloud/how-tos/invoke_studio/) - [Interact with threads in LangGraph Studio](https://langchain-ai.github.io/langgraph/cloud/how-tos/threads_studio/) -## And more! +## Different Types of Runs: -The four sections above don't cover everything that is possible with LangGraph cloud - make sure to check out our other how-to guides to learn even more! \ No newline at end of file +LangGraph Cloud supports multiple types of runs besides streaming runs. + +- [How to run an agent in the background](cloud_examples/background_run.ipynb) +- [How to run multiple agents in the same thread](cloud_examples/same-thread.ipynb) +- [How to create cron jobs](cloud_examples/cron_jobs.ipynb) +- [How to create stateless runs](cloud_examples/stateless_runs.ipynb) + +## Other + +Other guides that may prove helpful! + +- [How to configure agents](cloud_examples/configuration_cloud.ipynb) +- [How to convert LangGraph calls to LangGraph cloud calls](cloud_examples/langgraph_to_langgraph_cloud.ipynb) +- [How to integrate webhooks](cloud_examples/webhooks.ipynb) diff --git a/docs/docs/cloud/quick_start.md b/docs/docs/cloud/quick_start.md index 7807e1381..5cbd5245a 100644 --- a/docs/docs/cloud/quick_start.md +++ b/docs/docs/cloud/quick_start.md @@ -23,15 +23,15 @@ This tutorial will use: 2. The `agent.py` file should contain Python code for defining your graph. The following code is a simple example, the important thing is that at some point in your file you compile your graph and assign the compiled graph to a variable (in this case the `graph` variable). This example code uses `create_react_agent`, a prebuilt agent, read more about it [here](..//concepts/agentic_concepts.md#react-agent). ```python - from langchain_anthropic import ChatAnthropic - from langchain_community.tools.tavily_search import TavilySearchResults - from langgraph.prebuilt import create_react_agent + from langchain_anthropic import ChatAnthropic + from langchain_community.tools.tavily_search import TavilySearchResults + from langgraph.prebuilt import create_react_agent - model = ChatAnthropic(model="claude-3-5-sonnet-20240620") + model = ChatAnthropic(model="claude-3-5-sonnet-20240620") - tools = [TavilySearchResults(max_results=2)] + tools = [TavilySearchResults(max_results=2)] - graph = create_react_agent(model, tools) + graph = create_react_agent(model, tools) ``` 3. The `requirements.txt` file should contain any dependencies for your graph(s). In this case we only require four packages for our graph to run: @@ -231,8 +231,6 @@ async for chunk in client.runs.stream( {'agent': {'messages': [{'content': "Hi Bagatur! It's nice to meet you. How can I assist you today?", 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop', 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_9cb5d38cf7'}, 'type': 'ai', 'name': None, 'id': 'run-c89118b7-1b1e-42b9-a85d-c43fe99881cd', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}]}} -You can learn more about the Python SDK in [this how-to guide](./sdk/python_sdk.ipynb), and read up on the Javascript SDK in [this how-to guide](./sdk/js_sdk.ipynb) - ## What's Next Congratulations! If you've worked your way through this tutorial you are well on your way to becoming a LangGraph Cloud expert. Here are some other resources to check out to help you out on the path to expertise: diff --git a/docs/docs/concepts/index.md b/docs/docs/concepts/index.md index 671b53f0f..3acace645 100644 --- a/docs/docs/concepts/index.md +++ b/docs/docs/concepts/index.md @@ -14,28 +14,28 @@ LangGraph for Agentic Applications Low Level Concepts - [Graphs](low_level.md#graphs) - - [StateGraph](low_level.md#stategraph) - - [MessageGraph](low_level.md#messagegraph) - - [Compiling Your Graph](low_level.md#compiling-your-graph) + - [StateGraph](low_level.md#stategraph) + - [MessageGraph](low_level.md#messagegraph) + - [Compiling Your Graph](low_level.md#compiling-your-graph) - [State](low_level.md#state) - - [Schema](low_level.md#schema) - - [Reducers](low_level.md#reducers) - - [MessageState](low_level.md#messagestate) + - [Schema](low_level.md#schema) + - [Reducers](low_level.md#reducers) + - [MessageState](low_level.md#messagestate) - [Nodes](low_level.md#nodes) - - [`START` node](low_level.md#start-node) - - [`END` node](low_level.md#end-node) + - [`START` node](low_level.md#start-node) + - [`END` node](low_level.md#end-node) - [Edges](low_level.md#edges) - - [Normal Edges](low_level.md#normal-edges) - - [Conditional Edges](low_level.md#conditional-edges) - - [Entry Point](low_level.md#entry-point) - - [Conditional Entry Point](low_level.md#conditional-entry-point) + - [Normal Edges](low_level.md#normal-edges) + - [Conditional Edges](low_level.md#conditional-edges) + - [Entry Point](low_level.md#entry-point) + - [Conditional Entry Point](low_level.md#conditional-entry-point) - [Send](low_level.md#send) - [Checkpointer](low_level.md#checkpointer) - [Threads](low_level.md#threads) - [Checkpointer states](low_level.md#checkpointer-state) - - [Get state](low_level.md#get-state) - - [Get state history](low_level.md#get-state-history) - - [Update state](low_level.md#update-state) + - [Get state](low_level.md#get-state) + - [Get state history](low_level.md#get-state-history) + - [Update state](low_level.md#update-state) - [Configuration](low_level.md#configuration) - [Visualization](low_level.md#visualization) - [Streaming](low_level.md#streaming) @@ -46,10 +46,10 @@ Common Agentic Patterns - [Tool calling](agentic_concepts.md#tool-calling) - [Memory](agentic_concepts.md#memory) - [Human in the loop](agentic_concepts.md#human-in-the-loop) - - [Approval](agentic_concepts.md#approval) - - [Wait for input](agentic_concepts.md#wait-for-input) - - [Edit agent actions](agentic_concepts.md#edit-agent-actions) - - [Time travel](agentic_concepts.md#time-travel) + - [Approval](agentic_concepts.md#approval) + - [Wait for input](agentic_concepts.md#wait-for-input) + - [Edit agent actions](agentic_concepts.md#edit-agent-actions) + - [Time travel](agentic_concepts.md#time-travel) - [Map-Reduce](agentic_concepts.md#map-reduce) - [Multi-agent](agentic_concepts.md#multi-agent) - [Planning](agentic_concepts.md#planning) diff --git a/docs/docs/tutorials/index.md b/docs/docs/tutorials/index.md index a5aa052dc..3e414d592 100644 --- a/docs/docs/tutorials/index.md +++ b/docs/docs/tutorials/index.md @@ -7,11 +7,11 @@ hide: Welcome to the LangGraph Tutorials! These notebooks introduce LangGraph through building various language agents and applications. -## Introduction to LangGraph +## Quick Start -Learn the basics of LangGraph through the onboarding tutorials. +Learn the basics of LangGraph through a comprehensive quick start in which you will build an agent from scratch. -- [Introduction to LangGraph](introduction.ipynb) +- [Quick Start](introduction.ipynb) ## Use cases diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 6af3a2296..7c4926427 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -85,7 +85,7 @@ nav: - "index.md" - Tutorials: - "tutorials/index.md" - - Introduction: tutorials/introduction.ipynb + - Quick Start: tutorials/introduction.ipynb - Chatbots: - Customer Support: tutorials/customer-support/customer-support.ipynb - Prompt Generation from User Requirements: tutorials/chatbots/information-gather-prompting.ipynb @@ -193,20 +193,19 @@ nav: - Wait for User Input: "cloud/how-tos/cloud_examples/human_in_the_loop_user_input.ipynb" - Edit Graph State: "cloud/how-tos/cloud_examples/human_in_the_loop_edit_state.ipynb" - Replay and Branch from Prior States: "cloud/how-tos/cloud_examples/human_in_the_loop_time_travel.ipynb" - - Test with LangGraph Studio: + - LangGraph Studio: - Test Cloud Deployment: "cloud/how-tos/test_deployment.md" - Invoke graph in LangGraph Studio: "cloud/how-tos/invoke_studio.md" - Interact with threads in LangGraph Studio: "cloud/how-tos/threads_studio.md" - - Run Agent in Background: "cloud/how-tos/cloud_examples/background_run.ipynb" - - Run Multiple Agents in Thread: "cloud/how-tos/cloud_examples/same-thread.ipynb" - - Create Agents with Configuration: "cloud/how-tos/cloud_examples/configuration_cloud.ipynb" - - Convert LangGraph calls to LangGraph Cloud calls: "cloud/how-tos/cloud_examples/langgraph_to_langgraph_cloud.ipynb" - - Create Cron Jobs: "cloud/how-tos/cloud_examples/cron_jobs.ipynb" - - Create Stateless Runs: "cloud/how-tos/cloud_examples/stateless_runs.ipynb" - - Integrate Webhooks: 'cloud/how-tos/cloud_examples/webhooks.ipynb' - - SDK: - - Python: "cloud/sdk/python_sdk.ipynb" - - JS/TS: "cloud/sdk/js_sdk.ipynb" + - Different Types of Runs: + - Run an Agent in the Background: "cloud/how-tos/cloud_examples/background_run.ipynb" + - Run Multiple Agents in Same Thread: "cloud/how-tos/cloud_examples/same-thread.ipynb" + - Create Cron Jobs: "cloud/how-tos/cloud_examples/cron_jobs.ipynb" + - Create Stateless Runs: "cloud/how-tos/cloud_examples/stateless_runs.ipynb" + - Other: + - Configure Agents: "cloud/how-tos/cloud_examples/configuration_cloud.ipynb" + - Convert LangGraph calls to LangGraph Cloud calls: "cloud/how-tos/cloud_examples/langgraph_to_langgraph_cloud.ipynb" + - Integrate Webhooks: 'cloud/how-tos/cloud_examples/webhooks.ipynb' - Conceptual Guides: "cloud/concepts/index.md" - Reference: - API: "cloud/reference/api/api_ref.md" diff --git a/examples/introduction.ipynb b/examples/introduction.ipynb index 7d2343512..3d20c0656 100644 --- a/examples/introduction.ipynb +++ b/examples/introduction.ipynb @@ -5,9 +5,9 @@ "id": "4a1aae78-88a6-4133-b905-7e46c8e3772f", "metadata": {}, "source": [ - "# Introduction to LangGraph\n", + "# Quick Start\n", "\n", - "In this tutorial, we will build a support chatbot in LangGraph that can:\n", + "In this comprehensive quick start, we will build a support chatbot in LangGraph that can:\n", "\n", "- Answer common questions by searching the web\n", "- Maintain conversation state across calls\n", @@ -343,16 +343,13 @@ "\n", "However, you may have noticed that the bot's knowledge is limited to what's in its training data. In the next part, we'll add a web search tool to expand the bot's knowledge and make it more capable.\n", "\n", - "Below is the full code for this section for your reference:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "e014741f-cfad-4045-b6fa-ebd74ae93a5a", - "metadata": {}, - "outputs": [], - "source": [ + "Below is the full code for this section for your reference:\n", + "\n", + "
\n", + "Full Code\n", + "
\n",
+    "        \n",
+    "```python\n",
     "from typing import Annotated\n",
     "\n",
     "from langchain_anthropic import ChatAnthropic\n",
@@ -382,7 +379,11 @@
     "graph_builder.add_node(\"chatbot\", chatbot)\n",
     "graph_builder.set_entry_point(\"chatbot\")\n",
     "graph_builder.set_finish_point(\"chatbot\")\n",
-    "graph = graph_builder.compile()"
+    "graph = graph_builder.compile()\n",
+    "```\n",
+    "\n",
+    "
\n", + "
" ] }, { @@ -766,16 +767,13 @@ "Our chatbot still can't remember past interactions on its own, limiting its ability to have coherent, multi-turn conversations. In the next part, we'll add **memory** to address this.\n", "\n", "\n", - "The full code for the graph we've created in this section is reproduced below, replacing our `BasicToolNode` for the prebuilt [ToolNode](https://langchain-ai.github.io/langgraph/reference/prebuilt/#toolnode), and our `route_tools` condition with the prebuilt [tools_condition](https://langchain-ai.github.io/langgraph/reference/prebuilt/#tools_condition)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "8755d551-160e-4f8f-afac-0e4e07ca79ff", - "metadata": {}, - "outputs": [], - "source": [ + "The full code for the graph we've created in this section is reproduced below, replacing our `BasicToolNode` for the prebuilt [ToolNode](https://langchain-ai.github.io/langgraph/reference/prebuilt/#toolnode), and our `route_tools` condition with the prebuilt [tools_condition](https://langchain-ai.github.io/langgraph/reference/prebuilt/#tools_condition)\n", + "\n", + "
\n", + "Full Code\n", + "
\n",
+    "\n",
+    "```python\n",
     "from typing import Annotated\n",
     "\n",
     "from langchain_anthropic import ChatAnthropic\n",
@@ -817,7 +815,11 @@
     "# Any time a tool is called, we return to the chatbot to decide the next step\n",
     "graph_builder.add_edge(\"tools\", \"chatbot\")\n",
     "graph_builder.set_entry_point(\"chatbot\")\n",
-    "graph = graph_builder.compile()"
+    "graph = graph_builder.compile()\n",
+    "```\n",
+    "\n",
+    "
\n", + "
" ] }, { @@ -1170,16 +1172,13 @@ "\n", "In the next part, we'll introduce human oversight to our bot to handle situations where it may need guidance or verification before proceeding.\n", " \n", - "Check out the code snippet below to review our graph from this section." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "9c50a794-3ae5-484c-8edd-50e0d54da982", - "metadata": {}, - "outputs": [], - "source": [ + "Check out the code snippet below to review our graph from this section.\n", + "\n", + "
\n", + "Full Code\n", + "
\n",
+    "\n",
+    "```python\n",
     "from typing import Annotated\n",
     "\n",
     "from langchain_anthropic import ChatAnthropic\n",
@@ -1221,7 +1220,10 @@
     ")\n",
     "graph_builder.add_edge(\"tools\", \"chatbot\")\n",
     "graph_builder.set_entry_point(\"chatbot\")\n",
-    "graph = graph_builder.compile(checkpointer=memory)"
+    "graph = graph_builder.compile(checkpointer=memory)\n",
+    "```\n",
+    "
\n", + "details" ] }, { @@ -1478,16 +1480,13 @@ "\n", "Next, we'll explore how to further customize the bot's behavior using custom state updates.\n", "\n", - "Below is a copy of the code you used in this section. The only difference between this and the previous parts is the addition of the `interrupt_before` argument." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "a7228caf-a5aa-4f68-b775-81ea5402aca8", - "metadata": {}, - "outputs": [], - "source": [ + "Below is a copy of the code you used in this section. The only difference between this and the previous parts is the addition of the `interrupt_before` argument.\n", + "\n", + "
\n", + "Full Code\n", + "
\n",
+    "\n",
+    "```python\n",
     "from typing import Annotated\n",
     "\n",
     "from langchain_anthropic import ChatAnthropic\n",
@@ -1537,7 +1536,10 @@
     "    interrupt_before=[\"tools\"],\n",
     "    # Note: can also interrupt __after__ actions, if desired.\n",
     "    # interrupt_after=[\"tools\"]\n",
-    ")"
+    ")\n",
+    "```\n",
+    "
\n", + "
" ] }, { @@ -2508,16 +2510,13 @@ "\n", "We're almost done with the tutorial, but there is one more concept we'd like to review before finishing that connects `checkpointing` and `state updates`. \n", "\n", - "This section's code is reproduced below for your reference." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "6516baf8-bbb6-4400-b867-0add1a087342", - "metadata": {}, - "outputs": [], - "source": [ + "This section's code is reproduced below for your reference.\n", + "\n", + "
\n", + "Full Code\n", + "
\n",
+    "\n",
+    "```python\n",
     "from typing import Annotated\n",
     "\n",
     "from langchain_anthropic import ChatAnthropic\n",
@@ -2617,7 +2616,10 @@
     "graph = graph_builder.compile(\n",
     "    checkpointer=memory,\n",
     "    interrupt_before=[\"human\"],\n",
-    ")"
+    ")\n",
+    "```\n",
+    "
\n", + "
" ] }, { @@ -3066,7 +3068,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.2" + "version": "3.11.1" } }, "nbformat": 4, diff --git a/examples/sdk/img/graph_diagram.png b/examples/sdk/img/graph_diagram.png deleted file mode 100644 index 2105cde69ceccea35dc433a48f5f535ac1663299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56102 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\n", - "\n", - "The workflow is as follows: first the user inputs some message, our llm decides how to configure the call to our tool `get_user_info` , and after getting the results of the tool call we respond to our user using another LLM.\n", - "\n", - "### Simple Invocation\n", - "\n", - "Ok, now that we have set up our client, assistant, and thread we can actually invoke the graph above. Let’s first define the function we will use to invoke the graph, since we don’t want to have to rewrite this code every single run." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "async function processStreamedMessages(client, thread, agent, messages, metadata = {}) {\n", - " var answer = [];\n", - " try {\n", - " const streamResponse = client.runs.stream(\n", - " thread[\"thread_id\"],\n", - " agent[\"assistant_id\"],\n", - " {\n", - " input: { messages },\n", - " config: {\"configurable\": metadata}\n", - " }\n", - " );\n", - "\n", - " for await (const chunk of streamResponse) {\n", - " answer.concat(chunk);\n", - " // Process each chunk of streamed data here\n", - " }\n", - " return answer;\n", - " } catch (error) {\n", - " console.error('Error processing streamed messages:', error);\n", - " }\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let’s now see what happens to our graph when we run it with a simple sentence:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "var messages = [{ role: \"human\", content: \"My name is Bagatur and I am 26 years old.\" }];\n", - "\n", - "await processStreamedMessages(client, thread, agent, messages);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In order to see what happened to our graph, let's examine the state which was updated after the run we just sent through." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "var state = await client.threads.getState(thread['thread_id']);\n", - "console.log(state);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "{\n", - " values: {\n", - " messages: [ [Object], [Object], [Object] ],\n", - " user_info: { age: 26, name: 'Bagatur' }\n", - " },\n", - " next: [],\n", - " config: {\n", - " configurable: {\n", - " thread_id: '15292d98-6aca-4df8-b2a1-f4508e11abb1',\n", - " thread_ts: '1ef2f516-ebd2-68f4-8003-2a1251f89da5'\n", - " }\n", - " },\n", - " metadata: {\n", - " step: 3,\n", - " run_id: '1ef2f516-e211-6e60-8d19-6a1309008ece',\n", - " source: 'loop',\n", - " writes: { respond_to_user: [Object] },\n", - " user_id: '',\n", - " graph_id: 'agent',\n", - " thread_id: '15292d98-6aca-4df8-b2a1-f4508e11abb1',\n", - " created_by: 'system',\n", - " assistant_id: 'fe096781-5601-53d2-b2f6-0d3403f7e9ca'\n", - " },\n", - " created_at: '2024-06-20T22:07:06.852149+00:00',\n", - " parent_config: {\n", - " configurable: {\n", - " thread_id: '15292d98-6aca-4df8-b2a1-f4508e11abb1',\n", - " thread_ts: '1ef2f516-e6c7-6698-8002-80a6bedfa731'\n", - " }\n", - " }\n", - " }" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our state variable contains a variety of important information. Here is a quick summary of the keys and what they represent:\n", - "\n", - "- `values` contains the actual state values, so in our case you could call `state['values']['messages']` or `state['values']['user_info']` and get the actual values of each of the state variables.\n", - "- `next` tells us what action in the graph is next at the current state. Since we just finished running our graph and reached the end node, it is currently empty because there is no next action to take. However, if you go through the state at each point of the run you will see that the `next` value goes from `__start__` → `llm` → `get_user_info` →`respond_to_user` .\n", - "- `config` tells us what the configuration of the state is. This is important for when we want to run a query starting at a previous state instead of the one we are at. An example of this is shown in the Invoking from a previous checkpoint section\n", - "- `metadata` stores the metadata associated with our state. This is data that is outside of the agent state, but is important to keep track of across multiple runs. An example of this is shown in the next section.\n", - "- `created_at` is information on the date and time the state was created at.\n", - "- `parent_config` is config for the previous step of the graph. Note that the previous step is not the previous run, but rather the previous node that the graph was at.\n", - "\n", - "\n", - "### Invoking with Metadata\n", - "\n", - "Let’s create a new thread to reset our state and start fresh." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "const thread_2 = await client.threads.create();" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let’s add some metadata to our request. In this example we are going to treat each run of our assistant as a separate “node”. For each run, we will pass in a “node_id” as well as a “parent_node” in the metadata. This way we can easily go “back in time” and rerun our graph from a previous checkpoint. \n", - "\n", - "> NOTE: The reason we add this metadata instead of using the `parent_config` attribute is because `parent_config` tracks every individual step of a run, not the entire run itself.\n", - ">" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "var messages = [{ role: \"human\", content: \"My name is Bagatur and I am 26 years old.\" }];\n", - "\n", - "await processStreamedMessages(client, thread_2, agent, messages, {\"node_id\": 1, \"parent_node\": null});" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using our `run_input` function makes it easy to pass in metadata and you can inspect the function as well as the API docs to see exactly how metadata gets passed.\n", - "\n", - "We can continue our thread by creating a second node as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "messages = [{ role: \"human\", content: \"What is my name?\" }];\n", - "\n", - "await processStreamedMessages(client, thread_2, agent, messages, {\"node_id\": 2, \"parent_node\": 1});" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's check our state to make sure the graph remembered our name on the second run:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "var state = await client.threads.getState(thread_2['thread_id']);\n", - "var graph_messages = state.values['messages'].map((message) => message.content);\n", - "console.log(graph_messages);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "[\n", - " 'My name is Bagatur and I am 26 years old.',\n", - " '',\n", - " 'Hello Bagatur! How can I assist you today?',\n", - " 'What is my name?',\n", - " '',\n", - " 'Your name is Bagatur. How can I assist you today, Bagatur?'\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Perfect! The state persisted across separate runs, and the LLM remembers the name of our user. In a future we will explore non-sequential runs, i.e. not having each run just follow the last one but choosing which checkpoint we start our run from.\n", - "\n", - "## Querying and Updating the thread\n", - "\n", - "### Getting checkpoints by metadata\n", - "\n", - "Let’s say we want to start a new run from a previous state (not the current state). This state lives somewhere in our history, so we can utilize the `get_history` function to try and find it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "var all_history = await client.threads.getHistory(thread_2[\"thread_id\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is helpful for inspecting the specifics of our current thread, but remember that the history contains all the intermediate steps a graph takes. In our case, where the graph has 5 nodes (remember that Start and End both count as nodes), our history array grows quickly. Luckily, there is a way to query by using metadata. For example if we wanted to start a run from Node 1(from the example from above) we need to find the state from the end of run with metadata node_id:1 , which we can do like so:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "var node_1_history = await client.threads.getHistory(thread_2[\"thread_id\"],{metadata: {'node_id':1}})\n", - "\n", - "var node_1_end_of_run = history.filter(node => node.next.length === 0)[0];" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let’s explore how we could use this information to create a new branch in our thread.\n", - "\n", - "### Invoking from a previous checkpoint\n", - "\n", - "The following diagram describes what we would like to happen:\n", - "\n", - "
\n", - " \n", - "
\n", - "Basically, we want to have 3 runs of our graph, but instead of having them sequentially - we want both the second and third run to originate from the same state. We can do this by utilizing the code we used above, and passing additional metadata to our run." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "messages = [{ role: \"human\", content: \"What is my age?\" }];\n", - "\n", - "await processStreamedMessages(client, thread_2, agent, messages, {\"node_id\": 3, \"parent_node\": 1, \"thread_ts\":node_1_end_of_run.checkpoint_id});" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To check that everything actually worked as planned, let’s check our current state and check that message history to ensure that the message we passed to Node 2 is nowhere to be found." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "var state = await client.threads.getState(thread_2['thread_id']);\n", - "var graph_messages = state.values['messages'].map((message) => message.content);\n", - "console.log(graph_messages);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "[\n", - " 'My name is Bagatur and I am 26 years old.',\n", - " '',\n", - " 'Hello Bagatur! How can I assist you today?',\n", - " 'What is my age?',\n", - " '',\n", - " 'You are 26 years old, Bagatur. How can I assist you today?'\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! This has worked as expected. Being able to go back to previous states and execute new graph runs from those checkpoints is a great way to develop flexible applications that don’t require reloading or restarting everything when an error is detected or a user changes their mind.\n", - "\n", - "### Updating/Patching the thread state\n", - "\n", - "Lastly, let’s discuss the ability to manually change both the thread state as well as the metadata for a given state. Let’s say we incorrectly inputted data to the LLM and we want to rectify it. \n", - "\n", - "Continuing our previous example, let’s say the user mistyped their age and we want to let the graph know that without actually running it. In this case we can rectify this by using `update_state`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "await client.threads.updateState(thread_2['thread_id'], { values: { \"user_info\": { \"name\": \"Bagatur\", \"age\": 35 } } });" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let’s make sure that the state did in fact update by checking the current state:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "var state = await client.threads.getState(thread_2['thread_id']);\n", - "console.log(state.values['user_info']);\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "{ name: 'Bagatur', age: 35 }" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Voila! The LLM knows our users age updated without us having to prompt it at all.\n", - "\n", - "The last thing we will talk about is patching the thread, which is used when we want to update the metadata of a state. For example, say we actually wanted to update our last state to have `node_id:4` instead of `node_id:3`. To do this, we can call:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "await client.threads.patchState(thread_2['thread_id'],{\"node_id\": 4});" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can check that this worked by checking the metadata of our state" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "var state = await client.threads.getState(thread_2['thread_id']);\n", - "console.log(state.metadata['node_id']);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Perfect! The patch worked as expected." - ] - } - ], - "metadata": { - "language_info": { - "name": "python" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/sdk/python_sdk.ipynb b/examples/sdk/python_sdk.ipynb deleted file mode 100644 index e778aa7e8..000000000 --- a/examples/sdk/python_sdk.ipynb +++ /dev/null @@ -1,728 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "This how-to takes you through the steps of using the Python SDK for interacting with deployed Langgraph Cloud APIs.\n", - "\n", - "## Initialization\n", - "\n", - "### Initializing client\n", - "\n", - "To get started we need to initialize our client. The process for initializing our client is almost identical for both the local deployment and cloud deployment using Langsmith." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "from langgraph_sdk import get_client\n", - "\n", - "# If you deployed using Langsmith use this option\n", - "# Find this url on your Langsmith deployment page\n", - "example_deployed_url = (\n", - " \"https://ht-unhealthy-buffalo25-39d00f953458585aa9f7b5a4fa-g3ps4aazkq-uc.a.run.app\"\n", - ")\n", - "\n", - "# If you deployed locally using langgraph up -c langgraph.json use this option\n", - "# This is the default URL, and you can just call get_client() to use it\n", - "example_local_url = \"http://localhost:8123\"\n", - "\n", - "client = get_client(url=\"whatever-your-url-is\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Selecting an Assistant\n", - "\n", - "To select an assistant we can search the assistants that are hosted on our client, and then select the one we want:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "assistants = await client.assistants.search()\n", - "assistants = [a for a in assistants if not a[\"config\"]]\n", - "assistant = assistants[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In our example we are only hosting a single assistant, but you have the option to host many, in which case you will most likely want to do more filtering than just selecting the first one. Each assistant is a JSON object with the following format, allowing you to select based on a variety of parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca',\n", - " 'graph_id': 'agent',\n", - " 'created_at': '2024-06-11T20:12:45.862108+00:00',\n", - " 'updated_at': '2024-06-11T20:12:45.862108+00:00',\n", - " 'config': {},\n", - " 'metadata': {'created_by': 'system'}}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "assistant" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Configuring an assistant\n", - "\n", - "One important thing to know is that graph can be defined to be configurable, meaning that not every instance of the graph needs to be the same (read up on [this guide](https://langchain-ai.github.io/langgraph/how-tos/configuration/) to learn more about how to create your own configurable graphs). Let's briefly show how we can configure an assistant. The first step to do is find the assistant we want to configure. In our simple example we are only hosting a single graph, so we must choose it as the graph to configure." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "base_assistant = assistants[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This assistant has one configurable argument called `model`, which can take on two values: `openai` or `anthropic`. In this case, I want to create a graph that originates from this assistant that uses the `openai` option, which we can do as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "config_graph = await client.assistants.create(base_assistant['graph_id'],config = {'configurable':{'model':'openai'}})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now if we inspect our new graph, we can see that it has been configured and whenever we run it, it will select the `openai` model." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'assistant_id': '4d91047c-585c-4d1b-9ade-5b0f4d292528',\n", - " 'graph_id': 'agent',\n", - " 'created_at': '2024-06-21T23:06:08.203776+00:00',\n", - " 'updated_at': '2024-06-21T23:06:08.203776+00:00',\n", - " 'config': {'configurable': {'model': 'openai'}},\n", - " 'metadata': {}}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "config_graph" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Being able to create configurable assistants allows you to create different graphs all based on the same underlying structure. This can be very powerful for testing different configurations of a graph or allowing users to customize their graph." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a thread\n", - "\n", - "Threads are what we will actually use to run our graphs (assistants). Each thread will update the same state for the graph, meaning we can run the graph multiple times while the state will persist. We can also look back at our thread history, add meta data to different steps of our thread, and update the thread state manually if we wish. We will dive into all of those topics later in this article, but for now let’s just see how to start a thread:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "thread = await client.threads.create()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can examine the structure of our thread, which similar to the assistants object provides us with some information about the thread itself, including its id, timestamps, and metadata:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'thread_id': '6c2e8002-5712-4388-bed6-0747e9a86e31',\n", - " 'created_at': '2024-06-19T15:58:59.243657+00:00',\n", - " 'updated_at': '2024-06-19T15:58:59.243657+00:00',\n", - " 'metadata': {}}" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "thread" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we are ready to actually use our graph!\n", - "\n", - "## Invoking the graph\n", - "\n", - "The graph used in this example is a simple example of a StateGraph, but it allows us to show most of the API functionality. The state of our graph is defined as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "from typing import Annotated, TypedDict\n", - "\n", - "from langchain_core.messages import AnyMessage\n", - "\n", - "from langgraph.graph import add_messages\n", - "\n", - "\n", - "def update_user_info(old_info, new_info):\n", - " if \"name\" not in new_info or new_info[\"age\"] == -1:\n", - " return old_info\n", - " return new_info\n", - "\n", - "\n", - "class UserInformation(TypedDict):\n", - " age: int\n", - " name: str\n", - "\n", - "\n", - "class AgentState(TypedDict):\n", - " messages: Annotated[list[AnyMessage], add_messages]\n", - " user_info: Annotated[UserInformation, update_user_info]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is important to note that our member variables can be updated by using the `Annotated` class. This is especially important when we make API calls that will update our variables. This is also a good example that your graph can hold much more information than just messages. In our example we use a very simple `UserInformation` class, but you can imagine holding much richer information in your state.\n", - "\n", - "Our graph looks like follows:\n", - "\n", - "
\n", - " \n", - "
\n", - "\n", - "The workflow is as follows: first the user inputs some message, our llm decides how to configure the call to our tool `get_user_info` , and after getting the results of the tool call we respond to our user using another LLM.\n", - "\n", - "### Simple Invocation\n", - "\n", - "Ok, now that we have set up our client, assistant, and thread we can actually invoke the graph above. Let’s first define the function we will use to invoke the graph, since we don’t want to have to rewrite this code every single run." - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "async def run_input(client, thread, assistant, input, metadata={}):\n", - " # client.runs.stream will stream the results of running our graph\n", - " async for chunk in client.runs.stream(\n", - " thread[\"thread_id\"],\n", - " assistant[\"assistant_id\"],\n", - " input=input,\n", - " config={\"configurable\": metadata},\n", - " stream_mode=\"updates\",\n", - " ):\n", - " if chunk.data and \"run_id\" not in chunk.data:\n", - " print(chunk.data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let’s now see what happens to our graph when we run it with a simple sentence:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'llm': {'messages': [{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_ioeUDw39bXQ2nap5f593xZMW', 'function': {'arguments': '{\"age\":26,\"name\":\"Bagatur\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-75a0d9db-df99-4b0c-b356-f24e76f5ca5a', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': 26, 'name': 'Bagatur'}, 'id': 'call_ioeUDw39bXQ2nap5f593xZMW'}], 'invalid_tool_calls': [], 'usage_metadata': None}]}}\n", - "{'get_user_info': {'messages': [{'content': 'Hello! My name is Bagatur and I am 26 years old.', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'abafa365-1280-439d-b2ac-d4c547284ff9', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_E6NK18NXOHFkp8CeIuF7iI3K', 'function': {'arguments': '{\"age\":26,\"name\":\"Bagatur\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-c018c6a2-b93a-4787-aae3-46df0ef24c5b', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': 26, 'name': 'Bagatur'}, 'id': 'call_E6NK18NXOHFkp8CeIuF7iI3K'}], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Hello Bagatur! How can I assist you today?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-fb1ac0ca-b1f8-454b-ba3f-849c266dcc05', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Hello! What is my name?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '8bf0637b-8214-4c85-85ff-873ec193a7b8', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_6EFvGDGWHuoOKm4p7dq3qazN', 'function': {'arguments': '{\"age\":-1,\"name\":\"John Doe\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-30a91dfa-4526-4bb7-b4a2-017e5c530ed2', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': -1, 'name': 'John Doe'}, 'id': 'call_6EFvGDGWHuoOKm4p7dq3qazN'}], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Your name is Bagatur. How can I assist you today?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-f3dcd3ad-b438-4011-9353-83978758ee81', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Hello! My name is Bagatur and I am 26 years old.', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '88e7bb12-552d-4607-8bc5-ce2b342f0604', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_ioeUDw39bXQ2nap5f593xZMW', 'function': {'arguments': '{\"age\":26,\"name\":\"Bagatur\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-75a0d9db-df99-4b0c-b356-f24e76f5ca5a', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': 26, 'name': 'Bagatur'}, 'id': 'call_ioeUDw39bXQ2nap5f593xZMW'}], 'invalid_tool_calls': [], 'usage_metadata': None}], 'user_info': {'age': 26, 'name': 'Bagatur'}}}\n", - "{'respond_to_user': {'messages': [{'content': 'Hello Bagatur! How can I assist you today?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-49176b69-aae5-41ac-8c1e-7bab373b2b9b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}]}}\n" - ] - } - ], - "source": [ - "input = {\n", - " \"messages\": [\n", - " {\"role\": \"user\", \"content\": \"Hello! My name is Bagatur and I am 26 years old.\"}\n", - " ]\n", - "}\n", - "\n", - "await run_input(client, thread, assistant, input)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see our graph ran as expected, by calling our three nodes sequentially. Let’s now examine the state to take a further look under the hood. We can get the state by using the following command: " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dict_keys(['values', 'next', 'config', 'metadata', 'created_at', 'parent_config'])" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "state = await client.threads.get_state(thread_id=thread[\"thread_id\"])\n", - "state.keys()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our state variable contains a variety of important information. Here is a quick summary of the keys and what they represent:\n", - "\n", - "- `values` contains the actual state values, so in our case you could call `state['values']['messages']` or `state['values']['user_info']` and get the actual values of each of the state variables.\n", - "- `next` tells us what action in the graph is next at the current state. Since we just finished running our graph and reached the end node, it is currently empty because there is no next action to take. However, if you go through the state at each point of the run you will see that the `next` value goes from `__start__` → `llm` → `get_user_info` →`respond_to_user` .\n", - "- `metadata` stores the metadata associated with our state. This is data that is outside of the agent state, but is important to keep track of across multiple runs. An example of this is shown in the next section.\n", - "- `config` tells us what the configuration of the state is. This is important for when we want to run a query starting at a previous state instead of the one we are at. An example of this is shown in the Invoking from a previous checkpoint section\n", - "\n", - "### Invoking with Metadata\n", - "\n", - "Let’s create a new thread to reset our state and start fresh." - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "thread = await client.threads.create()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let’s add some metadata to our request. In this example we are going to treat each run of our assistant as a separate “node”. For each run, we will pass in a “node_id” as well as a “parent_node” in the metadata. This way we can easily go “back in time” and rerun our graph from a previous checkpoint. \n", - "\n", - "> NOTE: The reason we add this metadata instead of using the `parent_config` attribute is because `parent_config` tracks every individual step of a run, not the entire run itself.\n", - ">" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'llm': {'messages': [{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_VrA7UKg2w99BvIpsqrwjoawk', 'function': {'arguments': '{\"age\":26,\"name\":\"Bagatur\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-067609c1-4f1a-4d6d-bc1c-224a29153d37', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': 26, 'name': 'Bagatur'}, 'id': 'call_VrA7UKg2w99BvIpsqrwjoawk'}], 'invalid_tool_calls': [], 'usage_metadata': None}]}}\n", - "{'get_user_info': {'messages': [{'content': 'Hello! My name is Bagatur and I am 26 years old.', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '05faf88c-9f85-462e-84ee-4667de35625d', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_VrA7UKg2w99BvIpsqrwjoawk', 'function': {'arguments': '{\"age\":26,\"name\":\"Bagatur\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-067609c1-4f1a-4d6d-bc1c-224a29153d37', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': 26, 'name': 'Bagatur'}, 'id': 'call_VrA7UKg2w99BvIpsqrwjoawk'}], 'invalid_tool_calls': [], 'usage_metadata': None}], 'user_info': {'age': 26, 'name': 'Bagatur'}}}\n", - "{'respond_to_user': {'messages': [{'content': 'Hello Bagatur! How can I assist you today?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-48041247-fe04-419f-9f12-511e28c5f8aa', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}]}}\n" - ] - } - ], - "source": [ - "input = {\n", - " \"messages\": [\n", - " {\"role\": \"user\", \"content\": \"Hello! My name is Bagatur and I am 26 years old.\"}\n", - " ]\n", - "}\n", - "\n", - "metadata = {\"node_id\": 1, \"parent_node\": None}\n", - "\n", - "await run_input(client, thread, assistant, input, metadata)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using our `run_input` function makes it easy to pass in metadata and you can inspect the function as well as the API docs to see exactly how metadata gets passed.\n", - "\n", - "We can continue our thread by creating a second node as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'llm': {'messages': [{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_b2T2e0doVrh6uB1aHLIQglYR', 'function': {'arguments': '{\"age\":-1,\"name\":\"John Doe\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-808dca3a-0188-4c6b-9fc7-0037949fd820', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': -1, 'name': 'John Doe'}, 'id': 'call_b2T2e0doVrh6uB1aHLIQglYR'}], 'invalid_tool_calls': [], 'usage_metadata': None}]}}\n", - "{'get_user_info': {'messages': [{'content': 'Hello! My name is Bagatur and I am 26 years old.', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '05faf88c-9f85-462e-84ee-4667de35625d', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_VrA7UKg2w99BvIpsqrwjoawk', 'function': {'arguments': '{\"age\":26,\"name\":\"Bagatur\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-067609c1-4f1a-4d6d-bc1c-224a29153d37', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': 26, 'name': 'Bagatur'}, 'id': 'call_VrA7UKg2w99BvIpsqrwjoawk'}], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Hello Bagatur! How can I assist you today?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-48041247-fe04-419f-9f12-511e28c5f8aa', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Hello! What is my name?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '0970d6dd-e071-49bf-bf71-5345185b8291', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_b2T2e0doVrh6uB1aHLIQglYR', 'function': {'arguments': '{\"age\":-1,\"name\":\"John Doe\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-808dca3a-0188-4c6b-9fc7-0037949fd820', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': -1, 'name': 'John Doe'}, 'id': 'call_b2T2e0doVrh6uB1aHLIQglYR'}], 'invalid_tool_calls': [], 'usage_metadata': None}], 'user_info': {'age': -1, 'name': 'John Doe'}}}\n", - "{'respond_to_user': {'messages': [{'content': 'Your name is Bagatur. How can I assist you today, Bagatur?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-9ada26f0-951e-4dd5-a2c5-4357bdeeac9d', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}]}}\n" - ] - } - ], - "source": [ - "input = {\"messages\": [{\"role\": \"user\", \"content\": \"Hello! What is my name?\"}]}\n", - "metadata = {\"node_id\": 2, \"parent_node\": 1}\n", - "\n", - "await run_input(client, thread, assistant, input, metadata)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Perfect! The state persisted across separate runs, and the LLM remembers the name of our user. In a future we will explore non-sequential runs, i.e. not having each run just follow the last one but choosing which checkpoint we start our run from.\n", - "\n", - "### Invoking on a schedule\n", - "\n", - "Running your graph on a schedule can be valuable in situations where you want to run tasks periodically. The Langgraph Cloud API allows you to do this through the `CronAssistant` class. To schedule a graph job, you need to pass a [cron expression](https://crontab.cronhub.io/) to inform the client when you want to run the graph. `Cron` jobs are run in the background and do not interfere with normal invocations of the graph." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# This schedules a job to run at 15:27 (3:27PM) every day\n", - "cron_1 = await client.crons.create(assistant['assistant_id'],schedule=\"27 15 * * *\",input={'messages':[{\"role\":\"user\",\"content\":\"What time is it?\"}]})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that it is **very** important to delete `Cron` jobs that are no longer useful. Otherwise you could rack up unwanted API charges to the LLM! You can delete a `Cron` job using the following code:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "await client.crons.delete(cron_1['cron_id'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Querying and Updating the thread\n", - "\n", - "### Getting checkpoints by metadata\n", - "\n", - "Let’s say we want to start a new run from a previous state (not the current state). This state lives somewhere in our history, so we can utilize the `get_history` function to try and find it." - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "history = await client.threads.get_history(thread_id=thread[\"thread_id\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is helpful for inspecting the specifics of our current thread, but remember that the history contains all the intermediate steps a graph takes. In our case, where the graph has 5 nodes (remember that Start and End both count as nodes), our history array grows quickly. Luckily, there is a way to query by using metadata. For example if we wanted to start a run from Node 1(from the example from above) we need to find the state from the end of run with metadata node_id:1 , which we can do like so:" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "node_1_history = await client.threads.get_history(\n", - " thread_id=thread[\"thread_id\"], metadata={\"node_id\": 1}\n", - ")\n", - "# At the end of the run there will be no 'next' for the graph to execute\n", - "node_1_end_of_run = [h for h in node_1_history if h[\"next\"] == []][0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let’s explore how we could use this information to create a new branch in our thread.\n", - "\n", - "### Invoking from a previous checkpoint\n", - "\n", - "The following diagram describes what we would like to happen:\n", - "\n", - "
\n", - " \n", - "
\n", - "Basically, we want to have 3 runs of our graph, but instead of having them sequentially - we want both the second and third run to originate from the same state. We can do this by utilizing the code we used above, and passing additional metadata to our run." - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'llm': {'messages': [{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_yC7HUAQfcLzheepMD8SnAojR', 'function': {'arguments': '{\"age\":-1}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-b6a653e2-11ea-4f82-aa6a-ef321deed9ce', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': -1}, 'id': 'call_yC7HUAQfcLzheepMD8SnAojR'}], 'invalid_tool_calls': [], 'usage_metadata': None}]}}\n", - "{'get_user_info': {'messages': [{'content': 'Hello! My name is Bagatur and I am 26 years old.', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '05faf88c-9f85-462e-84ee-4667de35625d', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_VrA7UKg2w99BvIpsqrwjoawk', 'function': {'arguments': '{\"age\":26,\"name\":\"Bagatur\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-067609c1-4f1a-4d6d-bc1c-224a29153d37', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': 26, 'name': 'Bagatur'}, 'id': 'call_VrA7UKg2w99BvIpsqrwjoawk'}], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Hello Bagatur! How can I assist you today?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-48041247-fe04-419f-9f12-511e28c5f8aa', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Hello! What is my age?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'e94fa535-f821-4bfb-9d96-68c414adad8d', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_yC7HUAQfcLzheepMD8SnAojR', 'function': {'arguments': '{\"age\":-1}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-b6a653e2-11ea-4f82-aa6a-ef321deed9ce', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': -1}, 'id': 'call_yC7HUAQfcLzheepMD8SnAojR'}], 'invalid_tool_calls': [], 'usage_metadata': None}], 'user_info': {'age': -1}}}\n", - "{'respond_to_user': {'messages': [{'content': 'You are 26 years old, Bagatur! How can I assist you today?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-e3b6e627-b4b1-4249-a1bc-a6359ad7b961', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}]}}\n" - ] - } - ], - "source": [ - "input = {\"messages\": [{\"role\": \"user\", \"content\": \"Hello! What is my age?\"}]}\n", - "metadata = {\n", - " **{\"node_id\": 3, \"parent_node\": 1},\n", - " **{\n", - " \"thread_ts\": node_1_end_of_run[\"checkpoint_id\"],\n", - " \"thread_id\": thread[\"thread_id\"],\n", - " },\n", - "}\n", - "\n", - "await run_input(client, thread, assistant, input, metadata)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To check that everything actually worked as planned, let’s check our current state and check that message history to ensure that the message we passed to Node 2 is nowhere to be found." - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"Hello! What is my name?\" in [\n", - " message[\"content\"] for message in state[\"values\"][\"messages\"]\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! This has worked as expected. Being able to go back to previous states and execute new graph runs from those checkpoints is a great way to develop flexible applications that don’t require reloading or restarting everything when an error is detected or a user changes their mind.\n", - "\n", - "### Updating/Patching the thread state\n", - "\n", - "Lastly, let’s discuss the ability to manually change both the thread state as well as the metadata for a given state. Let’s say we incorrectly inputted data to the LLM and we want to rectify it. \n", - "\n", - "Continuing our previous example, let’s say the user mistyped their age and we want to let the graph know that without actually running it. In this case we can rectify this by using `update_state`" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [], - "source": [ - "new_state = await client.threads.update_state(\n", - " thread_id=thread[\"thread_id\"], values={\"user_info\": {\"name\": \"Bagatur\", \"age\": 35}}\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let’s make sure that the state did in fact update and ask our LLM again how old we are by invoking the graph again:" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'llm': {'messages': [{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_Ph3tYdt2UNdwqAF3kVL198Bg', 'function': {'arguments': '{\"age\":-1}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-373f3e22-8549-4f77-9ff2-05133099bb09', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': -1}, 'id': 'call_Ph3tYdt2UNdwqAF3kVL198Bg'}], 'invalid_tool_calls': [], 'usage_metadata': None}]}}\n", - "{'get_user_info': {'messages': [{'content': 'Hello! My name is Bagatur and I am 26 years old.', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '05faf88c-9f85-462e-84ee-4667de35625d', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_VrA7UKg2w99BvIpsqrwjoawk', 'function': {'arguments': '{\"age\":26,\"name\":\"Bagatur\"}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-067609c1-4f1a-4d6d-bc1c-224a29153d37', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': 26, 'name': 'Bagatur'}, 'id': 'call_VrA7UKg2w99BvIpsqrwjoawk'}], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Hello Bagatur! How can I assist you today?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-48041247-fe04-419f-9f12-511e28c5f8aa', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Hello! What is my age?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'e94fa535-f821-4bfb-9d96-68c414adad8d', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_yC7HUAQfcLzheepMD8SnAojR', 'function': {'arguments': '{\"age\":-1}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-b6a653e2-11ea-4f82-aa6a-ef321deed9ce', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': -1}, 'id': 'call_yC7HUAQfcLzheepMD8SnAojR'}], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'You are 26 years old, Bagatur! How can I assist you today?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-e3b6e627-b4b1-4249-a1bc-a6359ad7b961', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}, {'content': 'Hello! What is my age?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '24ac02be-7b08-4e91-9d20-90507ed25391', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_Ph3tYdt2UNdwqAF3kVL198Bg', 'function': {'arguments': '{\"age\":-1}', 'name': 'PersonalInfo'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-373f3e22-8549-4f77-9ff2-05133099bb09', 'example': False, 'tool_calls': [{'name': 'PersonalInfo', 'args': {'age': -1}, 'id': 'call_Ph3tYdt2UNdwqAF3kVL198Bg'}], 'invalid_tool_calls': [], 'usage_metadata': None}], 'user_info': {'age': -1}}}\n", - "{'respond_to_user': {'messages': [{'content': 'My apologies for the confusion earlier. You are 35 years old, Bagatur! How can I assist you today?', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop'}, 'type': 'ai', 'name': None, 'id': 'run-298306df-34a5-459a-a8c3-a0f16440c429', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}]}}\n" - ] - } - ], - "source": [ - "input = {\"messages\": [{\"role\": \"user\", \"content\": \"Hello! What is my age?\"}]}\n", - "\n", - "await run_input(client, thread, assistant, input)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Voila! The LLM knows our users age updated without us having to prompt it at all.\n", - "\n", - "The last thing we will talk about is patching the thread, which is used when we want to update the metadata of a state. For example, say we actually wanted to update our last state to have `node_id:4` instead of `node_id:3`. To do this, we can call:" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'configurable': {'thread_id': '4f044e5a-6f6e-4663-923e-6333c052ce9f',\n", - " 'thread_ts': '1ef2e5d6-e39f-6d26-800e-22245f8220a7'}}" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "await client.threads.patch_state(thread_id=thread[\"thread_id\"], metadata={\"node_id\": 4})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can check that this worked by checking the metadata of our state" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Current node id is 4\n" - ] - } - ], - "source": [ - "state = await client.threads.get_state(thread_id=thread[\"thread_id\"])\n", - "print(f\"Current node id is {state['metadata']['node_id']}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Perfect! The patch worked as expected." - ] - } - ], - "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.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -}

gs4kcFUCZQ4M`Y^$bDXs3&|lW~!h@>FOaVAK~Rn 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 diff --git a/examples/sdk/js_sdk.ipynb b/examples/sdk/js_sdk.ipynb deleted file mode 100644 index 9331b89a6..000000000 --- a/examples/sdk/js_sdk.ipynb +++ /dev/null @@ -1,800 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This how-to takes you through the steps of using the JS/TS SDK for interacting with deployed Langgraph Cloud APIs." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Initialization\n", - "\n", - "### Initializing client\n", - "\n", - "To get started we need to initialize our client. The process for initializing our client is almost identical for both the local deployment and cloud deployment using Langsmith." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "import { Client } from \"@langchain/langgraph-sdk\";\n", - "\n", - "\n", - "\n", - "// If you deployed using Langsmith use this option\n", - "// Find this url on your Langsmith deployment page\n", - "const example_deployed_url = \"https://ht-unhealthy-buffalo25-39d00f953458585aa9f7b5a4fa-g3ps4aazkq-uc.a.run.app\";\n", - "\n", - "// If you deployed locally using langgraph up -c langgraph.json use this option\n", - "// This is the default URL, and you can just call get_client() to use it\n", - "const example_local_url = \"http://localhost:8123\";\n", - "\n", - "const client = new Client({apiUrl:\"whatever-your-url-is\"});" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Selecting an Assistant\n", - "\n", - "To select an assistant we can search the assistants that are hosted on our client, and then select the one we want:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "// List all assistants\n", - "const assistants = await client.assistants.search({\n", - " metadata: null,\n", - " offset: 0,\n", - " limit: 10,\n", - "});\n", - "\n", - "// We auto-create an assistant for each graph you register in config.\n", - "const agent = assistants[0];" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In our example we are only hosting a single assistant, but you have the option to host many, in which case you will most likely want to do more filtering than just selecting the first one. Each assistant is a JSON object with the following format, allowing you to select based on a variety of parameters." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "console.log(agent);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "{\n", - " assistant_id: 'fe096781-5601-53d2-b2f6-0d3403f7e9ca',\n", - " graph_id: 'agent',\n", - " created_at: '2024-06-11T20:12:45.862108+00:00',\n", - " updated_at: '2024-06-11T20:12:45.862108+00:00',\n", - " config: {},\n", - " metadata: { created_by: 'system' }\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Configuring an assistant\n", - "\n", - "One important thing to know is that graph can be defined to be configurable, meaning that not every instance of the graph needs to be the same (read up on [this guide](https://langchain-ai.github.io/langgraph/how-tos/configuration/) to learn more about how to create your own configurable graphs). Let's briefly show how we can configure an assistant. The first step to do is find the assistant we want to configure. In our simple example we are only hosting a single graph, so we must choose it as the graph to configure." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "const base_assistant = assistants[0];" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This assistant has one configurable argument called `model`, which can take on two values: `openai` or `anthropic`. In this case, I want to create a graph that originates from this assistant that uses the `openai` option, which we can do as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "const config_graph = await client.assistants.create({graphId: base_assistant['graph_id'],config: {'configurable':{'model':'openai'}}});\n", - "console.log(config_graph);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "{\n", - " assistant_id: '414a1ddd-4453-4500-ab0b-7bc4f5bb41b1',\n", - " graph_id: 'agent',\n", - " created_at: '2024-06-21T23:42:16.388341+00:00',\n", - " updated_at: '2024-06-21T23:42:16.388341+00:00',\n", - " config: { configurable: { model: 'openai' } },\n", - " metadata: {}\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Being able to create configurable assistants allows you to create different graphs all based on the same underlying structure. This can be very powerful for testing different configurations of a graph or allowing users to customize their graph." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating a thread\n", - "\n", - "Threads are what we will actually use to run our graphs (assistants). Each thread will update the same state for the graph, meaning we can run the graph multiple times while the state will persist. We can also look back at our thread history, add meta data to different steps of our thread, and update the thread state manually if we wish. We will dive into all of those topics later in this article, but for now let’s just see how to start a thread:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "// Start a new thread\n", - "const thread = await client.threads.create();" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can examine the structure of our thread, which similar to the assistants object provides us with some information about the thread itself, including its id, timestamps, and metadata:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "console.log(thread);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "javascript" - } - }, - "outputs": [], - "source": [ - "{\n", - " thread_id: '12a112dc-d175-42ce-8b06-85697733cccc',\n", - " created_at: '2024-06-20T22:01:18.715497+00:00',\n", - " updated_at: '2024-06-20T22:01:18.715497+00:00',\n", - " metadata: {}\n", - "}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we are ready to actually use our graph!\n", - "\n", - "## Invoking the graph\n", - "\n", - "The graph used in this example is a simple example of a StateGraph, but it allows us to show most of the API functionality. The state of our graph is defined as follows (Langgraph Cloud is coming in the future for JS!):" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from typing import Annotated, TypedDict\n", - "\n", - "from langchain_core.messages import AnyMessage\n", - "\n", - "from langgraph.graph import add_messages\n", - "\n", - "\n", - "def update_user_info(old_info, new_info):\n", - " if \"name\" not in new_info or new_info[\"age\"] == -1:\n", - " return old_info\n", - " return new_info\n", - "\n", - "\n", - "class UserInformation(TypedDict):\n", - " age: int\n", - " name: str\n", - "\n", - "\n", - "class AgentState(TypedDict):\n", - " messages: Annotated[list[AnyMessage], add_messages]\n", - " user_info: Annotated[UserInformation, update_user_info]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is important to note that our member variables can be updated by using the `Annotated` class. This is especially important when we make API calls that will update our variables. This is also a good example that your graph can hold much more information than just messages. In our example we use a very simple `UserInformation` class, but you can imagine holding much richer information in your state.\n", - "\n", - "Our graph looks like follows:\n", - "\n", - "