dsh-opencode-model-sync:让 DSH 模型列表跟随 OpenCode Go 线上目录更新

前言

DeepSeek Harness(DSH)内置的推理提供商目录是在构建时打进去的快照。OpenCode 在端点上已经上线新模型(例如 README 中提到的 kimi-k3.1-pro)时,只要 DSH 还没有发新版,模型选择器里往往仍然选不到该模型。常见变通是等 DSH 发版、改 app.asar,或自己写协议适配——成本高,也容易和官方默认配置打架。

下面介绍社区插件 dsh-opencode-model-sync(维护者 Viyangle,分类:模型推理)。它从 opencode.ai 拉取 live OpenCode Go 模型目录,写入 DSH 的 llm-pi-ai 设置段,使新模型在同步之后即可出现在选择器里,而不必等待 DSH 重新构建。插件当前版本为 0.2.0(见仓库 package.json),许可证 MIT。

这是什么

一句话:把 DSH 模型选择器与 OpenCode Go 线上模型目录对齐——新模型在同步后出现,而不是等新 DSH 发行版。

DSH 仍自带构建期快照;本插件不替换整套提供商体系,只维护它声明的三条 provider 路由,其余提供商与凭据不动。目录变更时若与当前设置一致,则不会重复写入(幂等)。

核心功能

与内置快照的差异

