dsh-thinking-effort-autoswitcher:Composer 模型选择与思考力度一体切换

前言

在 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 表示未就绪。

典型用法

  1. 在 Composer 打开替换后的模型 + effort 菜单,选目标模型与固定档位,或选 Auto。
  2. 使用 Auto 时,首轮会立即评估;之后每轮结束自动再评估并应用映射档位。
  3. 在对话 UI 中查看每轮尾部标记旁显示的 该轮实际 effort(与当轮 request/header 一致)。
  4. 页面内用 → / ← 快速切换 effort 阶梯(光标不在 Composer 卡片内时)。
  5. 需要原生模型槽位时,用 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 目录页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