From 41a6eb7cf4e09cd303ac0a9b181cefe5eb44062f Mon Sep 17 00:00:00 2001 From: Isaac Francisco <78627776+isahers1@users.noreply.github.com> Date: Wed, 14 Aug 2024 09:31:24 -0700 Subject: [PATCH] [docs]: add CURL commands to some how-tos (#1325) --- docs/docs/cloud/how-tos/enqueue_concurrent.md | 4 +- .../how-tos/human_in_the_loop_breakpoint.md | 51 +++++- .../how-tos/human_in_the_loop_edit_state.md | 101 +++++++++++- .../human_in_the_loop_review_tool_calls.md | 4 +- .../how-tos/human_in_the_loop_time_travel.md | 151 +++++++++++++++++- .../how-tos/human_in_the_loop_user_input.md | 113 ++++++++++++- .../cloud/how-tos/interrupt_concurrent.md | 4 +- docs/docs/cloud/how-tos/reject_concurrent.md | 4 +- .../docs/cloud/how-tos/rollback_concurrent.md | 4 +- docs/docs/cloud/how-tos/stream_debug.md | 4 +- docs/docs/cloud/how-tos/stream_events.md | 146 +++++++++++++++-- docs/docs/cloud/how-tos/stream_messages.md | 101 +++++++++++- docs/docs/cloud/how-tos/stream_multiple.md | 55 ++++++- docs/docs/cloud/how-tos/stream_updates.md | 53 +++++- docs/docs/cloud/how-tos/stream_values.md | 83 +++++++++- 15 files changed, 819 insertions(+), 59 deletions(-) diff --git a/docs/docs/cloud/how-tos/enqueue_concurrent.md b/docs/docs/cloud/how-tos/enqueue_concurrent.md index 1e4a2e087..391550ee1 100644 --- a/docs/docs/cloud/how-tos/enqueue_concurrent.md +++ b/docs/docs/cloud/how-tos/enqueue_concurrent.md @@ -31,7 +31,7 @@ Then, let's import our required packages and instantiate our client, assistant, from langchain_core.messages import convert_to_messages from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") assistant_id = "agent" thread = await client.threads.create() ``` @@ -42,7 +42,7 @@ Then, let's import our required packages and instantiate our client, assistant, import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); const assistantId = "agent"; const thread = await client.threads.create(); ``` diff --git a/docs/docs/cloud/how-tos/human_in_the_loop_breakpoint.md b/docs/docs/cloud/how-tos/human_in_the_loop_breakpoint.md index 908d9fa9e..180547b54 100644 --- a/docs/docs/cloud/how-tos/human_in_the_loop_breakpoint.md +++ b/docs/docs/cloud/how-tos/human_in_the_loop_breakpoint.md @@ -21,7 +21,7 @@ In this how-to we use a simple ReAct style hosted graph (you can see the full co ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") assistant_id = "agent" thread = await client.threads.create() ``` @@ -31,11 +31,22 @@ In this how-to we use a simple ReAct style hosted graph (you can see the full co ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); const assistantId = "agent" const thread = await client.threads.create(); ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads \ + --header 'Content-Type: application/json' \ + --data '{ + "metadata": {} + }' + ``` + ## Adding a breakpoint We now want to add a breakpoint in our graph run, which we will do before a tool is called. @@ -82,6 +93,42 @@ And, now let's compile it with a breakpoint before the tool node: console.log("\n\n"); } ``` + +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"what's the weather in sf\"}]}, + \"interrupt_before\": [\"action\"], + \"stream_mode\": [ + \"messages\" + ] + }" | \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "") { + print data_content "\n" + } + sub(/^event: /, "Receiving event of type: ", $0) + printf "%s...\n", $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "") { + print data_content "\n" + } + } + ' + ``` Output: diff --git a/docs/docs/cloud/how-tos/human_in_the_loop_edit_state.md b/docs/docs/cloud/how-tos/human_in_the_loop_edit_state.md index fef0e3c6e..e9871c2ff 100644 --- a/docs/docs/cloud/how-tos/human_in_the_loop_edit_state.md +++ b/docs/docs/cloud/how-tos/human_in_the_loop_edit_state.md @@ -17,7 +17,7 @@ First, we need to setup our client so that we can communicate with our hosted gr ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") assistant_id = "agent" thread = await client.threads.create() ``` @@ -27,11 +27,22 @@ First, we need to setup our client so that we can communicate with our hosted gr ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); const assistantId = "agent"; const thread = await client.threads.create(); ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads \ + --header 'Content-Type: application/json' \ + --data '{ + "metadata": {} + }' + ``` + ## Editing state ### Initial invocation @@ -75,6 +86,42 @@ Now let's invoke our graph, making sure to interrupt before the `action` node. } ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"search for weather in SF\"}]}, + \"interrupt_before\": [\"action\"], + \"stream_mode\": [ + \"updates\" + ] + }" | \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + sub(/^event: /, "", $0) + event_type = $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + } + ' + ``` + Output: {'agent': {'messages': [{'content': [{'text': "Certainly! I'll search for the current weather in San Francisco for you using the search function. Here's how I'll do that:", 'type': 'text'}, {'id': 'toolu_01KEJMBFozSiZoS4mAcPZeqQ', 'input': {'query': 'current weather in San Francisco'}, 'name': 'search', 'type': 'tool_use'}], 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run-6dbb0167-f8f6-4e2a-ab68-229b2d1fbb64', 'example': False, 'tool_calls': [{'name': 'search', 'args': {'query': 'current weather in San Francisco'}, 'id': 'toolu_01KEJMBFozSiZoS4mAcPZeqQ'}], 'invalid_tool_calls': [], 'usage_metadata': None}]}} @@ -129,10 +176,22 @@ Now, let's assume we actually meant to search for the weather in Sidi Frej (anot await client.threads.updateState(thread['thread_id'], {values:{"messages": lastMessage}}); ``` +=== "CURL" + + ```bash + curl --request GET --url /threads//state | \ + jq '.values.messages[-1] | (.tool_calls[0].args = {"query": "current weather in Sidi Frej"})' | \ + curl --request POST \ + --url /threads//state \ + --header 'Content-Type: application/json' \ + --data @- + ``` + Output: - {'configurable': {'thread_id': '88d58d3f-4151-47a9-a8e0-e42fdd3527b8', - 'thread_ts': '1ef3274b-a809-6913-8002-91536ce6554d'}} + {'configurable': {'thread_id': '9c8f1a43-9dd8-4017-9271-2c53e57cf66a', + 'checkpoint_ns': '', + 'checkpoint_id': '1ef58e7e-3641-649f-8002-8b4305a64858'}} @@ -171,6 +230,40 @@ Now we can resume our graph run but with the updated state: } ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"stream_mode\": [ + \"updates\" + ] + }"| \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + sub(/^event: /, "", $0) + event_type = $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + } + ' + ``` + Output: {'action': {'messages': [{'content': '["I looked up: current weather in Sidi Frej. Result: It\'s sunny in San Francisco, but you better look out if you\'re a Gemini 😈."]', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'tool', 'name': 'search', 'id': '1161b8d1-bee4-4188-9be8-698aecb69f10', 'tool_call_id': 'toolu_01KEJMBFozSiZoS4mAcPZeqQ'}]}} diff --git a/docs/docs/cloud/how-tos/human_in_the_loop_review_tool_calls.md b/docs/docs/cloud/how-tos/human_in_the_loop_review_tool_calls.md index 66b3315b6..c730e9e01 100644 --- a/docs/docs/cloud/how-tos/human_in_the_loop_review_tool_calls.md +++ b/docs/docs/cloud/how-tos/human_in_the_loop_review_tool_calls.md @@ -28,7 +28,7 @@ First, we need to setup our client so that we can communicate with our hosted gr ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") assistant_id = "agent" thread = await client.threads.create() ``` @@ -38,7 +38,7 @@ First, we need to setup our client so that we can communicate with our hosted gr ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); const assistantId = "agent"; const thread = await client.threads.create(); ``` diff --git a/docs/docs/cloud/how-tos/human_in_the_loop_time_travel.md b/docs/docs/cloud/how-tos/human_in_the_loop_time_travel.md index 0c6df0910..36c8fe941 100644 --- a/docs/docs/cloud/how-tos/human_in_the_loop_time_travel.md +++ b/docs/docs/cloud/how-tos/human_in_the_loop_time_travel.md @@ -14,7 +14,7 @@ First, we need to setup our client so that we can communicate with our hosted gr ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") assistant_id = "agent" thread = await client.threads.create() ``` @@ -24,11 +24,22 @@ First, we need to setup our client so that we can communicate with our hosted gr ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); const assistantId = agent; const thread = await client.threads.create(); ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads \ + --header 'Content-Type: application/json' \ + --data '{ + "metadata": {} + }' + ``` + ## Replay a state ### Initial invocation @@ -69,6 +80,41 @@ Before replaying a state - we need to create states to replay from! In order to } } ``` + +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"Please search the weather in SF\"}]}, + \"stream_mode\": [ + \"updates\" + ] + }" | \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + sub(/^event: /, "", $0) + event_type = $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + } + ' + ``` Output: @@ -100,6 +146,12 @@ Now let's get our list of states, and invoke from the third state (right before console.log(stateToReplay['next']); ``` +=== "CURL" + + ```bash + curl --request GET --url /threads//history | jq -r '.[2].next' + ``` + Output: ['action'] @@ -116,7 +168,7 @@ To rerun from a state, we need to pass in the `checkpoint_id` into the config of assistant_id, # graph_id input=None, stream_mode="updates", - config={"configurable": {"thread_ts": state_to_replay['checkpoint_id']}} + config={"configurable": {"checkpoint_id": state_to_replay['checkpoint_id']}} ): if chunk.data and chunk.event != "metadata": print(chunk.data) @@ -131,7 +183,7 @@ To rerun from a state, we need to pass in the `checkpoint_id` into the config of { input: null, streamMode: "updates", - config: {"configurable": {"thread_ts": stateToReplay['checkpoint_id']}}, + config: {"configurable": {"checkpoint_id": stateToReplay['checkpoint_id']}}, } ); for await (const chunk of streamResponse) { @@ -141,6 +193,43 @@ To rerun from a state, we need to pass in the `checkpoint_id` into the config of } ``` +=== "CURL" + + ```bash + curl --request GET --url /threads//history | jq -r '.[2].checkpoint_id' | { + read checkpoint_id + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"config\": {\"configurable\": {\"checkpoint_id\": \"$checkpoint_id\"}}, + \"stream_mode\": [ + \"updates\" + ] + }" | \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + sub(/^event: /, "", $0) + event_type = $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + } + ' + ``` + Output: {'action': {'messages': [{'content': '["I looked up: current weather in San Francisco. Result: It\'s sunny in San Francisco, but you better look out if you\'re a Gemini 😈."]', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'tool', 'name': 'search', 'id': 'eba650e5-400e-4938-8508-f878dcbcc532', 'tool_call_id': 'toolu_011vroKUtWU7SBdrngpgpFMn'}]}} @@ -181,6 +270,23 @@ Let's show how to do this to edit the state at a particular point in time. Let's const newState = await client.threads.updateState(thread['thread_id'],{values:{"messages":[lastMessage]},checkpointId:stateToReplay['checkpoint_id']}); ``` +=== "CURL" + + ```bash + curl -s --request GET --url /threads//history | \ + jq -c ' + .[2] as $state_to_replay | + .[2].values.messages[-1].tool_calls[0].args.query = "current weather in SF" | + { + values: { messages: .[2].values.messages[-1] }, + checkpoint_id: $state_to_replay.checkpoint_id + }' | \ + curl --request POST \ + --url /threads//state \ + --header 'Content-Type: application/json' \ + --data @- + ``` + Now we can rerun our graph with this new config, starting from the `new_state`, which is a branch of our `state_to_replay`: === "Python" @@ -191,7 +297,7 @@ Now we can rerun our graph with this new config, starting from the `new_state`, assistant["assistant_id"], # graph_id input=None, stream_mode="updates", - config={"configurable": {"thread_ts": new_state['configurable']['thread_ts']}} + config={"configurable": {"checkpoint_id": new_state['configurable']['checkpoint_id']}} ): if chunk.data and chunk.event != "metadata": print(chunk.data) @@ -206,7 +312,7 @@ Now we can rerun our graph with this new config, starting from the `new_state`, { input: null, streamMode: "updates", - config: {"configurable": {"thread_ts": newState['configurable']['thread_ts']}}, + config: {"configurable": {"checkpoint_id": newState['configurable']['checkpoint_id']}}, } ); for await (const chunk of streamResponse) { @@ -216,6 +322,39 @@ Now we can rerun our graph with this new config, starting from the `new_state`, } ``` +=== "CURL" + + ```bash + curl -s --request GET --url /threads//state | \ + jq -r '.config.configurable.checkpoint_id' | \ + sh -c ' + CHECKPOINT_ID="$1" + curl --request POST \ + --url /threads//runs/stream \ + --header "Content-Type: application/json" \ + --data "{\"assistant_id\": \"agent\", \"config\": {\"configurable\": {\"checkpoint_id\": \"$CHECKPOINT_ID\"}}, \"stream_mode\": [\"updates\"]}" | \ + sed "s/\r$//" | \ + awk " + /^event:/ { + if (data_content != \"\" && event_type != \"metadata\") { + print data_content \"\n\" + } + sub(/^event: /, \"\", \$0) + event_type = \$0 + data_content = \"\" + } + /^data:/ { + sub(/^data: /, \"\", \$0) + data_content = \$0 + } + END { + if (data_content != \"\" && event_type != \"metadata\") { + print data_content \"\n\" + } + }" + ' _ + ``` + Output: diff --git a/docs/docs/cloud/how-tos/human_in_the_loop_user_input.md b/docs/docs/cloud/how-tos/human_in_the_loop_user_input.md index 1f29897ef..068a0bb00 100644 --- a/docs/docs/cloud/how-tos/human_in_the_loop_user_input.md +++ b/docs/docs/cloud/how-tos/human_in_the_loop_user_input.md @@ -24,7 +24,7 @@ First, we need to setup our client so that we can communicate with our hosted gr ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") assistant_id = "agent" thread = await client.threads.create() ``` @@ -34,11 +34,22 @@ First, we need to setup our client so that we can communicate with our hosted gr ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); const assistantId = "agent"; const thread = await client.threads.create(); ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads \ + --header 'Content-Type: application/json' \ + --data '{ + "metadata": {} + }' + ``` + ## Waiting for user input ### Initial invocation @@ -80,6 +91,42 @@ Now, let's invoke our graph by interrupting before `ask_human` node: } } ``` + +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"Use the search tool to ask the user where they are, then look up the weather there\"}]}, + \"interrupt_before\": [\"ask_human\"], + \"stream_mode\": [ + \"updates\" + ] + }" | \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + sub(/^event: /, "", $0) + event_type = $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + } + ' + ``` Output: @@ -117,11 +164,31 @@ Because we are treating this as a tool call, we will need to update the state as await client.threads.updateState(thread['thread_id'], {values: {"messages": toolMessage}, asNode:"ask_human"}) ``` +=== "CURL" + + ```bash + curl --request GET \ + --url /threads//state \ + | jq -r '.values.messages[-1].tool_calls[0].id' \ + | sh -c ' + TOOL_CALL_ID="$1" + + # Construct the JSON payload + JSON_PAYLOAD=$(printf "{\"messages\": [{\"tool_call_id\": \"%s\", \"type\": \"tool\", \"content\": \"san francisco\"}], \"as_node\": \"ask_human\"}" "$TOOL_CALL_ID") + + # Send the updated state + curl --request POST \ + --url /threads//state \ + --header "Content-Type: application/json" \ + --data "${JSON_PAYLOAD}" + ' _ + ``` + Output: - {'configurable': {'thread_id': '10d0ee61-db47-48fc-a58c-109a1e68cd73', - 'thread_ts': '1ef32729-3cc3-6647-8002-14dcb621b46e'}} - + {'configurable': {'thread_id': 'a9f322ae-4ed1-41ec-942b-38cb3d342c3a', + 'checkpoint_ns': '', + 'checkpoint_id': '1ef58e97-a623-63dd-8002-39a9a9b20be3'}} ### Invoking after receiving human input @@ -133,7 +200,7 @@ We can now tell the agent to continue. We can just pass in None as the input to ```python async for chunk in client.runs.stream( thread["thread_id"], - assistant_id, # graph_id + assistant_id, input=None, stream_mode="updates", ): @@ -158,6 +225,40 @@ We can now tell the agent to continue. We can just pass in None as the input to } ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"stream_mode\": [ + \"updates\" + ] + }"| \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + sub(/^event: /, "", $0) + event_type = $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "" && event_type != "metadata") { + print data_content "\n" + } + } + ' + ``` + Output: {'agent': {'messages': [{'content': [{'text': "Thank you for letting me know that you're in San Francisco. Now, I'll use the search function to look up the weather in San Francisco.", 'type': 'text'}, {'id': 'toolu_01K57ofmgG2wyJ8tYJjbq5k7', 'input': {'query': 'current weather in San Francisco'}, 'name': 'search', 'type': 'tool_use'}], 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run-241baed7-db5e-44ce-ac3c-56431705c22b', 'example': False, 'tool_calls': [{'name': 'search', 'args': {'query': 'current weather in San Francisco'}, 'id': 'toolu_01K57ofmgG2wyJ8tYJjbq5k7'}], 'invalid_tool_calls': [], 'usage_metadata': None}]}} diff --git a/docs/docs/cloud/how-tos/interrupt_concurrent.md b/docs/docs/cloud/how-tos/interrupt_concurrent.md index c34ae64c6..7c2792b45 100644 --- a/docs/docs/cloud/how-tos/interrupt_concurrent.md +++ b/docs/docs/cloud/how-tos/interrupt_concurrent.md @@ -29,7 +29,7 @@ Now, let's import our required packages and instantiate our client, assistant, a from langchain_core.messages import convert_to_messages from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") assistant_id = "agent" thread = await client.threads.create() ``` @@ -39,7 +39,7 @@ Now, let's import our required packages and instantiate our client, assistant, a ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); const assistantId = "agent"; const thread = await client.threads.create(); ``` diff --git a/docs/docs/cloud/how-tos/reject_concurrent.md b/docs/docs/cloud/how-tos/reject_concurrent.md index 5d92e8466..1f69541fe 100644 --- a/docs/docs/cloud/how-tos/reject_concurrent.md +++ b/docs/docs/cloud/how-tos/reject_concurrent.md @@ -28,7 +28,7 @@ Now, let's import our required packages and instantiate our client, assistant, a from langchain_core.messages import convert_to_messages from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") assistant_id = "agent" thread = await client.threads.create() ``` @@ -38,7 +38,7 @@ Now, let's import our required packages and instantiate our client, assistant, a ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); const assistantId = "agent"; const thread = await client.threads.create(); ``` diff --git a/docs/docs/cloud/how-tos/rollback_concurrent.md b/docs/docs/cloud/how-tos/rollback_concurrent.md index f8c64add4..0e8f39aad 100644 --- a/docs/docs/cloud/how-tos/rollback_concurrent.md +++ b/docs/docs/cloud/how-tos/rollback_concurrent.md @@ -30,7 +30,7 @@ Now, let's import our required packages and instantiate our client, assistant, a from langchain_core.messages import convert_to_messages from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") assistant_id = "agent" thread = await client.threads.create() ``` @@ -40,7 +40,7 @@ Now, let's import our required packages and instantiate our client, assistant, a ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); const assistantId = "agent"; const thread = await client.threads.create(); ``` diff --git a/docs/docs/cloud/how-tos/stream_debug.md b/docs/docs/cloud/how-tos/stream_debug.md index 815cdef82..78c2e34b9 100644 --- a/docs/docs/cloud/how-tos/stream_debug.md +++ b/docs/docs/cloud/how-tos/stream_debug.md @@ -9,7 +9,7 @@ First let's set up our client and thread: ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") # create thread thread = await client.threads.create() print(thread) @@ -20,7 +20,7 @@ First let's set up our client and thread: ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); // create thread const thread = await client.threads.create(); console.log(thread) diff --git a/docs/docs/cloud/how-tos/stream_events.md b/docs/docs/cloud/how-tos/stream_events.md index bbd61b050..fc02e3fff 100644 --- a/docs/docs/cloud/how-tos/stream_events.md +++ b/docs/docs/cloud/how-tos/stream_events.md @@ -6,7 +6,7 @@ This guide covers how to stream events from your graph (`stream_mode="events"`). ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") # create thread thread = await client.threads.create() print(thread) @@ -17,12 +17,22 @@ This guide covers how to stream events from your graph (`stream_mode="events"`). ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); // create thread const thread = await client.threads.create(); console.log(thread) ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads \ + --header 'Content-Type: application/json' \ + --data '{ + "metadata": {} + }' + ``` Output: @@ -30,7 +40,9 @@ Output: {'thread_id': '3f4c64e0-f792-4a5e-aa07-a4404e06e0bd', 'created_at': '2024-06-24T22:16:29.301522+00:00', 'updated_at': '2024-06-24T22:16:29.301522+00:00', - 'metadata': {}} + 'metadata': {}, + 'status': 'idle', + 'config': {}} @@ -91,6 +103,41 @@ Streaming events produces responses containing an `event` key (in addition to ot } ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"What's the weather in sf\"}]}, + \"stream_mode\": [ + \"events\" + ] + }" | \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "") { + print data_content "\n" + } + sub(/^event: /, "Receiving event of type: ", $0) + printf "%s...\n", $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "") { + print data_content "\n" + } + } + ' + ``` + Output: Receiving new event of type: metadata... @@ -258,9 +305,11 @@ Token-by-token streaming can be implemented with the `events` streaming mode. Th ): if ( chunk.event == "events" and - chunk.data["event"] == "on_chat_model_stream" + chunk.data["event"] == "on_chat_model_stream" and + len(chunk.data["data"]["chunk"]["content"]) > 0 and + 'text' in chunk.data["data"]["chunk"]["content"][0] ): - llm_response += chunk.data["data"]["chunk"]["content"] + llm_response += chunk.data["data"]["chunk"]["content"][0]['text'] print(llm_response) ``` @@ -278,21 +327,88 @@ Token-by-token streaming can be implemented with the `events` streaming mode. Th } ); for await (const chunk of streamResponse) { - if (chunk.event === "events" && chunk.data.event === "on_chat_model_stream") { - llmResponse += chunk.data.data.chunk.content; + if (chunk.event === "events" && chunk.data.event === "on_chat_model_stream" && chunk.data.chunk.content.length > 0 && 'text' in chunk.data.chunk.content[0]) { + llmResponse += chunk.data.data.chunk.content[0].text; console.log(llmResponse); } } ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"What's the weather in sf\"}]}, + \"stream_mode\": [ + \"events\" + ] + }" | sed 's/\r$//' | awk ' + /^event:/ { event = $2 } + /^data:/ { + json_data = substr($0, index($0, $2)) + + if (event == "events") { + print json_data + } + }' | jq -r ' + select(.event == "on_chat_model_stream") | + .data.chunk.content[] | .text // empty + ' | awk ' + BEGIN { llm_response="" } + $0 != "" && $0 != "null" { + llm_response = llm_response $0 + print llm_response + }' + ``` + Output: - b - be - beg - begi - begin - begine - beginen - beginend + The + The search + The search results provide + The search results provide the current weather conditions + The search results provide the current weather conditions in San Francisco. + The search results provide the current weather conditions in San Francisco. According + The search results provide the current weather conditions in San Francisco. According to the data, + The search results provide the current weather conditions in San Francisco. According to the data, as + The search results provide the current weather conditions in San Francisco. According to the data, as of 3 + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60 + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60. + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F ( + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16° + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The win + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is bl + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west- + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13 + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 k + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% and visibility + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% and visibility is 6 + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% and visibility is 6 miles + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% and visibility is 6 miles (10 km + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% and visibility is 6 miles (10 km). + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% and visibility is 6 miles (10 km). Overall + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% and visibility is 6 miles (10 km). Overall, it appears + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% and visibility is 6 miles (10 km). Overall, it appears to be a nice + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% and visibility is 6 miles (10 km). Overall, it appears to be a nice sunny day in San + The search results provide the current weather conditions in San Francisco. According to the data, as of 3:19 PM on August 12, 2024, the weather in San Francisco is sunny with a temperature of 60.8°F (16°C). The wind is blowing from the west-southwest at 13.4 mph (21.6 kph). The humidity is 70% and visibility is 6 miles (10 km). Overall, it appears to be a nice sunny day in San Francisco. + diff --git a/docs/docs/cloud/how-tos/stream_messages.md b/docs/docs/cloud/how-tos/stream_messages.md index 49cbf29b6..cdcf004e2 100644 --- a/docs/docs/cloud/how-tos/stream_messages.md +++ b/docs/docs/cloud/how-tos/stream_messages.md @@ -41,7 +41,7 @@ First let's set up our client and thread: ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") # create thread thread = await client.threads.create() print(thread) @@ -52,20 +52,33 @@ First let's set up our client and thread: ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); // create thread const thread = await client.threads.create(); console.log(thread) ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads \ + --header 'Content-Type: application/json' \ + --data '{ + "metadata": {} + }' + ``` + Output: {'thread_id': 'e1431c95-e241-4d1d-a252-27eceb1e5c86', 'created_at': '2024-06-21T15:48:59.808924+00:00', 'updated_at': '2024-06-21T15:48:59.808924+00:00', - 'metadata': {}} + 'metadata': {}, + 'status': 'idle', + 'config': {}} -Let's also define a helper function for better formatting of the tool calls in messages +Let's also define a helper function for better formatting of the tool calls in messages (for CURL we will define a helper script called `process_stream.sh`) === "Python" @@ -95,6 +108,69 @@ Let's also define a helper function for better formatting of the tool calls in m } ``` +=== "CURL" + + ```bash + # process_stream.sh + + format_tool_calls() { + echo "$1" | jq -r 'map("Tool Call ID: \(.id), Function: \(.name), Arguments: \(.args)") | join("\n")' + } + + process_data_item() { + local data_item="$1" + + if echo "$data_item" | jq -e '.role == "user"' > /dev/null; then + echo "Human: $(echo "$data_item" | jq -r '.content')" + else + local tool_calls=$(echo "$data_item" | jq -r '.tool_calls // []') + local invalid_tool_calls=$(echo "$data_item" | jq -r '.invalid_tool_calls // []') + local content=$(echo "$data_item" | jq -r '.content // ""') + local response_metadata=$(echo "$data_item" | jq -r '.response_metadata // {}') + + if [ -n "$content" ] && [ "$content" != "null" ]; then + echo "AI: $content" + fi + + if [ "$tool_calls" != "[]" ]; then + echo "Tool Calls:" + format_tool_calls "$tool_calls" + fi + + if [ "$invalid_tool_calls" != "[]" ]; then + echo "Invalid Tool Calls:" + format_tool_calls "$invalid_tool_calls" + fi + + if [ "$response_metadata" != "{}" ]; then + local finish_reason=$(echo "$response_metadata" | jq -r '.finish_reason // "N/A"') + echo "Response Metadata: Finish Reason - $finish_reason" + fi + fi + } + + while IFS=': ' read -r key value; do + case "$key" in + event) + event="$value" + ;; + data) + if [ "$event" = "metadata" ]; then + run_id=$(echo "$value" | jq -r '.run_id') + echo "Metadata: Run ID - $run_id" + echo "------------------------------------------------" + elif [ "$event" = "messages/partial" ]; then + echo "$value" | jq -c '.[]' | while read -r data_item; do + process_data_item "$data_item" + done + echo "------------------------------------------------" + fi + ;; + esac + done + ``` + + Now we can stream by messages, which will return complete messages (at the end of node execution) as well as tokens for any messages generated inside a node: === "Python" @@ -201,6 +277,23 @@ Now we can stream by messages, which will return complete messages (at the end o } ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"config\":{\"configurable\":{\"model_name\":\"openai\"}}, + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"What's the weather in sf\"}]}, + \"stream_mode\": [ + \"messages\" + ] + }" | sed 's/\r$//' | ./process_stream.sh + ``` + + Output: Metadata: Run ID - 1ef2fe5c-6a1d-6575-bc09-d7832711c17e diff --git a/docs/docs/cloud/how-tos/stream_multiple.md b/docs/docs/cloud/how-tos/stream_multiple.md index 0e7a0c143..d2d349099 100644 --- a/docs/docs/cloud/how-tos/stream_multiple.md +++ b/docs/docs/cloud/how-tos/stream_multiple.md @@ -9,7 +9,7 @@ First let's set up our client and thread: ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") # create thread thread = await client.threads.create() print(thread) @@ -20,19 +20,31 @@ First let's set up our client and thread: ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); // create thread const thread = await client.threads.create(); console.log(thread) ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads \ + --header 'Content-Type: application/json' \ + --data '{ + "metadata": {} + }' + ``` Output: {'thread_id': 'bfc68029-1f7b-400f-beab-6f9032a52da4', 'created_at': '2024-06-24T21:30:07.980789+00:00', 'updated_at': '2024-06-24T21:30:07.980789+00:00', - 'metadata': {}} + 'metadata': {}, + 'status': 'idle', + 'config': {}} When configuring multiple streaming modes for a run, responses for each respective mode will be produced. In the following example, note that a `list` of modes (`messages`, `events`, `debug`) is passed to the `stream_mode` parameter and the response contains `events`, `debug`, `messages/complete`, `messages/metadata`, and `messages/partial` event types. @@ -90,6 +102,43 @@ When configuring multiple streaming modes for a run, responses for each respecti } ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"What's the weather in SF?\"}]}, + \"stream_mode\": [ + \"messages\", + \"events\", + \"debug\" + ] + }" | \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "") { + print data_content "\n" + } + sub(/^event: /, "Receiving event of type: ", $0) + printf "%s...\n", $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "") { + print data_content "\n" + } + } + ' + ``` + Output: Receiving new event of type: metadata... diff --git a/docs/docs/cloud/how-tos/stream_updates.md b/docs/docs/cloud/how-tos/stream_updates.md index bd7123786..7b3d4730c 100644 --- a/docs/docs/cloud/how-tos/stream_updates.md +++ b/docs/docs/cloud/how-tos/stream_updates.md @@ -16,7 +16,7 @@ First let's set up our client and thread: ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") # create thread thread = await client.threads.create() print(thread) @@ -27,19 +27,31 @@ First let's set up our client and thread: ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl:"whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl:"" }); // create thread const thread = await client.threads.create(); console.log(thread) ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads \ + --header 'Content-Type: application/json' \ + --data '{ + "metadata": {} + }' + ``` Output: {'thread_id': '979e3c89-a702-4882-87c2-7a59a250ce16', 'created_at': '2024-06-21T15:22:07.453100+00:00', 'updated_at': '2024-06-21T15:22:07.453100+00:00', - 'metadata': {}} + 'metadata': {}, + 'status': 'idle', + 'config': {}} Now we can stream by updates, which outputs updates made to the state by each node after it has executed: @@ -93,6 +105,41 @@ Now we can stream by updates, which outputs updates made to the state by each no } ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"What's the weather in la\"}]}, + \"stream_mode\": [ + \"updates\" + ] + }" | \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "") { + print data_content "\n" + } + sub(/^event: /, "Receiving event of type: ", $0) + printf "%s...\n", $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "") { + print data_content "\n" + } + } + ' + ``` + Output: Receiving new event of type: metadata... diff --git a/docs/docs/cloud/how-tos/stream_values.md b/docs/docs/cloud/how-tos/stream_values.md index e2a739473..34282bd71 100644 --- a/docs/docs/cloud/how-tos/stream_values.md +++ b/docs/docs/cloud/how-tos/stream_values.md @@ -16,7 +16,7 @@ First let's set up our client and thread: ```python from langgraph_sdk import get_client - client = get_client(url="whatever-your-deployment-url-is") + client = get_client(url="") # create thread thread = await client.threads.create() print(thread) @@ -27,18 +27,31 @@ First let's set up our client and thread: ```js import { Client } from "@langchain/langgraph-sdk"; - const client = new Client({ apiUrl: "whatever-your-deployment-url-is" }); + const client = new Client({ apiUrl: "" }); // create thread const thread = await client.threads.create(); console.log(thread) ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads \ + --header 'Content-Type: application/json' \ + --data '{ + "metadata": {} + }' + ``` + Output: {'thread_id': 'bfc68029-1f7b-400f-beab-6f9032a52da4', 'created_at': '2024-06-24T21:30:07.980789+00:00', 'updated_at': '2024-06-24T21:30:07.980789+00:00', - 'metadata': {}} + 'metadata': {}, + 'status': 'idle', + 'config': {}} Now we can stream by values, which streams the full state of the graph after each node has finished executing: @@ -60,7 +73,6 @@ Now we can stream by values, which streams the full state of the graph after eac ``` === "Javascript" - ```js const input = {"messages": [{"role": "human", "content": "what's the weather in la"}]} @@ -80,6 +92,41 @@ Now we can stream by values, which streams the full state of the graph after eac } ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"what's the weather in la\"}]}, + \"stream_mode\": [ + \"values\" + ] + }" | \ + sed 's/\r$//' | \ + awk ' + /^event:/ { + if (data_content != "") { + print data_content "\n" + } + sub(/^event: /, "Receiving event of type: ", $0) + printf "%s...\n", $0 + data_content = "" + } + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "") { + print data_content "\n" + } + } + ' + ``` + Output: @@ -149,6 +196,34 @@ If we want to just get the final result, we can use this endpoint and just keep } ``` +=== "CURL" + + ```bash + curl --request POST \ + --url /threads//runs/stream \ + --header 'Content-Type: application/json' \ + --data "{ + \"assistant_id\": \"agent\", + \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"what's the weather in la\"}]}, + \"stream_mode\": [ + \"values\" + ] + }" | \ + sed 's/\r$//' | \ + awk ' + /^data:/ { + sub(/^data: /, "", $0) + data_content = $0 + } + END { + if (data_content != "") { + print data_content + } + } + ' + ``` + + Output: {'messages': [{'content': 'what's the weather in la',