dsh-openrouter-sync-models: Keeping DSH's OpenRouter model list in sync with the official directory

前言

在 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。

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

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

Xiaoye