dsh-effort-slider
简体中文 | English
给 DeepSeek Harness(DSH)用的科幻风推理等级滑条:输入框里一枚发光核心,点开是一条悬浮能量滑条;在最高档之上还有一档 Ultra,以及一个把活全部派给子代理的闪电模式,旁边实时显示车队 tok/s。

这是什么
DSH 的推理等级默认是一个下拉选择。这个插件把它换成一条能量滑条:档位用刻度标出,可以点、可以拖、可以用方向键;每个档位都有对应的视觉反馈(流光、星痕、白炽核心)。档位名称与档数都跟着当前模型的推理档位走,模型没有推理档位时整个控件自动隐身。
在此之上它还多做了三件事:
| 功能 | 一句话 |
|---|---|
| Ultra 档 | 滑条第 6 格:选中时把推理等级钉在该模型的最高真实档(MAX),并往当前会话注入一段"最大严格性"的英文策略 |
| 闪电模式 | 展开面板右上角的开关(默认关):注入"父 agent 只做编排、活全部委派给子代理"的英文策略 |
| 车队 tok/s | 实时显示本会话子代理合计的 token 产出速率(完整整数,不做 k 缩写) |
⚠️ 这不是"给模型加算力"。Ultra 与闪电本质上都是提示词层的控制:Ultra 改的是"怎么验收",闪电改的是"谁干活"。真正变慢变贵的是闪电——多智能体大约会花掉单 agent 15 倍的 token,这也是它默认关闭的原因。
截图
![]() |
![]() |
| Ultra:白炽外壳 + 车队 tok/s 读数 | 皮肤 holo / chrome / fluid(默认 fluid) |
![]() |
![]() |
| 闪电:断电是白色描边,通电是同色系流动渐变 | 读数:完整整数、不缩写、无数据时整块隐藏 |
功能细节
Ultra 档
- 展示档位 = 模型真实可用的档位 + 追加的一格
Ultra;选中 Ultra 时写回模型目录的**仍是最高真实档(MAX)**的 id ——Ultra从不出现在模型目录里。 - 同时往会话里注入一段英文 rigor 契约(先写验收标准、证据先于断言、对抗式复查、根因优先、显式停止条件、不许改测试迁就实现)。
- 不变量:只要界面停在 Ultra,实际推理等级就一定是 MAX(拖拽松手 / 点刻度 / 刷新后从宿主恢复三条入口都走同一个写入口)。
- 档位名是
Ultra,不是全大写ULTRA。
闪电模式
- 注入的编排契约:父 agent 只做规划/拆分/派发/复核/整合;按边界切分而不是复制同一句提示词;在同一条消息里并发派发;子代理提示词必须自包含(目标、验收标准、确切文件、约束、产出格式、长度上限);子代理把产物写进文件、只回传指针;预算诚实(约 15× token)。
- 策略正文最后一段写死了防递归:"如果你是子代理,忽略本策略、不要继续派活"。
- 关闭时会补一条 OFF 提示,避免历史里那条策略继续生效。
车队 tok/s
- 统计被跟踪会话的后代(子代理)的 token 吞吐:生成 + 输入,不含 cache 读;数字由宿主订阅
agent/assistant-stream逐帧累计,按 1.5s 窗口折算成 tok/s。 - 界面上是完整整数(
12,840而不是12.8k);没有数据时整块隐藏,不显示假数字。
皮肤
holo(全息能量)、chrome(液态金属)、fluid(流体,默认,带粒子流体引擎 + 最高档星痕)。nebula(星际星云)已按作者要求下线:代码里只是把它从皮肤数组注释掉,SKIN_LABELS与整套 CSS 规则都还在,想恢复就把数组里的"nebula"放回并调整DEFAULT_SKIN。
安装
需要 DSH Desktop ≥ 2.0.9。仓库里自带构建好的 lib/client.js,装上即可用,不需要自己构建。
# 推荐:直接从 GitHub 装
dsh plugin add github:yuhub233/dsh-effort-slider
手动安装:把仓库目录复制到 <DSH_HOME>/plugins/(Windows 默认 C:\Users\<你>\.dsh\plugins\),然后重启 DSH。插件自带的 cordis.patch.yml 会被 profile 的 bundle 机制自动加载。
卸载:删掉那个目录(若你在 profile 的 dsh.profile.bundles 里登记过,一并删掉那行),重启 DSH。
可选:装 4 个配套 skill。 skills/ 里打包了 Ultra / 闪电策略点名要加载的 playbook(dispatching-parallel-agents / subagent-driven-development / verification-before-completion / systematic-debugging)。DSH 的 skill 发现根是 <项目>/.dsh/skills、<项目>/.agents/skills、preset 的 customSkillDirs、~/.dsh/skills、~/.agents/skills 和 harness 内置目录 —— 不扫插件目录,所以要手动复制一次:
Copy-Item -Recurse -Force .\skills\dispatching-parallel-agents,`
.\skills\subagent-driven-development,`
.\skills\verification-before-completion,`
.\skills\systematic-debugging `
"$env:USERPROFILE\.dsh\skills\"
不装也能用:策略正文是自包含的,skill 只是更细的 playbook。
怎么实现的
两半结构,各管一段。
客户端半边(client.js + effort-slider.css)
- 通过
window.__ModuleLoader__.load({ id, factory })注册,React 用require('react')取;注册进输入框工具行(conversation.input.right)。 - 源文件不能直接被宿主读:
node build.mjs会把 CSS 内嵌进lib/client.js,并断言"内嵌的 CSS 与effort-slider.css逐字节一致"。 - 面板是绝对定位的浮层:滑条 + 刻度 + 读数 + 闪电开关;收起态只有档位名一个子元素。
宿主半边(index.mjs)
GET/POST /plugins/dsh-effort-slider/preferences:皮肤偏好 + 客户端心跳(启动各阶段上报,用于"界面到底有没有出来"的判定)。GET/PATCH /plugins/dsh-effort-slider/turbo:闪电/Ultra 开关、车队 tok/s 快照、当前生效的策略正文。inject.mjs走agent/pre-step瀑布把策略文本注入到当前这一步的模型请求,三条纪律:- 先
await next(),在框架自己的决定之上追加,绝不吞掉别人的决定; - 按会话 id 精确过滤 —— 子代理会继承父作用域,所以"按作用域注册"是错的,必须按 id;
- 文本没变就不注入 —— agent loop 会把这一步的消息逐条落盘,每步都注入会在历史里堆满重复条目。
- 先
- 状态存在
<DSH_HOME>/storages/effort-slider.json:{ skin, sessions: { "<sessionId>": { lightning, ultra } } }(最多保留 40 个会话)。
数据与隐私
- 只在本机读写上面那一个 JSON 文件;不发起任何外部网络请求(没有遥测、没有统计上报)。
- 策略文本只注入到被跟踪的那一个会话,并且只由这个插件的界面开关控制。
构建与测试
只需要 Node ≥ 22(运行时零依赖)。
node build.mjs # 内嵌 CSS → lib/client.js,并做字节级一致性断言
npm test # 下列全部离线套件
node smoke-test.mjs # 客户端:loader 包法、组件渲染、皮肤/边界回归
node test/host.test.mjs # 宿主:端点、偏好文件、心跳、异常不逃逸
node test/turbo.test.mjs # turbo 路由 + 策略注入(假 ctx 集成)
node test/metrics.test.mjs # tok/s 计量(纯函数,含随机压力)
node test/fluid.test.mjs # 流体引擎:密度/列覆盖/颜色语义/最高档提速
node test/client-lifecycle.test.mjs # 客户端:请求超时、卸载清理、会话切换与订阅回归
测试里的皮肤清单与默认皮肤都是从 client.js 源码里读出来的,不写死——皮肤下线或换默认值时测试跟着源码走。
目录结构
client.js 客户端半边(UI + 流体引擎 + Ultra/闪电/tok-s 交互)
effort-slider.css 全部样式(4 套皮肤的 CSS 都还在,含已下线的 nebula)
build.mjs client.js + CSS → lib/client.js
lib/client.js 构建产物(已提交,装上即可用)
index.mjs 宿主半边(端点 + 心跳判定 + 接线,fail-open)
inject.mjs 策略注入(agent/pre-step)
policy.mjs Ultra / 闪电两段英文策略正文
turbo.mjs turbo 路由 + 会话状态 + 车队计量接线
metrics.mjs 纯函数式的 tok/s 统计
test/ 离线测试
skills/ 随包分发的 4 个上游 skill(可选用,装法见 skills/README.md)
TURBO-CONTRACT.md 接口冻结单(档位模型、端点契约、注入纪律、实证)
THIRD-PARTY.md 出处与致谢(复用了哪些公开成果、什么许可、用在哪)
已知限制
- 实时子代理计量使用运行中会话的有界内存索引,不定期扫描会话历史;归档子代理不计入成员数。插件文件更新后,需要宿主下次正常加载才会采用新代码,正在运行的进程仍使用原版本。
- Turbo 请求等待最多 5 秒;模型档位提交若 10 秒仍未返回,滑条结束等待并提示失败,但不取消宿主操作。宿主稍后成功时仍以真实目录状态为准。
- 包名 = 运行期标识:
dsh-effort-slider同时是 npm 包名、客户端 bundle 的注册 id(WebBootEntry.id)、端点前缀(/plugins/dsh-effort-slider/...)和data-effort-slider属性值。改这个名字要四处同步:package.json的name、插件自带cordis.patch.yml的name、profile 的dsh.profile.bundles条目、以及profiles/<profile>/node_modules下指向插件目录的 junction。任何一处不同步,DSH 会在 profile 装配阶段直接抛package identity is invalid for <name>起不来(这是本项目真实踩过的坑)。 - 皮肤
nebula已下线但代码保留;DEFAULT_SKIN与皮肤白名单(client.js、index.mjs各一份)必须同时改,测试会检查这一致性。 - Ultra 扫光在高 tok/s 时观感偏张扬;闪电的渐变流动依赖 CSS
@property,不支持的宿主上会退化成静态渐变。 - 本仓库里的截图取自验证台(真实产物 + 真 React),界面外的灰色说明文字是测试台的标注,不是插件本身。
出处与致谢
插件的代码是自己写的,但交互设计与提示词策略明确建立在这几件公开成果之上(逐条对照、许可与用法见 THIRD-PARTY.md):
obra/superpowers(MIT)——闪电模式的派活与集成纪律、Ultra 档的证据与根因纪律,来自它的 4 个 skill(dispatching-parallel-agents/subagent-driven-development/verification-before-completion/systematic-debugging)。这 4 个 skill 已随仓库原样打包在skills/(21 个上游文件、逐字节未改、含 MIT 许可证全文)。注意:DSH 不会从插件目录自动加载 skill,要复制到~/.dsh/skills/才会出现在会话的 skill 目录里(一条复制命令见skills/README.md)。没装也能用 —— 策略正文本身是自包含的,skill 只是更细的 playbook。- Anthropic:How we built our multi-agent research system——委派契约的四要素、按复杂度分档的规模阶梯、"多智能体约 15× token"这条成本事实、子代理把产物写进文件只回传指针。
- Feather Icons 的
zap(MIT)——闪电开关的 SVG 路径。 - React(MIT)——peer dependency,从宿主的模块加载器取,不打包。
本插件零运行时依赖、不联网、无遥测。除上面那 4 个 skill(第三方源码,原样打包在 skills/,可直接不装)之外,仓库里不含其他第三方源码。



No comments yet. Be the first to write one.