# DSH Better Reasoning Effort

DSH Better Reasoning Effort

[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![npm version](https://img.shields.io/npm/v/dsh-better-reasoning-effort)](https://www.npmjs.com/package/dsh-better-reasoning-effort) [![npm downloads](https://img.shields.io/npm/dw/dsh-better-reasoning-effort)](https://www.npmjs.com/package/dsh-better-reasoning-effort) ![DeepSeek Harness](https://img.shields.io/badge/DeepSeek%20Harness-plugin-4d6bfe) ![dsh-plugin](https://img.shields.io/badge/dsh--plugin-ecosystem-4d6bfe) ![Version](https://img.shields.io/badge/version-0.4.0-4d6bfe) ![Docs](https://img.shields.io/badge/docs-EN%20%7C%20ZH-4d6bfe) [![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com) [![Commit activity](https://img.shields.io/github/commit-activity/t/HaoyueQin/dsh-better-reasoning-effort)](https://github.com/HaoyueQin/dsh-better-reasoning-effort/graphs/commit-activity) [![Last commit](https://img.shields.io/github/last-commit/HaoyueQin/dsh-better-reasoning-effort)](https://github.com/HaoyueQin/dsh-better-reasoning-effort/commits) [English](README.md) | **中文** 给 DeepSeek Harness 的**第三方模型**(pi-ai 手工声明路由)提供思考强度(reasoning effort)与**输入模态**(图片输入支持)设置的插件——直接在官方「模型」页的模型行里编辑,带知识库 + 协议推断的自动适配;另附**官方模型菜单内的快捷思考强度滑块**(白色圆形滑块,集成自 HanaAyane 的 dsh-reasoning-effort,见[致谢](#致谢))——Composer 右下角的官方*模型 · 思考强度*显示形式保持不变。

demo

官方「模型」页模型行内的思考强度编辑器

## 为什么需要它 DeepSeek Harness 的 `llm-pi-ai` 适配器原生支持每个模型声明 `reasoningEfforts`(接受哪些思考档位 + 每个档位发往端点的确切取值),但官方「模型」页的编辑卡**刻意不暴露这个字段**——官方注释明说它是 per-model 能力、provider 级旋钮会弄坏部分模型。于是: - 第三方模型在 Composer 的模型选择器里**没有思考档位选择**(`getSupportedThinkingLevels` 短路成 `["off"]`); - 只有官方 DeepSeek API(内置 catalog)能设思考强度; - 想给第三方模型设档位,只能手写 `settings.yaml` 的 `reasoningEfforts` / `compat` 块。 - 手工声明的第三方模型默认被当作**纯文本**(`input` 缺省为 `["text"]`):图片附件在发送前就被拒绝,read-image 工具拒绝工作,中间每一层网关路径都读同一个标志。核心本来就接受每模型的 `input: ["text", "image"]` 声明——只是官方页同样不暴露。 本插件把这两份配置能力都搬回 UI:**官方模型编辑卡内直接编辑**,加**自动适配**。 ## 特性 - **官方页内注入**:官方「模型 → 编辑 → 自定义设置 → 模型行展开区」里出现编辑块,和上下文窗口 / 最大输出并列——不是另起炉灶的单列页面,而是融进官方编辑流程(同一个 `settings.mutate` 契约、同一种保存方式)。编辑块横跨展开区整行,档位行按官方容量字段同样的两列均分;现在包含**思考强度**与**输入模态**两个分区,由卡片的**保存**统一提交、编辑器只保留「放弃修改」。 - **输入模态声明**:一个勾选框(「图片输入」)让手工声明的模型端到端具备视觉能力——Composer 附件、read-image 工具、代理门控读的都是同一个标志。取消勾选把声明收窄为纯文本;点「清除声明」则写入持久的 `inputUnset` 标记,host 自动填充会像尊重思考档位的撤销标记一样尊重它。若内核的官方「模型」页已自带**输入类型**编辑器(`0.1.6-alpha.2` 起),本区块会自动隐藏,保证模态只有一个设置入口——能力从模型行 DOM 嗅探,绝不比对版本号;旧内核继续保留本区块。 - **端点兼容控件**:编辑块底部多一个分区,只在对应协议的 compat 门接受它时出现。`openai-completions` 路由上是**思考预算字段**(思考 token 预算用哪个参数发送——部分 vLLM/自建端点读 `thinking_token_budget`,另一些读 `thinking_budget` 或 `thinking_budget_tokens`;未设置表示三个都不发送)与 **vLLM 优先级**(以 `--priority` 启动的端点的调度优先级)。`openai-responses` 路由上是**请求中的 max_output_tokens**——部分 Responses 网关会拒收该参数,选「不发送」可让请求完全不携带输出上限。控件沿用官方字段形态(说明在上、官方枚举宽度、提示在下),每一项都写清了自己的作用。这些开关是**端点级透传**而非模型能力:知识库刻意不预测它们(没有哪个模型"已知"会拒收 `max_output_tokens`),因此「自动适配」不会填——遇到需要的网关手动设一次即可。设错或换网关后把下拉框选回"未设置"再保存卡片即可**真正删除**该键;编辑器只会删除它自己展示过的那几个键,你手写在 `settings.yaml` 里的其他 compat 字段不会被波及。 - **分区式建议展示**:「自动适配」在独立一行报告应用了什么(来源 · 置信度),单独说明模态建议的出处(端点列表 / 知识库 / 命名启发式——最后一种明确标注低置信度),并把参考容量(上下文窗口、最大输出)渲染进独立的只读区块,标题写明"仅提示,不自动填充"。数值带千分位,可直接照抄进官方容量输入框。 - **随卡片保存落盘(编辑期零写入)**:编辑块也会出现在"尚未保存"的行上,两种形态同一条链路——新建供应商的卡片(自动适配直接用卡上填写的协议/端点),以及给**已保存供应商新增的模型行**(自动适配改用文档里的路由事实 + 行上已输入的显示名称)。**改动即时进入待写入**,点卡片的**「保存」**时一并落盘——官方卡片打开期间冻结了自己的设置版本号,插件因此改为跟着同一次保存写入,而不是去抢它("配置好了、保存了、却又变回原样"的成因);点**「取消」**或刷新会与卡片自带字段一起丢弃;绝不覆盖文档里已有的声明。注意暂存阶段表达不了"故意留空":全部清空后再暂存等同撤单、退回自动适配的填充——确要不声明的模型,请先保存行,再在行内全不勾并保存(写入持久撤销标记)。 - **自动适配**:内置模型知识库(DeepSeek V3/V4/R1 及其视觉实验版(2026-09 复核:现行官方 id 为 **deepseek-flash**=V4.1-Flash 与 **deepseek-v4-pro**=V4-Pro-0813,旧 v4 拼写为兼容别名,官方枚举 Off/low/high/max、默认 high);GPT-6 Astra(official 无 None 档,传 none 返回 400)与 GPT-5.6-cyber 的专门条目;OpenAI GPT-4o/GPT-4.1/GPT-5.1–5.6 按代际(含 codex 变体)+ o 系列 + gpt-oss 开源权重 + 各代非推理 -chat 线;Claude 3.x/4.5–5 按代分档(仅官方列入 effort 支持清单的型号给出档位)、Gemini、Grok 4.3–4.6、Mistral Small 2603 / Medium 3-5(reasoning_effort 模型;已弃用的 magistral 线声明为无 effort 控制)、通义含 Qwen-VL/QvQ 与 3.8 代、智谱含 GLM-4V/4.5V/4.6V/5V 与 GLM-5.2/5.3、Kimi K2.5/K2.6/K2.7-Code/K3、MiniMax M3 思考开关、豆包、混元 hy3、阶跃含 3.5/3.6/3.7、百度 ERNIE(官方接口无 effort 控制)——全部条目已于 2026-08 逐条对照各家官方文档复核,并与公开模型目录交叉印证;视觉变体单独成条,基础条目绝不替它们声称图片能力)+ 协议推断(按 pi-ai 真实线协议 `openai-completions` / `openai-responses` / `anthropic-messages`,以及从 `baseURL` 识别的 DeepSeek 官方端点方言——仅 `api.deepseek.com` 这一经验证的官方域名),一键填入推荐档位与线上取值。在此无法触及 effort 式控制的家族(Llama、Nova、Phi、Cohere、Perplexity sonar)有意不设条目——低置信度的通用建议更诚实。compat 建议按协议分门:openai-completions 门接受 thinkingFormat/supportsReasoningEffort,自适应思考的 Claude 家族在 anthropic-messages 路由上补 `forceAdaptiveThinking` 引脚,使 pi-ai 把声明的档位以 `output_config.effort` 发出。 - **端点取证**:自动适配还会经 host 同源路由探测供应商的**原始** `/models` 列表(凭据只在服务端解析、绝不回显),按置信度融合信号——端点明确"不支持推理"时直接建议禁用;知识库的线上取值始终权威;每条建议标注高/中/低置信度,低置信度建议核对后再用。同一次探测还会读取**模态披露**(OpenRouter 式 `architecture.input_modalities`、models.dev 式嵌套、`supported_features`/`capabilities` 的 vision 标志、`supports_vision`)以及端点自报的**上下文长度**——显式列表优先于知识库,沉默不改变任何判断。探测镜像 harness 内核自己的模型发现(`0.1.2-rc.1` 起,至 `0.1.6-alpha.2` 逐版未变):同一协议集合(OpenAI 兼容与新增的 **Anthropic Messages**——原生 `/v1/models` 路由、`x-api-key` 加固定 `anthropic-version`)、同时接受 `models` 映射表富目录与标准 `data` 数组两种列表形态、携带供应商配置的请求头(凭据解析出来时仍赢下自己的头名)、并应用同样的 4 MB 列表上限——靠自定义请求头认证的部署,探测与官方列表同样畅通。harness 自己的归属头刻意不发送:这是同源诊断,不是 harness 请求。 - **自动填充(避开编辑期)**:启动时由 host 为没有 `reasoningEfforts` 声明的模型自动补一份推荐声明——缺失的输入模态声明也会一并补齐(可用 `modalityAutofill: false` 关闭;已声明、显式 `false`、刻意撤销的标记一律不动,容量字段则从不写入)。运行中新增的模型由浏览器侧补写,且只在**你退出编辑卡片之后**执行(编辑期的后台写入正是"存不上"的成因);写入采用乐观锁:若你的编辑已把设置顶高,自动填充会放弃并稍后重试,绝不与你抢写。 - **三种意图**:全不勾 = 取消声明(回到继承——以 `reasoningEffortsUnset` 标记持久化,自动填充会尊重它,重启后依然有效);只勾 off = 禁用推理(`false`);勾选档位 = 写入声明。模态侧同理:未声明 = 继承提供方默认,勾选图片 = 声明收图,「清除声明」= 以 `inputUnset` 标记持久化撤销。编辑器随官方页重新渲染与推送的设置变更保持同步,你编辑到一半不会被打断。 - **Composer 思考强度滑块(整个弹窗复刻)**:官方模型菜单(右下角席位弹出的 popover)打开的那一帧起,体内即替换为上游设计——滑块(白色圆钮、渐变胶囊轨道、radiation canvas + flare;档位取自当前模型适配器播报的阶梯)带 14px 内边距,一条分隔线,然后**一行** *模型名 · 当前档位 ›*(点击打开官方模型列表)。官方“推理等级”钻取行被滑块取代(滑块本身就是档位控件);官方菜单外壳与右下角触发钮保持原样。拖动经官方 session 模型选择链路提交(乐观 + 被拒回滚,失败在菜单内提示)。档位少于两个的模型显示安静提示 + 模型行。复刻体与菜单同一帧挂载,不会先闪现官方原版窗口。切换模型会沿用你的档位:官方模型列表发起的不带档位的切换,会自动重新应用**本会话内**你选择的档位(会话内始终最高),其次该模型的默认思考强度,其次你在该模型上上次选择的档位(按「供应商/模型」记忆),最后是知识库记录的厂商官方默认档——与切换在同一原子提交中完成,中间不会闪现「Default」态(受滑块开关控制;目标模型阶梯不含该档位时保持官方默认行为)。全新会话与会话恢复由投影监视器走同一条链——监视器自会话诞生即接线,而非等你第一次打开模型菜单。 - **Composer 模型搜索(无条件注入)**:官方模型菜单处于**模型列表**面板时,列表上方注入一个搜索框。它按供应商名、模型名与模型 ID 过滤官方行(空格分词、大小写不敏感),隐藏无命中的分组,无结果时显示空态提示。输入框内 `↓` 跳到第一个命中项,`Esc` 清空查询;查询生效期间方向键**只在可见行之间**移动(不会落到被隐藏的行上)。搜索框位于官方列表之上、官方加载提示条之下,且**不改动菜单自身的尺寸与滚动**。与滑块不同,它**不受设置页开关控制**:只要插件生效就会注入。 - **每个模型的默认思考强度(issue #4)**:模型行编辑器新增「默认思考强度」选择器——每个新会话打开该模型时使用的档位。它存储在设置文档的模型行上(随部署走、跨设备一致、重启不丢),跨会话优先于记住的上次档位;会话内手动选择始终最高——你选过的档位(或显式的「跟随提供方默认」)不会被任何自动机制覆盖。选择器的候选就是该模型自己声明的档位;清除后回到记忆链,留空的模型文档上不写任何字段(无需标记——没有自动填充会去填它)。 - **模型页开关**:「推理强度滑块」开关从通用设置移出,放到**「模型」**设置页“添加提供方 / 添加自定义提供方”的下方,置于一个带边框的容器内(设置项形式与上游插件一致)。该开关无条件占据官方 `settings.models.footer` slot。 - **防御式注入**:注入依赖官方页 DOM 结构(aria-label / class),一旦官方升级改变结构,注入器自动停用、官方页不受影响;结构恢复后下次扫描自动重新注入。 - 双语文案(中文 / English)。 ## 安装 需要 DeepSeek Harness **`0.1.5-alpha.1` 及后续**(当前 0.1.x 内核发布线;peer 范围 `@deepseek-ai/dsh-api-remotes@^0.1.5-alpha.1 || ^0.1.6-alpha.1`、`@deepseek-ai/dsh-settings@^0.1.5-alpha.1 || ^0.1.6-alpha.1`,另有 `@deepseek-ai/schemastery@^3.18.0`。peer 用逐线并集而非 `>=0.1.5-alpha.1`,是因为 semver 的预发布豁免只管同 `major.minor.patch` 元组——`>=0.1.5-alpha.1` 匹配不到 `0.1.6` 的任何预发布版)。 > **还在用旧版 DeepSeek Harness?**本插件这条发布线面向 `0.1.5-alpha` 及后续——`0.1.2-rc` / `0.1.3-alpha` 线及更早版本**均不再受支持**。请升级 Harness,或安装与内核匹配的本插件旧版本(例如 `0.1.2-rc` / `0.1.3-alpha` 线请用 `dsh-better-reasoning-effort@0.3.7`)。 以 `0.1.6-alpha.2` 为编译与门禁基线(typecheck / 测试套件 / 完整构建都跑在 `0.1.6-alpha.2` 的各官方包上);最近一次**实机**运行时复核为 `0.1.5-rc.1`。 `0.1.5-rc.2` → `0.1.6-alpha.1` 的逐接缝源码复核:settings 服务(`get` / `describe` / `update` 与 `settings/updated`)与生成的 Typert `ctx.remote.settings` 契约、`settings.models` 的两个 slot 席位、slots / locale 运行时、`connection` 服务与 `connection/reset` 事件、Models 页六个锚点 aria-label 与结构类名、composer 模型弹层(`aria-controls` → `role="menu"` → `menuitem` / `menuitemradio`)、`dsh.client` 装载规则与 `/plugins//client.js` 路由、`llm` 服务的 `prepareCall` / `stream` 包装、`webServer.register`,以及 pi-ai 的 `config.ts` / `catalog.ts`(compat 键、`reasoningEfforts`、`input`)——承载实现全部零改动。两处相邻改动不在本插件的注入路径上:`ui-settings-models` 为 deepseek 家族端点加了新占位与提示文案,`ui-input-trigger` 改了斜杠命令菜单行的显示形态(本插件注入的是 `ModelSelect` 弹层)。`0.1.5` 线的既有适配说明继续成立(源码级验证:settings Remote wire、Models 页锚点、模型目录类型、slots / locale 自 `0.1.2-rc.1` 起全部原样;仅 `llm-pi-ai` compat schema 增长——pi-ai 0.85.1 新增 `thinkingTokenBudgetField` / `vllmPriority` / `supportsMaxOutputTokens`,以及 composer 模型菜单改为 portal 到 `document.body`——滑块经触发钮 `aria-controls` 链接跟随,内联形态保留为兜底)。新 schema 键按协议取用,旧内核写拒绝时自动剥离重试,全程无版本嗅探。接缝明细:settings Remote 是生成的 Typert `ctx.remote.settings` stub(无参 `describe`、位置参数 `mutate(ns, ops, expectedRevision)`、`{ok, value | error}` 包络、`settings/conflict` / `settings/rejected` 拒绝码);Models 页锚点(`Capacities`/容量、Model ID、Display name、Provider ID、Base URL、API protocol 与 `settings.models.footer` slot)全部原样;原始列表探测镜像内核自己的模型发现——同一协议集合(新含 **Anthropic Messages**,走原生 `/v1/models` 路由、`x-api-key` + `anthropic-version`)、同款 `data`/`models` 双形态解析、同款 4 MB 上限。client bundle 运行时不请求任何官方模块。 继续对 `0.1.6-alpha.1` → `0.1.6-alpha.2` 做逐接缝源码复核,只发现**两处**承载实现变更,现均已适配且**不做版本嗅探**:会话列表快照去掉了 `current` 选择态(导航交给视图持有方),因此 composer 滑块改为经 `ctx.uiSession` 的 main-view 绑定解析当前会话、并以首个 main-view 保留的目录行为兜底,同时在旧内核上继续读 `current`;`ModelDirectory.select` 改为**返回** `{ok:false}` 拒绝结果而非抛异常,档位记忆与滑块提交路径已把两种形态归一处理。Models 页折叠区文案由 `Capacities`/`容量` 改为 `Model options`/`模型选项`,注入器按 `modelAdvanced` 字典键定位、自动跟随,`Capacities` 仍作为无字典时的兜底。`0.1.6-alpha.2` 另新增官方逐行「输入类型」编辑器(`ModelInputTypes`),本插件把它当作**能力**处理:注入器在每行的折叠区 DOM 里嗅探到该控件,即在这些行上隐藏自己的模态区块,保证模态只留一个设置入口(旧内核保留本插件的区块)。其余承载面——settings Remote、slot 席位、composer 菜单 DOM、pi-ai schema、`llm` 包装与 `webServer.register`——均未改动。 **模型行编辑器统一走 DOM bypass(不做版本号嗅探):**注入器按官方折叠区的 `modelAdvanced` 字典值定位(`0.1.6-alpha.1` 线为 `Capacities`/`容量`,`0.1.6-alpha.2` 起为 `Model options`/`模型选项`),因此编辑器挂进每个展开的模型行下,就在*编辑 → 自定义设置*流程里,也覆盖未保存行(新建供应商卡片上的暂存、保存瞬间自动写入)。滑块开关占据官方 `settings.models.footer` slot,声明经插件自身的 `remote.settings` inject——与官方 Models 页消费的是同一服务契约。模型页余下的正规席位是 keyed `settings.models.provider-card`(按提供方卡片分发)——卡片级 UI 的迁移路径在它,但没有任何 slot 能触及单个模型行,这正是模型行编辑器保留 DOM bypass 的原因。 ### 从 npm ```bash # 在 dsh 的 web profile 下 dsh plugin --profile web add dsh-better-reasoning-effort ``` ### 从 GitHub ```bash # 在 dsh 的 web profile 下 dsh plugin --profile web add github:HaoyueQin/dsh-better-reasoning-effort ``` `github:` 源只拉源码,`lib/` 由包的 `prepare` 钩子构建;pnpm 默认不跑 git 依赖的构建脚本,安装器会打印需要加入 `allowBuilds` 的密钥,照做后重新 `add`。 ### 本地开发 ```bash npm install && npm run build dsh plugin --profile web add link:D:/Project/dsh-better-reasoning-effort ``` 重启 `dsh web`,硬刷新浏览器。官方「模型」页每行模型的展开区多了一块「思考强度」。 ## 使用 1. 在官方「模型」页配置第三方供应商(API Key 等)。 2. 展开某个模型行:官方容量字段下方是编辑块。 - 勾选档位(off / minimal / low / medium / high / xhigh / max),填线上取值(如给 `high` 填 `ultra`,Composer 选 High 时网关收到 `ultra`); - 在「输入模态」区勾选**图片输入**,声明模型接受什么(不勾且无声明 = 继承提供方默认,通常纯文本); - 点「自动适配」按知识库/协议/端点列表填推荐档位与模态——参考容量会以只读提示出现,可自行照抄进官方输入框; - 改动**即时进入待写入**(编辑块会这样提示),点卡片自身的**「保存」**时一并落盘;点**「取消」**或刷新页面则与卡片自带字段一起丢弃。 3. 协议兼容时,底部会出现「端点兼容」分区——`openai-completions` 上设思考预算字段 / vLLM 优先级,`openai-responses` 上设 `max_output_tokens` 的处理方式。 4. 全不勾 + 保存 = 取消声明(回到继承);只勾 off + 保存 = 禁用推理(`false`);模态行「清除声明」+ 保存 = 回到继承提供方默认。 声明后的模型在 Composer 模型选择器里立即可选思考强度;声明了图片输入的模型可以端到端传附件。 ## 配置 host 侧接受可选的配置项(以下是默认值): ```yaml - insert: - id: dsh-better-reasoning-effort name: dsh-better-reasoning-effort config: # 启动时自动填充未声明的模型(运行中的补全由浏览器侧在你退出编辑卡片后进行)。 autofill: true # 上述自动填充是否连带补写输入模态声明。 modalityAutofill: true # 上游 /models 探测请求超时,单位毫秒。 probeTimeoutMs: 15000 # 启动填充的重试退避表;[] 表示只尝试一次。 bootRetryDelaysMs: [1000, 2000, 4000, 8000, 16000, 30000] # 无档位调用在强制思考梯子上自动落厂商默认档。 defaultGuard: true ``` 设 `autofill: false` 可完全关闭静默自动填充(启动填充与浏览器侧的运行中补全一并关闭)——**Auto-adapt(自动适配)** 按钮不受影响。 ## 工作方式(架构) ``` 浏览器 (lib/client.js) Host (lib/index.js) ├─ DOM 注入器 └─ 自动填充 │ MutationObserver 监听官方模型页 settings/updated → 为未声明模型 │ → 在模型行展开区挂 EffortEditor 补 reasoningEfforts(知识库+推断) ├─ Composer 注入 │ MutationObserver 监听整个文档 │ → ComposerSlider(root 面板) │ → 模型搜索框(模型列表面板) ├─ EffortEditor(React 组件) │ 档位勾选 / 线上值 / 输入模态开关 / │ 自动适配(分区式建议展示)/ 随卡片保存写入 │ └─ 写 settings.mutate(llm-pi-ai) ``` - **知识库 + 协议推断**:`src/knowledge.ts` 的 `suggestEfforts()`,纯函数,host 与浏览器共用——融合端点信号、精选条目(档位、模态、参考容量)、命名启发式与协议推断。 - **DOM 注入**:`src/client/injection/models-page-editor.ts` 的 `reconcile()`,按官方按钮 aria-label(`modelAdvanced` 字典值:`0.1.6-alpha.1` 为 `Capacities`/`容量`,`0.1.6-alpha.2` 起为 `Model options`/`模型选项`)定位模型行,把编辑器挂进容量折叠区。浏览器侧的装配层是 `src/client/index.ts`;每条注入接缝位于 `src/client/injection/` 下的独立模块。 - **写入**:`src/client/ops.ts` 的 `createEditorApi()`,`settings.mutate` 按路径改写 `providers..models[i].reasoningEfforts`——有模态意图时一并改写 `.input`——保留行内其他字段;冲突时自动重读重试一次(与官方设置表单相同的恢复策略)。 - **共享常量**:`src/constants.ts` 承载插件 id、设置命名空间、DOM 标记,host 与浏览器共用。 ## 开发 ```bash npm run typecheck # tsc 严格检查 src npm test # vitest:知识库 / 推断 / autofill / DOM 注入 / 写入 npm run build # lib/*.js + lib/client.js(模块加载器 bundle) ``` 契约版本:`@deepseek-ai/dsh-api-remotes@0.1.6-alpha.2`(client 契约类型,peer 范围 `^0.1.5-alpha.1 || ^0.1.6-alpha.1`);开发依赖已统一到已发布的 `0.1.6-alpha.2` 各包,typecheck(0 错误)、测试套件(20 文件 / 390 测试全通过)与完整构建均针对该版本执行;运行时实测基线为 `0.1.5-rc.1`——`0.1.6-alpha.1` 与 `0.1.6-alpha.2` 目前完成的是源码级复核与上述门禁,实机复核未做。测试套件钉住 composer 菜单发现(portal 与内联双形态),`0.1.2-rc.1` 降级重试路径保留为安全网。 在 `0.1.5-rc.1` 内核上的运行时复核(2026-09):settings Remote 的 `describe`/`mutate(ns, ops, revision)` 契约、Models 页锚点、slider 的菜单发现全部原样;rc.1 对 `llm-pi-ai` 的两处加严已被本插件覆盖——模型级 compat 必须属于该模型解析出的协议(写拒绝时按协议剥离并重试,拒绝文案已逐字钉进测试),以及存量无效配置改为在提供方卡片上就地显示错误而非整体失败。 ## 已知限制 - 注入依赖官方 Models 页当前 DOM(aria-label/class)。官方升级若改结构,注入自动停用,需要跟进适配;停用期间官方页不受影响。 - 官方模型菜单的箭头键焦点漫游遍历的是它自己(已被隐藏)的根单元格——对 display:none 节点 focus() 是空操作;键盘用户经 Tab 到达复刻体,复刻行的 Enter 可打开官方模型列表。 - 「自动适配」的探测路由只应答 **loopback 与 IP 字面量 Host**——采用核心 `/api` 栅栏同款 Host 白名单纪律,但暂无其 `trustedHosts` 出口(DNS rebinding 页面的 Host 必然是攻击者域名,因此域名宿主一律拒绝)。以域名对外提供 GUI 的局域网部署,仅此一条探测路由会得到 403(IP 字面量宿主不受影响),其余功能照常。 - 「自动适配」的探测请求**不跟随重定向**(`redirect: 'error'`):它带着你存储的凭据,而跨源跳转并不会剥离它自己组装的鉴权头——因此只有 profile 里写明的那个地址能收到它。代价是有界的:仅在 30x 之后才列出模型的网关拿不到端点证据,自动适配退回知识库/协议推断,与端点无应答时同一条降级路径。 - `reasoningEfforts` 声明是建议值:网关实际接受哪些档位/取值以端点文档为准,可在 UI 里逐个修改。 - 知识库覆盖面有限——各家上新后拼写会漂移,不吃 effort 档的家族则完全无条目;未收录的模型走协议推断 + 通用档位,可手动调整。 - 端点兼容开关刻意不做自动填充:`supportsMaxOutputTokens` 与 `vllmPriority` 描述的是网关行为而不是模型能力,因此没有模型条目携带它们。安全默认(未设置)会按协议常规发送该字段;只有当网关确实拒收时才需要改。 - 模态词表跟随 pi-ai 核心(当前为 `text` / `image`)。部分网关支持的更宽能力(PDF、音频、视频)已按家族记录在案,等核心词表扩充后再开放声明——今天声明不了是设计使然,不是疏漏。 - 声明了图片能力的模型,在请求图片超出内核/端点预算时的失败模式随内核而变:`0.1.6` 起内核抛 `IMAGE_OFFLOAD_REQUIRED`,由 compaction 侧决定卸载哪几张图(`0.1.5` 是把最旧的图片静默换成占位文本)。声明与编辑器行为不变,这条只影响超预算请求的表现。 - 名字启发式的模态建议(`*-vl*` / `*vision*` / `gpt-4o` 一类视觉味 id)刻意标注为低置信度——使用前请核对。 - 自建中转:自动填充与自动适配会在无法归属官方的 `openai-completions` 路由上钉死 `supportsDeveloperRole: false`,系统提示保持 `system`(部分上游拒绝 `developer`,报角色信息不正确)。已有显式值永不覆盖——唯一的例外是端点兼容区那几个下拉框:把某一项选回"未设置"再保存卡片,就是要撤回那次设置,编辑器只会删除它自己展示过的字段。全部取消勾选 + 保存可清除声明回到裸请求(提供方默认),即中转兼容模式。 - 强制思考模型(无 `off` 档的梯子,如 GLM-5.3):提供商测试与 Default 调用原本会发送 `thinking: disabled` 而失败(如 1210)——host 侧会将其映射到梯子的厂商默认档。设 `defaultGuard: false` 可恢复旧行为。 ## 致谢 Composer 思考强度滑块**改编自 [dsh-reasoning-effort](https://github.com/HanaAyane/dsh-reasoning-effort)(作者 [HanaAyane](https://github.com/HanaAyane),MIT 许可)**——感谢原作者与 codex 风格思考强度控制的思路。 本插件取自它的部分: - 其依托的 session 模型选择契约(按会话的模型目录 → 适配器播报的档位阶梯 → `selectModel` 提交,乐观快照 + 被拒回滚); - 滑块交互形态(拖动 / 键盘操作,滑块旁显示档位名)。 集成时的**刻意改动**: - **只把滑块换成白色圆形。** chibi-runner“大肥鱼”滑块(把圆钮换成鱼形贴图)不带入;其余与上游逐字一致——渐变胶囊轨道、左侧裁剪的 canvas 辐射动效与 flare 辉光、拖动/键盘契约、乐观提交 + 被拒回滚。 - **官方模型席位绝不被替换。** 上游插件把整个席位顶掉(自绘触发钮 + 菜单);这里官方右下角 *模型 · 思考强度* 显示形式保持原样,滑块在官方菜单弹出时注入到其顶部。 - **位置与设置项减少。** 上游的“推理强度滑块 / 大肥鱼滑块”两项在通用设置页;这里只保留 *推理强度滑块* 开关,放在**「模型」**页添加提供方按钮下方的带框容器内;“大肥鱼滑块”随功能一起移除。 - **面向 `0.1.5-alpha` 及后续线维护**(编译与门禁基线 `0.1.6-alpha.2`)。 这是基于 harness wire 契约的精简重写(不是上游 bundle 的 fork):无需上游的 `0.1.0-rc.6` 版本钉死,可跑在 `0.1.5-alpha.1` 及后续内核上(见上方兼容性说明),整个挂载/卸载生命周期由本插件的 DOM 注入器管理。若上游项目恢复更新,留意两点:两个插件同时装会重复——上游再次顶掉官方席位,官方触发钮会再次消失。 如果你之前用过上游插件,请移除它,避免同席位上出现两套思考强度控制: ```bash dsh plugin --profile web remove dsh-reasoning-effort ``` ## Activity [![HaoyueQin/dsh-better-reasoning-effort GitStock K-Line Chart](https://gitstock.org/HaoyueQin/dsh-better-reasoning-effort/stock.svg)](https://gitstock.org/HaoyueQin/dsh-better-reasoning-effort) ## License MIT