前言¶
在 DeepSeek Harness(DSH)里给自定义网关路由配模型时,name、contextWindow、maxTokens、input、reasoningEfforts 等元数据往往需要自己查文档、手填。社区里已有按 provider 刷新或按名称模糊匹配的插件,但这类做法会「猜」:猜错 provider、猜错大小写、查不到就换一家猜。对生产配置来说,半填半猜的模型列表比空着更危险。
dsh-autofill-model-metadata 走另一条路:你只声明「本地模型 id → models.dev 上的 provider/model」,插件从 models.dev 目录拉取字段并写入 profile 里仍为 undefined 的项;未映射、格式不对、目录里找不到的,一律拒绝,整条路由不写。本文介绍该插件的定位、配置方式与典型用法。维护者为 peach0x33a,归类为模型推理;项目源自 Pi 扩展 pi-autofill-model-metadata 的 DSH 移植,许可证 MIT(见 GitHub 仓库)。
这是什么¶
DSH 本身没有内置「按目录自动填模型元数据」的能力。本插件在网关路由维度,根据你手写的映射表,从 models.dev 的 https://models.dev/api.json(可改 modelsDevUrl)解析并填充元数据;已手写声明的字段不会被覆盖。哲学是 explicit mapping、fail-closed:不做模糊匹配、不做跨 provider 兜底;某条路由的计划若含拒绝项,该路由整段不写入,避免出现填了一半的数组。
核心功能¶
显式映射¶
配置核心是 mapping:外层 key 为 Settings → Models 里出现的路由名,内层 key 为链路上的本地模型 id,值为 "modelsDevProvider/modelsDevModel" 字符串。例如:
"mapping": {
"my-gateway": {
"claude-opus-4-5": "anthropic/claude-opus-4-5",
"gemini-3-pro": "google/gemini-3-pro-preview"
}
}
mapping 为空时插件不做任何事。requireCompleteMapping 默认为 true:已声明映射的路由上,若还有未写入映射表的本地模型,会按错误处理并拒绝写入该路由。
会写入哪些字段¶
| 本地字段 | models.dev 来源 | 规则摘要 |
|---|---|---|
name |
model.name |
|
contextWindow |
limit.context |
仅当 > 0 |
maxTokens |
limit.output |
仅当 > 0 |
input |
modalities.input |
含 image 时写 ['text','image'] |
reasoningEfforts |
reasoning_options 的 effort |
按 pi-ai 规则映射;仅 off 或 reasoning: false 时写 false |
目录侧仅当 tool_call === true 且 status !== 'deprecated' 的模型才视为可填充来源;插件不会改写 tool_call。
缓存与触发¶
- 目录缓存默认路径:
$DSH_HOME/plugins/dsh-autofill-model-metadata/models.dev.json,cacheTTLHours默认 24(0表示每次拉取)。 applyOnStart默认true:插件挂载时执行一次填充。dryRun为true时只计划、打日志,不写 profile。
图形设置页¶
插件自带 Web 设置界面,入口为 Settings → Model metadata。只列出与当前 profile 或映射相关的路由;每条模型展示手写字段、拟填充项、可编辑映射与 catalog 搜索,以及会触发的拒绝原因。Save mapping 一次性写入整张表(带 revision 校验);Save and fill 保存后再跑填充。与配置文件共用同一 settings 服务;若在页面打开期间改动了配置文档,保存会 fail-closed,提示重新加载而非覆盖。
builtinSettingsForm 控制是否与宿主生成的表单并存:auto(默认)、always、never(亦接受 true/false 别名)。
本地 HTTP API¶
所有端点仅监听 loopback,非本机请求返回 403。<port> 为 DSH Web 服务端口:
BASE=http://127.0.0.1:<port>/api/dsh-autofill-model-metadata
curl -X POST $BASE/apply -H 'content-type: application/json' -d '{}'
curl $BASE/status
curl $BASE/inspect
curl "$BASE/catalog?q=gpt-5.4&limit=10"
curl -X POST $BASE/mapping -H 'content-type: application/json' \
-d '{"mapping":{"my-route":{"fast-model":"openai/gpt-5.4"}},"apply":true}'
/apply、/mapping、/page-live 为 POST;其余为 GET。/mapping 在映射写入成功时返回 200,即使后续填充被拒绝也会在 applyError 中单独报告。
安装与启用¶
要求 DSH >= 0.2.0-rc.2(见 package.json 中 dsh.engines)。在插件目录 checkout 后,用官方 README 中的 link 安装方式(路径需换成你本机绝对路径):
DSH="/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh"
"$DSH" plugin --profile desktop add link:/absolute/path/to/dsh-autofill-model-metadata
安装后需重启 DSH Desktop(插件在启动时挂载)。Linux 用户将 DSH 指向本机 dsh 可执行文件即可,命令形式相同。
典型配置示例¶
在 profile 设置文档中可放置完整配置(图形页主要编辑 mapping,其余字段仍可在文档中维护):
{
"mapping": {
"my-gateway": {
"claude-opus-4-5": "anthropic/claude-opus-4-5",
"gemini-3-pro": "google/gemini-3-pro-preview"
}
},
"modelsDevUrl": "https://models.dev/api.json",
"cacheTTLHours": 24,
"applyOnStart": true,
"dryRun": false,
"requireCompleteMapping": true,
"builtinSettingsForm": "auto"
}
建议流程:先用 Settings → Model metadata 或 /catalog 查询候选 provider/model,补全映射后 Save and fill;或用 dryRun: true 观察日志再正式写入。
适用场景与注意¶
适合已经在 DSH 里配置了自定义网关、希望上下文窗口、输出上限、多模态输入和 reasoning effort 与 models.dev 保持一致、又不愿把匹配逻辑交给「猜」的开发者。若你更习惯按 provider 一键刷新整表,应评估社区里 dsh-models-dev 一类方案与本插件显式表之间的取舍。
插件以当前 DSH 进程权限运行,会访问 models.dev 与本地 settings;安装前请自行审阅 GitHub 源码 与 MIT 许可证。DSH 社区插件目录由 skillhub.cn 等站点收录,与 DeepSeek / 幻方无官方从属关系,安装来源以你信任的仓库与目录页为准。
结尾¶
dsh-autofill-model-metadata 用一张你亲手维护的映射表,把 models.dev 的模型元数据填进 DSH 网关路由,拒绝猜测、拒绝半写。需要进一步了解参数与拒绝类型时,以仓库 README 为准。
- 目录页:https://www.skillhub.cn/plugins/peach0x33a/dsh-autofill-model-metadata
- GitHub:https://github.com/peach0x33a/dsh-autofill-model-metadata