前言¶
在 DeepSeek Harness(DSH)里通过 llm-pi-ai 走 OpenRouter 时,模型目录会随 OpenRouter 侧更新而变动;若只在配置里手工维护 models 列表,容易漏掉新模型,也拿不到账号专属的 @preset/... 条目。社区插件 dsh-openrouter-sync-models(维护者 m1khal3v,npm 包名同插件 id,当前版本 0.1.7,MIT 许可证)面向这一问题:用 OpenRouter 认证接口拉取目录,过滤后写回路由配置中的 api 与 models,并在启动、定时以及 API Key 变更时重复同步,无需重启进程即可通过 HMR 生效。
这是什么¶
一句话定位:为 DSH 提供「始终接近当前 OpenRouter 目录」的 OpenRouter 路由模型表,含账户 preset。
插件通过 ctx.llm.listConfigurableProviders() 找到 openrouter 路由,经 ctx.credentials 解析 apiKeyEnv 后请求 GET /api/v1/models,将结果过滤、映射为 DSH 模型 profile,再经 ctx.settings.mutate() 仅写入 api 与 models;路由其余字段仍由用户维护。README 说明其适用于 desktop、web、CLI 等表面,不依赖 DSH_HOME 手改 YAML、不做正则补丁或独立 status 文件。
核心功能¶
下面介绍 README 中已写明、且与实现描述一致的能力。
认证目录与 preset¶
使用 OpenRouter token 请求认证版目录,因此除公开列表外,还可包含账号相关的 @preset/... 模型。未配置密钥且 requireKey 为默认 true 时,插件会跳过同步,而不是默认清空已有 preset。
同步时机与可观测性¶
同步在进程启动时执行,之后按 intervalHours(默认 6 小时)定时刷新;密钥变化也会触发更新。结构化日志走 ctx.logger,并发出 openrouter/models-synced 事件。
默认过滤策略¶
默认只保留「有用」的模型:开启 tool calling(requireTools: true)、纯文本输出(requireTextOutput: true)、具备 chat 端点(requireChatEndpoint: true);includePresets: true,付费与免费模型均保留(freeOnly: false)。映射时会投影上下文长度、输入模态、reasoning effort 以及兼容性相关字段到 model profile。
配置项(均可选)¶
| 键 | 默认值 | 说明 |
|---|---|---|
provider |
openrouter |
要同步的 llm-pi-ai provider 路由名 |
endpoint |
https://openrouter.ai/api/v1/models |
目录 HTTP 端点 |
api |
openai-completions |
与模型列表一并写入的路由级 wire 协议 |
apiKeyEnv |
OPENROUTER_API_KEY |
路由未指定时使用的凭证环境变量名 |
requireKey |
true |
无法解析凭证时是否跳过 |
includePresets |
true |
是否包含 @preset/... |
freeOnly |
false |
是否仅保留零价模型 |
requireTools / requireTextOutput / requireChatEndpoint |
均为 true |
模型能力过滤 |
minContextWindow |
0 |
最小上下文 token |
maxOutputTokens |
0 |
输出上限钳制;0 表示保留目录 advertised 值 |
excludeModels |
[] |
精确排除的 model id |
intervalHours |
6 |
刷新间隔(小时) |
timeoutMs |
45000 |
HTTP 超时 |
startupGraceMs |
30000 |
启动阶段等待 provider 目录的时长 |
README 示例:在插件 config 中设置 freeOnly: true、minContextWindow: 64000,并在 excludeModels 中列出 openrouter/auto。
安装与启用¶
DSH 生态采用「一切皆插件」;插件目录页在 skillhub.cn,与 DeepSeek / 幻方无官方从属关系,安装前宜自行查看 GitHub 源码与 MIT 许可证。插件以当前 dsh 进程权限运行,会访问凭证与设置服务。
1、按 profile 安装¶
<profile> 指 $DSH_HOME/profiles/<name> 下的 profile 目录名;实际使用的每个 profile 都应单独安装。
dsh plugin --profile <profile> add dsh-openrouter-sync-models
常用 shipped profile 示例(摘自 README):
dsh plugin --profile web add dsh-openrouter-sync-models
dsh plugin --profile headless add dsh-openrouter-sync-models
dsh plugin --profile sdk add dsh-openrouter-sync-models
desktop profile 需通过 Electron 应用的 Plugins 页面或桌面版自带的 dsh 安装;npm CLI 对 desktop 拒绝插件管理。自定义 profile 可先用 dsh --profile <name> --from-default-profile web 初始化,再执行上述 add 命令。
若 profile 未启用 settings 或 credentials 服务,插件仍会加载,但同步不会激活。
本地开发包路径安装(README 示例):
pnpm install
pnpm run build
dsh plugin --profile <profile> add file:~/projects/mine/dsh-openrouter-sync-models
package.json 要求 Node ^22.19 || >=24,DSH >=0.2.1-rc.5 <0.3.0。
2、保留 OpenRouter 路由骨架¶
插件只维护 api 与 models;路由 id 与 provider 块由用户配置,例如:
- id: llm-pi-ai
name: '@deepseek-ai/dsh-llm-pi-ai'
config:
providers:
openrouter:
apiKeyEnv: OPENROUTER_API_KEY
# api and models are maintained by dsh-openrouter-sync-models
3、提供 OpenRouter API Key¶
通过 harness 凭证存储、环境变量或 profile 凭证层配置 OPENROUTER_API_KEY(或与路由、apiKeyEnv 覆盖项一致的变量名)。
典型用法¶
先做路由与密钥配置,再做 profile 级插件安装。经过上面的步骤后,首次启动会拉取目录并 patch 设置;之后每 6 小时(或自定义 intervalHours)自动刷新。需要仅免费模型或更大上下文窗口时,在插件条目下增加 config 覆盖即可,无需手改整份 models 数组。
插件条目形态示例(README):
- id: openrouter-sync-models
name: dsh-openrouter-sync-models
config:
freeOnly: true
minContextWindow: 64000
excludeModels:
- openrouter/auto
适用场景与注意¶
适合:长期用 DSH + OpenRouter、希望模型列表跟官方目录走、且依赖账号 preset 的开发者;希望在 web、headless、SDK 等多 profile 下统一同步策略的团队。
注意:同步写回的是活动 profile 的设置 patch,过滤规则过严会导致列表变短(README 称默认策略下 2026-11-02 某次认证样本约 416 条目录经筛选后约 305 个模型,含 preset,具体数量随 OpenRouter 与账号变化)。无密钥时默认不同步,避免误删 preset。安装第三方插件前请审阅 GitHub 仓库 源码与依赖声明。
结尾¶
dsh-openrouter-sync-models 把 OpenRouter 认证目录、定时与密钥触发的同步、以及 DSH 原生的 settings mutate 与 HMR 串在一起,减少手工维护 models 的负担。更多信息见目录页 skillhub.cn/plugins/m1khal3v/dsh-openrouter-sync-models 与 GitHub:m1khal3v/dsh-openrouter-sync-models。