Repository navigation
Releases: 1204244136/dsh-model-detector
Release list
dsh-model-detector v0.0.12
dsh-model-detector v0.0.12
本次发布修复 每次切换到「模型检测」设置页卡顿约 1 秒、且中间闪烁「当前未配置任何提供方」空白状态 的问题。引入前端模块级会话缓存(SWR)与加载态守卫,实现切换 Tab 0ms 瞬间满状态呈现,彻底消除切换延迟与闪烁,并优化后端提供方列表查询至亚毫秒级(<1ms)。
修复
-
前端状态易失与切换卡顿(根因修复):
- DSH 设置外壳(
SettingsRoot)在用户切换设置侧边栏导航时只渲染当前激活的 section,未激活的 section 组件会被彻底卸载(Unmounted)。此前所有状态(providers、sel、已发现的模型列表、编辑草稿等)全部放在组件内部的useState中,导致每次切回「模型检测」都会重新 mount、状态全失、重新发起 HTTP 请求,产生约 1 秒的等待卡顿,且切走会导致已编辑但未保存的草稿丢失。 - 引入模块级会话缓存(
sessionStore):组件挂载时直接从会话缓存读取上一次的提供方列表、选中的路由、当前模式(发现/编辑)、已发现模型列表以及未保存草稿,切回 Tab 瞬间 0ms 满状态呈现,完全无缝、零卡顿。 - SWR 静默校验机制:挂载时优先呈现缓存数据,并在后台静默比对刷新提供方列表;若系统配置发生变更则无感更新,若无变更则不打扰用户当前视图。
- DSH 设置外壳(
-
加载态缺失导致提前误报「当前未配置任何提供方」:
- 组件初次渲染且网络请求在途期间,因
providers为空数组且!busy,条件直接命中,导致界面在数据到达前错误地提前展示「当前未配置任何提供方」,且顶层下拉框塌陷、按钮置灰。 - 增加
providersLoaded状态守卫:- 数据在途时(
!providersLoaded):顶层提供方下拉框显示「正在加载提供方…」占位符且保持尺寸,中间区域展示带旋转图标的优雅加载态,绝不提前误报「当前未配置任何提供方」; - 确已加载完毕且提供方确为空时(
providersLoaded && providers.length === 0):才展示空状态提示。
- 数据在途时(
- 组件初次渲染且网络请求在途期间,因
优化
- 后端
listConfiguredProviders单快照索引优化:- 0.1.7 适配后读配置走
st.describe({ redactSecrets: false }),内部需要全量遍历所有 Loader entries 并做 schema 投影与反序列化。原代码在循环处理每个 route 时多次调用resolveTarget、resolveNamespace、readProviders,导致单个接口内重复调用 20 余次全局st.describe()。 - 改用
getDescriptorsMap(st)单次快照建立命名空间 Map,循环内走 O(1) 索引,消除数十次冗余全量遍历与克隆,接口响应速度提升至亚毫秒级(<1ms)。
- 0.1.7 适配后读配置走
测试与校验
- 端到端 DOM 真实渲染回归(
verify-client-dom.mjs,增至 23 项):- 新增首次挂载在途状态守卫断言(网络在途时显示加载态,绝不误报空状态);
- 新增模拟用户切走其他设置页(组件卸载)再切回(组件重新挂载)的断言:首帧 0ms 立即可见全部模型,未保存草稿完好无损,未保存提示依然保留,后台静默 SWR 刷新无缝。
- Host 回归(
npm run verify):144 / 144 通过 - Client 纯逻辑(
npm run verify:client):26 / 26 通过 - Client 真实渲染(
npm run verify:client-dom):23 / 23 通过 - 类型检查(
npm run typecheck):通过
安装·升级
dsh plugin --profile web add npm:dsh-model-detector
⚠️ 升级后必须重启 DSH(桌面版点右上角「重启」,或重启dsh web并刷新页面)。
dsh-model-detector v0.0.11
dsh-model-detector v0.0.11
本次发布修复 DSH 0.1.7 破坏性变更导致设置页恒显示「当前未配置任何提供方」 的问题:框架把 settings 服务换成了 SettingsForms(只投影 Loader 配置,不再提供 get(ns)),插件读取配置的那一步抛错被吞掉,于是所有提供方、模型都列不出来。同时修复了 pi-ai 目录数据在新安装布局下找不到的问题。本机实测已恢复:6 条路由(5 个 pi-ai 提供方 + DeepSeek 官方)全部正常列出。
修复
-
适配 DSH 0.1.7 的 settings 服务重构(本次故障根因):
- 0.1.7 起
settings是SettingsForms,成员只有describe / update / replace / mutate / writable / documentPath / prepareDocument / configure——没有get()。旧版写法settings.get('llm-pi-ai').providers抛TypeError,被readSection的try/catch吞掉后,提供方表恒为{}:界面显示「当前未配置任何提供方」,_dsh_model_detector_status返回providers: [],而/providers接口本身是 200(所以不是网络/权限问题,是读配置失败)。 - 读值改走
describe({ redactSecrets: false }):value= 该条目 volatile 子树的完整生效值,user= profile 的 patch 覆盖层;namespaceRegistered改为按"描述符是否存在"判定(描述符只列出 ACTIVE 且含 volatile 字段的条目)。 readProviders()优先读user层:它才是"用户真正配了什么",也是写入基座;若用含 schema 默认值的value回写,会把defaultContextWindow之类的默认值固化成用户配置。- 写入改走
mutate()路径精确改键(与官方ui-settings-models/CustomProviderCard同款):pi-ai 为set ['providers', route](整体替换该 route、其它 route 不受影响、且能真正删键),deepseek 为set/unset ['models'],清空时用unset回落适配器内置目录。不再使用replace()写"完整 user 层"——0.1.7 的replace内部是mergeLayers(base, input),会把继承层(bundle 默认值)一并固化进用户配置;replace()仅作为旧版回退保留。 - 旧版 DSH 的
get()仍保留为回退路径,两代框架都能跑。 - 命名空间一律以
describe()里实际出现的ns(= Loader 条目 id)为准,不再依赖硬编码。
- 0.1.7 起
-
修复 pi-ai 目录数据找不到(连带失效):
- 0.1.7 的 pi-ai 数据在
<DSH 安装目录>/resources/app/node_modules/@earendil-works/pi-ai/dist/providers/data,旧候选表只找@deepseek-ai/dsh/node_modules/...→ 本机候选全部落空(诊断恒报「pi-ai 目录数据目录未找到」),导致"编辑现有模型"列不出目录模型、modelOverrides判定永远为假。 - 改为「种子目录(
process.resourcesPath/app、execPath所在目录、cwd、DSH_HOME、DSH_CHECKOUT、全局 npm)+ 逐级向上找node_modules+ pnpm.pnpm/@earendil-works+pi-ai@<ver>布局兜底」,并支持DSH_PI_AI_DATA_DIR显式指定,不再被安装布局变化打死。
- 0.1.7 的 pi-ai 数据在
实测
-
环境:DSH Desktop 2.0.14(内置 dsh 0.1.7-rc.1),插件以 junction 方式装在
webprofile。 -
重启前:
_dsh_model_detector_status→providers: [](即便llm-pi-ai里配了 5 个路由)。 -
重启后 → 6 条全部列出,命名空间/目标识别正确:
route 展示名 ns 模型数 deepseek-officialDeepSeek(官方 API) llm-deepseek2 volcengine火山方舟 llm-pi-ai1 antigravityantigravity llm-pi-ai2 wbWorkBuddy llm-pi-ai6 axis小柠同学API llm-pi-ai3 mimo玛玛的爱 llm-pi-ai2
开发侧(为什么以前 125 项全绿也没挡住)
scripts/verify.mjs的假 settings 服务提供了框架已经删掉的get()—— 桩比框架"好用",于是测不出线上故障。现在桩逐项对齐真实SettingsForms(describe / update / replace / mutate,故意不含get),并新增 ⓪ 段守卫:- 无
get()时仍能列出提供方;modelCount从配置读; - 写入不得把继承层默认值固化成用户配置(桩区分
base与user); - 只改点名的那一个 provider,其它 provider 一个字段都不动;
apply空列表 →unset掉models键(回落适配器目录),而不是写一个空数组;- 本机真实配置形状(5 个路由)全部列出且可解析写入目标。
- 无
- pi-ai 目录用例不再"跳过":用临时目录 +
DSH_PI_AI_DATA_DIR注入,modelOverrides链路每次回归都会真的跑。 AGENTS.md新增「settings 服务形态(0.1.7 破坏性变更,必读)」章节,写明读/写/命名空间规则与"桩必须复刻真实服务形状"的教训。
安装·升级
dsh plugin --profile web add npm:dsh-model-detector
⚠️ 升级后必须重启 DSH(桌面版点右上角「重启」,或重启dsh web并刷新页面)。
DSH 的 HMR 默认root: [](不监听插件代码),运行中的进程在启动时就把lib/读进内存了,热改不会生效。
校验
npm run verify(host):144 / 144 通过(此前 125 项,新增 19 项 settings 形态 / 真实配置形状用例)npm run verify:client(草稿纯逻辑):26 / 26 通过npm run verify:client-dom(jsdom 真实渲染):14 / 14 通过npm run build:通过(host tsc + client tsdown)
dsh-model-detector v0.0.10
dsh-model-detector v0.0.10
本次发布新增对 DeepSeek 官方账号路由(deepseek-account)及独立 API Key 命名空间的支持,预置官方最新默认模型 deepseek-flash(原生多模态),扩展了 catalogModel 的 systemPromptUpdate / toolUpdate 参数配置与清洗规则,并强化了跨平台构建依赖的自动探测与修复机制。
新增
- DeepSeek 官方账号路由(
deepseek-account/llm-deepseek-account):- 支持官方网页账号/OAuth 登录方式的提供方路由检测与模型管理。
- 账号路由无需单独配置 API Key 环境变量(
apiKeyEnv: ''),默认指向官方端点https://api.deepseek.com。 - 支持完整的模型发现、写入、手动编辑、删除,以及路由级推理档位(
reasoningEffort: off/low/high/max)和思考开关(thinking: enabled/disabled)配置。 - 提供方列表(
listConfiguredProviders)已内置对deepseek-account的自动枚举与识别。
- 独立 API Key 命名空间支持(
llm-deepseek-api-key):- 兼容 DSH 最新插件拆分规范,在 settings 注册
llm-deepseek-api-key时自动适配映射,保障平滑过渡。
- 兼容 DSH 最新插件拆分规范,在 settings 注册
- 官方最新默认模型
deepseek-flash预置:- 清单中收录官方最新模型
deepseek-flash(展示名DeepSeek-V41-Flash),预置text+image双模态支持、1M 上下文及 384k 输出上限。
- 清单中收录官方最新模型
- 扩展 catalogModel 参数支持:
- 写入白名单支持
systemPromptUpdate(合法值'in-history')与toolUpdate(合法值'in-history' | 'addition-only')。 cleanDeepSeekModel增加对应字段清洗逻辑,非法值自动过滤,防止错误数据落盘。
- 写入白名单支持
优化
- 构建依赖环境自动链接与修复:
scripts/build.mjs新增ensureDependencyLinks(),自动探测本地node_modules与 DSH Desktop 安装包 / 源码 checkout 的依赖并按需建立 junction 符号链接,失效链接自动重建,构建不再因环境软链接断开而报错。
- 依赖声明规范化:
- peerDependencies 更新为
@deepseek-ai/cordis与@deepseek-ai/schemastery(旧版cordis/schemastery标记为 optional)。 - 新增
src/ambient.d.ts提供完整的 ambient 类型定义。
- peerDependencies 更新为
安装·升级
dsh plugin --profile web add npm:dsh-model-detector升级后重启
dsh web并刷新页面(插件从已构建的lib/加载,运行中的进程在启动时就把代码读进内存了)。
校验
npm run verify(host):125 / 125 通过(新增 13 项官方账号路由、新模型与清洗规则用例)npm run verify:client(草稿纯逻辑):26 / 26 通过npm run verify:client-dom(jsdom 真实渲染):14 / 14 通过npm run build:通过
dsh-model-detector v0.0.9
dsh-model-detector v0.0.9
本次发布修复同一模型按区域挂成多条 id 时展示名完全相同、用户无法分辨的问题,并清理了一处与 DSH 官方样式不一致的装饰元素。
修复
cn:/global:同名变体在界面上无法分辨:- 根因:为了让 WorkBuddy 这类区域命名空间网关的模型能富化命中,归一化匹配必须剥掉区域前缀(不剥时实测命中率 0%)。但展示名跟着一起被剥了 ——
cn:deepseek-v4.1-flash与global:deepseek-v4.1-flash富化后拿到同一个收录名,写进 DSH 后模型选择器里两条一模一样,用户无法判断该选哪个区域。 - 修复:新增
disambiguateNames(),在「仅前缀不同 + 同时出现」时把前缀补进展示名(cn:DeepSeek V4.1 Flash/global:DeepSeek V4.1 Flash)。三条触发条件缺一不动,避免误伤:必须同名、必须同时出现(≥2 条)、必须仅前缀不同。 - 模型
id一字不动(路由靠它),只改展示名。
- 根因:为了让 WorkBuddy 这类区域命名空间网关的模型能富化命中,归一化匹配必须剥掉区域前缀(不剥时实测命中率 0%)。但展示名跟着一起被剥了 ——
- 前缀不足以区分时的唯一性兜底:
- 根因:
global:deepseek-v4.1-flash与global:deepseek-v4.1-flash-sg前缀相同,差别只在被REGION_SUFFIX_RE归一掉的区域后缀 —— 加前缀救不了,仍然重名。 - 修复:仍重名的那几条退回原始 id(列表的唯一键,必然可分辨),末尾再跨组兜一次。展示名唯一是硬保证;前缀能区分开的仍保留加前缀的漂亮名字。
- 根因:
- 幂等:展示名已带命名空间前缀就跳过,重复作用不会叠成
cn:cn:X。 - 标题前的装饰性蓝圆点:
- 根因:该圆点(
.mc-headDot)自 0.0.1 起就存在,是aria-hidden的纯装饰元素 —— 无状态指示、无点击行为,而 DSH 官方各 section 的标题就是纯文本(官方ModelsSection的.title只有字号/行高/字重/颜色)。官方页面上的圆点都是有语义的(如credentialDot绿=已配置、红=缺失),装饰性圆点不符合该惯例,视觉上像多出来的东西。 - 修复:删除该 CSS 规则与对应 JSX,标题与官方样式对齐。
- 根因:该圆点(
变更
- README 徽标改为动态:原先中英两份 README 都写死
version-0.0.4徽标,而实际已发到 0.0.8(落后 4 个版本)。改用 shields.io 动态徽标(npm/v跟随 registry 最新版、npm/l许可证、npm/dm下载量),以后发版不再需要手动改 README。 - 效果图更新:
docs/preview.png换成展示 WorkBuddy 65 个模型的新版界面(含消歧后的cn:Hy3、计费倍率徽标、推理档位 chip)。
实测
- 用真实 models.dev 数据 + 真实
wb清单跑通:cn:deepseek-v4.1-flash/global:deepseek-v4.1-flash/global:deepseek-v4.1-flash-sg三条混合场景下展示名全部互不相同,id全部保持原样。 - 假网关走真实
/discover→/apply全链路:前端收到的models与落盘配置的name均可分辨,落盘id保留前缀(路由正确)。
开发侧
src/api.ts新增modelIdPrefix()/prefixNameOverrides()/disambiguateNames()。- 三个链路都接:
mergeDiscovered(发现页)、mergeManifest(离线兜底)、currentModels(编辑页建议名)—— 只接一个的话,用户在另一页点「采纳」后两条又会变得一样。 AGENTS.md补充「展示名必须唯一」硬约束与两个必接链路。- 回归用例新增 ②g 段 22 条:幂等、区域后缀、跨组重名、组合不重名硬保证、编辑页建议名、纯清单兜底。
安装 / 升级
dsh plugin --profile web add npm:dsh-model-detector升级后重启
dsh web并刷新页面(插件从已构建的lib/加载,运行中的进程在启动时就把代码读进内存了)。
校验
npm run verify(host):112 / 112 通过npm run verify:client(草稿纯逻辑):26 / 26 通过npm run verify:client-dom(jsdom 真实渲染):14 / 14 通过npm run typecheck:通过npm pack --dry-run:17 files
dsh-model-detector v0.0.8
dsh-model-detector v0.0.8
本次发布修复**「编辑现有模型」修改多条时单条保存导致全部按钮误显示「已保存」且未保存草稿被静默丢弃**的严重问题。
修复
- 单条保存草稿静默丢弃与误报「已保存」:
- 根因:此前在保存单条模型后,直接调用了全量
loadCurrent()。该函数从服务端拉取全量数据并整体覆盖重置了前端drafts表。未保存的其余模型被直接覆盖回服务端的旧值,导致dirty判断全部转为false,所有按钮瞬间变成「已保存」且处于禁用状态,用户此前编辑的数据全部丢失。 - 修复:将草稿与脏检查纯逻辑抽离至
src/client/drafts.ts;改造loadCurrent为局部增量重同步模式(syncIds):保存某模型后只重同步该条模型草稿为最新基准,其余所有卡片的未保存本地草稿完整保留,按钮与卡片保持「未保存」与可编辑状态。
- 根因:此前在保存单条模型后,直接调用了全量
- 手填新模型草稿无法直接保存:
- 根因:手填的新模型号因未在服务端落盘,原先初始基线被视为空对象
{},与未编辑时的空白草稿计算比对结果为一致,误判为未修改状态导致按钮显示禁用的「已保存」,且刷新后该卡片会直接消失。 - 修复:为未在服务端落盘的手填草稿标记
draftOnly: true,在draftIsDirty中对其强制判定为脏状态,保证手填模型后按钮即可点并能正常保存;在mergeDrafts中保证未落盘的手填条目在增量重载时不被误删。
- 根因:手填的新模型号因未在服务端落盘,原先初始基线被视为空对象
- 草稿比较顺序敏感引起的假脏:
- 规范化草稿键序(
canonicalDraft):排序input数组与按EFFORT_ORDER规范化efforts字典,消除因点击顺序不同导致的假性「未保存」标记。
- 规范化草稿键序(
- 状态消息被重载立即抹除:
- 增量同步时开启
quiet: true,保存成功后的「已保存 xxx」反馈提示不再被loadCurrent开头的setStatus(null)清除。
- 增量同步时开启
- 保存后搜索与翻页被强制重置:
- 增量重同步不再清空搜索关键字(
q/debouncedQ)与当前页码(page)。
- 增量重同步不再清空搜索关键字(
- 异步竞态保护:
- 引入
selRef,当响应返回时若用户已切换提供方路由,自动丢弃过期旧响应,避免草稿跨路由串台。
- 引入
新增
- 顶部未保存条数常驻提醒:
- 在分页栏旁实时显示「未保存 N 条」语义标签,即使处于搜索过滤状态也能准确统计并提醒全局未保存的卡片数量。
- 主动重读提示:
- 顶栏「读取现有模型」按钮在存在未保存条目时提供 Tooltip 明确提示「会以服务端为准重新读取,丢弃 N 条未保存的改动」。
测试与验证
- 新增
npm run verify:client(23/23 通过):覆盖多条保存草稿保留、旧行为对照复现(确认三条都变已保存的 bug)、手填草稿报脏、删除不残留、顺序无关性等用例。 - 新增
npm run verify:client-dom(14/14 通过):使用真实打包后的lib/client.js+ jsdom + 真实 React 运行时测试用户操作流程(读取模型 → 编辑 3 条 → 保存 1 条),证实修复前确实存在 7 项失败,修复后 14 项全绿。 - 原 Host 测试
npm run verify(90/90 通过)保持全通。
安装 / 升级
dsh plugin --profile web add npm:dsh-model-detector升级后重新打开或刷新「设置 → 模型检测」即可生效。
dsh-model-detector v0.0.7
dsh-model-detector v0.0.7
本次发布修复本地代理 / 网关提供方的模型识别与元数据准确性,并补齐发现页的展示信息。
⚠️ npm 用户注意:npm 上此前最新是0.0.5(0.0.6只发过 GitHub Release),因此本版说明同时包含 0.0.6 的内容。
修复:本地代理 / 网关的模型识别
- 根因一:线上清单端点此前只试
<baseURL>/models。走 Anthropic 协议的路由 baseURL 不能带/v1(SDK 自行拼/v1/messages),而这类本地代理的清单恰恰只在/v1/models→ 永远 404、发现拿不到任何 id。现依次尝试两个端点,并把失败原因串成可读提示(原先前端只显示"获取到 0 个模型") - 根因二:模型号里的思考档位后缀(
gemini-3.8-flash-high/-low/-tiered)不在噪声白名单,无法与 models.dev 的gemini-3.8-flash等效,整批落保守默认。-max故意不剥——它在真实数据里是独立模型档(gpt-5.1-codex-max、qwen3.6-max) - 根因三:模型号里的区域命名空间前缀 / 后缀(
cn:deepseek-v4.1-flash、global:glm-5.3、-sg、@eu)未剥离 → WorkBuddy 的 65 条命中率 0%。冒号前缀只认显式区域词,避免把 ollama tag(gpt-oss:20b)与 Bedrock id 削成垃圾键而互相误命中 - 选候选改为三层:原始同名 → 归一化同名 → 前缀等效,避免
glm-5.1被容量更大的上一代glm-5抢走 - 跨厂商回退在同类里取多数派,不再取单家网关的乐观容量;清单新增
upstream声明(antigravity / wb),第一方厂商优先
变更:能力元数据优先采用端点自声明
/models里端点自己声明的字段(上下文长度、输出上限、是否收图、思考档位、显示名)现在逐字段优先于 models.dev 快照,端点没声明的字段才回落- 为什么:端点声明才是它实际允许的能力。实测某网关的输出上限被 models.dev 写成 384000,而端点自己声明只有 50000 —— 照 384000 发请求会被上游拒
- 只在
id/object/created/owned_by之外什么都没声明的路由(如 antigravity 反代)行为完全不变 - 编辑页(「编辑现有模型」)的建议值同样改用线上声明,并按精确 id 区分变体:
cn:与global:是不同部署、能力可能不同(实测一个支持 low/high/max 三档、另一个只有 high),此前两者都会被建议成 models.dev 的乐观值(输出上限 384000 > 端点真实上限 128000),点「采纳」就会写坏 - 拉取线上清单补了超时(此前完全没有:半开连接会让编辑页卡在「正在读取现有模型…」)
新增:发现页展示端点声明的计费倍率
/models里的credits字段(x0.03= 3% 计费,x0.00= 免费)现以 chip 展示,x0.00用绿色- 仅展示,不会写入配置(DSH 的 modelProfile / catalogModel 都不认这个字段),回归测试有专门用例守着
- 归一化处理了同一端点混用的两种写法(
"x0.21"与"x0.34 credits")
修复:展示字段此前从未显示
/discover返回给前端的models经过一层字段白名单,而来源徽标(「线上声明」/「models.dev」/「清单」/「默认」)、「内测」标记、计费 chip 都只加在了内部raw里 —— 前端读的是models,所以这些徽标从来没有显示过。现已让展示字段穿过该层(写入路径仍受白名单保护)
界面:列表更紧凑
- 发现页每条原本「提供方 id」与「收录名」各占一行、右侧大片空白;现收录名并到同一行,每条省一行
- id 保持单行完整显示(主信息),收录名吸收收缩并在空间不足时省略(悬停可看全)
实测
- antigravity:94 条全部命中(
gemini-3.8-flash-high= 1048576 / 65536 / 含图) - WorkBuddy:65/65 采用端点自声明值(
cn:hy4-preview-f= 1000000 / 64000 / 含图,此前落保守默认262144/32768/纯文本);54 条带计费标注(x0.00~x6.67)
开发侧
npm run verify扩到 90 项:新增「线上清单端点 + 档位后缀」「区域前缀 / 同名优先 / 多数派」「线上声明优先(发现链路 + 编辑页)」「计费标注只展示不落盘」「展示字段穿过toTargetModel」五段回归package.json增加prepack(build + verify),npm pack/npm publish不会再发出未构建的lib/AGENTS.md补齐归一化规则、候选三层、upstream与多数派、线上声明优先的取舍、展示字段穿透陷阱,以及实际发布流程
安装 / 升级
dsh plugin --profile web add npm:dsh-model-detector升级后必须重启 dsh(host 半区代码在启动时加载,仅刷新页面不会生效),再打开「设置 → 模型检测」。
校验
npm run build + npm run typecheck + npm run verify(90 通过 / 0 失败);布局预览浅色 / 深色 / 430px 窄面板均已截图核对。
⚠️ 升级后重新「发现新模型」会得到与 0.0.5 不同的元数据(更贴近端点真实能力)。注意「应用所选」是整体替换该提供方的models列表,建议先「清空」再勾选需要的模型。
dsh-model-detector v0.0.6
dsh-model-detector v0.0.6
本次发布修复 两类提供方模型"认不出来"的问题(antigravity 发现 0 条 / WorkBuddy 全靠模型名猜),并把能力元数据的来源改为优先采用端点自声明。
修复:本地代理 / 网关的模型识别
- 根因一:线上清单端点此前只试
<baseURL>/models。走 Anthropic 协议的路由 baseURL 不能带/v1(SDK 自行拼/v1/messages),而这类本地代理的清单恰恰只在/v1/models→ 永远 404、发现拿不到任何 id。现依次尝试两个端点,并把每个候选的失败原因串成可读提示(原先前端只显示"获取到 0 个模型") - 根因二:模型号里的思考档位后缀(
gemini-3.8-flash-high/-low/-tiered/-thinking)不在噪声白名单,无法与 models.dev 的gemini-3.8-flash等效,整批落保守默认。-max故意不剥——它在真实数据里是独立模型档(gpt-5.1-codex-max、qwen3.6-max) - 根因三:模型号里的区域命名空间前缀 / 后缀(
cn:deepseek-v4.1-flash、global:glm-5.3、-sg、@eu)未剥离 → WorkBuddy 的 65 条命中率 0%。冒号前缀只认显式区域词,避免把 ollama tag(gpt-oss:20b)与 Bedrock id(global.anthropic.…-v1:0)削成20b/0这类垃圾键而互相误命中 - 选候选改为三层:原始同名 → 归一化同名 → 前缀等效,避免
glm-5.1被容量更大的上一代glm-5抢走 - 跨厂商回退在同类里取多数派,不再取单家网关的乐观容量;清单新增
upstream声明(antigravity / wb),第一方厂商优先于全局扫描
变更:能力元数据优先采用端点自声明
/models里端点自己声明的字段(上下文长度、输出上限、是否收图、思考档位、显示名)现在逐字段优先于 models.dev 快照,端点没声明的字段才回落- 为什么:端点声明才是它实际允许的能力。实测某网关的输出上限被 models.dev 写成 384000,而端点自己声明只有 50000 —— 照 384000 发请求会被上游拒
- 只在
id/object/created/owned_by之外什么都没声明的路由(如 antigravity 反代)行为完全不变 - 设置页新增「线上声明」来源标注;
/discover拿不到任何 id 时改为显示可读原因
实测
- antigravity:94 条全部命中(
gemini-3.8-flash-high= 1048576 / 65536 / 含图) - WorkBuddy:65/65 采用端点自声明值(
cn:hy4-preview-f= 1000000 / 64000 / 含图,此前落保守默认262144/32768/纯文本) - 未声明对应字段的提供方,取值与 0.0.5 一致
开发侧
npm run verify扩到 68 项:新增「线上清单端点 + 档位后缀」「区域前缀 / 同名优先 / 多数派」「线上声明优先」三段回归AGENTS.md补齐归一化规则、候选三层、upstream与多数派、线上声明优先的取舍与踩坑记录
安装 / 升级
dsh plugin --profile web add npm:dsh-model-detector升级后必须重启 dsh(host 半区代码在启动时加载,仅刷新页面不会生效),再打开「设置 → 模型检测」。
校验
npm run build + npm run typecheck + npm run verify(68 通过 / 0 失败);布局预览浅色 / 深色均已截图核对。
⚠️ 升级后重新「发现新模型」会得到与 0.0.5 不同的元数据(更贴近端点真实能力)。注意「应用所选」是整体替换该提供方的models列表,建议先「清空」再勾选需要的模型。
dsh-model-detector v0.0.5
dsh-model-detector v0.0.5
本次发布修复 深色主题下几乎不可用 的问题:文字对比度、原生下拉弹层配色、卡片与徽标层次。
修复:深色主题适配
- 根因一:样式里的
--dsw-alias-text-primary在 DSH 中并不存在,深色下静默回退成近黑色文字——模型号、输入框内容几乎不可见;现全部改用真实 token - 根因二:
--dsw-alias-brand-primary是高对比前景色(亮≈近黑 / 深≈近白),此前被当作蓝色强调色使用;蓝色强调改用--dsw-alias-state-business-primary - 根因三:亮色字面量 rgba 做底色与阴影,深色下不可见;
var(--x)22拼接非法导致推理档位 chip 从来没有底色——现统一用color-mix()现算 - 根因四:原生
<select>弹层未跟随主题(深色底 + 亮色方案文字);.mc-root现按body[data-ds-dark-theme]切换color-scheme,下拉弹层与勾选框一并跟随
改进:与 DSH 设计语言对齐
- 发丝线边框(0.5px)、卡片 12px / 输入框 8px 圆角,与官方设置页一致
- 下拉框换用与宿主同一枚内嵌 chevron;placeholder 改用 tertiary,深色浅色都清晰
- 选中态、提示条、来源徽标改用主题感知的状态 token(亮色浅底 / 深色深底)
- 绿色「应用所选」按钮文字固定深色,两套主题对比度均达标
开发侧
scripts/preview.mjs新增THEME=dark深色预览(内联 DSH 真实主题 token),并修正 CSS 提取锚点(原先把文件头 JSDoc 混进预览样式)AGENTS.md记录 5 条主题 / token 硬约束,避免再次踩坑
安装 / 升级
dsh plugin --profile web add npm:dsh-model-detector升级后必须重启 dsh(client bundle 在 host 启动扫描时读入内存,仅刷新页面不会生效),再打开「设置 → 模型检测」。
校验
npm run build + npm run verify(38 项 host 回归)全部通过;浅色 / 深色 × 发现 / 编辑 + 430px 窄面板无头截图自查。
dsh-model-detector v0.0.4
dsh-model-detector v0.0.4
本次发布新增 DeepSeek 官方 API 支持 与 现有模型参数手动编辑,并修复「手填模型号不支持多模态」。
新增:DeepSeek 官方 API(路由 deepseek-official)
- 自动识别提供方归属
llm-pi-ai/llm-deepseek,按各自 schema 写入(inputvsinputModalities) - 内置 DeepSeek 模型元数据(含内测模型 deepseek-v4.1-flash-expires-on-0910)与适配器默认目录
- 路由级推理档位(off/low/high/max)与 thinking 开关可在设置页直接改
新增:编辑现有模型参数
- 逐条改 输入模态(文本/图像)、上下文、输出上限、思考档位(含 wire 值)、compat;可手填模型号新增
- 新增接口 /current、/save-model、/remove-model、/route-settings
- 保存只动这一条:pi-ai 目录路由写 modelOverrides(目录其余照常服务),否则就地更新;DeepSeek 写 models
修复:手填模型号拿不到多模态
- 根因:DeepSeek 适配器对图片硬判定 inputModalities 含 image,否则抛 UNSUPPORTED_CONTENT
- 名字级匹配改为优先含 image 的等效候选(精确同名仍优先),剥掉 -expires-on-0910 到期标记,另加家族模态推断兜底
界面
- 修复窄面板控件重叠、按钮溢出面板、顶行空隙;主操作按钮固定与「提供方」同行
安装 / 升级
dsh plugin --profile web add npm:dsh-model-detector升级后请重启 dsh web(host 代码需重启加载),再刷新页面。
校验
npm run typecheck / build / verify(38 项 host 回归)全部通过。
dsh-model-detector v0.0.3
支持第三方模型思考档位富化:从 models.dev reasoning_options 按模型读取推理等级,翻译为 DSH reasoningEfforts 写入(manifest thinkingLevelMap 人工档位优先);apply 写入白名单清洗,剔除 DSH 不认识的字段。修复此前写 reasoning:true 导致第三方模型无推理等级的问题。