oh-my-openagent 为 Claude Opus 5 定制 Sisyphus Prompt Family:从模型探测、工厂路由到真实 opencode 线上验证的完整实践
2026/9/18 17:27:58 网站建设 项目流程

oh-my-openagent 为 Claude Opus 5 定制 Sisyphus Prompt Family:从模型探测、工厂路由到真实 opencode 线上验证的完整实践

【免费下载链接】oh-my-openagentOmO: Just type "mass ulw" keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent

在 oh-my-openagent 项目中,Sisyphus Agent 的提示词是按模型家族(prompt family)逐一烘焙的,新模型接入后必须保证"请求发出时携带的是该模型专属的提示词",同时不能破坏既有家族的回归稳定性。本文以仓库内 opencode-qa.md 记录的 QA 证据为主线,完整还原claude-opus-5Sisyphus prompt family 是如何通过"模型探测(detector)→ 工厂路由(factory routing)→ 提示词本体(prompt body)"三层改动接入,并在真实 opencode v1.18.4 + 隔离 XDG 沙箱 + 本地假 LLM 服务器环境下完成端到端验证的。读完本文,你将掌握:Opus 5 提示词家族的设计差异点(五个自省计数器、委托门控、语调偏好提醒)、resolveSisyphusPromptFamilyisClaudeOpus5Model的源码级路由原理,以及一套可复用的"假 LLM 捕获 + 隔离沙箱 + 回归断言"验证方法论。

背景:为什么 Opus 5 需要单独的 Prompt Family

Sisyphus 是 oh-my-openagent 中的主执行 Agent,其完整系统提示词并非一份通用文本,而是按模型家族分别烘焙的。在 sisyphus-agent-factory.ts 中,SisyphusPromptFamily联合类型枚举了当前支持的全部家族:kimi-k3kimi-k2-7kimi-k2-6gpt-5-5gpt-5-4claude-fable-5claude-opus-5claude-opus-4-8claude-opus-4-7glm-5-2grok-4,以及兜底的fallback

resolveSisyphusPromptFamily(model)是唯一的家族判定入口,按优先级依次匹配:

if (isClaudeOpus5Model(model)) return "claude-opus-5"; if (isClaudeOpus48Model(model)) return "claude-opus-4-8"; if (isClaudeOpus47Model(model)) return "claude-opus-4-7";

接入 Opus 5 之前,anthropic/claude-opus-5会一路落到fallback——即被当作"未知模型"处理,使用通用 fallback 提示词。QA 证据 routing-before-after.txt 清楚地记录了这一路由变化:

BEFORE (dev tip 346a054bc): anthropic/claude-opus-5 -> fallback AFTER (worktree): anthropic/claude-opus-5 -> claude-opus-5 anthropic/claude-opus-4-8 -> claude-opus-4-8

路由从fallback提升为专属家族claude-opus-5,而最近的既有家族claude-opus-4-8路由保持不变——这正是本次改动要同时保证的"正向接入 + 回归稳定"两个目标。

第一层改动:模型探测(Detector)

家族判定的底层依赖模型探测函数。在 model-family-detectors.ts 中,isClaudeOpus5Model的实现与 4.7/4.8 家族保持同一套归一化策略:

export function isClaudeOpus5Model(model: string): boolean { const modelName = extractModelName(model).toLowerCase().replaceAll(".", "-") return modelName.includes("claude-opus-5") }

其中extractModelName会先剥离provider/前缀(如anthropic/openai/只取斜杠后段),再将点号归一化为连字符。这套归一化使以下模型 ID 写法全部命中:

