The guide covers the interrupt option for double texting, which interrupts the prior run of the graph and starts a new one with the double-text. This option does not delete the first run, but rather keeps it in the database but sets its status to interrupted. Below is a quick example of using the interrupt option.
# PLACE THIS IN A FILE CALLED pretty_print.shpretty_print(){localtype="$1"localcontent="$2"localpadded=" $type "localtotal_width=80localsep_len=$(((total_width-${#padded})/2))localsep=$(printf'=%.0s'$(eval"echo {1.."${sep_len}"}"))localsecond_sep=$sepif(((total_width-${#padded})%2));thensecond_sep="${second_sep}="fiecho"${sep}${padded}${second_sep}"echoecho"$content"}
Now, let's import our required packages and instantiate our client, assistant, and thread.
importasynciofromlangchain_core.messagesimportconvert_to_messagesfromlanggraph_sdkimportget_clientclient=get_client(url=<DEPLOYMENT_URL>)# Using the graph deployed with the name "agent"assistant_id="agent"thread=awaitclient.threads.create()
import{Client}from"@langchain/langgraph-sdk";constclient=newClient({apiUrl:<DEPLOYMENT_URL>});// Using the graph deployed with the name "agent"constassistantId="agent";constthread=awaitclient.threads.create();
Now we can start our two runs and join the second one until it has completed:
# the first run will be interruptedinterrupted_run=awaitclient.runs.create(thread["thread_id"],assistant_id,input={"messages":[{"role":"user","content":"what's the weather in sf?"}]},)# sleep a bit to get partial outputs from the first runawaitasyncio.sleep(2)run=awaitclient.runs.create(thread["thread_id"],assistant_id,input={"messages":[{"role":"user","content":"what's the weather in nyc?"}]},multitask_strategy="interrupt",)# wait until the second run completesawaitclient.runs.join(thread["thread_id"],run["run_id"])
// the first run will be interruptedletinterruptedRun=awaitclient.runs.create(thread["thread_id"],assistantId,{input:{messages:[{role:"human",content:"what's the weather in sf?"}]}});// sleep a bit to get partial outputs from the first runawaitnewPromise(resolve=>setTimeout(resolve,2000));letrun=awaitclient.runs.create(thread["thread_id"],assistantId,{input:{messages:[{role:"human",content:"what's the weather in nyc?"}]},multitaskStrategy:"interrupt"});// wait until the second run completesawaitclient.runs.join(thread["thread_id"],run["run_id"]);
curl--requestPOST\--url<DEPLOY<ENT_URL>>/threads/<THREAD_ID>/runs\--header'Content-Type: application/json'\--data"{ \"assistant_id\": \"agent\", \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"what\'s the weather in sf?\"}]},}"&&sleep2&&curl--requestPOST\--url<DEPLOY<ENT_URL>>/threads/<THREAD_ID>/runs\--header'Content-Type: application/json'\--data"{ \"assistant_id\": \"agent\", \"input\": {\"messages\": [{\"role\": \"human\", \"content\": \"what\'s the weather in nyc?\"}]}, \"multitask_strategy\": \"interrupt\"}"&&curl--requestGET\--url<DEPLOYMENT_URL>/threads/<THREAD_ID>/runs/<RUN_ID>/join
sourcepretty_print.sh&&curl--requestGET\--url<DEPLOYMENT_URL>/threads/<THREAD_ID>/state|\jq-c'.values.messages[]'|whileread-relement;dotype=$(echo"$element"|jq-r'.type')content=$(echo"$element"|jq-r'.content | if type == "array" then tostring else . end')pretty_print"$type""$content"done
Output:
================================ Human Message =================================
what's the weather in sf?
================================== Ai Message ==================================
[{'id': 'toolu_01MjNtVJwEcpujRGrf3x6Pih', 'input': {'query': 'weather in san francisco'}, 'name': 'tavily_search_results_json', 'type': 'tool_use'}]
Tool Calls:
tavily_search_results_json (toolu_01MjNtVJwEcpujRGrf3x6Pih)
Call ID: toolu_01MjNtVJwEcpujRGrf3x6Pih
Args:
query: weather in san francisco
================================= Tool Message =================================
Name: tavily_search_results_json
[{"url": "https://www.wunderground.com/hourly/us/ca/san-francisco/KCASANFR2002/date/2024-6-18", "content": "High 64F. Winds W at 10 to 20 mph. A few clouds from time to time. Low 49F. Winds W at 10 to 20 mph. Temp. San Francisco Weather Forecasts. Weather Underground provides local & long-range weather ..."}]
================================ Human Message =================================
what's the weather in nyc?
================================== Ai Message ==================================
[{'id': 'toolu_01KtE1m1ifPLQAx4fQLyZL9Q', 'input': {'query': 'weather in new york city'}, 'name': 'tavily_search_results_json', 'type': 'tool_use'}]
Tool Calls:
tavily_search_results_json (toolu_01KtE1m1ifPLQAx4fQLyZL9Q)
Call ID: toolu_01KtE1m1ifPLQAx4fQLyZL9Q
Args:
query: weather in new york city
================================= Tool Message =================================
Name: tavily_search_results_json
[{"url": "https://www.accuweather.com/en/us/new-york/10021/june-weather/349727", "content": "Get the monthly weather forecast for New York, NY, including daily high/low, historical averages, to help you plan ahead."}]
================================== Ai Message ==================================
The search results provide weather forecasts and information for New York City. Based on the top result from AccuWeather, here are some key details about the weather in NYC:
- This is a monthly weather forecast for New York City for the month of June.
- It includes daily high and low temperatures to help plan ahead.
- Historical averages for June in NYC are also provided as a reference point.
- More detailed daily or hourly forecasts with precipitation chances, humidity, wind, etc. can be found by visiting the AccuWeather page.
So in summary, the search provides a convenient overview of the expected weather conditions in New York City over the next month to give you an idea of what to prepare for if traveling or making plans there. Let me know if you need any other details!
Verify that the original, interrupted run was interrupted