Skip to content

如何启动后台运行

本指南涵盖如何为您的代理启动后台运行。这对于长时间运行的作业非常有用。

设置

首先,让我们设置我们的客户端和线程:

from langgraph_sdk import get_client

client = get_client(url=<DEPLOYMENT_URL>)
# 使用名称为 "agent" 的图
assistant_id = "agent"
# 创建线程
thread = await client.threads.create()
print(thread)
import { Client } from "@langchain/langgraph-sdk";

const client = new Client({ apiUrl: <DEPLOYMENT_URL> });
// 使用名称为 "agent" 的图
const assistantID = "agent";
// 创建线程
const thread = await client.threads.create();
console.log(thread);
curl --request POST \
  --url <DEPLOYMENT_URL>/threads \
  --header 'Content-Type: application/json' \
  --data '{}'

输出:

{
    'thread_id': '5cb1e8a1-34b3-4a61-a34e-71a9799bd00d',
    'created_at': '2024-08-30T20:35:52.062934+00:00',
    'updated_at': '2024-08-30T20:35:52.062934+00:00',
    'metadata': {},
    'status': 'idle',
    'config': {},
    'values': None
}

检查线程上的运行情况

如果我们列出当前线程上的运行情况,我们将看到它是空的:

runs = await client.runs.list(thread["thread_id"])
print(runs)
let runs = await client.runs.list(thread['thread_id']);
console.log(runs);
curl --request GET \
    --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/runs

输出:

[]

在线程上启动运行

现在让我们启动一个运行:

input = {"messages": [{"role": "user", "content": "sf的天气怎么样"}]}
run = await client.runs.create(thread["thread_id"], assistant_id, input=input)
let input = {"messages": [{"role": "user", "content": "sf的天气怎么样"}]};
let run = await client.runs.create(thread["thread_id"], assistantID, { input });
curl --request POST \
    --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/runs \
    --header 'Content-Type: application/json' \
    --data '{
        "assistant_id": <ASSISTANT_ID>
    }'

第一次轮询时,我们可以看到 status=pending

print(await client.runs.get(thread["thread_id"], run["run_id"]))
console.log(await client.runs.get(thread["thread_id"], run["run_id"]));
curl --request GET \
    --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/runs/<RUN_ID>

输出:

    {
        "run_id": "1ef6a5f8-bd86-6763-bbd6-bff042db7b1b",
        "thread_id": "7885f0cf-94ad-4040-91d7-73f7ba007c8a",
        "assistant_id": "fe096781-5601-53d2-b2f6-0d3403f7e9ca",
        "created_at": "2024-09-04T01:46:47.244887+00:00",
        "updated_at": "2024-09-04T01:46:47.244887+00:00",
        "metadata": {},
        "status": "pending",
        "kwargs": {
            "input": {
                "messages": [
                    {
                        "role": "user",
                        "content": "sf的天气怎么样"
                    }
                ]
            },
            "config": {
                "metadata": {
                    "created_by": "system"
                },
                "configurable": {
                    "run_id": "1ef6a5f8-bd86-6763-bbd6-bff042db7b1b",
                    "user_id": "",
                    "graph_id": "agent",
                    "thread_id": "7885f0cf-94ad-4040-91d7-73f7ba007c8a",
                    "assistant_id": "fe096781-5601-53d2-b2f6-0d3403f7e9ca",
                    "checkpoint_id": null
                }
            },
            "webhook": null,
            "temporary": false,
            "stream_mode": [
                "values"
            ],
            "feedback_keys": null,
            "interrupt_after": null,
            "interrupt_before": null
        },
        "multitask_strategy": "reject"
    }

现在我们可以加入该运行,等待它完成,并再次检查状态:

await client.runs.join(thread["thread_id"], run["run_id"])
print(await client.runs.get(thread["thread_id"], run["run_id"]))
await client.runs.join(thread["thread_id"], run["run_id"]);
console.log(await client.runs.get(thread["thread_id"], run["run_id"]));
curl --request GET \
    --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/runs/<RUN_ID>/join &&
curl --request GET \
    --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/runs/<RUN_ID>

输出:

