模型 : claude-opus-4-6 (anthropic/claude-opus-4-6) 生成日期 : 2026-02-18
如果说 OpenCode 展示了"如何构建一个可扩展的 AI 编程助手引擎",那么 oh-my-opencode 则展示了"如何在引擎之上构建一个强大的 AI 编程团队"。作为 OpenCode 生态中最复杂的第三方 Plugin,oh-my-opencode 的设计理念值得每一个 AI 应用开发者学习。
18.2.1 "Prompt Engineering as Code"——将 Prompt 工程化
在很多 AI 应用中,Prompt 是作为"配置"或"字符串常量"存在的——写在配置文件或数据库里,由人工手动调整。oh-my-opencode 采取了完全不同的方法:把 Prompt 当作代码来工程化管理 。
oh-my-opencode 的核心创新之一是 dynamic-agent-prompt-builder.ts——一个根据运行时状态动态生成 Prompt 的系统:
Copy // 不是硬编码的字符串,而是根据可用 Agent 动态构建
export function buildToolSelectionTable (
agents : AvailableAgent [] ,
tools : AvailableTool [] ,
) : string {
const rows : string [] = [ " ### Tool & Agent Selection: " , "" ]
// 根据实际可用的工具生成表格
if ( tools . length > 0 ) {
rows . push ( ` - ${ formatToolsForPrompt ( tools ) } — **FREE** — Not Complex ` )
}
// 按成本排序 Agent,低成本优先
const sorted = [ ... agents ] . sort (
( a , b ) => costOrder [ a . metadata . cost ] - costOrder [ b . metadata . cost ]
)
for ( const agent of sorted ) {
rows . push ( ` - \` ${ agent . name } \` — ** ${ agent . metadata . cost } ** — ${ agent . description } ` )
}
return rows . join ( " \n " )
} 这意味着:
Prompt 会随着配置变化而变化 :如果用户禁用了某个 Agent,Prompt 中就不会出现对它的引用
Prompt 与数据保持同步 :不会出现 Prompt 提到了不存在的工具的情况
Prompt 可以被测试 :构建函数是纯函数,可以用单元测试验证输出
oh-my-opencode 中每个 Agent 的 Prompt 都是独立的 TypeScript 文件(如 agents/sisyphus.ts、agents/oracle.ts),而非 .txt 文本。这让 Prompt 可以:
将 Prompt 视为代码而非配置 ——这意味着 Prompt 应该享有代码的所有工程实践:版本控制、Code Review、单元测试、动态组装。对于复杂的 AI 应用,静态的 Prompt 字符串是不够的。
18.2.2 "Hook 即策略"——53 个 Hook 的设计哲学
oh-my-opencode 注册了多达 53 个 Hook(第 15.5 节),覆盖了从消息处理到错误恢复的方方面面。但重要的不是数量,而是背后的设计哲学 。
传统的策略模式(Strategy Pattern)通常用 Class 和接口实现。oh-my-opencode 用 Hook 实现了一种更灵活的策略模式:
每个 Hook 都是一个独立的策略 ,可以通过配置启用或禁用:
53 个 Hook 并非随意添加的——它们形成了清晰的分类体系:
edit-error-recovery、session-recovery、json-error-recovery
preemptive-compaction、context-window-monitor
stop-continuation-guard、unstable-agent-babysitter
directory-agents-injector、rules-injector
tool-output-truncator、thinking-block-validator
todo-continuation-enforcer、task-reminder
不要试图让 AI 一次就做对——而是构建多层防护网 。oh-my-opencode 的 53 个 Hook 构成了一个"防御纵深"(Defense in Depth)体系:
预防层 :stop-continuation-guard 防止 AI 无限循环
检测层 :context-window-monitor 监控上下文窗口使用率
修复层 :edit-error-recovery 自动修复编辑失败
兜底层 :session-recovery 在会话崩溃时尝试恢复
每一层都假设上一层可能失败。这种防御式设计 是构建可靠 AI 系统的关键。
18.2.3 "Agent 人格化"——从希腊神话到工程实践
oh-my-opencode 为 Agent 赋予了希腊神话人物的名字:Sisyphus(西西弗斯)、Oracle(神谕)、Prometheus(普罗米修斯)、Hephaestus(赫菲斯托斯)、Atlas(阿特拉斯)、Metis(墨提斯)、Momus(摩墨斯)……
这不仅仅是命名偏好——它反映了一种深思熟虑的Agent 设计方法论 。
每个神话人物的故事都与 Agent 的功能产生联想:
这种命名策略的好处:
1. 可记忆性
比较两种日志:
vs.
神话名字让多 Agent 协作的日志像是在阅读一个"故事",大大提升了可理解性。
2. 心智模型锚定
当你知道 Sisyphus 是"永远推石头的人",你就能直觉地理解它是一个不会放弃、反复尝试 的 Agent。这种心智模型帮助开发者快速理解 Agent 的行为特征。
3. Prompt 工程的锚点
Agent 的名字可以直接用在 Prompt 中,强化其角色认同:
为 Agent 赋予有意义的"人格" 。这不是多余的修饰——它帮助开发者理解 Agent 的设计意图,帮助 LLM 更好地"进入角色",也让整个系统的行为更加可预测。好的 Agent 名字应该:
18.2.4 "防御式编程"——错误恢复与兜底策略
AI 系统与传统软件的根本区别在于:LLM 的输出是不确定的 。传统软件出 Bug 是因为代码有错,而 AI 系统"出 Bug"可能仅仅因为模型这次"想法不同"。
oh-my-opencode 深刻理解这一点,构建了一套完整的防御式编程 体系。
session-recovery Hook 是典型示例。它不是简单地 try-catch 然后报错,而是分类错误并对症下药 :
每种错误类型有专门的恢复策略:
thinking_disabled_violation
assistant_prefill_unsupported
将 assistant 消息转换为 user 消息
oh-my-opencode 的容错不是单点的,而是多层嵌套 的:
构建 AI 系统时,应该遵循以下防御式编程原则 :
错误分类优于通用 catch :不同类型的错误需要不同的恢复策略
主动预防优于被动修复 :preemptive-compaction 在溢出前就行动
优雅降级优于完全失败 :即使某个 Agent 失败,系统应该能继续运行
所有外部交互都可能失败 :LLM API 调用、工具执行、文件操作——每一步都应该有容错处理
记录恢复过程 :错误恢复的日志对于调试和改进至关重要
oh-my-opencode 的这四个设计启示——Prompt 工程化、Hook 策略体系、Agent 人格化、防御式编程——不仅适用于 OpenCode Plugin 开发,更是所有 AI Agent 系统的通用设计智慧。在下一节中,我们将把这些洞察与 OpenCode 核心的设计决策整合,提炼出构建 AI 编程助手的最佳实践。