第 10 章 · SubAgent 协作
03 · 上下文隔离与结果传递
每个 subagent 只看到自己的任务,不共享全部上下文。前置任务的结果作为附加上下文传入。
为什么需要上下文隔离
主 agent 的对话历史可能包含几十条消息——用户的问题、模型的分析、工具的输出、多轮对话的积累。如果把整个历史传给 subagent,两个问题:
- 信息过载。 subagent 只需要知道"自己的任务是什么"和"前置任务发现了什么",不需要看到主 agent 的全部对话。
- 隐私和安全。 主 agent 的对话中可能包含敏感信息(API 密钥、用户偏好),不需要暴露给 subagent。
上下文隔离的原则:subagent 只拿到完成任务所需的最少信息。
SubAgent 的上下文
SubAgent 的 execute 方法创建一个全新的对话:
async execute(task: string, workingDir: string): Promise<SubAgentResult> {
const state: AgentState = {
messages: [{ role: "user", content: task }],
task,
workingDir,
};
const systemMessage = { role: "system", content: ROLE_PROMPTS[this.role] };
const messages = [systemMessage, ...state.messages];
// ...
}对话从零开始:一条系统消息(角色定义)+ 一条用户消息(任务描述)。没有主 agent 的对话历史、没有之前 subagent 的执行痕迹——完全干净。
前置结果的传递
串行执行多个 subagent 时,后续 subagent 需要看到前置任务的结果。Orchestrator 通过在任务描述中附加前置结果来实现:
const previousContext = results.length > 0
? this.formatPreviousResults(results)
: "";
const taskWithContext = previousContext
? `${task.task}\n\n## 前置任务的结果\n\n${previousContext}`
: task.task;格式化后的结果类似:
修改入口文件的 import 语句
## 前置任务的结果
[explorer] 搜索入口文件
→ 找到 3 个相关文件:src/main.ts, src/agent.ts, src/types.ts
[editor] 修改 import 路径
→ 已将 import { Model } from "./model" 改为 from "../model"editor subagent 不需要知道主 agent 是谁、用户问了什么——它只需要知道"修改什么"和"之前发现了什么"。
结果汇总
所有 subagent 执行完成后,Orchestrator 返回 SubAgentResult[]。主 agent 通过 delegate_tasks 工具拿到汇总后的结果:
### 子任务 1 [explorer]
任务: 搜索入口文件
结果: 找到 3 个文件
(模型调用: 2, 工具调用: 3)
### 子任务 2 [editor]
任务: 修改入口文件
结果: 已修改 import 语句
(模型调用: 3, 工具调用: 2)
### 子任务 3 [reviewer]
任务: 审查修改结果
结果: 修改正确,测试通过
(模型调用: 2, 工具调用: 1)主 agent 可以基于这个汇总结果继续工作——比如向用户报告完成情况,或者发现 reviewer 指出了问题,再启动新一轮修改。
隔离的代价
上下文隔离不是没有代价:
- 信息丢失。 subagent 看不到主 agent 的完整对话,可能重复搜索已经搜索过的内容。ContextManager(第 6 章)只在主 agent 层面生效,不会传递给 subagent。
- 协调成本。 主 agent 需要花一个工具调用来 delegate,然后等待所有 subagent 完成。如果任务简单,直接做比 delegate 更快。
所以 delegate_tasks 只适合真正复杂的任务。简单任务用单 agent 直接处理更高效。
登录以继续阅读
解锁完整文档、代码示例及更多高级功能。