前言¶
在 DSH 里,Composer 的模型选择与各厂商暴露的 thinking effort(off / low / high / max 等)往往是分开操作的。长对话中若希望按回合难度自动调节推理力度,又要回看「这一轮实际发了什么 effort」,单靠原生选择器往往不够直观。下面介绍的插件把模型槽位收成「模型 + effort」一体选择器,增加 Auto 档位,并在 Host 侧对当前回合打分后选用目标等级;每一轮结束后还会展示该轮请求头里记录的真实 effort。
这是什么¶
dsh-thinking-effort-autoswitcher(维护者 Relethe,分类:模型推理)是面向 DSH Web 客户端的 bundle 插件,当前版本 0.1.0,MIT 许可。它替换 conversation.input.model 插槽内的原生模型选择器,在同一菜单里按厂商分组列出模型,并为当前模型列出真实 effort 档位及 Auto;在 Auto 下由 Host 半部根据失败度与重要性评分映射到具体档位,Client 在每轮结束后展示该轮实际发送的 effort(来自 request/header 事件,而非当前选择器状态)。
核心功能¶
模型与 effort 一体选择器¶
菜单结构为:先按 provider 分组的模型列表,再是当前模型支持的 effort 等级,最后是 Auto。方向键 ← / → 在「真实档位 … Auto」阶梯上递减或递增:从最高档 → 进入 Auto,从 Auto ← 回到最高档,不环绕。指针在 Composer 卡片内时忽略该快捷键,避免劫持光标;页面其他区域可用。按钮内 effort 文案有横向滑动动画,固定宽度槽位避免按钮跳动。
Auto 评分(Host 半部)¶
Host 提供同源 JSON 接口:
| 路由 | 作用 |
|---|---|
POST /thinking-effort/evaluate |
对当前回合打分并返回目标等级;apply: true 时写入应用 |
POST /thinking-effort/turns |
返回各轮实际发送的 effort(自 request/header 汇总) |
failure(0–5,确定性):仅看最近一轮。同名同参工具调用失败 ≥2 次计为一组重复,得 2 分;turn/end 且 reason.kind === 'error' 再加 2,上限 5。
importance(0–10,模型评判):用小模型比较最近一条用户消息与锚点(有运行中 goal 时用其 objective,否则用首条用户消息)。越贴近锚点、影响面越大分越高;边缘探索分低。评判优先使用最低 effort(倾向 off);解析失败时回落为 5,并返回 importanceRaw 便于调试。
映射公式(权重仅存于 patch,比例有效):
total = wI * importance + wA * failure
maximum = wI * 10 + wA * 5
interval = maximum / levelCount
index = floor(total / interval) // 限制在 0 … levelCount-1
默认权重示例(cordis.patch.yml 插入行):
- insert:
- id: thinking-effort
name: 'dsh-thinking-effort-autoswitcher'
config:
weights: { importance: 1, failure: 1 }
Client 调用时机:切换到 Auto 时立即评估(冷启动先落到中间档);每轮完成后由 turn-tail 标记触发一次,防抖 600 ms,每轮至多一次。路由 404/405 则停止重试,菜单显示「auto scoring not connected」。
每轮真实 effort 展示¶
/thinking-effort/turns 在 turn/start 与 turn/end 之间归集 request/header,响应形如:
{"ok":true,"turns":[{"turn":1,"effort":"low","seq":18,"endSeq":100}]}
Client 按会话缓存,用回合尾部条目的 seq 匹配(再 fallback 到 endSeq <= seq、回合号)。无记录 header 的回合(如已取消)显示 default。
逃生与局限¶
若替换选择器异常,可保留插件并设置 localStorage['thinking-effort:no-replace'] = '1' 后刷新:由 conversation.input.left 上的紧凑 effort chip 接管。
已知限制包括:未记录 header 时优先展示记录值,仅路由不可用时回退到当前选择;其他插件对 conversation.input.model.label 的贡献不转发;菜单无搜索与 roving 键盘焦点;agent 运行中 selectModel 可能被拒(applied: false 与 applyError,UI 保留手动选择)。
安装与启用¶
官方做法是将插件 link 进 profile 依赖,并在 dsh.profile.bundles 中列入 bundle;bundle 自带的 cordis.patch.yml 会插入 loader 行,profile patch 无需再写条目。
// ~/.dsh/profiles/<profile>/package.json
{
"dependencies": { "dsh-thinking-effort-autoswitcher": "link:C:/path/to/thinking-effort-plugin" },
"dsh": { "profile": { "bundles": ["...", "dsh-thinking-effort-autoswitcher"] } }
}
完成后须 完全重启 DSH(Host 半部仅在启动时加载)。
Host 生效需同时满足:插件已 link 进 profile 的 node_modules;存在对应 loader 行;index.js 导出 export const inject = ['webServer']。若缺依赖声明,apply 可能早于 HTTP 载体就绪,ctx.get('webServer') 为 undefined 时路由会落入 SPA 回退(405)。可用同源 POST 自检:
curl.exe -s -X POST "http://127.0.0.1:<port>/thinking-effort/evaluate" `
-H "content-type: application/json" -H "sec-fetch-site: same-origin" `
-d '{"sessionId":"probe"}'
返回结构化 JSON(如 {"ok":false,"error":"session-not-live"})表示路由已挂载;405 表示未就绪。
典型用法¶
- 在 Composer 打开替换后的模型 + effort 菜单,选目标模型与固定档位,或选
Auto。 - 使用
Auto时,首轮会立即评估;之后每轮结束自动再评估并应用映射档位。 - 在对话 UI 中查看每轮尾部标记旁显示的 该轮实际 effort(与当轮
request/header一致)。 - 页面内用
→/←快速切换 effort 阶梯(光标不在 Composer 卡片内时)。 - 需要原生模型槽位时,用 localStorage 逃生项切换为左侧 effort chip 模式。
适用场景与注意¶
适合需要在同一界面切换模型与 thinking effort、并希望 Auto 按回合失败与任务重要性调节档位的 DSH 用户。也适合需要审计「每轮到底发了什么 effort」的调试与复盘场景。
插件以当前 DSH 进程权限运行;安装前请阅读仓库源码与 MIT 许可证,自行确认 link 路径与 profile 配置。DSH 生态奉行「一切皆插件」;社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-thinking-effort-autoswitcher 把 Composer 模型选择与 effort 合成一个选择器,用 Host 侧评分驱动 Auto,并用请求头事件还原每轮真实 effort。更多细节与截图见 GitHub 仓库 与 SkillHub 目录页。