dsh-model-avail:用真实请求探测模型可用性并重排选择器

前言

在 DeepSeek Harness(DSH)里换模型,常见做法是依赖 listModels 或 resolveModelInfo 列出的清单。这些接口只能说明提供商的元数据通路是否正常,不能保证某个具体模型还能完成一次推理:上游下线、额度用尽或凭证失效时,名字仍会出现在选择器里,选中后才会失败。

下面介绍社区插件 dsh-model-avail(维护者 Shino113-1):对每个模型发一次最小真实请求,按「可用模型数」重排模型选择器中的提供商,并在 Web UI 里用颜色区分可用、不可用与待验证状态。

这是什么

dsh-model-avail 是 DSH 生态下的插件,分类为模型推理。它不做质量或速度评测,只回答「这条路由能不能跑完一次请求」。探测结果会缓存,并驱动选择器上的统计标签(例如 qwen-token-plan-cn · 16/20)与排序。

插件当前版本为 0.3.1(见仓库 package.json),采用 MIT 许可证。DSH 社区插件目录页:https://www.skillhub.cn/plugins/Shino113-1/dsh-model-avail;源码与说明:https://github.com/Shino113-1/dsh-model-avail。

核心功能

真实探测与三种判定

宿主侧对每个模型发送最小请求:一条 ping 消息,并要求 1 个输出 token,再根据终结 finish 块归类:

状态 含义 后续
available 请求成功(有输出或正常结束) 计入可用数
unavailable 明确不可用(无凭证、模型不存在、被禁、额度耗尽等) 沉到组尾并标注 (不可用)
unknown 限流、超时、网络抖动等途中失败 不判死,下一轮重试

设计原则是宁可少标不可用,也不把 transient 错误误标为永久不可用。

选择器展示

展开模型选择器时,提供商标题会带上 · 可用/总数,并按可用数降序排列(探测完成前保持原顺序,避免列表闪动)。点进某一提供商后,模型名按判定上色:可用 为绿色(#2ea043)、不可用 为红色(#d1242f)、待验证 为灰色。不可用项还会沉到组尾。

示例效果(来自 README):

qwen-token-plan-cn · 16/20
Our Free Model + 自动识图 · 12/32
Our Free Model · 11/32
…
opencode2dsh · 0/8
DeepSeek Account · 0/2

宿主与浏览器分工

  • 宿主(lib/index.js):启动约 4 秒后自动探测,监听 llm/adapters-updated;结果写入 $DSH_HOME/dsh-model-avail/state.json,TTL 6 小时。
  • 浏览器(lib/client.js):把选择器里实际看到的 roster POST 给宿主,再拉取状态、重排 modelDirectories.catalog.store 中的分组并写标签;约每 15 秒 复查。模型名上色依赖选择器 DOM(与 dsh-reasoning-effort 渲染的类名配合);若类名不匹配,排序与统计仍生效,只是不上色。

deepseek-account / deepseek-official 由 DSH 核心固定置顶,本插件不会把它们挤到下面。

安装与启用

要求:DSH 桌面版或 CLI(Web UI 形态)、Node.js ≥ 20。插件无运行时 npm 依赖,安装后必须重启 DeepSeek Harness(刷新页面不足以加载宿主路由与客户端 bundle)。

方式一:DSH 插件面板(推荐)

  1. 打开 DSH Web UI,左侧进入 插件 / Plugins;
  2. 点 安装,填入例如:
github:Shino113-1/dsh-model-avail

也可填本地目录绝对路径,或 npm 包名 dsh-model-avail(若已发布)。面板会在 profile 的 dsh.profile.bundles 中登记插件;该路径需能访问 GitHub 或 npm。

  1. 安装完成后重启 DSH。

方式二:安装脚本(适合离线、无需走面板 pnpm)

在已获取插件源码的目录中执行:

node scripts/install.mjs --list      # 列出本机 profile
node scripts/install.mjs --dry-run   # 预览变更
node scripts/install.mjs             # 自动检测唯一 profile 并安装

指定 profile 示例:

node scripts/install.mjs --profile "C:\Users\<你>\.dsh\profiles\desktop"

也可用环境变量 DSH_PROFILE_DIR(完整路径)或 DSH_PROFILE(profile 名)。若 profile 由 pnpm 管理(存在 pnpm-lock.yaml),脚本会同步 file:./vendor/dsh-model-avail 依赖,避免下次 pnpm 清掉手工复制的 node_modules。

方式三:手动

  1. 将整个包目录复制到 <profile>/node_modules/dsh-model-avail;
  2. 在 <profile>/package.json 的 dsh.profile.bundles 末尾追加 "dsh-model-avail";
  3. 若有 pnpm-lock.yaml,再复制到 <profile>/vendor/dsh-model-avail 并在 dependencies 中加入 "dsh-model-avail": "file:./vendor/dsh-model-avail";
  4. 重启 DSH。

典型用法与确认

看选择器与控制台

  • 第一次启动后,宿主会在数秒内开始探测;完成后提供商按可用数排序,标题带 · N/M。
  • 控制台在快照变化时会输出类似 [model-avail] N providers decorated; top: …;展开提供商且模型名上色后,还会打印各色 RGB,便于确认样式是否生效。

HTTP 接口

端口与 Web UI 一致(随 DSH 启动参数)。常用路由:

方法 路径 说明
GET /dsh-model-avail/state 当前快照(含 probing、progress、各模型 verdict)
GET /dsh-model-avail/state?refresh=1&force=1 触发探测(force 忽略缓存)
POST /dsh-model-avail/roster 浏览器上报选择器 roster
POST /dsh-model-avail/probe 单点复测 {"provider":"…","model":"…"}

本地查看状态示例:

curl http://127.0.0.1:<端口>/dsh-model-avail/state

若只有统计、未按可用数排序,多半是探测尚未结束(响应里 probing: true)。

探测预算(默认写死在 lib/index.js 顶部)

每 provider 最多 60 个模型;每轮最多 80 次探测;并发 3;单次超时 20s。一轮未结束且有进展时,约 30 秒 后续跑。计费敏感时可调小 MAX_PROBES_PER_CYCLE、拉长 TTL_MS,改后需重启 DSH。

适用场景与注意

适合:经常在不同提供商之间切换、希望优先看到「真能应答」的模型集合的 DSH 用户;需要在 Web UI 里一眼区分不可用模型的场景。

注意:

  • 探测会真实发请求(每次约 1 个输出 token),可能消耗额度。
  • 只验证「能不能跑」,不测上下文长度、工具调用或输出质量。
  • 浏览器侧仅作用于 Web UI;TUI 选择器不受排序/上色影响。
  • 插件以当前 DSH 进程权限运行;安装前建议阅读源码与 MIT 许可证,确认符合你的环境策略。
  • 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 本身遵循「一切皆插件」的扩展方式。

卸载可在插件面板移除,或在插件目录执行:

node scripts/install.mjs --uninstall

之后同样需重启 DSH。

结尾

dsh-model-avail 用最小真实请求补齐「列表里有名字」与「真的能推理」之间的缺口,并把选择器按可用模型数重排,减少误选失效路由的时间。需要安装说明与实现细节时,以仓库 README 为准:

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye