# Changelog All notable changes to `dsh-effort-router` (formerly `dsh-model-router`). This project follows [Semantic Versioning](https://semver.org/). ## 0.3.0 — 2026-09-10 **改名发布版。** 第一个可对外分发的版本:包名从 `dsh-model-router` 改为 `dsh-effort-router`。 ### Changed - **包名 `dsh-model-router` → `dsh-effort-router`**:npm 上的 `dsh-model-router` 已被他人占用(`thedeveloper256`,0.7.0,且是完全不同的「角色制路由」)。用旧名安装会装到别人的插件,npm 也不允许重名发布。中文名「模型分流」不变;GitHub 仓库名保持 `dsh-model-router`。 - 随之同步:`cordis.patch.yml` 中插件树的 `name`、`build.mjs` 里客户端包的注册 id(`window.__ModuleLoader__.load({ id })` 必须等于包名,否则启动时报 "loaded without registering")、语言命名空间、`tools/check-reload.mjs` 的默认安装目录。 - **存储目录跟随包名**:新目录 `storages/dsh-effort-router`;若只存在旧目录 `storages/dsh-model-router`(升级场景)则继续沿用旧的,配置与决策日志不丢。 - 插件内部标识保持稳定:HTTP 前缀 `/api/model-router`、插件树 entry id `model-router`、设置页 tab id 均未改动。 ### Notes - 0.2.0 的全部内容(座位同步、灰区判定、思考强度阶梯、即时开关、手选保护、28 个测试)都已包含在本版本中;0.2.0 从未对外发布。 ## 0.2.0 — 2026-09-10 首个公开发布版本。相比 0.1.x 的内部迭代,这一版把"会不会误改你的东西"这件事彻底收紧,并补齐了图片档的难度维度。 ### Added - **输入框一键开关** `🧭 分流:开 / 关`(`conversation.input.right`):点一下即时写盘并生效,不用进设置、不用找保存按钮。 - **本轮实际读数带**(`conversation.composer.dock`):显示这一轮真正发出去的 `模型@思考强度` 与档位,和决策日志一致;关闭分流时显示"自动分流已关闭"。 - **图片档的思考强度阶梯** `visionEffort: { simple: low, standard: high, hard: max }`:图片档只固定模型(能收图的就那么几个),强度跟随难度——风景照 `low`、带图排错 `high`、报错截图+根因 `max`。 - **灰区判定** `llmClassifier`:规则判定落在 `standard`(最不可靠的中间带)时,交给一个便宜模型判一次难度(`maxTokens: 8`、4 秒超时、失败即退回规则)。明显简单/明显困难的轮次零开销,且**不再需要维护任何关键词表**。 - **配置指纹自检** `tools/check-reload.mjs`:让运行中的宿主自己报出它加载的各文件哈希,直接回答"这次改动要重启宿主还是刷新页面",退出码 0/1/2/3/4 可脚本化。 - **`imageAutoSwitch` 开关(默认关)**:显式选择"发图前自动切到图片档"这项便利,并对其代价做书面说明。 - 面板新增:图片档强度三行、灰区判定配置、分类测试的"配图张数"(不用真传图即可验算)、最近决策的"判定依据"列。 - 27 个测试用例(判定规则 / 图片阶梯 / 灰区判定 / 开关与手选 / 图片守卫 / 座位同步 / HTTP API)。 ### Fixed - **关掉分流仍然生效**:面板上的开关之前只是本地草稿,必须滚到面板底部点"保存配置"才写盘;现在改为即时保存,并新增配置指纹(`configStamp`)让宿主的计划缓存立刻失效——下一条消息就生效。 - **手选模型被覆盖**:旧的"尊重手动选择"拿会话模型和从 settings 读到的全局默认模型比对,一次读取失败就会静默失效。现在按会话记账:会话开局的模型 + 插件自己设过的模型(含图片守卫钉的)都不算手选,只有落在其它模型才算你手点过,让开并在日志写 `skip:manual`。 - **图片守卫不认开关**:关掉分流后发图仍会把会话切到 vision 模型;现在它只在"分流开 + 带图自动切"同时成立时才动手。 - **每次发图都重写默认模型**:会话已在目标选择上时不再重复 `selectModel`;确实需要切换时,守卫会先通过新端点 `GET /api/model-router/default` 读走你当前的全局默认模型,切换完成后立刻 `POST` 写回——`selectModel` 会顺手把选择存成默认模型,这个副作用对使用者不可见。 - **座位与实际不一致**:守卫钉会话时改为先问插件自己的 `/preview`,拿到**含难度阶梯的完整目标**再钉;同模型但强度不对也会纠正。 - 图片档的强度不再被固定成 `low`:`needsVision` 之前会短路难度分支,导致 2/4 档的差别全部丢失。 ### Changed - **座位同步(取代“带图自动切”开关)**:发送前客户端先 `POST /api/model-router/preview` 取得本轮计划(与正式判定同一套代码路径:规则、思考强度阶梯、强制关键词、共享的灰区判定结果),再把它写进会话选择——于是**输入框里的模型框显示的就是这一轮真正会用的模型**;带图轮的计划本身就是图片档目标,harness 的图片准入检查随之自然通过。写入前后会读走并写回全局默认模型(新增 `GET/POST /api/model-router/default`),所以你“设置 → 模型”里的默认模型不会被改。手选模型仍然优先:预览返回 `manual` 时客户端不动,宿主也在同一轮跳过并记 `skip:manual`。 - 移除 `imageAutoSwitch` 开关与独立图片守卫:座位同步覆盖了它的全部作用,且不再留下“座位被钉住、不再跟随分流”的副作用。 - 会话账本(开局模型 / 插件引入的模型 / 灰区判定结果缓存)抽到 `lib/state.js`,由请求水路与 HTTP API 共用——这是“预览与正式判定给出同一个答案、且灰区小模型一轮只调用一次”的前提。 ### Notes - **host 半边**改动需要重启宿主;**client 半边**只需刷新页面;配置改动两者都不需要。`tools/check-reload.mjs` 会直接告诉你属于哪一种。 ## 0.1.0 — 2026-09-10 - 初版:`agent/request` 水路 + 规则分类四档 + 面板(分档映射、强制关键词、分类测试、最近决策)+ 决策日志。