Skip to content

Releases: 1204244136/dsh-model-detector

dsh-model-detector v0.0.12

Choose a tag to compare

@1204244136 1204244136 released this 26 Sep 11:44

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 静默校验机制:挂载时优先呈现缓存数据,并在后台静默比对刷新提供方列表;若系统配置发生变更则无感更新,若无变更则不打扰用户当前视图。
  • 加载态缺失导致提前误报「当前未配置任何提供方」:

    • 组件初次渲染且网络请求在途期间,因 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)。

测试与校验

  • 端到端 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

Choose a tag to compare

@1204244136 1204244136 released this 25 Sep 16:32

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)为准,不再依赖硬编码。
  • 修复 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 显式指定,不再被安装布局变化打死。

实测

  • 环境:DSH Desktop 2.0.14(内置 dsh 0.1.7-rc.1),插件以 junction 方式装在 web profile。

  • 重启前:_dsh_model_detector_status → providers: [](即便 llm-pi-ai 里配了 5 个路由)。

  • 重启后 → 6 条全部列出,命名空间/目标识别正确:

    route 展示名 ns 模型数
    deepseek-official DeepSeek(官方 API) llm-deepseek 2
    volcengine 火山方舟 llm-pi-ai 1
    antigravity antigravity llm-pi-ai 2
    wb WorkBuddy llm-pi-ai 6
    axis 小柠同学API llm-pi-ai 3
    mimo 玛玛的爱 llm-pi-ai 2

开发侧(为什么以前 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

Choose a tag to compare

@1204244136 1204244136 released this 25 Sep 10:24

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 时自动适配映射,保障平滑过渡。
  • 官方最新默认模型 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 类型定义。

安装·升级

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

Choose a tag to compare

@1204244136 1204244136 released this 19 Sep 04:06

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 一字不动(路由靠它),只改展示名。
  • 前缀不足以区分时的唯一性兜底:
    • 根因: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

Choose a tag to compare

@1204244136 1204244136 released this 18 Sep 13:29

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

Choose a tag to compare

@1204244136 1204244136 released this 18 Sep 08:27

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

Choose a tag to compare

@1204244136 1204244136 released this 18 Sep 07:48

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

Choose a tag to compare

@1204244136 1204244136 released this 11 Sep 12:55

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

Choose a tag to compare

@1204244136 1204244136 released this 08 Sep 08:56

dsh-model-detector v0.0.4

本次发布新增 DeepSeek 官方 API 支持 与 现有模型参数手动编辑,并修复「手填模型号不支持多模态」。

新增:DeepSeek 官方 API(路由 deepseek-official)

  • 自动识别提供方归属 llm-pi-ai / llm-deepseek,按各自 schema 写入(input vs inputModalities)
  • 内置 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

Choose a tag to compare

@1204244136 1204244136 released this 03 Sep 14:28

支持第三方模型思考档位富化:从 models.dev reasoning_options 按模型读取推理等级,翻译为 DSH reasoningEfforts 写入(manifest thinkingLevelMap 人工档位优先);apply 写入白名单清洗,剔除 DSH 不认识的字段。修复此前写 reasoning:true 导致第三方模型无推理等级的问题。