前言¶
在 DeepSeek Harness(DSH)里给模型调推理强度时,档位不是界面「画」出来的,而是 Host 侧 LLM 适配器根据 profile 里的 reasoningEfforts 解析出的模型能力。手写或新增的模型若没在配置里声明这一字段,解析结果往往是 reasoning: false:模型目录里没有档位,官方菜单连「推理等级」一行都不会出现;即便客户端强行塞档位,dsh-llm 也会在 resolveCallWithInfo() 里以 UNSUPPORTED_REASONING_EFFORT 拒绝请求。
社区里 dsh-codex-effort-slider 这类滑条控件,能否滑到某一档,同样取决于模型是否在配置里具备对应档位。下面介绍维护者 junjundesk 的 Host 插件 dsh-default-reasoning-efforts:对适配器配置中所有未声明 reasoningEfforts 的模型,自动写入 high / xhigh / max 三档,走 configEditor 正常校验与原子写路径,并刻意避开 HMR 嵌套事务导致的静默失败。
这是什么¶
dsh-default-reasoning-efforts 是面向 DeepSeek Harness 的 Host 插件(分类:工作流)。仓库:junjundesk/dsh-default-reasoning-efforts;社区目录页:SkillHub 条目。
它解决的是「配置缺档 → 适配器不认 → UI 与请求链路都不成立」这一端到端问题:把档位写进 provider 的模型声明,让 dsh-llm-pi-ai 的 resolveModelReasoning() → getSupportedThinkingLevels() → reasoningInfo() 整条链路能认出模型具备推理档位。插件零运行时依赖、无构建步骤,补齐逻辑幂等;与 effort 滑条类插件配合时,本插件负责把缺的档位补上,滑条负责在已有档位上操作。
为什么必须改配置¶
能力从配置到界面的路径在 README 里写得很清楚:
profile 配置 reasoningEfforts
→ dsh-llm-pi-ai: resolveModelReasoning() → pi-ai thinkingLevelMap
→ getSupportedThinkingLevels() → reasoningInfo() → ctx.llm.resolveModelInfo()
→ 模型目录(浏览器)→ 官方菜单「推理等级」那一行 / 滑条刻度
未写 reasoningEfforts 的模型,尤其是手写声明、不在 pi-ai 内置目录里的条目,没有可继承的能力,后果有两层:目录无档、菜单不渲染;调用侧也会被 UNSUPPORTED_REASONING_EFFORT 拦下。因此唯一可靠做法是把档位写进 provider 配置,由适配器识别。
核心功能¶
幂等补齐流程¶
插件在 apply() 中做一次可重入的配置补齐:
- 等待目标 entry(默认
@deepseek-ai/dsh-llm-pi-ai)出现在configEditor中,退避重试约 30 秒; - 读取有效配置,在
providers.<route>.models[]里找出reasoningEfforts未声明的模型; - 通过
ctx.configEditor.edit()写回 profile patch(校验 → 原子写 → 失败回滚,YAML 注释保留); - 调用
ctx.emit('llm/adapters-updated'),已连接的浏览器会立即重拉模型目录,无需刷新页面。
没有任何模型需要补时,不写一个字节,也不触发重载循环;档位已等于目标三档的模型会跳过,第二次运行是彻底的 no-op。
HMR 事务外写入¶
热装即可生效,无需重启宿主。写入被刻意放在 HMR 事务之外:configEditor.edit() 内部使用 hmr.runExclusive(),若已在 HMR 事务内会拒绝嵌套(HMR transactions cannot be nested)。插件热装时 apply() 常落在事务内,且 AsyncLocalStorage 上下文会沿 setTimeout 传递,单纯「延后写」无法逃脱。实现上参照官方 hmr.watchConfig,用 AsyncLocalStorage.exit() 把写入放到事务外;写入被拒时退避重试约 37 秒,不静默吞错。
默认规则¶
| 模型状态 | 行为 |
|---|---|
未写 reasoningEfforts |
补上 { high: high, xhigh: xhigh, max: max } |
reasoningEfforts: false |
不修改(显式表示无推理) |
| 写了其它档位表 | 不修改 |
| 已恰好为三档 | 不修改(幂等) |
只改 providers.*.models[].reasoningEfforts 一个字段;补的是声明,端点是否接受 xhigh/max 由上游 API 决定。
可选配置与自检¶
配置文件路径:$DSH_HOME/dsh-default-reasoning-efforts/config.json(不存在则使用内置默认值,修改后下次检查生效)。
{
"enabled": true,
"levels": { "high": "high", "xhigh": "xhigh", "max": "max" },
"targets": ["@deepseek-ai/dsh-llm-pi-ai"],
"providers": [],
"includeDeclared": false,
"dryRun": false
}
常用键含义:enabled 为 false 时插件加载但不补齐;levels 的键限于 pi-ai 七档名 off/minimal/low/medium/high/xhigh/max,值为线上拼写(off 可用 null 表示不发送参数);targets 为要处理的 entry 包名,默认仅 pi-ai;providers 为 route 白名单,空数组表示全部;includeDeclared 为 true 时会覆盖已声明模型;dryRun 为 true 时只打日志不写文件;pollSeconds 为兜底自检间隔(默认 30 秒,0 关闭)。
补齐时机:每次 DSH 启动一定会全量扫描;运行中在设置页新增模型,通常在 pollSeconds 内补上;直接手改 cordis.patch.yml 可能要等到下次启动(该环境下 HMR 未必把文件改动送进运行中的 Loader)。插件订阅多种宿主事件,同时用定时自检保证「新模型最终会被补上」。
排障可先读 $DSH_HOME/dsh-default-reasoning-efforts/status.json(仅结果变化时写入)。status 可能为 patched、no-change、dry-run、waiting-entry、read-failed、write-failed、crashed、disabled 等。
安装与启用¶
面板路径:设置 → 插件 → 添加插件 → 填写仓库地址或本目录绝对路径。
非 desktop profile 可用命令行(以 README 原文为准):
dsh plugin --profile web add github:junjundesk/dsh-default-reasoning-efforts
本地开发可链到目录:
dsh plugin --profile web add link:"<本目录的绝对路径>"
插件仅使用 Node 内置模块,要求 Node >=22,MIT 许可。安装前建议自行查看仓库源码与许可证;插件以当前 dsh 进程权限运行,会修改 profile 相关配置。
典型用法¶
- 安装并启用插件,确认
config.json中enabled为true(或省略文件使用默认)。 - 在 DSH 中为 pi-ai 适配器添加未声明
reasoningEfforts的自定义模型。 - 查看
status.json是否出现patched及changedModels列表;在浏览器模型目录中应能看到推理档位,并可与 dsh-codex-effort-slider 等控件配合。 - 若只想预览变更,将
dryRun设为true,根据日志决定是否正式写入。
开发者可在插件目录运行测试(43 项断言,含 HMR 事务逃逸回归):
node test/plan.test.mjs
适用场景与注意¶
适合:使用 dsh-llm-pi-ai、频繁添加自定义模型、又需要在官方 UI 或 effort 滑条上使用 high/xhigh/max 的 DSH 用户与工作流搭建者。
注意:
targets默认只含 pi-ai;其它适配器 schema 不同,乱加可能导致上游拒请求。- 卸载或
enabled: false后,已写入 profile patch 的reasoningEfforts不会自动删除,需手动改配置恢复。 - 配置非法时会回退内置默认并在日志说明原因。
DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-default-reasoning-efforts 把「未声明推理档位」的缺口收敛到一次幂等的 Host 侧写配置:让 pi-ai 适配器、模型目录、官方菜单与调用校验在同一份 reasoningEfforts 上对齐。需要进一步了解参数与边界时,以仓库 README 为准。
- 目录页:https://www.skillhub.cn/plugins/junjundesk/dsh-default-reasoning-efforts
- GitHub:https://github.com/junjundesk/dsh-default-reasoning-efforts