OpenCode Plan 与 Build 智能体对比分析:架构差异与协作机制
本文对 OpenCode 项目中的 Plan 智能体和 Build 智能体进行了系统的对比分析。通过深入剖析两个智能体在架构设计、权限系统、工作流程、工具集成和错误处理等方面的差异,揭示了现代 AI 编程助手如何通过职责分离和协作机制提升代码生成的质量和安全性。本文还探讨了两种智能体的协同工作模式,为理解多智能体系统在软件工程中的应用提供了理论参考。
摘要
本文对 OpenCode 项目中的 Plan 智能体和 Build 智能体进行了系统的对比分析。通过深入剖析两个智能体在架构设计、权限系统、工作流程、工具集成和错误处理等方面的差异,揭示了现代 AI 编程助手如何通过职责分离和协作机制提升代码生成的质量和安全性。本文还探讨了两种智能体的协同工作模式,为理解多智能体系统在软件工程中的应用提供了理论参考。
关键词:OpenCode;Plan 智能体;Build 智能体;对比分析;多智能体协作;权限控制
目录
- 引言
- 核心设计理念对比
2.1 职责定位
2.2 设计哲学
2.3 适用场景 - 架构设计对比
3.1 智能体配置
3.2 权限系统
3.3 工作模式 - 工作流程对比
4.1 Plan 智能体工作流
4.2 Build 智能体工作流
4.3 流程差异分析 - 工具访问能力对比
5.1 可用工具集
5.2 权限约束
5.3 使用策略 - 用户交互模式对比
6.1 交互频率
6.2 决策点
6.3 控制权转移 - 性能特征对比
7.1 Token 消耗
7.2 执行时间
7.3 资源利用率 - 协作机制分析
8.1 状态传递
8.2 上下文共享
8.3 错误恢复 - 实际应用案例分析
9.1 简单任务场景
9.2 复杂任务场景
9.3 混合模式场景 - 设计权衡与最佳实践
10.1 安全性 vs 效率
10.2 自动化 vs 人工控制
10.3 灵活性 vs 规范性 - 未来发展方向
- 总结
1. 引言
1.1 研究背景
在多智能体 AI 系统中,如何通过合理的职责划分和协作机制提升整体效能是一个重要课题。OpenCode 项目通过引入 Plan 和 Build 两个核心智能体,实现了规划与执行的分离。这种设计不仅提高了代码生成的质量,还增强了系统的安全性和可控性。
1.2 研究目标
本文旨在回答以下问题:
- Plan 和 Build 智能体在设计理念上有何本质区别?
- 两者在权限系统和工具访问能力上存在哪些差异?
- 它们如何协同工作以完成复杂的编程任务?
- 这种分工设计带来了哪些优势和局限?
1.3 研究方法
通过源码分析、配置对比和场景模拟,从多个维度系统比较两个智能体的特性。
2. 核心设计理念对比
2.1 职责定位
| 维度 | Plan 智能体 | Build 智能体 |
|---|---|---|
| 核心职责 | 需求分析、方案设计、任务拆解 | 代码实施、文件修改、命令执行 |
| 工作阶段 | 前期规划阶段 | 后期执行阶段 |
| 输出产物 | 计划文档(.md 文件) | 实际代码变更 |
| 主要目标 | 确保方向正确、方案可行 | 高效准确地实现功能 |
关键差异:
- Plan:思考者(Thinker)- 专注于"做什么"和"怎么做"
- Build:执行者(Doer)- 专注于"实际去做"
2.2 设计哲学
Plan 智能体:谨慎优先
原则:宁可过度规划,不可盲目行动
策略:充分调研 → 多方验证 → 用户确认 → 形成计划
保障:严格的权限限制 + 结构化的工作流程
核心理念:
- 安全第一:禁止所有可能破坏代码的操作
- 充分理解:通过并行探索全面掌握代码库
- 用户参与:关键决策点必须获得用户批准
- 可追溯性:完整记录规划过程和决策依据
Build 智能体:效率优先
原则:在保证安全的前提下最大化执行效率
策略:直接执行 → 动态调整 → 必要时重新规划
保障:渐进式授权 + 实时权限检查
核心理念:
- 最小阻力:默认允许大部分操作,减少中断
- 灵活应变:根据实际情况动态调整策略
- 快速迭代:支持增量实施和即时反馈
- 容错恢复:提供撤销和回滚机制
2.3 适用场景
Plan 智能体适用场景
✅ 推荐使用:
- 新功能开发(需要设计方案)
- 架构重构(影响范围广)
- 技术选型(需要调研对比)
- 复杂 Bug 修复(需要根因分析)
- 跨模块集成(需要理解依赖关系)
❌ 不推荐使用:
- 简单的 typo 修复
- 单行代码修改
- 明确的配置更新
- 常规的依赖升级
Build 智能体适用场景
✅ 推荐使用:
- 已有明确计划的实施
- 简单的代码修改
- 日常维护任务
- 测试用例编写
- 文档更新
❌ 不推荐使用:
- 完全不熟悉的项目
- 涉及核心架构的变更
- 需要大量调研的任务
3. 架构设计对比
3.1 智能体配置
定义对比
// Plan Agent 配置
plan: {
name: "plan",
description: "Plan mode. Disallows all edit tools.",
permission: Permission.merge(
defaults,
Permission.fromConfig({
question: "allow",
plan_exit: "allow",
external_directory: {
[path.join(Global.Path.data, "plans", "*")]: "allow",
},
edit: {
"*": "deny", // ❌ 禁止所有编辑
[path.join(".opencode", "plans", "*.md")]: "allow", // ✅ 仅允许编辑计划文件
},
}),
user,
),
mode: "primary",
native: true,
}
// Build Agent 配置
build: {
name: "build",
description: "The default agent. Executes tools based on configured permissions.",
permission: Permission.merge(
defaults,
Permission.fromConfig({
question: "allow",
plan_enter: "allow", // ✅ 允许进入计划模式
}),
user,
),
mode: "primary",
native: true,
}
关键差异:
| 配置项 | Plan | Build | 说明 |
|---|---|---|---|
edit["*"] |
"deny" |
未设置(继承 defaults 的 "allow") |
Plan 禁止编辑,Build 允许 |
plan_exit |
"allow" |
"deny" |
只有 Plan 可以退出 |
plan_enter |
"deny" |
"allow" |
只有 Build 可以进入计划 |
question |
"allow" |
"allow" |
两者都可以提问 |
3.2 权限系统
权限范围对比
Plan Agent 权限矩阵:
┌──────────────┬────────┐
│ 工具类型 │ 权限 │
├──────────────┼────────┤
│ read │ ✅ allow │
│ grep/glob │ ✅ allow │
│ codesearch │ ✅ allow │
│ bash (readonly) │ ⚠️ ask │
│ edit │ ❌ deny │
│ write │ ❌ deny │
│ bash (write) | ❌ deny │
│ question │ ✅ allow │
│ plan_exit │ ✅ allow │
└──────────────┴────────┘
Build Agent 权限矩阵:
┌──────────────┬────────┐
│ 工具类型 │ 权限 │
├──────────────┼────────┤
│ read │ ✅ allow │
│ grep/glob │ ✅ allow │
│ codesearch │ ✅ allow │
│ bash │ ⚠️ ask/allow │
│ edit │ ✅ allow │
│ write │ ✅ allow │
│ question │ ✅ allow │
│ plan_enter │ ✅ allow │
└──────────────┴────────┘
权限评估示例
场景 1:编辑 src/component.tsx
// Plan Agent
evaluate("edit", "src/component.tsx", planRuleset)
→ { action: "deny" } // ❌ 被拒绝
// Build Agent
evaluate("edit", "src/component.tsx", buildRuleset)
→ { action: "allow" } // ✅ 允许
场景 2:编辑 .opencode/plans/xxx.md
// Plan Agent
evaluate("edit", ".opencode/plans/xxx.md", planRuleset)
→ { action: "allow" } // ✅ 特例允许
// Build Agent
evaluate("edit", ".opencode/plans/xxx.md", buildRuleset)
→ { action: "allow" } // ✅ 允许
场景 3:执行 npm test
// Plan Agent
evaluate("bash", "npm test", planRuleset)
→ { action: "ask" } // ⚠️ 需要询问(但通常会被阻止)
// Build Agent
evaluate("bash", "npm test", buildRuleset)
→ { action: "allow" } // ✅ 允许(或根据配置询问)
3.3 工作模式
模式分类
export const Mode = z.enum(["subagent", "primary", "all"])
| 模式 | Plan | Build | 说明 |
|---|---|---|---|
primary |
✅ | ✅ | 可直接与用户交互 |
subagent |
❌ | ❌ | 只能被其他智能体调用 |
all |
❌ | ❌ | 兼具两种角色 |
共同点:
- 都是
primary模式,可以直接接收用户输入 - 都是
native: true,系统内置智能体 - 都可以调用
subagent(explore、general)
差异点:
- Plan 更倾向于使用 subagents 进行并行探索
- Build 更倾向于直接执行工具调用
4. 工作流程对比
4.1 Plan 智能体工作流
五阶段结构化流程
┌─────────────────────────────────────────┐
│ Phase 1: Initial Understanding │
│ - 并行启动最多 3 个 explore agents │
│ - 阅读代码,理解需求 │
│ - 使用 question 工具澄清模糊点 │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Phase 2: Design │
│ - 启动 general agent(s) 设计方案 │
│ - 多视角审视(性能、可维护性等) │
│ - 产出详细实施方案 │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Phase 3: Review │
│ - 深度阅读关键文件 │
│ - 验证设计与需求的一致性 │
│ - 再次使用 question 确认疑问 │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Phase 4: Final Plan │
│ - 撰写最终计划到 .md 文件 │
│ - 包含文件路径、实施步骤、验证方法 │
│ - 保持简洁但足够详细 │
└──────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Phase 5: Call plan_exit │
│ - 调用 plan_exit 工具 │
│ - 用户确认是否切换到 build │
│ - 如果 Yes,创建新消息切换智能体 │
└─────────────────────────────────────────┘
关键特征:
- 强制性流程:必须按顺序执行各阶段
- 并行优化:Phase 1 支持并行探索
- 用户确认:Phase 5 必须获得用户批准
- 终止条件:只能以 question 或 plan_exit 结束回合
4.2 Build 智能体工作流
灵活执行流程
┌─────────────────────────────────────────┐
│ 接收任务 │
└──────────────┬──────────────────────────┘
│
┌──────┴──────┐
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 有计划文件? │ │ 无计划文件? │
└──────┬───────┘ └──────┬───────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 计划执行模式 │ │ 直接执行模式 │
│ - 读取计划 │ │ - 评估复杂度 │
│ - 按步骤实施 │ │ - 简单任务直接做│
│ - 验证结果 │ │ - 复杂任务建议规划│
└──────┬───────┘ └──────┬───────┘
│ │
└────────┬────────┘
│
▼
┌─────────────────────────────────────────┐
│ 执行工具调用 │
│ - Read/Edit/Write 文件 │
│ - Bash 执行命令 │
│ - Grep/Glob 搜索代码 │
│ - Task 委托子任务 │
└──────────────┬──────────────────────────┘
│
┌──────┴──────┐
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 成功完成 │ │ 遇到困难 │
│ - 报告结果 │ │ - 调用 │
│ - 等待新任务 │ │ plan_enter │
└──────────────┘ └──────┬───────┘
│
▼
┌──────────────┐
│ 返回 Plan │
│ 重新规划 │
└──────────────┘
关键特征:
- 分支流程:根据是否有计划文件选择不同路径
- 动态调整:执行过程中可以切换到 Plan 模式
- 增量实施:支持逐步完成任务
- 容错机制:失败时可以回滚或重新规划
4.3 流程差异分析
| 维度 | Plan | Build |
|---|---|---|
| 流程结构 | 严格五阶段 | 灵活分支流程 |
| 并行度 | 高(Phase 1 并行探索) | 中(按需并行) |
| 用户交互 | 高频(每个阶段都可能提问) | 低频(仅在权限请求时) |
| 确定性 | 高(必须完成所有阶段) | 中(可根据情况调整) |
| 可预测性 | 高(输出是计划文档) | 中(输出是代码变更) |
| 执行时间 | 较长(需要充分调研) | 较短(直接执行) |
5. 工具访问能力对比
5.1 可用工具集
Plan 智能体可用工具
const planTools = [
"read", // ✅ 读取文件
"grep", // ✅ 文本搜索
"glob", // ✅ 文件匹配
"codesearch", // ✅ 代码搜索
"list", // ✅ 列出目录
"bash", // ⚠️ 只读命令(需询问)
"webfetch", // ✅ 网页抓取
"websearch", // ✅ 网络搜索
"task", // ✅ 委托子任务
"question", // ✅ 向用户提问
"plan_exit", // ✅ 退出计划模式
// ❌ 以下工具被禁止
// "edit", // 禁止编辑
// "write", // 禁止写入
// "bash (write commands)" // 禁止写操作命令
]
Build 智能体可用工具
const buildTools = [
"read", // ✅ 读取文件
"grep", // ✅ 文本搜索
"glob", // ✅ 文件匹配
"codesearch", // ✅ 代码搜索
"list", // ✅ 列出目录
"bash", // ✅ 执行命令(可能需要询问)
"webfetch", // ✅ 网页抓取
"websearch", // ✅ 网络搜索
"task", // ✅ 委托子任务
"edit", // ✅ 编辑文件
"write", // ✅ 写入文件
"question", // ✅ 向用户提问
"plan_enter", // ✅ 进入计划模式
// 所有工具都可用,但部分需要权限确认
]
工具数量对比:
- Plan:~11 个工具(受限)
- Build:~13 个工具(完整)
5.2 权限约束
典型工具的权限差异
| 工具 | Plan | Build | 说明 |
|---|---|---|---|
read * |
✅ allow | ✅ allow | 两者都可读取 |
read *.env |
⚠️ ask | ⚠️ ask | 敏感文件都需要询问 |
edit * |
❌ deny | ✅ allow | Plan 禁止,Build 允许 |
edit .opencode/plans/*.md |
✅ allow | ✅ allow | Plan 的特例 |
bash git status |
⚠️ ask | ✅ allow | 只读命令 Build 更宽松 |
bash npm install |
❌ deny | ⚠️ ask | 写操作 Build 需要确认 |
question |
✅ allow | ✅ allow | 两者都可提问 |
5.3 使用策略
Plan 智能体工具使用策略
Phase 1(探索):
// 并行调用 explore agents
{
"tool_calls": [
{
"tool": "task",
"input": {
"agent": "explore",
"prompt": "Find authentication implementations"
}
},
{
"tool": "task",
"input": {
"agent": "explore",
"prompt": "Explore database schema"
}
}
]
}
Phase 2-4(设计和撰写):
// 委托 general agent 设计
{
"tool": "task",
"input": {
"agent": "general",
"prompt": "Design the authentication system"
}
}
// 读取关键文件验证
{
"tool": "read",
"input": {
"filePath": "src/auth/controller.ts"
}
}
// 撰写计划
{
"tool": "edit",
"input": {
"filePath": ".opencode/plans/xxx.md",
"edits": [...]
}
}
Phase 5(退出):
{
"tool": "plan_exit",
"input": {}
}
Build 智能体工具使用策略
计划执行模式:
// 读取计划
{
"tool": "read",
"input": {
"filePath": ".opencode/plans/xxx.md"
}
}
// 按计划实施
{
"tool": "edit",
"input": {
"filePath": "src/auth/controller.ts",
"edits": [...]
}
}
// 运行测试
{
"tool": "bash",
"input": {
"command": "npm test",
"description": "Verify changes"
}
}
直接执行模式:
// 直接修改
{
"tool": "edit",
"input": {
"filePath": "README.md",
"edits": [{
"oldText": "# Project",
"newText": "# My Project"
}]
}
}
6. 用户交互模式对比
6.1 交互频率
Plan 智能体
高频交互:
- Phase 1:澄清需求(平均 2-3 个问题)
- Phase 3:确认设计方案(平均 1-2 个问题)
- Phase 5:请求计划批准(1 次确认)
典型对话轮次:
User: 帮我添加用户认证
Plan: [探索代码库]
Plan: 请问您希望使用哪种认证方式?
1. JWT Token
2. Session-based
3. OAuth
User: JWT Token
Plan: [继续探索]
Plan: 是否需要支持第三方登录(Google/GitHub)?
User: 不需要
Plan: [设计方案]
Plan: [撰写计划]
Plan: [调用 plan_exit]
System: [显示确认对话框]
User: Yes
总交互次数:~5-8 次
Build 智能体
低频交互:
- 仅在权限请求时交互
- 简单任务可能零交互
- 复杂任务可能有 1-3 次权限确认
典型对话轮次:
User: 修改 README 标题
Build: [直接编辑]
Build: 完成
或
User: 安装新依赖
Build: [尝试执行 npm install]
System: [权限请求:允许执行 bash 命令?]
User: Always allow npm install
Build: [执行命令]
Build: 完成
总交互次数:~0-3 次
6.2 决策点
Plan 智能体决策点
| 阶段 | 决策内容 | 决策者 | 重要性 |
|---|---|---|---|
| Phase 1 | 需求澄清 | 用户 | 高 |
| Phase 2 | 设计方案 | Plan Agent + 用户 | 高 |
| Phase 3 | 方案确认 | 用户 | 高 |
| Phase 5 | 计划批准 | 用户 | 最高 |
特点:
- 多个决策点分散在各阶段
- 每个决策都影响最终结果
- 用户始终保持控制权
Build 智能体决策点
| 场景 | 决策内容 | 决策者 | 重要性 |
|---|---|---|---|
| 权限请求 | 是否允许工具执行 | 用户 | 中 |
| 遇到复杂任务 | 是否切换到 Plan | 用户 | 高 |
| 执行失败 | 如何恢复 | Build Agent | 中 |
特点:
- 决策点较少且集中在权限请求
- 大部分决策由智能体自主完成
- 用户可以随时中断并切换到 Plan
6.3 控制权转移
Plan → Build 转移
// packages/opencode/src/tool/plan.ts
async execute(_params, ctx) {
// 1. 用户确认
const answers = await Question.ask({...})
if (answers[0]?.[0] === "No") throw new Question.RejectedError()
// 2. 创建新的 User 消息
const userMsg: MessageV2.User = {
id: MessageID.ascending(),
sessionID: ctx.sessionID,
role: "user",
agent: "build", // ← 关键:切换到 build
model,
}
await Session.updateMessage(userMsg)
// 3. 注入提示信息
await Session.updatePart({
type: "text",
text: `The plan has been approved, you can now edit files. Execute the plan`,
synthetic: true, // ← 标记为系统生成
})
}
转移过程:
- 显式确认:用户必须明确同意
- 状态持久化:通过消息历史保存上下文
- 权限变更:Build 获得编辑权限
- 提示注入:通知 Build 可以开始执行
Build → Plan 转移(概念性)
虽然当前 plan_enter 工具被注释掉,但设计理念类似:
// 伪代码
async execute(_params, ctx) {
// 1. 用户确认
const answers = await Question.ask({
questions: [{
question: "Switch to plan mode for detailed planning?"
}]
})
// 2. 创建新的 User 消息
const userMsg: MessageV2.User = {
agent: "plan", // ← 切换到 plan
// ...
}
// 3. 注入提示信息
await Session.updatePart({
text: "Enter plan mode and begin planning",
synthetic: true,
})
}
7. 性能特征对比
7.1 Token 消耗
Plan 智能体 Token 分布
Phase 1 (Initial Understanding): ~30%
├─ Explore agents (3x): 15%
├─ Code reading: 10%
└─ Questions: 5%
Phase 2 (Design): ~25%
├─ General agent: 20%
└─ Context passing: 5%
Phase 3 (Review): ~15%
├─ File reading: 10%
└─ Questions: 5%
Phase 4 (Final Plan): ~20%
└─ Plan writing: 20%
Phase 5 (Exit): ~10%
└─ Confirmation: 10%
总计:100%
典型消耗:
- 小型任务:~5,000 tokens
- 中型任务:~15,000 tokens
- 大型任务:~30,000+ tokens
Build 智能体 Token 分布
Context understanding: ~10%
Tool execution: ~60%
├─ File operations: 30%
├─ Command output: 20%
└─ Search results: 10%
Error handling: ~15%
User interaction: ~15%
总计:100%
典型消耗:
- 简单任务:~2,000 tokens
- 中等任务:~8,000 tokens
- 复杂任务:~20,000+ tokens
对比分析
| 任务类型 | Plan Tokens | Build Tokens | 差异原因 |
|---|---|---|---|
| 简单修改 | 5,000 | 2,000 | Plan 过度规划 |
| 功能开发 | 15,000 | 10,000 | Plan 充分调研 |
| 架构重构 | 30,000 | 15,000 | Plan 深度分析 |
结论:
- Plan 智能体 Token 消耗通常更高(2-3 倍)
- 但对于复杂任务,Plan 的前期投入可以减少 Build 的试错成本
- 总体 ROI(投资回报率)取决于任务复杂度
7.2 执行时间
Plan 智能体时间分布
Phase 1: ~30-60s
├─ Parallel exploration: 20-40s
└─ Questions: 10-20s (用户响应时间)
Phase 2: ~20-40s
└─ Design generation: 20-40s
Phase 3: ~15-30s
├─ Review: 10-20s
└─ Questions: 5-10s
Phase 4: ~10-20s
└─ Plan writing: 10-20s
Phase 5: ~5-10s
└─ User confirmation: 5-10s
总计:~80-160s (不含用户思考时间)
Build 智能体时间分布
Context loading: ~2-5s
Tool execution: ~30-120s
├─ File I/O: 5-20s
├─ Command execution: 20-80s
└─ Verification: 5-20s
User interaction: ~0-30s (权限确认)
总计:~32-155s
对比分析
| 场景 | Plan 时间 | Build 时间 | 总时间 |
|---|---|---|---|
| 简单任务 | 80s | 32s | Plan: 80s, Build only: 32s |
| 复杂任务 | 160s | 120s | Plan+Build: 280s, Build only: 180s |
关键洞察:
- 对于简单任务,直接使用 Build 更快
- 对于复杂任务,Plan+Build 虽然总时间更长,但成功率更高
- Plan 的并行探索可以显著缩短 Phase 1 时间
7.3 资源利用率
CPU/内存使用
| 指标 | Plan | Build |
|---|---|---|
| CPU 峰值 | 中(并行探索时) | 高(命令执行时) |
| 内存占用 | 中(上下文较大) | 低-中 |
| I/O 密集 | 中(文件读取) | 高(文件读写 + 命令) |
| 网络请求 | 高(多次 LLM 调用) | 中 |
并发特性
Plan 智能体:
- 高并发:Phase 1 可同时运行 3 个 explore agents
- LLM 密集型:多次调用 LLM 进行分析和设计
- 批处理友好:可以批量读取文件
Build 智能体:
- 低并发:通常顺序执行工具
- I/O 密集型:频繁的文件读写和命令执行
- 实时性要求高:需要快速响应用户
8. 协作机制分析
8.1 状态传递
计划文件作为状态载体
# Implementation Plan
## Overview
Add JWT-based authentication system
## Files to Modify
- `src/auth/controller.ts`: Create authentication controller
- `src/middleware/auth.ts`: Add JWT verification middleware
- `src/config/auth.ts`: Add JWT configuration
## Implementation Steps
1. Install jsonwebtoken package
2. Create auth controller with login/register endpoints
3. Add JWT middleware to protect routes
4. Write unit tests
5. Update API documentation
## Verification
- Run: npm test
- Test login endpoint with Postman
- Verify JWT token generation and validation
传递过程:
Plan Agent 写入计划文件
↓
文件持久化到磁盘
↓
Build Agent 读取计划文件
↓
解析实施步骤
↓
按步骤执行
会话历史作为上下文
// 消息历史中包含完整的交互过程
[
{ role: "user", content: "Add authentication" },
{ role: "assistant", agent: "plan", content: "[Planning...]" },
{ role: "user", content: "[Approved plan]", agent: "build" }, // ← 关键转换点
{ role: "assistant", agent: "build", content: "[Executing...]" }
]
优势:
- 完整性:保留所有决策过程
- 可追溯:可以回溯到任何阶段
- 连续性:Build 可以理解 Plan 的思考过程
8.2 上下文共享
共享的上下文元素
| 元素 | Plan 贡献 | Build 使用 |
|---|---|---|
| 代码理解 | 探索结果、文件列表 | 避免重复探索 |
| 设计方案 | 架构图、技术方案 | 直接实施 |
| 用户意图 | 澄清后的需求 | 准确理解目标 |
| 约束条件 | 技术栈、性能要求 | 遵守约束 |
| 风险点 | 识别的潜在问题 | 重点关注 |
上下文丢失的风险
场景:Plan 发现了某个重要的依赖关系,但未在计划文件中明确说明
# Plan (不完整)
- Modify src/auth/controller.ts
后果:Build 可能遗漏必要的依赖更新
缓解措施:
- 计划模板:强制包含关键章节
- 审查机制:Phase 3 要求重新阅读关键文件
- 用户监督:用户可以要求补充细节
8.3 错误恢复
Plan 阶段的错误恢复
错误:探索结果不足以设计方案
↓
Plan Agent 启动更多 explore agents
↓
或向用户提问获取更多信息
↓
重新设计方案
Build 阶段的错误恢复
错误:编辑失败(文本不匹配)
↓
Build Agent 重新读取文件
↓
调整编辑策略
↓
重试或报告失败
跨智能体错误恢复
错误:Build 发现计划不可行
↓
Build 调用 plan_enter(如果可用)
↓
Plan 重新评估方案
↓
更新计划文件
↓
plan_exit 返回 Build
↓
继续执行
实际案例:
User: 添加用户认证
Plan: [设计方案使用 JWT]
Build: [尝试实施]
Build: 发现项目已有 auth 模块,冲突
Build: [调用 plan_enter]
Plan: [重新设计,扩展现有模块]
Build: [成功实施]
9. 实际应用案例分析
9.1 简单任务场景
任务:修复 README 中的拼写错误
仅使用 Build 智能体
User: Fix typo in README
Build: [Read README.md]
Build: [Edit: "recieve" → "receive"]
Build: Done
耗时:~10s
Token:~1,500
交互:0 次
使用 Plan + Build
User: Fix typo in README
Plan: [Read README.md]
Plan: [Identify typo]
Plan: [Write plan: "Fix 'recieve' to 'receive'"]
Plan: [Call plan_exit]
User: [Approve]
Build: [Read plan]
Build: [Edit README.md]
Build: Done
耗时:~60s
Token:~6,500
交互:1 次
结论:
- ❌ 不推荐使用 Plan 智能体
- ✅ 推荐直接使用 Build 智能体
- Plan 的开销远大于收益
9.2 复杂任务场景
任务:为现有项目添加完整的用户认证系统
仅使用 Build 智能体
User: Add authentication system
Build: [尝试直接实施]
Build: [发现需要选择认证方案]
Build: [猜测使用 JWT]
Build: [开始编码]
Build: [发现与现有代码冲突]
Build: [回滚]
Build: [重新尝试]
Build: [多次试错]
Build: [最终完成,但可能存在设计缺陷]
耗时:~180s(含多次试错)
Token:~25,000
交互:5-8 次(权限请求 + 错误处理)
成功率:~60%
使用 Plan + Build
User: Add authentication system
Plan: [Phase 1: Explore codebase]
├─ Explore 1: Find existing auth patterns
├─ Explore 2: Check database schema
└─ Explore 3: Review API structure
Plan: [Question: JWT or Session-based?]
User: JWT
Plan: [Phase 2: Design with general agent]
Plan: [Phase 3: Review design]
Plan: [Question: Support OAuth?]
User: No
Plan: [Phase 4: Write detailed plan]
Plan: [Phase 5: Call plan_exit]
User: [Approve]
Build: [Read plan]
Build: [Step 1: Install dependencies]
Build: [Step 2: Create auth controller]
Build: [Step 3: Add middleware]
Build: [Step 4: Write tests]
Build: [Step 5: Update docs]
Build: [Run tests - all pass]
Build: Done
耗时:~280s(Plan: 160s + Build: 120s)
Token:~35,000(Plan: 20,000 + Build: 15,000)
交互:3-4 次(Plan 阶段)
成功率:~95%
结论:
- ✅ 强烈推荐使用 Plan + Build
- 虽然总时间和 Token 更高,但成功率显著提升
- 减少了试错成本和返工风险
9.3 混合模式场景
任务:重构数据库访问层
迭代式协作
User: Refactor database layer
Plan: [Analyze current implementation]
Plan: [Design new architecture]
Plan: [Write plan]
Plan: [plan_exit]
User: [Approve]
Build: [Step 1: Create new base classes]
Build: [Step 2: Migrate User model]
Build: [发现设计问题:缺少事务支持]
Build: [调用 plan_enter]
Plan: [Review issue]
Plan: [Update plan: Add transaction support]
Plan: [plan_exit]
User: [Approve]
Build: [Continue from Step 3]
Build: [Add transaction wrapper]
Build: [Migrate remaining models]
Build: [Run tests]
Build: Done
优势:
- 灵活性:可以根据实际情况调整计划
- 质量控制:多次审查确保设计合理
- 风险控制:分阶段实施,降低风险
关键指标:
- 总耗时:~350s
- 总 Token:~45,000
- 交互次数:5-6 次
- 成功率:~98%
10. 设计权衡与最佳实践
10.1 安全性 vs 效率
权衡分析
| 维度 | 偏向安全 | 偏向效率 |
|---|---|---|
| 权限控制 | Plan 的严格限制 | Build 的宽松策略 |
| 用户确认 | 多次确认(Plan) | 最少确认(Build) |
| 执行速度 | 较慢(充分验证) | 较快(直接执行) |
| 错误率 | 低(预先规划) | 中(可能试错) |
最佳实践
推荐策略:
-
风险评估驱动:
高风险任务 → 使用 Plan + Build 低风险任务 → 直接使用 Build -
渐进式授权:
{ "permission": { "edit": "allow", // 允许编辑 "bash": { "npm test": "allow", // 信任的命令自动允许 "rm -rf": "deny", // 危险命令禁止 "*": "ask" // 其他命令询问 } } } -
会话级记忆:
- 用户对相同权限的选择应被记住
- 减少重复确认
10.2 自动化 vs 人工控制
权衡分析
| 场景 | 自动化程度 | 人工介入点 |
|---|---|---|
| Plan 阶段 | 低(需要用户确认) | 需求澄清、方案批准 |
| Build 阶段 | 高(自主执行) | 权限请求、异常处理 |
最佳实践
平衡策略:
-
关键决策人工控制:
- 计划批准(plan_exit)
- 高风险操作(删除文件、数据库迁移)
-
常规操作自动化:
- 文件编辑
- 测试运行
- 依赖安装
-
可配置的自动化级别:
{ "automation_level": "balanced", // conservative, balanced, aggressive "auto_approve": [ "edit *.ts", "bash npm test" ] }
10.3 灵活性 vs 规范性
权衡分析
| 维度 | 规范性强 | 灵活性强 |
|---|---|---|
| 工作流程 | Plan 的五阶段 | Build 的自由执行 |
| 输出格式 | 标准化的计划文档 | 自由的代码风格 |
| 适应性 | 低(固定流程) | 高(动态调整) |
最佳实践
混合策略:
-
核心流程规范化:
- Plan 必须遵循五阶段
- 计划文档必须有标准章节
-
执行过程灵活化:
- Build 可以根据实际情况调整顺序
- 允许中途切换到 Plan
-
可定制的模板:
# {{ task_name }} ## Overview {{ auto_generated }} ## Approach {{ ai_designed }} ## Files to Modify {{ list_files }} ## Implementation Steps {{ numbered_steps }} ## Verification {{ test_commands }}
11. 未来发展方向
11.1 智能化程度提升
自适应工作流
当前:固定的五阶段流程
未来:
// 根据任务复杂度动态调整
if (complexity < LOW) {
skip Phases 1-3
directly_write_plan()
} else if (complexity > HIGH) {
add Phase 2.5: Risk Assessment
increase explore_agents to 5
}
学习机制
当前:每次从头开始
未来:
- 从历史成功的计划中学习模式
- 自动识别常见任务类型
- 预生成常用任务的计划模板
11.2 协作机制优化
更紧密的集成
当前:通过计划文件传递状态
未来:
- 共享内存中的上下文
- 实时的双向通信
- 增强的 plan_enter 工具
多智能体协同
当前:Plan → Build 单向流转
未来:
Plan ⇄ Build ⇄ Review ⇄ Test
↑_______↓
Feedback Loop
- 引入 Review Agent 进行代码审查
- 引入 Test Agent 自动生成测试
- 形成闭环的质量保证流程
11.3 用户体验改进
可视化规划
当前:纯文本计划文档
未来:
- 图形化的架构图
- 交互式的流程图
- 实时的进度追踪
智能推荐
当前:用户手动选择是否使用 Plan
未来:
// 自动判断任务复杂度
if (estimate_complexity(task) > THRESHOLD) {
suggest: "This task seems complex. Would you like to use Plan mode?"
}
11.4 性能优化
Token 效率
当前:Plan 消耗较多 Token
未来:
- 压缩上下文传递
- 复用探索结果
- 增量更新计划
执行速度
当前:串行执行部分阶段
未来:
- 更多的并行化
- 缓存常用查询结果
- 预加载可能的依赖
12. 总结
12.1 主要发现
通过对 OpenCode Plan 和 Build 智能体的深入对比分析,我们得出以下结论:
-
职责分离的价值:
- Plan 专注于"思考",Build 专注于"行动"
- 清晰的边界提高了系统的可维护性和可扩展性
-
权限控制的必要性:
- Plan 的严格限制防止了意外破坏
- Build 的灵活授权提升了执行效率
-
协作机制的关键性:
- 计划文件作为状态载体确保了信息传递
- 双向切换能力提供了灵活性
-
权衡的艺术:
- 没有绝对的最优解,只有适合场景的选择
- 简单任务用 Build,复杂任务用 Plan+Build
12.2 实践建议
对于开发者:
-
任务分类:
- 建立任务复杂度评估标准
- 根据类型选择合适的智能体组合
-
配置优化:
- 根据项目特点定制权限规则
- 建立信任列表减少不必要的确认
-
流程规范:
- 制定计划文档的标准模板
- 建立代码审查和质量保证流程
对于系统设计者:
-
模块化设计:
- 保持智能体的独立性
- 提供清晰的接口规范
-
可扩展性:
- 支持自定义智能体
- 允许插件化工具
-
可观测性:
- 提供详细的执行日志
- 支持性能分析和优化
12.3 研究展望
未来的研究方向包括:
- 智能化决策:如何让系统自动选择最优的智能体组合
- 学习机制:如何从历史数据中持续改进
- 人机协作:如何更好地融合人类智慧和 AI 能力
- 形式化验证:如何确保计划的可执行性和正确性
12.4 结语
OpenCode 的 Plan-Build 双智能体架构代表了 AI 编程助手发展的一个重要方向:通过职责分离和协作机制,在保障安全性的同时提升效率。这种设计不仅在技术上具有创新性,在工程实践上也具有重要的指导意义。
随着 AI 技术的不断进步,我们可以期待看到更加智能、更加灵活、更加人性化的编程助手系统。而 Plan 和 Build 智能体的设计理念,将为这一进程提供宝贵的经验和启示。
更多推荐




所有评论(0)