← 返回列表
未验证
@royenheart/dsh-plugin-opencode-omo
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/15 · 已提供中文文档
deepseek harness opencode + omo(oh-my-openagent)预设
综合分
37.6
GitHub 分
37.6
用户评分
—
★ Stars
3
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add royenheart/dsh-plugin-opencode-omo该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/19(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-sandbox@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-settings-general@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-llm用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
@royenheart/dsh-plugin-opencode-omo
dsh
一个 DeepSeek Harness 插件,为 web profile 添加 opencode-omo agent preset(模式)。该模式复刻了 opencode + omo 插件(oh-my-openagent)的行为,且仅作用于该模式——其他 preset(standard/…)保持默认的 dsh 循环、沙箱化文件系统,且不启用 omo hooks。
该模式提供的内容
- opencode + omo 系统提示词 —— 真实的 opencode default.txt 人格(语气、风格、主动性、约定、代码风格、任务指引)+ omo 的 Sisyphus 编排者身份,声明为完整系统提示词:该模式下 dsh harness 身份与运行时上下文快照被抑制。循环 shim 还会额外前置 opencode 的实时环境块(确切的模型 id、工作目录、工作区根目录、git、平台、日期,每一步都会重新计算)。
- composer 中的 omo 角色选择器 —— 位于 dsh 现有的 conversation.input.left 工具行槽位(在 access/plan 芯片之后):sisyphus、hephaestus(Deep Agent)、prometheus(Plan Builder)、atlas(Plan Executor)、sisyphus-junior、athena/athena-junior/council-member、metis、momus、oracle、librarian、explore、multimodal-looker。选择角色会替换会话的完整系统提示词,并应用该角色配置的模型。
- dsh 设置面板中的全局“Role Settings”(settings.section):在居中的“Primary model”标签下,为每个角色提供主模型下拉框(跟随当前 / 固定);一个 dsh 风格的圆形“+”按钮会在角色框下方打开回退模型列表(可重复添加,取消/关闭则不添加任何内容),持久化在 opencode-omo-roles 设置中。请求失败时,循环 shim 会先沿该角色的回退链推进,然后才运行 harness 重试策略。
- opencode 工具链(完整) —— 持久化 bash、read/write/edit/read_image、apply_patch、glob/grep、todo_write、skill、web_fetch/web_search、lsp、exit_plan_mode(plan)、ask_user_question。tool-surface.mjs 用 opencode 的 tool/.txt 文本覆盖模型可见的描述/参数,并将 read/edit/write/web_search 垫片为 opencode 的参数名(web_search.query → dsh queries)。
- omo task() 接口 —— task-shim.mjs 注册 omo 风格的 task(category/subagent_type/load_skills/run_in_background/task_id) 调用,将其映射到 dsh 命名 subagent + 通用委托。
- omo 多角色子代理 — oracle(只读顾问)、librarian(外部文档/代码搜索)、explore(代码库 grep)、metis(预规划)、momus(计划审查者)、multimodal-looker(媒体),外加通用的 subagent/subagent_fork + workflow/ralph。
- omo 上下文注入 — AGENTS.md/CLAUDE.md 向上查找 + skills/ + omo 的 rules-injector(.omo/rules、.cursor/rules、.github/instructions、copilot-instructions.md)。
- omo 钩子 — comment-checker(在写入/编辑时拒绝 AI 垃圾评论)、hashline(读取标记 N#HH|content + hashline_edit 过期引用防护)。
- 按模式执行后端 — 本地文件系统(dsh-fs-local)+ 持久 PTY shell,与其他模式的沙箱化 fs/shell 隔离。
- 原生接缝循环垫片 — 没有 dsh 侧驱动接缝。driver.mjs 是一个普通的预设插件,使用已提供的接缝:动态的 ctx.systemPrompt.section({ complete: true }) 在每次组装时重新计算 opencode 的环境块和选定的 omo 角色提示;system-prompt/assemble 应用 opencode 的模型工具门控;agent/inbox/claimed、agent/pre-step、agent/request 和 agent/request-error 提供 ultrawork 检测、maxSteps、角色模型路由和回退重试。其他预设从构造上不受影响。
布局
cordis.patch.yml # bundle patch: self host row
install.py # idempotent install/uninstall (incl. user preset root)
src/ # host + client plugin halves (role registry, settings, picker UI)
lib/ # built host/client bundles (npm run build)
scripts/build.sh # typecheck + tsdown build
presets/opencode-omo/
agent.cordis.yml # the composition (tools, roles, hooks, LSP)
preset.yml # display metadata
persona.md # opencode default.txt + omo Sisyphus persona
roles/.md # subagent personas (also main-role prompts)
roles/prompts/.md # primary-role complete prompts (hephaestus/prometheus/atlas/…)
skills/ # omo shared skills
driver.mjs # native-seam loop shim (prompt/route/fallback/maxSteps/ultrawork)
rules.mjs # rules-injector
comment-checker.mjs # comment-checker hook
apply-patch.mjs # apply_patch tool
hashline.mjs # omo hashline read-tagging + hashline_edit
安装
lib/ 在本地生成,不提交到仓库。install.py 总是先构建仓库自身的工具链(当工具链缺失时执行 npm install,然后执行 npm run build),并且仅在 npm 本身缺失时才报告错误:
python3 install.py install --profile web # install (idempotent)
python3 install.py uninstall --profile web # remove
install.py 将包以符号链接方式放入 ~/.dsh/profiles//node_modules/,编辑该 profile 的 package.json(添加/移除依赖项及 bundle 条目),并通过 dsh 的原生用户预设根目录,将预设作为真实目录发布到 $DSH_HOME/.agent-presets/opencode-omo 下(其中的条目以符号链接指向该包,因此更新保持实时生效):
手动替代方案——该包是一个 dsh bundle:它声明了 dsh.bundle.patch 并附带该预设。dsh plugin 会从已安装的包自动协调 dsh.profile.bundles:
dsh plugin --profile web add link:/path/to/dsh-plugin-opencode-omo
该预设仍需发布到其用户根目录(bundle patch 无法创建 $DSH_HOME/.agent-presets 条目):
mkdir -p "$DSH_HOME/.agent-presets/opencode-omo"
for f in /path/to/dsh-plugin-opencode-omo/presets/opencode-omo/; do
ln -s "$f" "$DSH_HOME/.agent-presets/opencode-omo/"
done
重启 dsh,然后从模式选择器中选择 opencode-omo。
可选的 LSP 服务器。 该预设为 lsp 工具预配置了 typescript-language-server。install.py 会检查 PATH,并在其缺失时发出警告;随后该预设会自动禁用其 lsp-stdio 行,以便该模式仍能挂载(LSP 查询会优雅失败,而不是阻塞整个预设)。安装它以启用 LSP:
npm install -g typescript-language-server typescript
然后重启 dsh。
web_fetch 提供程序。 该预设启用了 dsh 原生的 web_fetch 工具(fetch: true)。官方 0.1.2 已在基础 bundle 中注册了 @deepseek-ai/dsh-web-fetch-http,因此本插件不会插入第二个 fetch 行(那会抛出 WEB_DUPLICATE_PROVIDER)。web_search 继续使用现有的 DeepSeek 搜索提供程序(DEEPSEEK_API_KEY)。其他预设保持 fetch: false,因此它们的工具面保持不变。
所需的 dsh 侧改动
本版本不附带任何 dsh 补丁。 官方 0.1.2-alpha.2 没有 PreStepDecision.assistantPrefill;该插件不再携带 patches/0001-agent-pre-step-assistant-prefill.patch,该补丁为:
maxSteps 仍会触发。上限文本是 opencode 逐字照搬的 MAX_STEPS_PROMPT,在触及上限的那一步作为系统提示词段落注入。这是 0.1.2 支持的路径(ctx.systemPrompt.section),而非静默丢弃。
移除 assistantPrefill 补丁后的行为差异
这些差异是有意为之的,在 discussion #2407(或等效方案)在上游落地之前,不会与原生 opencode 一致:
| 层面 | opencode / 打过补丁的 harness | 本插件在原生 0.1.2 上 |
|---|---|---|
| MAX_STEPS_PROMPT 的角色 | 在请求末尾以 assistant 角色续写 | 该步骤的系统提示词前缀 |
| 会话记录 / 统计 / 压缩 | 仅请求级(头部),不是会话消息 | 同样不是会话消息(系统段落会被重新组装) |
| 模型停止/收尾的严格程度 | 针对助手尾部进行调优 | 可能对系统提醒的处理更弱或更强 |
| Token 放置位置 | 该请求上额外的助手 token | 该请求上额外的系统 token |
| 可重建请求 | 记录在 request/header 上 | 从实时提示组装中重建 |
该插件不再扫描已安装的 @deepseek-ai/dsh-agent-loop 以查找残留的 assistantPrefill 标记,也不再向浏览器提供 compat.warnings。原版 0.1.2 是唯一受支持的路径;带有旧接缝的本地测试框架只是使用相同的系统提示部分。
对提供方可见的 format/toolChoice 仍是一个未修补的提案;omo 的常规路径不使用它。
其他所有内容都运行在未经修改的 dsh 接缝上:预设通过 $DSH_HOME/.agent-presets 发布,编辑器选择器占用现有的 conversation.input.left 槽位。
基准实验(等价性验证)
运行器和复现说明位于 tests/benches/;报告写入 docs/exps/。科学方法论(配对设计、McNemar/bootstrap/TOST、A/A 噪声下限、轨迹对齐、缓存和延迟协议)记录在 docs/exps/2026-08-16-scientific-bench-methodology.md 中。设计要点:
- 运行一个隔离端口的 dsh(opencode-omo 模式,隔离的 $DSH_HOME)以及本机安装的 opencode + oh-my-openagent(隔离的 XDG_CONFIG_HOME)。
- 两者都使用 deepseek-official/deepseek-v4-pro(dpsk v4 pro);API 密钥来自 DEEPSEEK_API_KEY 环境变量。脚本不硬编码任何机器路径或密钥。
- 分层基准:L1 HumanEval、L2 MBPP、L3 SWE-bench-verified-mini(抽样),比较 pass@1、CoT/推理暴露、工具调用链(read/edit/write/bash/test/subagents)以及最终补丁/答案。
- 性能:bench_metrics.mjs 在两侧规范化 token 使用量(包括 cacheRead)和工具时间戳;eval_perf.mjs / eval_swe_perf.mjs 离线生成缓存命中率、TTFT、步骤时长和每个工具的耗时(见报告 §5)。
- MBPP 修复:MBPP 行没有 entry_point;脚本从第一个 assert fn(...) 或参考 def fn 推断函数名。旧实现硬编码了 Function name: undefined,这是 MBPP 行为差异的根本原因(见报告 §0 和 §6.4)。
- 原始基准数据下载到 tests/benches/.data/,并且不纳入版本控制;fetch-benches.sh 复现下载,setup-homes.sh 复现两个隔离的主目录。
最新结果(dpsk v4 pro;L1 30×3,修正后的 L2 5×2,旧版 L3 样本)
| 级别 | dsh pass@1 | opencode+omo pass@1 | 逐项一致率 |
|---|---|---|---|
| HumanEval(30 个任务 × 3 次重复) | 1.00 | 1.00 | 1.00 |
| MBPP(修正后的 entry_point,5 个任务 × 2 次重复) | 1.00 | 1.00 | 1.00 |
| SWE-bench-verified-mini 样本(sphinx-doc__sphinx-10323) | 相同补丁 | 相同补丁 | 字节完全一致的 git diff |
完整报告:docs/exps/2026-08-15-opencode-omo-equivalence-bench.md;原始记录位于 tests/benches/.runs/ 下。
对齐状态(对照 reference/opencode + reference/oh-my-openagent 审计)
- 已对齐:opencode 默认 persona(完整系统提示词 + 实时环境块,其 provider/model 现在遵循与实际请求相同的逐步路由——会话实时模型选择或角色 primary/fallback——因此提示词与请求不会分裂;工作区根目录现在派生为 git 根目录);opencode 工具族 + gpt apply_patch/edit-write 工具门控在模型可见 schema 和执行(tools/pre-execute deny 镜像)上均强制执行;opencode maxSteps + 逐字 MAX_STEPS_PROMPT;逐字 opencode plan.txt / plan-mode.txt,带动态 ${planInfo} 以及 plan→build 的 BUILD_SWITCH 提醒;omo 角色目录/显示名称;sisyphus/hephaestus/atlas/sisyphus-junior + 专家子代理;comment-checker/hashline/rules-injector 钩子;生成的 Sisyphus 路由部分;提取的 omo Sisyphus 模型族模板(GPT-5.5/GPT-5.4/claude-opus-4-7/claude-opus-4-8/claude-fable-5/gemini/kimi-k3/kimi-k2-7/kimi-k2-6/glm-5-2,以及针对未知模型族的动态 Sisyphus fallback)加上 hephaestus GPT 变体、全部 8 个 atlas 变体,以及专家模型变体(oracle/metis/momus);omo 默认的按角色 PRIMARY 模型解析(provider 作用域有序)以及从 primary 之后开始的 fallback 链;omo 角色采样默认值(sisyphus/hephaestus GPT effort medium,atlas temperature 0.1);omo 风格的可重试错误门控,在 fallback 推进之前生效;角色设置中的 reasoning-effort 选择器;ultrawork 关键词覆盖;/start-work、/remove-ai-slops、/refactor、/stop-continuation、/handoff、/hyperplan、/team-mode 命令;composer 角色选择器 + 全局按角色模型/fallback 设置;omo 技能以 user-dsh 发布,以便第三方 skills-manager 可以管理它们。omo rules-injector 文本现在被合并进完整系统提示词(driver.mjs + rules.mjs),而不是被 suppressRuntimeContext() 丢弃;已批准的计划持久化在 .opencode/plans/-.md;专家子代理 persona 现在加载提取的参考提示词文件(oracle/librarian/explore/metis/momus/multimodal-looker)。
- MCP:独立插件 dsh-plugin-mcp-support 从其 bundle-row 配置或持久化的 mcp-support 设置命名空间挂载原生 @deepseek-ai/dsh-mcp-client 服务器。
- 结构化输出:独立插件 dsh-plugin-structured-output 在原生接缝上提供 opencode 风格的 /json-schema + StructuredOutput 验证(没有 dsh 侧格式字段)。其可见性通过设置 → 结构化输出工具(Structured output)按预设选择启用;默认不启用任何模式。
- 部分实现:提取的家族模板保留了由 dsh 原生数据填充的动态部分,而非 omo 的构建器输出;结构化输出由工具强制执行,而非 tool_choice: required;钩子是正则/简化移植;AGENTS.md 注入是 dsh 原生的;子子代理继承会话模型,因为 dsh 子头部/描述符不携带子代理角色 ID(主角色采样默认值确实会被应用)。
- 本仓库中没有 dsh 侧的补丁。 maxSteps 在原生 0.1.2 上使用系统提示词部分(参见上文“放弃 assistantPrefill 补丁后的行为差距”)。format/toolChoice 仍是一个提案;独立的结构化输出插件覆盖了常见路径。
剩余差距
1. maxSteps 角色(已接受,无本地补丁):在原生 0.1.2 上,MAX_STEPS_PROMPT 是一个系统提示词部分,而非助手角色的请求尾部。文本和触发条件相同;模型对该角色的处理可能与 opencode 不同。已在上游跟踪为 讨论 #2407。
2. dsh 侧(提案,中等):GenerateOptions.format / toolChoice。omo 的常规路径不使用它们;独立的结构化输出插件覆盖了常见路径。
3. 子子代理的按角色采样无法可靠地解析角色 ID(dsh 子头部/描述符不携带它);主角色采样默认值确实会被应用,且子代理继承会话模型。
4. 计划文件:dsh 本身不持久化它们;插件在 exit_plan_mode 批准后写入 .opencode/plans/*。一等公民的计划文件接缝仍是一个可选的改进。
5. 团队模式 TUI、comment-checker CLI 和 hashline diff 增强器仍属于非 LLM/编辑体验方面的差异。同作者(royenheart)的其他插件
扫码进群