dsh-thinking-slider
Codex-style reasoning-effort slider for the DeepSeek Harness composer
- Stars
- 0
- Language
- JavaScript
- Created
- Sep 30, 2026
- Updated
- Oct 7, 2026
Introduction
dsh-thinking-slider
把 DeepSeek Harness(DSH)composer 里的模型选择器换成「模型 + 推理强度」:
平时显示 模型名 · 等级,点开是一张卡片 —— 上面是模型列表入口,下面是带渐变与粒子的强度滑块。
An opinionated model + reasoning-effort picker for the DSH composer, with a gradient particle rail.

它做什么
- 关闭态:正常的一行文字
deepseek-flash · Max,不占地方 - 点开:卡片里大字显示当前等级,
模型名 ›可切模型,下面一条厚滑块 - 拖滑块:即时切换推理强度;视觉随等级变化(见下方三种模式)
- 键盘:
←/→、Home/End切换,Esc关闭 - 降级:模型没有推理等级时只显示模型名,不出现滑块(不会给你一个假的控件)
等级不写死在插件里 —— 它读 DSH 上报的 model.reasoning.efforts,
所以任何在配置里声明了 reasoningEfforts 的供应商路由都会自动出现在滑块上。
三种模式
在 设置 → 通用 → 推理滑块 里切换。模式存在浏览器本地(localStorage), 切换即时生效,不需要重启。
| 模式 | 效果 |
|---|---|
| 官方 | 插件完全不注册座位,交还 DSH 官方的模型选择器原样 |
| 粒子 | 轨道渐变 + 内部漂浮粒子,等级越高越密 |
| 能量充能 | 深色轨道上的点阵充能场,前沿从左扫入旋钮,最高档持续燃烧 |
设置行独立于座位注册,所以即使选了「官方」也随时能切回来 —— 不会把自己锁在外面。
能量模式是 canvas 2D 的逐格衰减模拟(不是 WebGL,也没有引入依赖): 每格有自己的随机相位与速度,前沿扫过时依次点亮,靠近旋钮的格子落定成 「热核 + 曳光」,最高档则保持长记忆让整条轨道持续燃烧;中间档落定后 主动停掉渲染循环,静止不烧 CPU。
浅色 / 深色是两套分开的配色:深色下格子越热越漂向白色(靠近旋钮白热),
浅色下保持本色饱和度、靠对比度表达等级 —— 浅色轨道本身已接近白色,
再往白漂就等于把格子从视野里抹掉。配色跟随 data-ds-dark-theme 实时切换,
不用重开卡片。
| 深色 | 浅色 |
|---|---|
![]() | ![]() |
让没有等级的模型真的能选等级
先说原因:等级要能真正生效,必须由 reasoningEfforts 给每个模型声明
「等级 → 发给网关的原始值」的映射。而 DSH 的「设置 → 模型」页面没有这个字段,
所以任何通过 GUI 添加的代理商,模型都永远不会有等级。
注意这不是"显示问题":DSH 会直接拒绝一个没有映射的等级(
UNSUPPORTED_REASONING_EFFORT,不是静默忽略)。它的注释写明了设计意图 ——
它宁可不报告任何等级,也不愿意提供一个"做不到自己所说事情"的控件。
(本插件早期版本试图在界面上补四档,结果每次点选都报错,已回退。)
插件补上了这个缺口:设置 → 通用 → 模型推理等级 会列出「有模型没声明等级的 代理商」,逐个点「补四档」即可。
- 写入的是
llm-pi-ai的真实配置(与「设置 → 模型」同一份),所以等级真的生效 - 适配器每个请求都重读配置,不需要重启
- 只补没有声明的模型;已经声明过的原样保留
- 逐代理商确认,不做全自动:若某个网关不接受
reasoning_effort,会让那个代理商 的请求全部失败。none / low / high / max是实测可用的拼写,但换网关要先试一个模型
要求
- DSH Desktop 或
dsh web,内核 0.2.x(开发时验证于0.2.0-rc.1/0.2.0-rc.2) - 无第三方依赖:只用 DSH 自带的
react/react/jsx-runtime/react-dom
插件没有声明 peerDependencies,所以不会被 DSH 的版本门禁整包跳过;
代价是版本兼容由你自己判断,升级 DSH 后如果 UI 槽位变了可能失效。
安装
dsh plugin --profile desktop add github:MuFeng262/dsh-thinking-slider
装完完全退出 DSH Desktop 再打开(客户端插件在启动时组合加载)。
如果你的 profile 名不是
desktop,把--profile desktop换成实际名字。 插件管理器里添加同一条github:MuFeng262/dsh-thinking-slider也可以。
手动安装(命令不可用时)
-
克隆到插件源码目录:
git clone https://github.com/MuFeng262/dsh-thinking-slider %USERPROFILE%\.dsh\plugins-src\dsh-thinking-slider -
把
node_modules\dsh-thinking-slider做成指向它的目录联结(junction):New-Item -ItemType Junction ` -Path "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-thinking-slider" ` -Target "$env:USERPROFILE\.dsh\plugins-src\dsh-thinking-slider" -
在
%USERPROFILE%\.dsh\profiles\desktop\package.json里加两处:{ "dependencies": { "dsh-thinking-slider": "file:../../plugins-src/dsh-thinking-slider" }, "dsh": { "profile": { "bundles": [ "dsh-thinking-slider" // ← 加进这个数组 ] } } } -
重启 DSH Desktop。
让自定义模型也有推理等级
档位不在插件里。 插件是通用的,但 Off / Low / High / Max 来自你自己的 profile 配置。
DSH 的 Models 设置页刻意不提供这个字段,只能手写进 profile 的 cordis.patch.yml:
- id: llm-pi-ai
name: "@deepseek-ai/dsh-llm-pi-ai"
config:
providers:
your-gateway:
displayName: 你的中转商
apiKeyEnv: YOUR_API_KEY
api: openai-completions
baseURL: https://your-gateway.example/v1
models:
- id: some-model
name: some-model
reasoningEfforts: # ← 关键:每个模型单独写
off: none
low: low
high: high
max: max
几点注意:
- 右边那些值是原样发到网关的拼写,不是 DSH 的枚举。不同中转商认的词不一样, 填错可能 400 —— 建议先只给一个模型加上试。
- 键名(
off/minimal/low/medium/high/xhigh/max)决定了滑块上有几档。 - 省略
reasoningEfforts时,DSH 只会按模型 id 去查内置目录; 自定义模型名查不到 → 该模型就没有等级。 reasoningEfforts: false可以显式声明为「非推理模型」。
卸载
dsh plugin --profile desktop remove dsh-thinking-slider
手动装的,要删三处:node_modules\dsh-thinking-slider、
package.json 的 dependencies 条目、以及 dsh.profile.bundles 里的同名项。
只删 dependencies 不够 —— bundles 里的条目不清掉,插件开机仍会被加载。
开发
git clone https://github.com/MuFeng262/dsh-thinking-slider
cd dsh-thinking-slider
node test/smoke.mjs # 66 项行为测试,零依赖,不需要 DSH
test/smoke.mjs 自带一个迷你 React 运行时(hooks 槽位、类组件与错误边界、
跨渲染的 DOM 节点身份、真实执行的 effect 与 cleanup),所以
「节点重挂后动画有没有重新绑定」这类问题是可以断言的,不需要开浏览器。
许可
MIT

