子代理与 Supervisor:多 agent 协作与任务交接
30 秒导读: 一个 Agent 太"全能"就什么都做不精。VoltAgent 让你把一个 supervisor(主管)Agent 和若干 专精子 Agent 组队——主管只负责"拆任务、点名、汇总",真正干活交给子代理。本章讲清楚:这个委派是怎么在运行时发生的、任务怎么交接过去、父子怎么共享上下文与追踪、结果又怎么流回来。
本章只讲运行时委派(supervisor/sub-agent)。它和第 5 章的 Workflow 引擎是两种编排:
| 子代理委派(本章) | Workflow(第 5 章) | |
|---|---|---|
| 谁决定下一步 | 模型在运行时临时决定点名谁 | 你写死的声明式步骤图 |
| 形态 | 一个工具调用(delegate_task) | .andThen / .andAgent / .andWhen 步骤链 |
| 适合 | 开放式、需要模型判断该找谁 | 固定流程、要能暂停/恢复 |
如果你还不了解单个 Agent 一次生成的生命周期,先读 01 · Agent 运行时;委派本质上就是"在父 Agent 的一次生成里,调了一个特殊工具,而这个工具会去跑另一个 Agent 的完整生成"。
1. 这是什么(零基础也能懂)
一句话定义: 把一个 Agent 声明为另一个 Agent 的 subAgents,父 Agent 就变成 supervisor,自动获得一个 delegate_task 工具,能在对话中途把子任务甩给专精的子代理去做。
解决什么问题: 假设你在做一个客服机器人。用户既可能问"我的订单到哪了",又可能问"帮我算一下退款金额",还可能要"用英文重写这封投诉"。你可以塞一个巨型 prompt 让单个 Agent 全包——但它会顾此失彼。更好的做法:
- 一个 物流查询 Agent(接了物流 API)
- 一个 计算 Agent(擅长数值)
- 一个 翻译 Agent
再放一个 supervisor 在最前面。它读懂用户意图,把子问题分发给对应的专家,收齐答案后拼成最终答复。
用起来什么样: 声明子代理只要一个 subAgents 数组(packages/core/src/agent/agent.ts:1181 构造 SubAgentManager):
// 示意,非源码:声明一个 supervisor
const supervisor = new Agent({
name: "Supervisor",
instructions: "你负责把用户问题分派给合适的专家,并汇总答复。",
model: myModel,
subAgents: [logisticsAgent, mathAgent, translatorAgent], // ← 关键
});
// 之后照常调用,委派对模型是透明的
await supervisor.streamText("我的订单到哪了?顺便把这句翻成英文:'请尽快发货'");
你不需要手写"先调物流、再调翻译"的逻辑——一旦 subAgents 非空,VoltAgent 自动:
- 把 supervisor 的 system prompt 改写成"你是主管,手下有这些专家……"(见 §8)。
- 给它挂上一个
delegate_task工具。
一句话直觉: 把 supervisor 想成一个项目经理。它自己不写代码,但知道手下每个人擅长什么;delegate_task 就是它派活的"工单系统",可以一次给多个人派活,然后等大家交活。
本节不出现底层细节。记住一件事:委派 = 父 Agent 调了一个会去跑子 Agent 的工具。