Skip to content

异步子 Agent

Preview 能力:Async subagents 自 Python deepagents 0.5.0、TypeScript deepagents 1.9.0 起提供,API 仍在演进。它依赖 Agent Protocol server,不能只靠一个本地 SDK 对象获得完整后台 任务能力。

同步 subagent 会阻塞主调用直到完成。AsyncSubAgent 把任务发送到同部署或远程 Agent Protocol 服务,在独立 thread 中持续运行;主 Agent 可以继续和用户交互,稍后再检查或更新任务。

什么时候需要异步

  • 研究、构建或数据处理可能运行数分钟以上。
  • 用户希望先收到任务 ID 和当前状态。
  • 主 Agent 需要同时管理多个后台任务。
  • 子任务需要在多次 update 之间保留自己的 state。

如果主 Agent 启动任务后立刻轮询到完成,异步只会变成更复杂的阻塞调用。短任务优先使用同步 subagent。

前端类比

它更像有持久 job id 的后台队列,而不是 await Promise.all。浏览器请求可以结束,任务仍在服务端 运行;后续请求通过 task id 查询或追加指令。

Deep Agents 原生语义:AsyncSubAgent 描述的是 Agent Protocol server 上的 graph/assistant。 AsyncSubAgentMiddleware 向 supervisor 注入 start、check、update、cancel 与 list 工具,并把远程 thread 状态投影回主 Agent 上下文。

配置 AsyncSubAgent

同部署时省略 url,由 Agent Server 使用 ASGI transport;远程部署设置 url,并由应用安全管理 认证 headers。

python
import os

from deepagents import AsyncSubAgent, create_deep_agent

researcher = AsyncSubAgent(
    name="researcher",
    description="执行长时间资料核验并返回带来源的报告",
    graph_id="researcher",
)

agent = create_deep_agent(
    model=os.environ["DEEPAGENTS_MODEL"],
    subagents=[researcher],
)
ts
import { createDeepAgent, type AsyncSubAgent } from 'deepagents'

const researcher: AsyncSubAgent = {
  name: 'researcher',
  description: '执行长时间资料核验并返回带来源的报告',
  graphId: 'researcher',
}

const model = process.env.DEEPAGENTS_MODEL
if (!model) throw new Error('DEEPAGENTS_MODEL is required')

const agent = createDeepAgent({
  model,
  subagents: [researcher],
})

代码还需要在 Agent Protocol 服务中注册 graph_id/graphId 对应的图。没有服务端图配置时, 这段 supervisor 配置无法独立运行。

生命周期工具

工具作用主 Agent 应如何使用
start_async_task启动后台任务并返回 task id保存完整 task id,向用户报告已启动
check_async_task获取实时状态和完成结果需要状态时重新调用,不复述旧消息
update_async_task向运行任务追加指令说明变更和仍然有效的约束
cancel_async_task请求取消任务取消后继续检查最终状态与资源回收
list_async_tasks列出 supervisor 跟踪的任务用于恢复视图,不替代服务端授权

历史消息中的任务状态总是可能过期。System prompt 应要求模型在回答“现在完成了吗”之前调用 check_async_task,不要根据之前的 ToolMessage 猜测。

独立 thread 与更新

每个 async subagent 在自己的 thread 中运行,因此 update 可以基于已有 state 继续,而不必重放 全部任务。Supervisor 只持有 task id 和状态摘要;远程 thread 的 checkpoint、store 和生命周期由 Agent Protocol 部署负责。

这也意味着:

  • 主 Agent checkpointer 不会替代远程 graph 的持久化。
  • 远程任务可能因 worker pool 已满而排队。
  • 取消请求需要服务端协作,不能假设进程已经立刻停止。
  • Task id 必须作为不透明标识保存,不应由模型截断或改写。

安全与信任

远程 subagent 的状态、错误和最终结果会进入 supervisor 上下文。应把它们视为不可信输入:

  • 只连接受控 Agent Protocol endpoint,并验证 TLS 与服务身份。
  • Headers 由服务端配置或凭据代理提供,不写进 prompt。
  • 在服务端再次校验用户、tenant、graph 与 thread 权限。
  • 对远程结果使用 schema、来源和业务验证。
  • 为 start/update/cancel 建立审计日志和速率限制。

Python 与 TypeScript 差异

概念PythonTypeScript
类型AsyncSubAgentAsyncSubAgent type
Graph 字段graph_idgraphId
远程地址urlurl
初始版本门槛>=0.5.0>=1.9.0

两者的生命周期概念相同,但具体类型与 middleware 实现应按当前版本文档核验。

先修

下一步

官方参考

学习文档整合站点