方面 DSH 默认 本插件
模型来源 构建期快照 GET 配置的 modelsUrl(默认 https://opencode.ai/zen/go/v1/models)
新模型可见时机 新 DSH 构建 启动同步、周期刷新或手动 sync 之后
实现方式 无 无需 DSH 重编译、无需 patch app.asar、无需自写协议层

写入的三条路由

插件按 wire protocol 分组,在 llm-pi-ai 的 providers 下维护三条路由(默认前缀 opencode-go,可在配置里改 routePrefix):

路由 id DSH 协议 目录中的端点
opencode-go-chat openai-completions https://opencode.ai/inference/go/openai/v1
opencode-go-anthropic anthropic-messages https://opencode.ai/inference/go/anthropic/v1
opencode-go-responses openai-responses https://opencode.ai/inference/go/openai/v1

每条路由携带从目录翻译来的模型列表、上下文/输出上限、图像能力、推理档位等。DSH 无法对接的协议(README 写明当前为 Gemini 的 generate-content)会被跳过。

内置的 bundled opencode-go 路由默认不修改,避免单一路由无法同时表达多协议时的会话头与兼容性问题;同步出来的路由负责「发现新模型」。若要去掉重复项,可配置 retireBundledRoute: true(见下文注意)。

同步时机与 Agent 工具

  • 启动后:syncOnStart 默认为 true,DSH 启动数秒后执行一次同步。
  • 周期:默认 intervalMinutes: 360;设为 0 关闭定时刷新。
  • 手动:注册工具 opencode_model_sync,可在智能体侧调用。

凭据与安全

需要 OpenCode API Key:默认读环境变量 OPENCODE_API_KEY,或通过 DSH credentials 中同名项解析。README 明确:插件不会把 key 的值写入日志、工具输出或 settings。

环境与前置条件

条件 说明
DSH Desktop / 含 llm-pi-ai 的运行时 README 写明在 DSH Desktop 44.7.0(@deepseek-ai/dsh-desktop@0.2.1-rc.5)上构建与测试
OpenCode API Key 见上
默认 profile 中的 llm-pi-ai 需存在 bundled 的 opencode-go 路由行

Node 引擎要求:>=20.3(package.json)。

安装与启用

发行包由 npm pack 产出,附在 GitHub Releases,文件名为 dsh-opencode-model-sync-<version>.tgz。请从 latest release 下载,不要凭仓库名自行拼接未在文档出现的 CLI 安装命令。

通过 Plugin Manager 安装 bundle

  1. 从最新 Release 下载 .tgz。
  2. 用支持 Plugin Manager 的智能体或 DSH 插件 UI,对下载文件的绝对路径(或解压后的目录)执行 bundle 安装。

文档给出的调用形式如下:

install_bundle target: /absolute/path/to/dsh-opencode-model-sync-0.2.0.tgz

UI 侧同样接受本地包路径;具体入口以你当前的 DSH 版本为准。

  1. 按提示启用 bundle。若当前环境支持 HMR,会立即生效;否则重启 DSH。

从本地目录链接开发版

若已有插件源码目录(非本文要求的 git clone 步骤,仅当你本地已有 checkout):

install_bundle target: /absolute/path/to/dsh-opencode-model-sync

链接目录会被就地使用,改代码后需等待下次 recomposition 或重启 DSH。

典型用法

在界面选模型

在模型选择器中使用 OpenCode Go · Chat Completions、OpenCode Go · Messages 或 OpenCode Go · Responses 下的条目。目录里新增的模型会在下一次同步之后出现。

手动同步(Agent 工具)

opencode_model_sync action=status
opencode_model_sync action=sync
opencode_model_sync action=sync dryRun=true
opencode_model_sync action=remove
  • status:最近一次尝试/成功、错误、各生成路由上的 live 模型数量,以及与 DSH bundled 目录的对比。
  • sync:立即拉目录;仅变更的路由会写 settings。
  • sync dryRun=true:预演不写盘。
  • remove:从 settings 删除当前前缀下的三条生成路由。

配置说明

配置写在 Cordis patch 里该 bundle 行的 config,字段均可选。默认值如下(与 README 一致):

- id: opencode-model-sync
  name: dsh-opencode-model-sync
  config:
    enabled: true
    syncOnStart: true
    intervalMinutes: 360
    modelsUrl: https://opencode.ai/zen/go/v1/models
    apiKeyEnv: OPENCODE_API_KEY
    routePrefix: opencode-go
    displayNamePrefix: OpenCode Go
    sessionId: 00000000-0000-7000-8000-000000000000
    retiredModels: drop
    retireBundledRoute: false
    excludeModels: []
    timeoutMs: 20000

常用字段含义摘要:

  • enabled:总开关;关闭时不注册工具、不同步。
  • intervalMinutes:自动刷新间隔(分钟);0 关闭周期任务。
  • sessionId:生成路由所需的 x-opencode-session 头;所有走这些路由的对话共享该值。
  • retiredModels:drop 跟随 live 目录移除已下线模型;keep 则保留仍挂在路由上的旧模型 id。
  • excludeModels:永不同步的模型 id 列表。
  • routePrefix:变更前缀会新增一组路由,旧前缀需用 action=remove 清理;安装后宜保持稳定。

可选:退役 bundled opencode-go

retireBundledRoute: true 时,下次 sync 会尝试删除 bundled 的 opencode-go provider,并把 agent-default-model 迁到能 serve 同一模型的生成路由上。约束(README 原文):

  1. 仅当 profile 仍为未改动的默认 opencode-go: {} 时才删除;已自定义则保留并告警。
  2. 若默认模型不在 live 目录中,退役中止,避免指向不存在路由。
  3. 从 llm-pi-ai 的 providers 中移除 opencode-go。

该操作单向:之后把选项改回 false 不会自动恢复 bundled 路由;需手动加回 opencode-go: {}。会话里曾 pinned 在旧 provider 下的模型,退役后可能报 UNKNOWN_MODEL,README 说明不会做会话级迁移。

工作原理(简述)

经过上面的配置与安装,插件在运行期大致执行:

  1. 通过 ctx.credentials 解析 API key(可回落到 Host 进程环境)。
  2. 带 Bearer token 请求 modelsUrl。
  3. 按协议翻译 type: chat 记录(窗口、输出上限、图像、reasoningEfforts 等)。
  4. 按协议分组,加上 x-opencode-session 与 Chat Completions 所需的 thinkingFormat: deepseek 等兼容项。
  5. 与当前 llm-pi-ai provider 比较,有变才 ctx.settings.update。
  6. 网络错误、HTTP 429、5xx 会重试一次(README 截断处仍包含此行为)。

适用场景与注意

适合谁:日常通过 OpenCode Go 推理、希望 DSH 模型列表跟线上目录走、又不想等 DSH 发版或改 asar 的开发者。

权限与安全:插件在 当前 DSH 进程权限 下运行,会读写 llm-pi-ai 中与上述三条路由相关的 settings,并访问配置的目录 URL。安装前应阅读 GitHub 仓库 源码与 MIT 许可证,确认凭据与网络策略符合你的环境。

生态说明:DSH 强调「一切皆插件」;SkillHub 目录页 为社区收录站点,与 DeepSeek / 幻方无官方从属关系,本文不以「官方应用商店」口吻描述。

重复模型:在 retireBundledRoute: false 时,快照里已有的模型可能在 bundled 与生成路由各出现一次,属 README 说明的预期行为。

结尾

dsh-opencode-model-sync 用线上 OpenCode Go 目录填补 DSH 构建期快照的滞后:启动同步、定时刷新和 opencode_model_sync 工具三种方式更新模型列表,且只动三条自管的 provider 路由。需要进一步了解安装包与变更记录,见目录页与 GitHub:

  • 目录页:https://www.skillhub.cn/plugins/Viyangle/dsh-opencode-model-sync
  • GitHub:https://github.com/Viyangle/dsh-opencode-model-sync
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