LiangYin233
dsh-provider-model-configurator
DSH 高级模型配置器:为 DeepSeek Harness 提供将 pi-ai 预设模型的上下文、输出上限、推理挡位一键应用到自定义提供商的能力。
- Stars
- 3
- Language
- JavaScript
- Created
- Aug 13, 2026
- Updated
- Aug 14, 2026
Introduction
供应商模型配置器 (Provider Model Configurator)
一个 DeepSeek Harness (DSH) 可安装插件包(bundle):集中查看、新建、编辑、复制与删除已配置提供商下的模型条目——上下文窗口、最大输出、输入模态与推理档位,全部在一个独立设置页内完成;pi-ai 安装目录(预设)或其他任何提供商的模型数据可作为复制来源快速填充。
背景
DSH 默认 LLM 提供商链路基于 @deepseek-ai/dsh-llm-pi-ai,底层是 @earendil-works/pi-ai 的安装目录 catalog(内置各提供商的模型、上下文、推理能力数据)。
问题:
- 新模型发布而目录未更新时,原生「自定义提供商」卡片无法给出模型的
contextWindow/reasoningEfforts等数据,只能手查; - 原生卡片刻意不提供推理档位(reasoning effort)编辑——它认为这是模型级能力,而模型选择器(composer)需要这些数据才能给出正确档位;
- 手写模型条目没有推理能力声明时,模型不会按预期推理;
- 已配置的显式模型条目缺少一个集中的查看 / 编辑 / 删除入口。
本插件把「供应商模型配置」做成一个独立设置页,直接读写 llm-pi-ai 的 providers.<route>.models,无需等待目录更新。
安装
本插件以 DSH bundle 形式发布:通过 dsh plugin 命令(在 profile 内执行 pnpm 并合并 bundle 层)安装。
# 从 git 安装(推送到 GitHub 后即可用此地址)
dsh plugin --profile web add https://github.com/LiangYin233/dsh-provider-model-configurator/archive/refs/heads/main.tar.gz
# 或从本地打包安装(开发时;git/registry 安装会把包物化为 profile 内的真实目录,
# 而 pnpm 对 `add <目录>` 使用符号链接,宿主端 ESM 依赖解析会失效,请走 tarball)
npm pack
dsh plugin --profile web add ./dsh-provider-model-configurator-0.3.1.tgz
然后重启 Web 服务器并刷新页面:
- Host 插件挂载为
dsh-provider-model-configurator;Client bundle 由/plugins/dsh-provider-model-configurator/client.js提供; - 打开 Web 设置 → 左侧导航「供应商模型配置器」(Models 页之后)。
安装要求:pnpm(在 PATH 中)、DSH
0.1.0-rc.6或更高版本。卸载:dsh plugin --profile web remove dsh-provider-model-configurator。
功能
- 独立设置页「供应商模型配置器」(挂在
settings.section,与官方 Models 页并列,零侵入); - 模型管理:选择目标提供商后,列出其全部显式模型条目及配置摘要,每个条目可:
- 编辑 — 一键载入该模型的当前配置(显示名、上下文、输出上限、输入模态、推理档位),修改后重新应用;表单未涉及的字段(description 等)原样保留,不会被覆盖;
- 删除 — 确认后移除该条目(删除最后一个条目时,该提供商自动恢复使用内置目录);
- 新建 / 复制:
- 输入新模型 ID 手动填写(高级配置器),可自由添加/删除推理档位;
- 在所选提供商的模型管理页底部,可展开复制来源(预设目录或任意其他提供商)+ 模型 → 自动填充下方字段(快速填充);载入后把 ID 改成新值即可复制为新模型;
- 同步/编辑字段:
- 模型 ID、显示名称
contextWindow(上下文窗口)maxTokens(最大输出)- 输入模态
input(text / image) - 推理档位
reasoningEfforts(档位 → wire 值的字典,off 留空 = 不发送)
- 目标:任意已配置的
llm-pi-ai路由(含自定义提供商与内置目录路由); - 内置目录路由应用后自动转为显式 models 列表,保留全部目录模型,
modelOverrides折叠进对应条目,不丢失; - 同名模型需勾选「覆盖」;写入经 settings 校验器,立即生效,官方 Models 页自动刷新;
- 只写 settings 文档,不接触、不存储任何 API 密钥。
仓库结构
├── package.json bundle 清单:dsh.bundle.patch / dsh.client / exports
├── cordis.patch.yml bundle patch:插入 dsh-provider-model-configurator 条目
├── dsh.plugin.json 插件元数据(id/main/engines)
├── lib/ 构建产物(由 build.mjs 生成,发布时随包携带)
│ ├── index.js ← src/host/index.js(静态 Host:modelConfigurator Remote)
│ ├── contract.js ← src/host/contract.js(线契约)
│ └── client.js ← src/client/static.tsx(ModuleLoader bundle)
├── src/
│ ├── host/ Host 半区源码
│ │ ├── index.js 静态 Host:TypertRemoteService + manifest 注册(6 个方法)
│ │ ├── contract.js 线契约:Invocation descriptors + Host Typert manifest
│ │ └── dynamic.js 动态插件 Host 半区(cordis_define 的 code.host)
│ └── client/ Client 半区源码
│ ├── page.tsx 设置页组件(仅 UI 与表单状态)
│ ├── model.ts 模型条目业务逻辑(buildEntry / entryToForm / modelSummary)
│ ├── page.css 页面样式(独立 CSS 文件)
│ ├── locales/
│ │ ├── zh.json 简体中文词典(一个语言一个 JSON)
│ │ └── en.json English dictionary
│ ├── static.tsx 静态 bundle 入口(remote 适配、样式注入)
│ ├── dynamic.ts 动态插件入口(host.call 适配、styles.insert)
│ ├── env.d.ts 运行环境符号声明(React / styles / host)
│ └── css.d.ts *.css 文本导入声明
├── build.mjs esbuild 构建:lib/ 产物与动态插件 code.client 函数体
├── tsconfig.json
└── README.md
开发与构建
页面以 TSX 记录在 src/client/page.tsx(不写 React.createElement),业务逻辑在 src/client/model.ts,词典在 src/client/locales/,Host 半区在 src/host/。构建生成两套产物:
npm install
npm run build # → lib/client.js(+ sourcemap)+ 回填 lib/index.js、lib/contract.js
npm run build:dynamic # → dist/dynamic-client-body.js,动态插件的 code.client 函数体
npm run typecheck # tsc --noEmit
src/client/static.tsx通过 Typert Remote 与宿主通信,是安装包(bundle)使用的 Client;src/client/dynamic.ts通过host.call与宿主通信,与src/host/dynamic.js组成动态插件版本(cordis_define 用);- 两个入口共享
src/client/page.tsx,页面与环境的差异只存在于薄适配层。
架构
┌─ Client(浏览器)────────────────────────────────┐
│ settings.section 注册 React 页面(zh/en 双语) │
│ ├─ ② 提供商 · 模型管理 │
│ │ (模型列表 + 编辑/删除 + 复制来源) │
│ └─ ③ 模型配置(新建 / 编辑) │
│ └─ remote.modelConfigurator.* ←→ Typert RPC │
└─────────────────────────────────────────────────┘
│ Connection /api 网关
┌─ Host(主进程)───────────────────────────────────┐
│ ModelConfiguratorRuntime (TypertRemoteService) │
│ presetProviders llm.listConfigurableProviders│
│ presetModels llm.listModels / discoverModels│
│ presetModelInfo llm.resolveModelInfo(+目录) │
│ targetProviders settings.get('llm-pi-ai') │
│ applyModelConfig 构建 models 数组 + settings.mutate│
│ deleteModel 移除条目(set/unset models) │
│ + ctx.typert.register(manifest) 严格描述符解析 │
└─────────────────────────────────────────────────┘
Remote 方法一览
| 方法 | 参数 | 说明 |
|---|---|---|
presetProviders | — | 复制来源:目录 + 已配置提供商(带 declared/configured 标记) |
presetModels | provider | 已注册走 listModels,休眠走 discoverModels |
presetModelInfo | provider, model | 上下文/输出/模态/推理档位(合并 resolve + discovery) |
targetProviders | — | 已配置路由、现有模型条目(完整配置)、目录模型、writable |
applyModelConfig | route, entry, overwrite | 校验 → 构建 → settings.mutate('llm-pi-ai', ops);覆盖时保留未编辑字段 |
deleteModel | route, modelId | 移除显式条目;删空后 unset 恢复内置目录 |
已知限制
- 推理档位名:仅对已注册(已配置)的复制来源提供商可精确获取(
resolveModelInfo);休眠目录提供商不暴露推理元数据。 - wire 值:精确映射(pi-ai 目录的
thinkingLevelMap,如 opencode-go 的{minimal:null, low:null, medium:null, high:"high", max:"max"})只存在于 pi-ai 安装目录的 JSON 中,适配器未通过llm服务暴露。默认按「档位名 = wire」预填(对绝大多数 OpenAI 兼容网关正确),逐档可改;deepseek 系minimal/low/medium通常应留空(不发送)。 - 目标路由必须已配置(先在官方 Models 页创建);使用
modelOverrides的路由自动折叠后写入。 - 删除仅作用于显式 models 条目;使用内置目录的路由(无显式条目)没有可删除项。删除最后一个条目会使该路由恢复使用内置目录。
- 提供商级配置(api / baseURL / 密钥)不属于本插件职责,请使用官方 Models 页。
使用
- 安装 bundle 并重启 Web 服务器(见上);
- 打开 Web 设置 → 左侧导航「供应商模型配置器」(Models 页之后);
- ②选择目标提供商,查看其模型列表;点击「编辑」载入现有配置,或「删除」移除条目;
- 在该提供商的模型管理页底部,(可选)选择复制来源(预设目录 / 其他提供商)+ 模型快速填充;③编辑模型字段与推理档位;
- 「预览写入内容」核对 → 「应用配置」;
- 写入立即生效,官方 Models 页自动刷新;
$DSH_HOME/settings.yaml中llm-pi-ai.providers.<route>出现/更新models:列表。
兼容性
- 依赖 Host 服务:
typert(注入)、llm、settings(后两者通过ctx.get可选读取,缺失时优雅报错); - 依赖 Client:
slots(settings.section)、locale(zh/en)、remote(Typert 网关); - 与官方
dsh-client-ui-settings-models页并列运行,不遮蔽、不替换官方 UI。
License
MIT