17.5 实验五:实现一个简化版多 Agent 编排系统

模型: claude-opus-4-6 (anthropic/claude-opus-4-6) 生成日期: 2026-02-18


前四个实验让我们掌握了 AI 编程助手的核心组件:LLM 对话、Tool Use、MCP 扩展、Plugin 机制。但真正强大的 AI 编程助手不是一个单独的 Agent 在工作——而是多个 Agent 协作

在第 15 章,我们深入剖析了 oh-my-opencode 的多 Agent 体系:Sisyphus 作为主编排者、Oracle 提供技术咨询、Explore 负责代码搜索、Prometheus 规划复杂任务……这种分工协作的模式极大地提升了 AI 的任务完成能力。

本节我们将从零构建一个简化版多 Agent 编排系统,模仿 oh-my-opencode 的核心架构,体验 Agent 编排的设计精髓。

17.5.1 目标

构建一个包含以下组件的多 Agent 系统:

  1. Commander Agent(主编排者):接收用户任务,决定是自己处理还是委托给子 Agent

  2. Researcher Agent(研究员):专门负责代码搜索和信息收集

  3. Coder Agent(编码者):专门负责代码编写和修改

  4. Task 工具:实现 Agent 间的任务委托机制

  5. 会话管理:维护每个 Agent 独立的上下文

衍生解释——什么是多 Agent 编排(Multi-Agent Orchestration)?

多 Agent 编排是指在一个系统中运行多个具有不同能力和"人格"的 AI Agent,通过某种协调机制让它们分工合作完成复杂任务。

这与单 Agent 的关键区别在于:

  • 专业化分工:每个 Agent 有不同的 System Prompt、工具集和行为约束,就像团队中的不同角色

  • 成本优化:简单任务交给轻量 Agent(便宜的模型),复杂任务交给强力 Agent(昂贵的模型)

  • 并行处理:多个子 Agent 可以同时工作,提升效率

  • 上下文隔离:每个 Agent 有独立的对话上下文,避免相互干扰

oh-my-opencode 的做法类似一个"虚拟技术团队":Sisyphus 是技术负责人,根据任务性质分配给不同的专家。

17.5.2 架构设计

在开始编码前,让我们设计系统的整体架构:

与 oh-my-opencode 的对应关系

我们的系统
oh-my-opencode
角色

Commander

Sisyphus

主编排者,负责任务分类和委托

Researcher

Explore

代码搜索专家

Coder

Hephaestus

代码编写工匠

task 工具

delegate-task / task

Agent 间任务委托

17.5.3 实现步骤

步骤一:项目初始化与基础结构

创建目录结构:

步骤二:定义核心类型

创建 src/types.ts

这些类型对应了第 4 章分析的 OpenCode 数据模型:AgentDefinition 对应 Agent.InfoSession 对应 Session.InfoTaskRequest 对应 task 工具的参数。

步骤三:实现会话管理器

创建 src/session/manager.ts——管理多个 Agent 的独立会话:

这个设计模仿了 OpenCode 中 Session 的核心概念(第 4.1 节):

  • parentSessionId:实现父子会话关联。当 Commander 委托任务给 Researcher 时,Researcher 的会话会记录 Commander 的会话 ID,形成层级关系。

  • 独立的 messages 数组:每个 Agent 有自己的上下文,互不干扰。

  • status 状态机activecompleted/error,对应 OpenCode 的 SessionStatus

步骤四:定义 Agent

创建 src/agents/researcher.ts——研究员 Agent:

创建 src/agents/coder.ts——编码者 Agent:

创建 src/agents/commander.ts——主编排者 Agent:

注意 Commander 的 System Prompt 设计——它模仿了 oh-my-opencode 中 Sisyphus 的核心理念(第 15.3.3 节):

  1. 意图分类:分析任务复杂度,类似 Sisyphus 的 Trivial/Explicit/Exploratory/Open-ended 分类

  2. 委托协议:结构化的任务描述格式,类似 Sisyphus 的 6 段委托结构

  3. 成本意识:区分哪些任务用便宜的 Agent,哪些用昂贵的 Agent

  4. 错误恢复:子 Agent 失败时的兜底策略

步骤五:实现工具集

创建 src/tools/search-tools.ts

创建 src/tools/file-tools.ts

步骤六:实现 Task 工具(核心)

创建 src/tools/task-tool.ts——这是实现 Agent 编排的关键:

这个 task 工具的设计直接对应了 OpenCode 中 tool/task.ts 的核心思想(第 5.3.5 节):

  • 创建子会话:通过 sessionManager.create() 为子 Agent 创建独立的会话

  • Agent 权限过滤:通过 z.enum(["researcher", "coder"]) 限制可委托的目标

  • 结果回传:子 Agent 的执行结果作为 task 工具的返回值,回到 Commander 的上下文中

步骤七:实现核心执行引擎

创建 src/index.ts——把所有组件组装在一起:

步骤八:运行与测试

测试场景:

17.5.4 进阶:添加并行任务执行

oh-my-opencode 的后台 Agent 系统(第 15.6.1 节)支持并行执行多个子 Agent。让我们为系统添加这个能力:

使用 Promise.allSettled 而非 Promise.all,这样即使某个子 Agent 失败,其他任务也能正常完成——这正是 oh-my-opencode 的防御式编程理念。

17.5.5 进阶:Doom Loop 检测

回顾第 4.4.2 节分析的 Doom Loop 检测机制——当 Agent 反复调用同一个工具得到相同结果时,说明它陷入了死循环。让我们添加这个保护:

17.5.6 知识点总结

通过这个实验,我们实现了一个包含以下核心机制的多 Agent 系统:

知识点
对应章节
实现方式

Agent 定义与 Prompt 工程

第 6 章 Agent 系统

AgentDefinition + 精心设计的 System Prompt

会话管理与上下文隔离

第 4 章 Session 系统

SessionManager + 父子会话关联

Task 工具与任务委托

第 5.3.5 节 task 工具

task 工具 + executeAgent()

Agentic Loop

第 4.4 节 SessionProcessor

while 循环 + 工具调用检测

Doom Loop 检测

第 4.4.2 节

重复调用签名检查

并行执行

第 15.6.1 节后台 Agent

Promise.allSettled()

防御式编程

第 15.5 节 Hook 系统

错误恢复、超时保护、安全检查

从这个实验到生产级产品的差距

我们的简化版系统虽然展示了核心概念,但与 OpenCode + oh-my-opencode 的生产级实现相比,还缺少:

  1. 持久化存储:我们的会话存在内存中,退出即丢失。OpenCode 使用文件存储(第 10 章)

  2. 流式 UI:我们只有简单的 console.log。OpenCode 有完整的 TUI(第 12 章)

  3. 权限系统:我们的安全检查是硬编码的。OpenCode 有完整的权限评估引擎(第 9 章)

  4. Snapshot 回滚:我们没有文件变更快照。OpenCode 可以撤销所有修改(第 10.1 节)

  5. 上下文压缩:我们没有 Compaction。长对话会超出 Token 限制(第 4.5 节)

  6. 53 个 Hook:oh-my-opencode 的 Hook 系统提供了极其精细的行为控制

但核心思想是一样的:通过 Agent 分工 + 工具系统 + 会话管理,构建一个能够自主完成复杂编程任务的 AI 系统。理解了这些核心概念,你就具备了从零构建类似系统的基础。

Last updated