dsh-omniroute-models
DSH plugin: searchable/filterable model manager for OmniRoute (or any OpenAI-compatible gateway) — provider directory, modality discovery, multi-select enable.
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 28, 2026
- Updated
- Aug 28, 2026
Introduction
@dsh-external/dsh-omniroute-models
OmniRoute 模型管理器:一个 DSH host+client 插件,自动拉取 OmniRoute 全部模型及其模态, 并用一个可搜索/可筛选/可多选的设置页,管理 DSH 实际能用 OmniRoute 的哪些模型。
痛点:OmniRoute(OpenAI 兼容网关)模型太多(本机 400+);DSH 自带「模型」页添加模型 没有搜索/筛选,且 discovery 契约不返回模态(
DiscoveredModelView只有 id/name/contextWindow/maxTokens)。 本插件把 OmniRoute/v1/models的真实input_modalities/context_length/max_output_tokens映射进llm-pi-ai.providers.<route>.models,一次勾选即生效,无需重启。
能做什么
- 按供应商筛选:模型 id 里的命名空间前缀(
/前的部分,如opencode-go/deepseek-…→opencode-go)会解析出来,UI 有「供应商」下拉 + 独立「供应商」列,可按供应商过滤/查看(opencode、oc、auto、github、无命名空间…)。 - 按路由(DSH 供应商)切换:自动枚举
llm-pi-ai.providers下所有已配置路由(route、displayName、api、baseURL、模型数、是否 OpenAI 兼容),UI 顶部「路由」下拉切换,管理对应端点的模型。 - 一键拉取供应商
/v1/models(默认http://localhost:20128/v1),得到每个模型的input(text/image,自动从input_modalities/capabilities.vision推导)、contextWindow、maxTokens。 - 在 DSH 设置面板新增「OmniRoute 模型管理」页:搜索框 + 模态筛选 + 全选匹配/全不选 + 逐行勾选。
- 「保存所选」整体替换
llm-pi-ai.providers.<route>.models(即 DSH 恰好能用勾选的这些), 经由官方 settings seam 写入settings.yaml,下一请求立即生效;apiKeyEnv/api/baseURL等兄弟字段保留。 - 已启用的模型预勾选,并在重复拉取时用存储值覆盖(不覆盖你在
settings.yaml手改的模态/容量)。 - 模态只取 DSH 认识的
text/image(video/audio等被裁剪),避免写入 DSH 无法处理的模态导致校验失败。
内部
- Host(
src/index.ts):注册两条同源 JSON 路由(ctx.webServer.register):GET /omniroute-models/api/catalog?provider=<route>— 枚举llm-pi-ai供应商目录(providers)→ 读该路由当下模型 → 请求GET {baseURL}/models→ 返回{ configured, compatible, provider, displayName, api, baseURL, providers:[...], models:[{id,name,input,contextWindow,maxTokens,enabled}], enabledCount, totalCount };非 OpenAI 兼容路由返回compatible:false提示,不拉取。POST /omniroute-models/api/apply—{ provider, models:[{id,name,input,contextWindow,maxTokens}] }, 校验后经ctx.settings.mutate('llm-pi-ai', [{op:'set', path:['providers',provider,'models'], value}], expectedRevision)写入; 冲突返回SETTINGS_CONFLICT、schema 拒绝返回settings-rejected。- 组件不注册/不拥有
llm-pi-ai命名空间(那是适配器@deepseek-ai/dsh-llm-pi-ai的);只读/写既有命名空间。
- Client(
src/client/index.tsx):订阅settings.sectionslot(idomniroute-models,order 15), 渲染 React 表格;全部数据走同源fetch,不依赖ctx.api/LLM 远程。
构建
# 需要 node + typescript + tsdown(可用 dev_build_plugin,或手动):
npm run build # host → lib/index.js
npm run build:client # client → lib/client.js
安装 / 注入
- 本环境(super-injector):
dev_inject_plugin /path/to/dsh-omniroute-models,注入即 host+client 完整生效。 - 生产 bundle:
dsh plugin --profile web add <本目录 | tgz | github:...>,然后重启目标 profile。
使用
- 刷新 DSH 页面(运行时注入的 client 模块需页面重载后才引导)。
- 打开「设置」→ 右侧出现「OmniRoute 模型管理」入口。
- 搜索 / 按模态筛选 / 勾选要用的模型(视觉模型会显示
text + image徽标)。 - 点「保存所选」→ 写入
settings.yaml的llm-pi-ai.providers.omniroute.models。 - 用一个刚勾选的模型发一条消息验证(视觉模型可附带图片)。
验证
- host:
curl "http://127.0.0.1:3080/omniroute-models/api/catalog"应返回模型列表 + 模态 + enabled。 - 写入:
curl -X POST .../api/apply -d '{"provider":"omniroute","models":[{...}]}'。 - 检查
~/.dsh/settings.yaml的llm-pi-ai.providers.omniroute.models(含input/contextWindow/maxTokens,兄弟字段保留)。