EffortKeeper:按模型記住 DSH 推理檔位

前言

DeepSeek Harness(DSH)在支持推理檔位的模型上,通常通過原生模型選擇器和推理檔位菜單切換 Provider、模型與 effort。多模型並行調試時,常見情況是:爲 Claude Sonnet 5.5 選了 High,切到 Gemini 再切回來,界面卻回到 Default,請求頭也不再帶上之前的 reasoningEffort。這不是「忘記聊天」,而是 DSH 按當前會話投影展示檔位,切換模型時不會自動帶回「該模型上次你手動選過的檔位」。

EffortKeeper(倉庫名 dsh-effort-keeper,中文名「推理檔位記憶器」)是 ChimeSky 維護的 DSH Host 插件,分類屬於記憶類能力。它按 Provider ID + Model ID 持久化每個模型最後一次由用戶明確選擇的推理檔位,並在切回該模型時用與手動選擇相同的一次原生 selectModel 調用恢復。你仍用 DSH 自帶選擇器,不需要額外頁面或保存按鈕。

這是什麼

EffortKeeper 是獨立安裝的 DSH Host 插件,無額外 npm 依賴,只使用 Node 標準庫與 DSH 已提供的服務。當前版本爲 1.0.5,許可證 MIT;README 記載已在 DSH Desktop 0.2.1-rc.3(Windows)上驗證。package.json 中聲明的 DSH 引擎範圍爲 >=0.2.1-rc.3 <0.3.0-0。

插件不保存 API Key、聊天內容、工具參數或任何會話正文。

核心功能

下面介紹 README 中列出的實現要點。

按模型獨立記憶

存儲鍵爲 provider::model,顯示名稱不參與身份判斷。同一 Provider 下不同 Model ID 各自一條偏好。

切換模型時自動恢復

插件在 Host 側裝飾 ctx.sessionController.selectModel:用戶點擊模型或檔位時原生調用照常發出;若是模型切換且目標模型有已保存檔位,則在同一請求對象裏改寫 reasoningEffort 後再執行原生實現,避免界面先錯檔再被第二次調用糾正。

手動改檔自動保存

同一模型下的檔位變化在原生調用成功後再寫入存儲。

持久化位置

使用 DSH 官方 ctx.storageDomain,文件位於 $DSH_HOME/storages/effort_keeper.json。寫入由 storage domain 串行化並原子落盤,不覆蓋其他插件或 Provider 配置。

Default 與能力變化

用戶顯式選擇 Default 時存爲 null,恢復時會刪除 reasoningEffort,不會誤套舊檔位。恢復前通過 ctx.llm.resolveModelInfo 檢查 reasoning.efforts;當前模型未聲明的已保存檔位會被忽略(偏好仍保留),不會發送未聲明檔位。

新會話與已有會話

新建空白會話會按當前模型恢復偏好;已有對話的會話在插件加載時不會被追溯修改。

禁用與卸載

禁用或卸載時會恢復被裝飾的原方法,不修改 DSH 核心文件。MVP 無獨立設置頁,關閉自動記憶可直接禁用插件。

爲什麼是 Host-only

DSH 模型目錄在 Client 側,但最終選擇經 Host 的 sessionController.selectModel 提交。EffortKeeper 不另做選擇器、不操作 DOM,只包裝這一入口。README 也說明:DSH 原生 selectModel 會更新 agent-default-model 的 profile 默認,這是 DSH 既有行爲;EffortKeeper 的記憶在獨立按模型存儲中,不會把某一檔位批量套給所有模型。

存儲結構示例

effort_keeper.json 中 global.preferences 示意如下(鍵爲示例,以你本機爲準):

{
  "unit": {
    "name": "effort_keeper",
    "version": 1
  },
  "global": {
    "version": 1,
    "preferences": {
      "openrouter-custom::anthropic/claude-sonnet-5.5": "high",
      "openrouter-custom::anthropic/claude-opus-5.5": "max",
      "openrouter-custom::anthropic/claude-sonnet-5.5-old": null
    }
  },
  "tables": {}
}

字符串表示明確檔位 ID;null 表示用戶選了 Default;鍵不存在則從未保存,恢復時保持 DSH 原生行爲。

