前言¶
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 進程權限運行。
準備¶
- 完整退出 DSH Desktop(含托盤)。
- 確認 DSH 版本在
>=0.2.1-rc.3 <0.3.0-0。 - 可使用倉庫
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 可復現的流程如下:
- 選擇 Sonnet 5.5,把推理檔位改爲 High。
- 切到 Gemini 4 Argon,把檔位改爲 Medium。
- 切回 Sonnet 5.5。
- 原生選擇器應顯示 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。