第 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 直接处理更高效。

登录以继续阅读

解锁完整文档、代码示例及更多高级功能。

立即登录

On this page