dsh-model-capability-probe
Verifieddsh-model-capability-probe · v0.1.1 · MIT · Web UI
Automatically probe a model route's reasoning-effort levels and context window, then fill them into the DSH model configuration page.
Install
dsh plugin add dsh-model-capability-probe Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Creators
Readme
dsh-model-capability-probe
自动探测模型路由支持的推理强度与上下文长度,并把结果写进 DSH 的模型配置页(Settings → Models 中的 provider 卡片)。
安装
npm 包名:dsh-model-capability-probe。
在 DSH 的 Settings → Plugins 中安装该 npm 包并启用;也可以先用
dsh plugin --profile web add dsh-model-capability-probe 安装,再到插件列表启用 bundle。
写入的 reasoningEfforts 直接复用 DSH 原版的模型选择器:composer 的模型菜单和 /model 命令会自动出现 Effort 档位,切换方式、顺序和样式与 DSH 自带模型完全一致,插件不另外实现一套切换 UI。
使用
- 打开 Settings → Models。
- 在已配置的 provider 卡片底部点击 自动探测。
- 插件会:
- 读取 provider 的
GET /models元数据(有凭据时); - 对每个模型发送少量极小请求(
max_output_tokens: 16),枚举none/minimal/low/medium/high/xhigh/max; - 用 models.dev 的目录校正档位、补全上下文长度;
- 把结果写入该 provider 的
contextWindow与reasoningEfforts。
- 读取 provider 的
- 结果会立即生效;原版模型选择器下一次打开时显示新的档位。
探测是手动的。已配置推理档位和上下文长度的模型不会重复探测,也不会下载 models.dev 目录;全部模型都已配置时,一次刷新通常约 1–2 秒(只访问 provider 的 /models)。新加入、还没有 reasoningEfforts 的模型才会发探测请求(每个模型约 8–15 秒,取决于网关延迟)。
探测/回退顺序
- provider 自己的
GET /models(OpenAI 兼容、Anthropic 列表),读取context_length、top_provider.context_length、limit.context等字段。 - Harness 的
llm.discoverModels()(适配器处理原生认证,例如 DeepSeek 账号)。 - 主动请求探测:
openai-completions发reasoning_effort,openai-responses发reasoning.effort,请求体里带的就是模型 ID。只探测还没有配置reasoningEfforts的模型;已配置的模型直接复用。只接受 HTTP 2xx,400/422/503中明确“参数被拒绝”的响应视为不支持;超时、429、5xx 会重试一次,不会误删已有档位。 - 轻量目录
https://models.dev/models.json?type=all(JSON 482 KB,压缩后约 54 KB):按模型 ID 查上下文长度与reasoning布尔。它不再下载 5.8 MB 的完整 provider 目录。 - 只有当某个未配置档位的模型探测失败/无法判定时,才回退到完整目录:
https://models.dev/api.json?type=all(含reasoning_options)https://models.dev/catalog.json?type=allhttps://models.dev/models.json?type=all
档位以 模型 id 精确匹配,再按 / 后的模型名后缀匹配;上下文取候选值的众数(并列取较小值),避免个别 provider 的极端值。
off 的处理:只有探测确认 reasoning.effort: "none" 会被接受且响应里没有 reasoning 输出,或 models.dev 明确列出 none 时,才写入 off: none。这样原版的 “off” 是真正关闭推理,而不是“省略参数后仍按默认推理”。
写入规则
llm-pi-ai路由:写providers.<id>.models[].contextWindow和models[].reasoningEfforts。reasoningEfforts的 key 是选择器档位,value 是发给网关的 wire 值;例如{ off: none, low: low, high: high, max: max }。- 只对用户层已经声明的
models数组按索引写入,不会把 schema 默认值(如compat)物化进配置。
- 没有
models数组、但支持modelOverrides的路由(pi-ai 内置目录路由、DeepSeek 账号路由):写modelOverrides.<model>.contextWindow,不写推理档位。 - 其他 schema(例如
llm-deepseekAPI-key 路由):只读不写;无法安全覆盖时返回 warning,不会破坏配置。 - 已存在的档位采用只增不减的合并策略:探测结果不会删除用户手写的档位,避免网络抖动造成配置回退。
性能
- 需要补全新模型时只下载
models.json(482 KB JSON / 约 54 KB 压缩),不再预取或下载 5.8 MB 的api.json;全部模型已配置时连models.json也不下载。 - 完整
api.json仅在“新模型探测失败”时按需加载,并缓存 30 分钟。 - 已配置
reasoningEfforts的模型跳过主动探测,也不触发完整目录下载;这是全部模型已配置时只需 1–2 秒的原因。 - 新模型才发 7 个 16-token 的极小请求(约 8–15 秒);单请求超时 8 秒、瞬时错误只重试一次。
- 复用 5 分钟内的探测结果;同一 provider 的并发重复点击共享同一次探测。
- 如需强制重新探测已配置模型,设置
reprobe: true。
配置
cordis.patch.yml 的 model-probe 行可覆盖:
- id: model-probe
config:
modelsDev: true # 关闭后只用 provider 元数据/主动探测
modelFactsUrl: https://models.dev/models.json?type=all # 轻量上下文目录
reprobe: false # true = 连已配置档位的模型也重新探测
modelsDevUrls: # 仅在探测失败时使用的完整目录回退链
- https://models.dev/api.json?type=all
- https://models.dev/catalog.json?type=all
- https://models.dev/models.json?type=all
probeTimeoutMs: 8000 # 单次探测请求超时
probeConcurrency: 8 # 探测并发;网关限流时可降到 2–4
probeCacheTtlMs: 300000 # 探测结果缓存(5 分钟)
maxModels: 16 # 单次最多探测的模型数
cacheTtlMs: 1800000 # models.dev 缓存时间(30 分钟)
实现
index.js:Host 半,注册两个 loopback-only 路由:GET /api/model-probe/healthPOST /api/model-probe/detect,body{ provider, settingsNs }
client.js:Client 半,在settings.models.provider-card(按settingsNs分键)注册“自动探测”按钮,同源调用 Host 路由。cordis.patch.yml:插入model-probe行。
依赖:Host 侧只用 Node 全局 fetch 和 Cordis 服务;Client 侧只用 loader 提供的 react、ctx.remote.llm、ctx.locale、ctx.slots。
已知限制
- models.dev 的公开 API 只支持
?type=过滤,不支持按模型 ID 查询(API worker 只读取type参数)。所以无法做到“请求 URL 里带模型 ID 只取一条”;插件改为:用模型 ID 发实际模型请求做探测,上下文用 54 KB 的models.json按 ID 查找,完整目录只在探测失败时兜底。 - 推理档位是“网关接受 + models.dev 共识”的结果,个别网关会把未知档位静默映射到邻近档位;插件无法读取模型内部真实预算。
- 只对
openai-completions/openai-responses做主动档位探测;Anthropic Messages 路由依赖 models.dev。 - 每次探测会产生少量计费 token(每个模型每个档位最多 16 个输出 token)。
- 浏览器端视觉呈现未做自动化截图验证;已通过 Client Slot 检查确认三个
settingsNs的卡片注册均处于 active 状态。