前言¶
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。