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 系统:
Commander Agent(主编排者):接收用户任务,决定是自己处理还是委托给子 Agent
Researcher Agent(研究员):专门负责代码搜索和信息收集
Coder Agent(编码者):专门负责代码编写和修改
Task 工具:实现 Agent 间的任务委托机制
会话管理:维护每个 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 的对应关系
Commander
Sisyphus
主编排者,负责任务分类和委托
Researcher
Explore
代码搜索专家
Coder
Hephaestus
代码编写工匠
task 工具
delegate-task / task
Agent 间任务委托
17.5.3 实现步骤
步骤一:项目初始化与基础结构
创建目录结构:
步骤二:定义核心类型
创建 src/types.ts:
这些类型对应了第 4 章分析的 OpenCode 数据模型:AgentDefinition 对应 Agent.Info,Session 对应 Session.Info,TaskRequest 对应 task 工具的参数。
步骤三:实现会话管理器
创建 src/session/manager.ts——管理多个 Agent 的独立会话:
这个设计模仿了 OpenCode 中 Session 的核心概念(第 4.1 节):
parentSessionId:实现父子会话关联。当 Commander 委托任务给 Researcher 时,Researcher 的会话会记录 Commander 的会话 ID,形成层级关系。独立的
messages数组:每个 Agent 有自己的上下文,互不干扰。status状态机:active→completed/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 节):
意图分类:分析任务复杂度,类似 Sisyphus 的 Trivial/Explicit/Exploratory/Open-ended 分类
委托协议:结构化的任务描述格式,类似 Sisyphus 的 6 段委托结构
成本意识:区分哪些任务用便宜的 Agent,哪些用昂贵的 Agent
错误恢复:子 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 的生产级实现相比,还缺少:
持久化存储:我们的会话存在内存中,退出即丢失。OpenCode 使用文件存储(第 10 章)
流式 UI:我们只有简单的 console.log。OpenCode 有完整的 TUI(第 12 章)
权限系统:我们的安全检查是硬编码的。OpenCode 有完整的权限评估引擎(第 9 章)
Snapshot 回滚:我们没有文件变更快照。OpenCode 可以撤销所有修改(第 10.1 节)
上下文压缩:我们没有 Compaction。长对话会超出 Token 限制(第 4.5 节)
53 个 Hook:oh-my-opencode 的 Hook 系统提供了极其精细的行为控制
但核心思想是一样的:通过 Agent 分工 + 工具系统 + 会话管理,构建一个能够自主完成复杂编程任务的 AI 系统。理解了这些核心概念,你就具备了从零构建类似系统的基础。
Last updated
