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
羽毛球分组比赛记分
小程序二维码

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

小夜