安裝與啓用

DSH 生態強調「一切皆插件」;社區目錄頁在 skillhub.cn,與 DeepSeek / 幻方無官方從屬關係。安裝前建議瀏覽 GitHub 倉庫 源碼與 MIT 許可證——插件以當前 DSH 進程權限運行。

準備

  1. 完整退出 DSH Desktop(含托盤)。
  2. 確認 DSH 版本在 >=0.2.1-rc.3 <0.3.0-0。
  3. 可使用倉庫 vendor/dsh-effort-keeper-1.0.5.tgz,或在倉庫根目錄重新打包:
pnpm pack --pack-destination vendor

用 DSH CLI 安裝

將 <DSH 安裝目錄> 換成本機路徑,<repo> 換成本地克隆或解壓後的插件目錄路徑:

$dsh = '<DSH 安裝目錄>\resources\runtime\cli\bin\dsh.cmd'
& $dsh plugin --profile desktop add `
  '<repo>\vendor\dsh-effort-keeper-1.0.5.tgz'

也可從 GitHub 指定 tag 安裝(README 註明純 JS 包、無需構建,釘在 v1.0.5):

& $dsh plugin --profile desktop add `
  'github:ChimeSky/dsh-effort-keeper#v1.0.5'

倉庫還提供 tools/install.ps1:

pwsh -File .\tools\install.ps1

插件管理器

在 DSH「插件」頁選擇「添加插件 → 安裝第三方插件」,指向本目錄或 tarball。安裝後確認列表中出現 dsh-effort-keeper。

啓動與驗證

重新打開 DSH 後,可在頁面 DevTools Console 執行(需同源 Cookie):

fetch('/effort-keeper/status').then(r => r.json()).then(console.log)

預期包含 "ok": true、"persistence": "storage-domain" 等字段;該只讀接口僅返回模型路由鍵與檔位 ID,不返回憑據或聊天內容。也可用 tools/verify-install.ps1 或 node .\tools\verify-install.mjs --profile desktop 校驗安裝副本。

典型用法

不需要新菜單或配置項,按 README 可復現的流程如下:

  1. 選擇 Sonnet 5.5,把推理檔位改爲 High。
  2. 切到 Gemini 4 Argon,把檔位改爲 Medium。
  3. 切回 Sonnet 5.5。
  4. 原生選擇器應顯示 High,後續請求使用 reasoningEffort: "high"。

從未設置過檔位的模型保持 DSH 原生默認,不會錯誤恢復。

適用場景與注意

適合誰: 經常在 DSH 裏切換多個支持 reasoningEffort 的模型,且希望每個模型記住「上次手動選的檔位」的開發者。

邊界與限制(來自 README「已知限制」):

  • 恢復檔位仍會觸發 DSH 原生「last-used」默認更新,與全局默認機制並存。
  • 依賴 Host 公開方法裝飾;DSH 大版本若改變 selectModel 簽名,需重新驗證。
  • 已有內容的會話不會被安裝/重啓追溯改檔。
  • 只使用 adapter 公告的 reasoning.efforts,不支持任意自定義檔位名。

禁用: 在插件頁關閉 EffortKeeper,或在 profile 的 cordis.patch.yml 中對 effort-keeper 設置 disabled: true。

卸載:

$dsh = '<DSH 安裝目錄>\resources\runtime\cli\bin\dsh.cmd'
& $dsh plugin --profile desktop remove dsh-effort-keeper

確認 dsh.profile.bundles 中不再包含該包後重啓。$DSH_HOME/storages/effort_keeper.json 可保留以便重裝後繼續用;不需要時可自行刪除(確認無其他插件佔用該 domain)。

結尾

EffortKeeper 用 Host 側一次原生選擇調用,把「按模型的推理檔位偏好」從會話切換裏拆出來並持久化,解決多模型來回切時檔位被 Default 覆蓋的問題。進一步瞭解可查看社區目錄 dsh-effort-keeper 與源碼倉庫 ChimeSky/dsh-effort-keeper。

羽毛球分组比赛记分
小程序二维码

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

小夜