{
    "run_id": "1ef6a5f8-bd86-6763-bbd6-bff042db7b1b",
    "thread_id": "7885f0cf-94ad-4040-91d7-73f7ba007c8a",
    "assistant_id": "fe096781-5601-53d2-b2f6-0d3403f7e9ca",
    "created_at": "2024-09-04T01:46:47.244887+00:00",
    "updated_at": "2024-09-04T01:46:47.244887+00:00",
    "metadata": {},
    "status": "success",
    "kwargs": {
        "input": {
            "messages": [
                {
                    "role": "user",
                    "content": "sf的天气怎么样"
                }
            ]
        },
        "config": {
            "metadata": {
                "created_by": "system"
            },
            "configurable": {
                "run_id": "1ef6a5f8-bd86-6763-bbd6-bff042db7b1b",
                "user_id": "",
                "graph_id": "agent",
                "thread_id": "7885f0cf-94ad-4040-91d7-73f7ba007c8a",
                "assistant_id": "fe096781-5601-53d2-b2f6-0d3403f7e9ca",
                "checkpoint_id": null
            }
        },
        "webhook": null,
        "temporary": false,
        "stream_mode": [
            "values"
        ],
        "feedback_keys": null,
        "interrupt_after": null,
        "interrupt_before": null
    },
    "multitask_strategy": "reject"
}

完美!运行成功,正如我们所预期的那样。我们可以通过打印出最终状态来再次确认运行的效果:

final_result = await client.threads.get_state(thread["thread_id"])
print(final_result)
let finalResult = await client.threads.getState(thread["thread_id"]);
console.log(finalResult);
curl --request GET \
    --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/state

输出:

{
    "values": {
        "messages": [
            {
                "content": "sf的天气怎么样",
                "additional_kwargs": {},
                "response_metadata": {},
                "type": "human",
                "name": null,
                "id": "beba31bf-320d-4125-9c37-cadf526ac47a",
                "example": false
            },
            {
                "content": [
                    {
                        "id": "toolu_01AaNPSPzqia21v7aAKwbKYm",
                        "input": {},
                        "name": "tavily_search_results_json",
                        "type": "tool_use",
                        "index": 0,
                        "partial_json": "{\"query\": \"在旧金山的天气\"}"
                    }
                ],
                "additional_kwargs": {},
                "response_metadata": {
                    "stop_reason": "tool_use",
                    "stop_sequence": null
                },
                "type": "ai",
                "name": null,
                "id": "run-f220faf8-1d27-4f73-ad91-6bb3f47e8639",
                "example": false,
                "tool_calls": [
                    {
                        "name": "tavily_search_results_json",
                        "args": {
                            "query": "在旧金山的天气"
                        },
                        "id": "toolu_01AaNPSPzqia21v7aAKwbKYm",
                        "type": "tool_call"
                    }
                ],
                "invalid_tool_calls": [],
                "usage_metadata": {
                    "input_tokens": 273,
                    "output_tokens": 61,
                    "total_tokens": 334
                }
            },
            {

```json "content": "[{\"url\": \"https://www.weatherapi.com/\", \"content\": \"{'location': {'name': '旧金山', 'region': '加利福尼亚', 'country': '美国', 'lat': 37.78, 'lon': -122.42, 'tz_id': 'America/Los_Angeles', 'localtime_epoch': 1725052131, 'localtime': '2024-08-30 14:08'}, 'current': {'last_updated_epoch': 1725051600, 'last_updated': '2024-08-30 14:00', 'temp_c': 21.1, 'temp_f': 70.0, 'is_day': 1, 'condition': {'text': '局部多云', 'icon': '//cdn.weatherapi.com/weather/64x64/day/116.png', 'code': 1003}, 'wind_mph': 11.9, 'wind_kph': 19.1, 'wind_degree': 290, 'wind_dir': '西北偏西', 'pressure_mb': 1018.0, 'pressure_in': 30.07, 'precip_mm': 0.0, 'precip_in': 0.0, 'humidity': 59, 'cloud': 25, 'feelslike_c': 21.1, 'feelslike_f': 70.0, 'windchill_c': 18.6, 'windchill_f': 65.5, 'heatindex_c': 18.6, 'heatindex_f': 65.5, 'dewpoint_c': 12.2, 'dewpoint_f': 54.0, 'vis_km': 16.0, 'vis_miles': 9.0, 'uv': 5.0, 'gust_mph': 15.0, 'gust_kph': 24.2}}\"}]", "additional_kwargs": {}, "response_metadata": {}, "type": "tool", "name": "tavily_search_results_json", "id": "686b2487-f332-4e58-9508-89b3a814cd81", "tool_call_id": "toolu_01AaNPSPzqia21v7aAKwbKYm", "artifact": { "query": "旧金山天气", "follow_up_questions": null, "answer": null, "images": [], "results": [ { "title": "旧金山天气", "url": "https://www.weatherapi.com/", "content": "{'location': {'name': '旧金山', 'region': '加利福尼亚', 'country': '美国', 'lat': 37.78, 'lon': -122.42, 'tz_id': 'America/Los_Angeles', 'localtime_epoch': 1725052131, 'localtime': '2024-08-30 14:08'}, 'current': {'last_updated_epoch': 1725051600, 'last_updated': '2024-08-30 14:00', 'temp_c': 21.1, 'temp_f': 70.0, 'is_day': 1, 'condition': {'text': '局部多云', 'icon': '//cdn.weatherapi.com/weather/64x64/day/116.png', 'code': 1003}, 'wind_mph': 11.9, 'wind_kph': 19.1, 'wind_degree': 290, 'wind_dir': '西北偏西', 'pressure_mb': 1018.0, 'pressure_in': 30.07, 'precip_mm': 0.0, 'precip_in': 0.0, 'humidity': 59, 'cloud': 25, 'feelslike_c': 21.1, 'feelslike_f': 70.0, 'windchill_c': 18.6, 'windchill_f': 65.5, 'heatindex_c': 18.6, 'heatindex_f': 65.5, 'dewpoint_c': 12.2, 'dewpoint_f': 54.0, 'vis_km': 16.0, 'vis_miles': 9.0, 'uv': 5.0, 'gust_mph': 15.0, 'gust_kph': 24.2}}", "score": 0.976148, "raw_content": null } ], "response_time": 3.07 }, "status": "success" }, { "content": [ { "text": "\n\n搜索结果提供了旧金山当前的天气条件。根据数据,截至2024年8月30日下午2:00,旧金山的温度为70°F(21.1°C),天空部分多云。风速约为每小时12英里(每小时19公里),来自西北偏西。湿度为59%,能见度为9英里(16公里)。总体来看,这看起来是一个在旧金山舒适温暖、部分晴朗的晚夏日。", "type": "text", "index": 0 } ], "additional_kwargs": {}, "response_metadata": { "stop_reason": "end_turn", "stop_sequence": null }, "type": "ai", "name": null, "id": "run-8fecc61d-3d9f-4e16-8e8a-92f702be498a", "example": false, "tool_calls": [], "invalid_tool_calls": [], "usage_metadata": { "input_tokens": 837, "output_tokens": 124, "total_tokens": 961 } } ] }, "next": [], "tasks": [], "metadata": { "step": 3, "run_id": "1ef67140-eb23-684b-8253-91d4c90bb05e", "source": "loop", "writes": { "agent": { "messages": [ { "id": "run-8fecc61d-3d9f-4e16-8e8a-92f702be498a", "name": null, "type": "ai", "content": [ { "text": "\n\n搜索结果提供了旧金山当前的天气条件。根据数据,截至2024年8月30日下午2:00,旧金山的温度为70°F(21.1°C),天空部分多云。风速约为每小时12英里(每小时19公里),来自西北偏西。湿度为59%,能见度为9英里(16公里)。总体来看,这看起来是一个在旧金山舒适温暖、部分晴朗的晚夏日。", "type": "text", "index": 0 } ], "example": false, "tool_calls": [], "usage_metadata": { "input_tokens": 837, "total_tokens": 961, "output_tokens": 124 }, "additional_kwargs": {}, "response_metadata": { "stop_reason": "end_turn", "stop_sequence": null }, "invalid_tool_calls": [] } ] } }, "user_id": "", "graph_id": "agent", "thread_id": "5cb1e8a1-34b3-4a61-a34e-71a9799bd00d", "created_by": "system", "assistant_id": "fe096781-5601-53d2-b2f6-0d3403f7e9ca" }, "created_at": "2024-08-30T21:09:00.079909+00:00", "checkpoint_id": "1ef67141-3ca2-6fae-8003-fe96832e57d6", "parent_checkpoint_id": "1ef67141-2129-6b37-8002-61fc3bf69cb5" } 我们也可以直接打印最后一条AI消息的内容:

python print(final_result['values']['messages'][-1]['content'][0]['text'])

js console.log(finalResult['values']['messages'][finalResult['values']['messages'].length-1]['content'][0]['text']);

bash curl --request GET \ --url <DEPLOYMENT_URL>/threads/<THREAD_ID>/state | jq -r '.values.messages[-1].content.[0].text'

输出: 搜索结果提供了旧金山当前的天气条件。根据数据,截至2024年8月30日下午2:00,旧金山的温度为70°F(21.1°C),天空部分多云。风速约为每小时12英里(每小时19公里),来自西北偏西。湿度为59%,能见度为9英里(16公里)。总体来看,这看起来是一个在旧金山舒适温暖、部分晴朗的晚夏日。 ```

优云智算