输入模型 ID归一化结果是否命中claude-opus-5
anthropic/claude-opus-5claude-opus-5
claude-opus-5-0claude-opus-5-0✅(includes 子串匹配)
claude-opus-5.0claude-opus-5-0
claude-opus-5[1m](带[1m]后缀)同上
claude-opus-4-8claude-opus-4-8❌(不包含claude-opus-5

另外,同文件中isClaudeOpus47OrLaterModel使用正则CLAUDE_OPUS_VERSION_RE = /claude-opus-(\d+)(?:-(\d+))?/解析主次版本,覆盖 4.7+ 的请求面判断(如 adaptive thinking),QA 文档中提到的 "major-only 4.7+ coverage" 即指这一逻辑。这些 detector 边界用例由 model-family-detectors.test.ts 与omo-opencode侧的 sisyphus-agent-factory.test.ts 以单元测试形式钉死。

第二层改动:工厂路由(Factory Routing)

探测命中后,createSisyphusAgent(model, ...)依据resolveSisyphusPromptFamily的结果进入对应分支(见 sisyphus-agent-factory.ts):

case "claude-opus-5": return buildClaudeSisyphusAgentConfig( MODE, model, buildClaudeOpus5SisyphusPrompt(model, agents, tools, skills, categories, useTaskSystem), );

buildClaudeSisyphusAgentConfig是 Claude 家族共用的 AgentConfig 构造器,负责把提示词本体、工具分类结果(categorizeTools)与动态收集的可用 Agent / Skill / Category 清单组装成 opencode SDK 的AgentConfig。注意resolveSisyphusPromptFamily同时也是运行时提示词协调器(runtime prompt reconciler)的"单一事实来源":当 TUI 运行时模型解析出的家族与配置时不一致时,会据此重建烘焙好的提示词体(对应 issue #5297/#5316 的处理)。这也解释了为什么 QA 文档强调"detector + factory routing + prompt body"三件套缺一不可——单改提示词文本而不改路由,运行时仍可能落到错误的家族。

第三层改动:Opus 5 提示词本体(Prompt Body)

提示词本体实现在 claude-opus-5.ts,其设计原则在文件头注释中明确写出:以 Opus 4.8 的骨架为基础,仅针对 Anthropic 官方 "Prompting Claude Opus 5" 指南中记录的行为差异进行调优。核心差异如下:

维度Opus 4.8 处理Opus 5 处理
范围控制抑制"过度询问"(over-asking)SCOPE CONSTRAINT 取代:Opus 5 不偏保守而是过度执行,会擅自扩展范围、添加未请求步骤,需显式校准"deliver what was asked, at the scope intended"
委托策略DEFAULT BIAS: DELEGATE(默认倾向委托)DELEGATION CAP 反转DELEGATE BY DOMAIN AND SIZE, NOT BY DEFAULT,仅按专业领域或真正独立的大块工作委托,并显式禁止用子 Agent 复核自己的工作
验证行为需要推动验证OVER-VERIFICATION 移除:Opus 5 自带自验证,证据门(evidence gates)保留但只跑一次,删除重复验证脚手架
叙述节奏默认输出偏长一句话开场(ONE-SENTENCE OPENER)、工具调用间保持安静、结论优先收尾,外加结尾<tone_preference>提醒(Anthropic 对长系统提示词的推荐做法)
字面遵循4.7/4.8 继承保留:LITERAL FOLLOWING计数器,要求对 "every / all / for each" 全部生效

线上真实捕获的<self_knowledge>段落(见 captured-system-prompt-excerpt.txt)完整呈现了五个计数器——LITERAL FOLLOWINGSCOPE EXPANSIONOVER-DELEGATIONOVER-VERIFICATIONLONG RESPONSES,外加DELEGATE BY DOMAIN AND SIZE, NOT BY DEFAULTEVIDENCE, NOT ASSERTIONONE-SENTENCE OPENER等关键指令。提示词还沿用了 Claude 家族共享的 XML 标签锚点、Phase 0/1/2A/2B/2C/3 心智模型,以及来自 dynamic-agent-prompt-builder.ts 的动态构建助手(buildAgentIdentitySectionbuildDelegationTablebuildOracleSection等),确保与其他 Claude 变体内容同步。

端到端 QA:真实 opencode + 隔离沙箱 + 假 LLM

改动完成后,QA 证据的核心主张是"驱动了真实生产路径":真实 opencode v1.18.4 从本分支源码加载插件(file://.../packages/omo-opencode/src/index.ts),解析会话模型,运行时提示词协调器选定家族,最终在真实出站 LLM 请求中观察到烘焙好的提示词——全程没有真实 API 调用。

测试环境构建(qa-run.sh)

完整脚本见 qa-run.sh,关键环节如下:

  1. 隔离 XDG 沙箱:用mktemp -d创建临时根目录,分别导出HOMEXDG_DATA_HOMEXDG_CONFIG_HOMEXDG_CACHE_HOMEXDG_STATE_HOME,并设置OPENCODE_DISABLE_AUTOUPDATE=1OPENCODE_DISABLE_MODELS_FETCH=1,保证测试期间 opencode 不联网、不落真实用户数据。
  2. 假 LLM 服务器capture-fake-llm.mjs(与 qa-run.sh 同目录)在随机端口启动本地 OpenAI Responses 兼容服务,捕获每一个请求体到/tmp/opus5-qa/captures/
  3. 沙箱内 opencode 配置:写入$XDG_CONFIG_HOME/opencode/opencode.jsonc,内容如下:
{ "plugin": ["file://${WORKTREE}/packages/omo-opencode/src/index.ts"], "model": "openai/claude-opus-5", "provider": { "openai": { "options": { "apiKey": "fake-key", "baseURL": "http://127.0.0.1:${PORT}/v1", "timeout": 30000 }, "models": { "claude-opus-5": { "tool_call": true, "limit": { "context": 200000, "output": 8192 } }, "claude-opus-4-8": { "tool_call": true, "limit": { "context": 200000, "output": 8192 } } } } }, "permission": { "bash": "allow" } }

同时写入oh-my-openagent.json将 explore/librarian 子 Agent 的模型指到openai/claude-opus-5,使整个提示词动态组装链路走 Opus 5 家族。

探测命令

对两个模型各跑一次真实opencode run(非交互模式、JSON 输出、120 秒超时):

opencode run </dev/null "OPUS5PROBE reply with anything" --agent sisyphus -m "openai/claude-opus-5" --format json opencode run </dev/null "OPUS48PROBE reply with anything" --agent sisyphus -m "openai/claude-opus-4-8" --format json

观察结果(qa-run-output.txt)

假 LLM 捕获到的真实请求体(qa-run-output.txt)中:

  • call-02-claude-opus-5.json:98,960 字节,系统提示词 38,417 字符,携带You are **Claude Opus 5**、五个自省计数器、DELEGATE BY DOMAIN AND SIZE, NOT BY DEFAULT、结尾<tone_preference>提醒,且不包含You are **Claude Opus 4.8**
  • call-04-claude-opus-4-8.json:97,824 字节,携带You are **Claude Opus 4.8**DEFAULT BIAS: DELEGATE行,且不包含Opus 5 身份标识。

脚本用grep -qF对捕获文件执行了 8 条 wire 断言(正例与反例各半)+ 1 条隔离断言:

断言期望结果
Opus 5 请求携带 Opus 5 身份1PASS
Opus 5 请求携带委托门控指令1PASS
Opus 5 请求携带结尾 tone_preference1PASS
Opus 5 请求携带 over-verification 计数器1PASS
Opus 5 请求不携带 4.8 身份0PASS
Opus 4.8 请求仍携带 4.8 身份1PASS
Opus 4.8 请求不携带 Opus 5 身份0PASS
Opus 4.8 请求保留 delegate-bias 行1PASS
真实 opencode DB 未被触碰21932 → 21932PASS

最终输出QA_RESULT=PASS。值得注意的是call-01call-03是 gpt-5.4-nano 的小请求(约 2.5KB),说明 Sisyphus 动态提示词组装链路中还有低阶模型参与(如规划/摘要环节),但它们不携带 Opus 家族身份,不影响本次断言。

隔离性证明与全量门禁

QA 文档强调了两类额外证据:

  1. 隔离证明:真实~/.local/share/opencode/opencode.db会话数在每次运行前后恒为 21932(real-db-session-count-before/after),证明沙箱未污染真实用户数据;每次运行结束后沙箱目录被整体删除(sandbox-removed=...)。
  2. 全量门禁bun test全仓 12,146 个用例全部通过(bun-test-full-suite-tail.txt),bun run typecheck(tsgo,全包)退出码 0。注意 QA 文档使用的 opencode 版本为 v1.18.4、dev tip 为346a054bc,这些版本前提应作为复现时的对照基准。

为什么这套 QA 是充分的

QA 文档的 "Why it is enough" 一节给出了判定依据:本次改动本质是"提示词家族新增"(detector + factory routing + prompt body),而 QA 恰好覆盖了这三者协同的完整生产路径——真实 opencode 从本分支源码启动插件 → 解析会话模型 → 运行时提示词协调器选定家族 → 在真实出站请求中观察到烘焙后的提示词,同时对新家族(正向)和最近既有家族(回归)双向验证。Detector 边界用例(claude-opus-5claude-opus-5-0claude-opus-5.0[1m]后缀、4.7+ 主版本覆盖)则由model-core的单元测试钉死,构成"单元级钉死 + 端到端 wire 级实证"的双层防线。

安全与留档边界(What was omitted)

QA 全程不涉及任何真实密钥:沙箱内使用fake-key假 API Key 指向 localhost 假 LLM,未复制任何认证文件;完整的 98KB 级捕获文件仅保留在/tmp(如/tmp/opus5-qa/captures/),证据目录内只留存三样东西——测试脚本qa-run.sh、运行日志qa-run-output.txt,以及承载关键信息的提示词摘录captured-system-prompt-excerpt.txt。如果你希望在本仓库复现此验证,只需在本地检出对应分支,参照 qa-run.sh 中的沙箱与环境变量设置搭建隔离环境,切勿在真实 HOME 或带真实凭据的环境下执行。

小结

Claude Opus 5 的 Sisyphus 接入是一次教科书式的"提示词家族落地":isClaudeOpus5Model完成归一化探测(model-family-detectors.ts),resolveSisyphusPromptFamily完成路由提升(sisyphus-agent-factory.ts),buildClaudeOpus5SisyphusPrompt完成行为差异调优(claude-opus-5.ts),最后由 qa-run.sh 用"假 LLM 捕获 + 隔离沙箱 + 双向 wire 断言"证明改动在真实 opencode 上按预期工作、且不破坏既有 4.8 家族。这套"探测归一化 → 单一事实源路由 → 家族化提示词 → 端到端实证"的链路,同样适用于后续任何新模型家族的接入与回归验证。

【免费下载链接】oh-my-openagentOmO: Just type "mass ulw" keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询