# dsh-reasoning-effort-slider [English](README.md) | 中文 把 DeepSeek Harness 官方模型菜单里的 **「推理等级 / Effort」那一行**,变成一条 **Codex 风格推理强度滑条**: ``` ┌──────────────────────────────────────┐ │ 模型 DeepSeek-V4.1-Flash 1017 › │ ├──────────────────────────────────────┤ │ 推理等级 Max › │ ← 官方行,数值文字跟着档位变色 │ ●━━━━━━━━━━━━━━━━━━━━━━━━━━◯ │ ← 插件注入:28px 粗轨 + 白色圆钮 │ · · · · │ ← 圆点刻度(已到达的亮) │ Max │ ← 当前档位名(拖动时实时预览) └──────────────────────────────────────┘ ``` 输入框工具行**不加任何东西**,收起态的模型席还是官方的 `模型名 · 档位 ⌄`,只是那枚档位文字会按档位着色。 ## 交互 | 操作 | 行为 | | --- | --- | | 在轨道上按下 | 直接跳到按下的那一格 | | 拖动 | 旋钮**跟手**:指针到哪,圆钮和填充就到哪;档位名、圆点、写入按最近的档位走,松手后 80ms 吸附到格上(无回弹) | | 松手 | 立即落地(拖动途中停手约 160ms 也会自动落地) | | `←` `→` `↑` `↓` | 一次一档,立即提交 | | `Home` / `End` | 最低 / 最高档 | | 悬停 | 提示当前档位与「越往右越费 token」 | 写入有去重与合并:一次拖动最多落地几次,落在当前档位时**一次都不写**;失败会在档位名处显示原因、4 秒后恢复。 ## 颜色与特效(由档位位置驱动,与档数无关) | 位置 | 填充右端 | 星尘 | 档位文字 | | --- | --- | --- | --- | | 第 1 档 | 蓝 `#4d93f8` | 无 | 官方灰(`Off` 不染色) | | 中间档 | 蓝 → 紫 `#9333ea` | 无 | 蓝 → 靛 | | 最高档 | 深紫 `#4c1d95` | 26 颗错峰星尘 + 紫色能量层 | 紫罗兰 `#8b5cf6` | - 填充是 `linear-gradient(90deg, 蓝 → 当前位置的颜色)`:左端恒为蓝、右端随档位变深。 - 能量层与星尘都**只覆盖已填充的那一段**,旋钮右边不会出现能量。 - 旋钮是白圆,直径等于轨道高度(28px),圆心内缩 14px,所以两端永远是完整的圆。 ## 它为什么不弄坏官方菜单 - 只加一个 `data-dres-row` 属性给官方那一行(放大高度、允许折行),官方 class、文案、chevron 一个都不动。 - 认不出预期结构就 **fail-open**:触发器没有 `aria-controls`、菜单里不是「模型 / 推理等级」两行、或者这一行不是自己 composer 卡片的,就完全不注入,官方菜单照常可用。 - 打开菜单时插件长高那一行,官方自己的 `ResizeObserver` 会重新测量并把菜单摆回屏幕内。 - 卸载或关闭菜单时:容器删除、属性移除、被染色的文字颜色还原。 ## 数据路径(全部官方公开面) | 用途 | 接口 | | --- | --- | | 读档位 | `session.modelCatalog()` → `groups[].models[].reasoning.efforts` | | 读当前值 | `modelSelection` 会话投影(`useProjection`),缺省回落到目录默认值 | | 写档位 | `session.selectModel({ sessionId, provider, model, reasoningEffort })` —— 和官方菜单同一个写入口 | ## 安装 从 GitHub 直装: ``` dsh plugin --profile add github:sleepinggggggggggg/dsh-reasoning-effort-slider ``` 本地目录安装: ``` dsh plugin --profile add <本目录绝对路径> ``` 桌面端在 **设置 → 插件 → 添加插件** 里填 `github:sleepinggggggggggg/dsh-reasoning-effort-slider` 或本地目录路径。装完刷新页面(或完全重开桌面应用)。 ## 兼容性 支持范围写在 `package.json` 的 `engines.dsh` 里:**DSH `>=0.2.0-rc.2 <0.3.0-0`**,已在 `0.2.1-rc.2` 上核对过。 DSH 会在加载插件前检查这个范围:落在范围外的宿主版本会得到一条明确的「不兼容」提示,而不是留下一个静默不生效的滑条。 ## 已知边界 - **依赖官方菜单的语义结构**(`aria-haspopup` / `aria-expanded` / `aria-controls`、根面板两行 `role="menuitem"`)。宿主改版后若结构变了,插件静默不生效(不会把菜单改坏),需要跟进适配。 - 必须先点开模型菜单才能调档位;输入框工具行上不常驻读数。 - 模型只声明一档(例如关掉思考)时,控件不渲染,官方那一行也会恢复原高(`setActive` 会撤掉加高)。 - 模型目录在页面生命周期内缓存一份(断线重连会重拉)。设置里新加 provider / 模型后要刷新一次页面。 - 提交的是「下一次请求」的选择;正在跑的那一步保持它开始时的档位(和官方菜单一致)。 ## 致谢 这个插件的判断来自对三个同类实现的阅读,没有复制它们的代码(本仓库是独立实现): - [HanaAyane/dsh-reasoning-effort](https://github.com/HanaAyane/dsh-reasoning-effort) —— 「大肥鱼」版,确认了「白圆钮 + 轨道 + 圆点 + 档位名」这套视觉语言,以及 `modelSelection` 投影 + `session.selectModel` 的数据路径。 - [Microqian2th/dsh-codex-effort-slider](https://github.com/Microqian2th/dsh-codex-effort-slider) —— 把滑条注入官方「推理等级」行的 DOM 锚点策略(`aria-haspopup` / `aria-expanded` / `aria-controls` / `role="menuitem"`),以及蓝 → 紫 → 深紫的配色与星尘位置曲线。 - [Bai-2008/a-better-dsh-codex-effort-slider](https://github.com/Bai-2008/a-better-dsh-codex-effort-slider) —— 接管模型席那条路线的取舍说明(本插件没有走那条路)。 ## 反馈 - **Bug 和功能请求** —— [开个 issue](https://github.com/sleepinggggggggggg/dsh-reasoning-effort-slider/issues)。模板会问插件版本和 DSH 版本,这一对信息基本就够定位了。 - **装不上、自定义模型档位、想确认能不能配合某个端点用** —— 发邮件到 **nupotecrosstvo@gmail.com**。 - **安全相关** —— 也发同一个邮箱,别开公开 issue,见 [SECURITY.md](SECURITY.md)。 - **随手问两句、发个截图** —— X [@nupote_](https://x.com/nupote_)。 ## 许可 MIT,见 [LICENSE](LICENSE)。 ## 文件 | 文件 | 作用 | | --- | --- | | `index.js` | Host 半:空 `apply()`,只为让 bundle 进入 profile | | `client.js` | 全部逻辑:DOM 桥、portal 滑条、配色/星尘、字典 | | `cordis.patch.yml` | 插入 bundle 行 | | `locale/{zh,en}.json` | 管理页文案 + 控件文案 | | `icon.svg` | 插件管理页图标 |