Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

章节: 第9章 — OpenCode的独特贡献 书名: Claude Code VS OpenCode: Architecture, Design and The Road Ahead 模型: openai/gpt-5.4 Token 用量: ~2,850 tokens 生成日期: 2026-04-01

9.5 计划模式

OpenCode 的 plan mode(计划模式)看起来很朴素,但它实际上体现了一个非常深刻的 agent 设计理念:规划和执行不应该只是 prompt 里的“语气差别”,而应该是运行时层面的不同模式。相关代码主要在 packages/opencode/src/tool/plan.tspackages/opencode/src/agent/agent.ts 中。OpenCode 并没有把“先规划再执行”当成一句建议,而是把它做成了独立 agent、独立权限集和独立切换流程。

agent.ts 中,内置的 plan agent 和默认的 build agent 被明确分开定义。plan agent 的描述非常直接:Plan mode. Disallows all edit tools. 也就是“计划模式,禁止所有编辑类工具”。继续看权限配置,会发现它对 edit 做了广泛 deny,只为计划文件本身保留了非常窄的允许路径。这一点很关键:计划模式并不是“建议模型尽量不要改文件”,而是“从能力层面限制它不能随便改文件”。

这里可以引入一个稍偏理论的词:capability restriction,即“能力约束”。在系统设计里,一个进程能做什么,不只由它的目标决定,更由它被授予什么能力决定。如果一个 agent 仍然拥有写文件能力,那么“请先规划、不要动手”这种要求就只是软约束;模型在某些情境下仍然可能越界。而 OpenCode 的做法是通过权限系统硬性收窄能力集,让计划阶段真正接近 read-only 模式。这里的 read-only 可以理解为“只读模式”:可以查看、搜索、分析、写计划文档,但不能随意修改业务文件。

这是一种非常值得强调的工程思想。很多 agent 系统把行为控制寄托在 prompt 上,希望模型“听话”。但在真正重要的工作流中,单靠文字约束是不够稳的。能靠权限系统表达的东西,就不该只靠 prompt 暗示。OpenCode 的 plan mode 正是在把这一原则贯彻到底。

tool/plan.ts 展示了计划模式如何退出。PlanExitTool 会在计划完成后询问用户:是否切换到 build agent 并开始执行。若用户批准,系统会创建一条 synthetic user message,把当前 session 的 agent 切换到 build,并告诉它“计划已经批准,现在可以编辑文件并执行计划”。这种设计很优雅,原因有两点。第一,它让“规划阶段”和“执行阶段”在会话历史中显式分离。第二,它形成了一个正式的 handoff,即从分析转向实施的明确交接点。

这个 handoff 的价值其实很大。coding agent 常见的问题之一,是 planning 和 implementation 很容易混在一起:系统一边探索代码,一边顺手改一点;改一点之后又继续推演;最后用户很难知道,到底哪些是结论、哪些是试探、哪些已经对代码产生影响。OpenCode 的计划模式则人为插入了一个检查点:先形成计划,再确认,再执行。它把“行动泄漏”压到了更低。

这种模式特别适合高风险任务,例如大规模重构、迁移、未知根因的复杂 bug、架构调整、多文件联动修改等。在这些任务中,过早动手往往会制造更多噪音。一个只读的 planning agent 可以先做 repo 探索、依赖映射、备选方案比较和实施顺序设计,避免系统在理解不充分时就开始 patch。

和 Claude Code 相比,这一点很有代表性。Claude Code 当然也能进行 planning,但 OpenCode 的不同之处在于:它把 planning 做成了硬边界模式,而不是仅仅依赖模型行为。Oh-My-OpenCode 在此基础上进一步发展出更丰富的 orchestration,但 plan/build 这种基础相位划分,本身就来自 OpenCode。

从更一般的 agent 设计角度看,计划模式还揭示了一个重要原则:不同认知阶段,不应该默认拥有相同的行动权限。研究、规划、执行、审查、总结,本质上是不同工作。若这些阶段都共享同一套工具权限,系统实现上会更简单,但控制上会更脆弱。OpenCode 通过一个很朴素的 plan agent 告诉我们:哪怕是最小可用的 agent 平台,也值得把不同阶段拆成不同能力配置。

这背后其实也映射了成熟工程师的工作方式。真正经验丰富的开发者,很少在问题尚未澄清时大面积动手。更常见的顺序是:先调查,再设计,再实施,再回顾。OpenCode 把这种人类工程流程编码进了 agent runtime。本质上,它是在把“好的工程习惯”变成“可执行的系统约束”。

因此,本节的结论非常明确:如果你真的重视 planning,就不要只在 prompt 里说“先想后做”。应该像 OpenCode 一样,为 planning 提供独立模式、独立权限、独立输出物和明确退出路径。计划模式不算炫目的功能,但它也许是 OpenCode 在 agent 行为治理上最干净、最值得借鉴的设计之一。