dsh-provider-hub:在设置里对齐模型供应商引用,消除 NO_ADAPTER

前言

在 DeepSeek Harness(dsh)里跑智能体时,模型供应商(provider)的名字会出现在 profile 补丁、无头 overlay、以及「模型供应商」页的配置里。这几处若不同步,桌面端可能一切正常,而命令行、定时任务或值班轮一启动就退出,终端里常见:

dsh: NO_ADAPTER: no adapter registered for provider "acme"

这类问题往往难查:overlay 是最后一层补丁,某插件把「桌面当前选中的模型」写进 overlay,但对应 profile 里根本没有该 provider 的定义,进程直接退出,连报告都写不出来。下面介绍社区插件 dsh-provider-hub(维护者 xuanbaon,分类:模型推理):在 设置 → 供应商中心 一页看清引用与定义是否一致,并支持一键补齐或批量换供应商。

这是什么

dsh-provider-hub 是给 DSH 增加的一页设置 UI,核心目标是弄清「模型提供商」在三处的状态,并把不一致补齐。

位置 谁在写
profiles/<name>/cordis.patch.yml 里的 agent-default-model 模型选择器里选中的那一项
~/.dsh/<状态目录>/headless-overlay.yml 插件每轮重写(值班轮、定时任务等)
同一 patch 里的 llm-pi-ai.providers 「模型供应商」页里的定义

插件数据与代码分离,默认目录为 <DSH_HOME>/provider-hub/(DSH_HOME 默认 ~/.dsh),可用 DSH_PROVIDER_HUB_DATA 覆盖。许可证 MIT,当前 package 版本 1.2.0。

核心功能

面板上的四个动作

动作 做什么 数据来源
扫描对话 每个会话最后一次实际用的 provider/model,并按 provider 汇总 storages/session_projcache/sessions/*.json 的 modelSelection.lastUsed
扫描插件与配置 谁引用了哪个 provider,按「该 profile 自己有没有定义」判定状态 profile patch、插件 overlay、插件 patch、config.json
换供应商 在面板选「从 A → 换成 B(+模型)」,把所有写着 A 的地方一起改掉,并把 B 的定义补进还缺它的 profile profile patch、overlay、config.json
一键同步(补定义) 先出计划(不写盘),确认后把别处已定义的 provider 原样追加进引用了它却没定义的 profile profiles/<name>/cordis.patch.yml

换供应商与补定义方向不同:

  • 补定义:配置引用了 A,但本 profile 没有 A 的定义 → 把定义搬过来,针对 NO_ADAPTER。
  • 换供应商:不想再用 A,改用 B → 把 provider: A 改成 provider: B,并补上 B 的定义;只改选择,不删 A 的定义。

判定口径

「悬空」按该 profile 自己有没有定义算,不看别的 profile。桌面 profile 注册了某 provider,不代表 headless 那一轮的配置里也有。

判定 含义 你能做什么
正常 内置供应商(deepseek-official、deepseek-account)或本 profile 已定义 —
悬空·可补 别处有定义、本 profile 没有 点「一键同步」
仅运行时 静态配置里没有,运行时注册表里有 一般不用管
缺定义 哪儿都没有 先去「模型供应商」页配一次

扫描范围只针对 agent-default-model 条目里的 provider:,避免把子代理、工具提供方等误报为模型供应商。

写入与安全

换供应商与补定义共用规则:写前自检(解析失败或目标未达成则放弃)、写前备份 *.bak-provider-hub-<时间>、同目录临时文件再 rename 原子替换、单文件失败不影响其它文件;行号对不上则拒改并要求重新扫描。

补定义只追加到 llm-pi-ai.providers 末尾,幂等。换供应商支持批量与引用表逐行「换」(按 file + line 锁定);插件生成的 headless-overlay.yml 可能被下一轮重写,页面会单独提醒。改完 patch 需重启 DSH 才生效(loader 不热读 cordis.patch.yml)。

安装与启用

插件目录需放在 DSH 能解析到的位置,并在 profile 的 package.json 里登记依赖与 bundle:

{
  "dependencies": { "dsh-provider-hub": "^1.0.0" },
  "dsh": { "profile": { "bundles": ["dsh-provider-hub"] } }
}

本地开发可用目录联接(Windows mklink /J、macOS ln -s)链到 profiles/<name>/node_modules/dsh-provider-hub,改完重启 DSH。

重启 DSH 后生效。

目录页:https://www.skillhub.cn/plugins/xuanbaon/dsh-provider-hub
源码:https://github.com/xuanbaon/dsh-provider-hub

典型用法

设置页流程

  1. 打开 设置 → 供应商中心。
  2. 使用「扫描对话」「扫描插件与配置」查看会话实际用法与引用状态。
  3. 对「悬空·可补」项使用 一键同步:先看计划,确认后再写盘。
  4. 若要整体从供应商 A 迁到 B,用 换供应商;只需改一处引用时,用引用表每行右侧的「换」。

命令行等价(DSH 未开时)

与设置页补定义逻辑相同,仅预演或真写:

node tests/sync.mjs           # 只看计划
node tests/sync.mjs --apply   # 真写(先备份)

在插件源码目录下也可使用 package 脚本:

npm run sync
npm run sync:apply

HTTP 接口(排查与自动化)

本机同源访问,例如健康检查:

curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:5488/dsh-provider-hub/health

401 表示路由已挂且在鉴权,404 表示未挂上。补定义:POST /dsh-provider-hub/sync,body {apply:false} 预演、{apply:true} 写盘。换供应商:POST /dsh-provider-hub/rewrite,字段见 README 路由表。

适用场景与注意

适合经常在 桌面 + headless(定时、值班、CLI) 混用 DSH、且 profile / 插件较多、provider 引用分散的开发者。插件以当前 dsh 进程权限读写配置与数据目录,安装前应自行查看源码与 MIT 许可证,确认符合你的环境策略。

已知边界包括:只扫一层 node_modules/*/cordis.patch.yml;overlay 归属 profile 为推断;老会话无 modelSelection 显示「未记录」;不做热更新。若设置页出现「接口没有挂上(HTTP 404)」,可查看 ~/.dsh/provider-hub/logs/provider-hub.log;v1.0.0 若未声明 export const inject = ['webServer'] 会导致全 404,需 1.0.1+。

社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,本插件是其中面向模型推理配置的一类工具。

结尾

dsh-provider-hub 把 provider 的「会话在用谁、配置引用了谁、谁缺定义」集中到供应商中心,用扫描、补定义与换供应商三条线减少 NO_ADAPTER 类故障。需要进一步了解安装与 API 细节时,可参考 SkillHub 目录页 与 GitHub 仓库 README。

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

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

Xiaoye