Skip to main content
在许多场景中,按计划运行助手非常有用。 例如,假设您正在构建一个每日运行并发送当天新闻摘要邮件的助手。您可以使用定时任务让助手每天在晚上8点运行。 LangSmith 部署支持定时任务,这些任务按用户定义的计划运行。用户指定一个计划、一个助手和一些输入。之后,在指定的计划时间,服务器将:
  • 使用指定的助手创建一个新线程
  • 将指定的输入发送到该线程
请注意,这每次都会向线程发送相同的输入。 LangSmith 部署 API 提供了多个端点来创建和管理定时任务。更多详情请参阅 API 参考 有时您不希望基于用户交互来运行您的图,而是希望按计划调度您的图运行——例如,如果您希望您的图每周为您的团队撰写并发送待办事项邮件。LangSmith 部署允许您使用 Crons 客户端来实现这一点,而无需编写自己的脚本。要调度一个图作业,您需要传递一个 cron 表达式 来告知客户端您希望何时运行该图。Cron 作业在后台运行,不会干扰图的正常调用。
所有定时计划均以 UTC 时间解释。在指定计划时,请确保将您期望的执行时间转换为 UTC。

设置

首先,让我们设置我们的 SDK 客户端、助手和线程:
from langgraph_sdk import get_client

client = get_client(url=<DEPLOYMENT_URL>)
# 使用部署时命名为 "agent" 的图
assistant_id = "agent"
# 创建线程
thread = await client.threads.create()
print(thread)
输出:
{
'thread_id': '9dde5490-2b67-47c8-aa14-4bfec88af217',
'created_at': '2024-08-30T23:07:38.242730+00:00',
'updated_at': '2024-08-30T23:07:38.242730+00:00',
'metadata': {},
'status': 'idle',
'config': {},
'values': None
}

针对线程的定时任务

要创建与特定线程关联的定时任务,您可以编写:
# 这将调度一个任务,每天在 UTC 时间 15:27(下午3:27)运行
cron_job = await client.crons.create_for_thread(
    thread["thread_id"],
    assistant_id,
    schedule="27 15 * * *",
    input={"messages": [{"role": "user", "content": "What time is it?"}]},
)
请注意,删除不再有用的 Cron 作业 非常 重要。否则,您可能会因调用 LLM 而产生不必要的 API 费用!您可以使用以下代码删除 Cron 作业:
await client.crons.delete(cron_job["cron_id"])

无状态定时任务

您也可以使用以下代码创建无状态定时任务。无状态定时任务每次执行都会创建一个新线程:
# 这将调度一个任务,每天在 UTC 时间 15:27(下午3:27)运行
cron_job_stateless = await client.crons.create(
    assistant_id,
    schedule="27 15 * * *",
    input={"messages": [{"role": "user", "content": "What time is it?"}]},
)
同样,请记住在完成后删除您的作业!
await client.crons.delete(cron_job_stateless["cron_id"])

无状态定时任务的线程清理

此功能需要 LangGraph API 版本 0.5.18 或更高版本,以及 Python SDK 0.3.2 或更高版本,或 JavaScript SDK 1.4.0 或更高版本。
每次触发无状态定时任务时,都会创建一个新线程。使用 on_run_completed 参数控制在运行完成后如何处理该线程:
  • "delete"(默认):运行完成后自动删除线程。
  • "keep":保留线程以供后续检索。您需要负责清理这些线程。有关推荐方法,请参阅 如何为您的应用程序添加 TTL

示例:保留线程以供后续检索

# 创建一个在运行后保留线程的无状态定时任务。
# 在 langgraph.json 中配置 checkpointer.ttl 以自动删除旧线程。
# 参见:https://docs.langchain.com/langsmith/configure-ttl
cron_job = await client.crons.create(
    assistant_id,
    schedule="27 15 * * *",
    input={"messages": [{"role": "user", "content": "Daily report"}]},
    on_run_completed="keep"
)

# 您可以稍后检索运行及其结果
runs = await client.runs.search(
    metadata={"cron_id": cron_job["cron_id"]}
)