🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

模型列表实时刷新 WeatherWind/dsh-llm-pi-ai-live

DeepSeek Harness
WeatherWind36 天前有提交已提供中文文档扫描:含敏感能力

定时拉取线上模型列表并合并元数据写入路由配置

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add WeatherWind/dsh-llm-pi-ai-live
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]—
静态安装检查有提示项,装前建议看一眼 README
数据截至 2026/09/30·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 36 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-llm-pi-ai-live(未发布到 npm,仅可源码安装)
✓Node 引擎要求 ^22.19.0 || >=24 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/8 09:41:08

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 3 处,展示前 3 条)
  • 读取本地文件
    lib/builtin.js:111
    if (!existsSync(manifestPath))
  • 读取本地文件
    lib/builtin.js:115
    manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
  • 读取本地文件
    lib/builtin.js:127
    if (!existsSync(entry))
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/cordis-plugin-timer@deepseek-ai/dsh-llm@deepseek-ai/dsh-settings@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 定时拉取线上模型列表
  • 合并元数据到新id
  • 追加写入路由配置

为 DeepSeek Harness 的 llm-pi-ai 服务商路由实时刷新模型列表:查询在线端点,把已安装的 pi-ai 目录元数据合并到新 id 上,只追加写入,走官方设置接缝。

README

由 DeepSeek 最新模型翻译生成
dsh-llm-pi-ai-live 给 DSH 的 llm-pi-ai provider 路由做模型列表实时刷新的伴生插件。不改动 DSH 本体,走官方 settings / credentials / llm / tools 缝隙。 为什么需要它 内置的 @deepseek-ai/dsh-llm-pi-ai 在回答"这个 provider 现在能提供哪些模型"时,对 pi-ai catalog 已经认识的路由直接短路返回安装包里的快照,完全不发网络请求: // dsh-llm-pi-ai/lib/index.js discoverModels() const installed = catalogModels(request.provider) if (installed.size > 0) return [...installed.values()].map(...) // 直接返回快照 这是个有意的取舍——快照里带着 listing 端点不会公开的 contextWindow、maxTokens、多模态等元数据——但代价是:pin 住的 pi-ai 版本之后发布的模型永远出不来,用户手写的 models 列表也会一直冻结在当初抄下来的那几行。
展开完整文档(README 剩余 1 节)
dsh-llm-pi-ai-live

给 DSH 的 llm-pi-ai provider 路由做模型列表实时刷新的伴生插件。不改动 DSH 本体,走官方 settings / credentials / llm / tools 缝隙。

为什么需要它

内置的 @deepseek-ai/dsh-llm-pi-ai 在回答"这个 provider 现在能提供哪些模型"时,对 pi-ai catalog 已经认识的路由直接短路返回安装包里的快照,完全不发网络请求:

// dsh-llm-pi-ai/lib/index.js discoverModels()
const installed = catalogModels(request.provider)
if (installed.size > 0) return [...installed.values()].map(...) // 直接返回快照

这是个有意的取舍——快照里带着 listing 端点不会公开的 contextWindow、maxTokens、多模态等元数据——但代价是:pin 住的 pi-ai 版本之后发布的模型永远出不来,用户手写的 models 列表也会一直冻结在当初抄下来的那几行。

社区已经反复报告过这个漂移:

- #3816 — opencode-go 线上 28 个模型,快照只有 16 个;新模型(glm-5.3、qwen3.8-max、gpt-5.6-luna…)永远显示不出来
- #5306 — 「模型列表陈旧且不完整,从不向 provider 端点刷新」
- #5691 — 「目录是静态的:OpenRouter 431 个模型只显示 333 个」
- #4685 — 「从 OpenRouter 拉取模型不工作」

本插件就是这些报告里共同诉求的落地:总是查线上端点、失败时回落快照、把快照的元数据合并到线上 id 上、并且把结果真正写进路由配置。

它做什么

一次刷新(定时触发、启动后触发,或调用 refresh_model_catalog 工具):

1. 发现路由 — 从 llm.listConfigurableProviders() 取实时的 configurable-provider 目录,拿到每条路由真正所属的 settings namespace 与 settingsPath。
不硬编码 llm-pi-ai:settings namespace 是 profile 的 loader entry id(stock profile 里是 include:llm-pi-ai),写死它的插件会静默失效。
2. 探测端点 — OpenAI 系协议走 GET {baseURL}/models(Bearer),Anthropic Messages 走
GET {root}/v1/models?limit=1000(x-api-key + anthropic-version),两种响应方言都归一化。
3. 合并 — 线上 id 决定"有哪些模型",已安装的 pi-ai catalog 决定 name / contextWindow / maxTokens / input;端点自己报了容量的则以端点值兜底。
4. 写回 — 通过 settings.mutate() 写入,写前重读 revision,写后回读确认真的落地。

保证

- 只追加,绝不删改。 用户已有的条目按原顺序、原字段、原对象引用原样穿过,只在末尾追加新 id。
端点已下线的模型不会被移除。
- 读不懂就不写。 若既有 models 不是一份能完整解释的列表(比如被误写成字符串、或有条目缺 id),整条路由放弃并报告——而不是猜一个值把它覆盖掉。
- 失败不动配置。 端点 5xx、超时、返回非 JSON、协议不可读、写入被拒——任何一步失败都只报告,该路由配置保持原样。
- 不合成危险字段。 只写 id / name / contextWindow / maxTokens / input 这五个语义明确的字段。reasoningEfforts、compat 这类字段绝不从列表推断:留空即继承 catalog 条目的能力,永远比"从裸列表猜"更准。

安装

1) 构建
cd dsh-plugins/dsh-llm-pi-ai-live
npm install && npm run verify && npm run build

2) 装进目标 profile(本地路径用 link:)
dsh plugin --profile add link:$PWD

3) 重启 DSH

也可以手工把 cordis.patch.yml 里的 insert 段并入 /cordis.patch.yml。

首次使用建议先开 dryRun: true 跑一轮。dry run 只计算并报告,绝不写入,报告直接进日志:

[live-catalog] mounted (first pass in 0ms, periodic refresh off, dry run)
[live-catalog] openrouter: dry run — would add 464 model(s): openai/gpt-6.1-sol-pro, ... [live-catalog] scheduled: 1 updated, 464 added, 0 failed, 0 skipped in 932ms

(上面是一次对真实 OpenRouter 端点、真实 DSH 启动的实测输出。)确认无误后把 dryRun 关掉即可。

配置

全部字段可省略。默认值见 cordis.patch.yml。

| 字段 | 默认值 | 含义 |
| enabled | true | 总开关;false 时只加载不调度 |
| startupDelayMs | 10000 | 挂载后首次刷新的延迟(毫秒);0 = 立即执行(首次刷新总会执行) |
| intervalMs | 21600000 | 刷新周期(毫秒,默认 6 小时);0 关闭周期刷新 |
| timeoutMs | 30000 | 单次网络请求超时 |
| settingsNamespaces | [] | 要服务的 namespace;空 = 从目录自动探测 pi-ai 的 namespace |
| include | [] | 只刷新这些 provider 路由;空 = 全部已配置路由 |
| exclude | [] | 跳过的 provider 路由,例如 ['openrouter'] |
| enrichFromCatalog | true | 用已安装 pi-ai catalog 补齐新条目的元数据 |
| maxModels | 2000 | 每条路由存储的模型数上限 |
| dryRun | false | 只计算并报告,不写入 |
| toolEnabled | true | 是否注册 refresh_model_catalog 工具 |

给第三方模型补 reasoning effort

先说清现状:llm-pi-ai 的路由如果不在 pi-ai catalog 里,它的一切都得自己声明,而 reasoningEfforts 是唯一没有合理默认值的字段。对真实 DSH 的实测:

| 第三方模型 | resolveModelInfo().reasoning |
| 没有 reasoningEfforts | null —— 模型不提供任何思考等级,选择器里也没有 |
| 声明了 reasoningEfforts | {efforts: [off, high, max]} ✓ |
| reasoningEfforts: false | null(正确地声明为不推理) |

也就是说:手工写一张 map 能用,但每加一个模型都要再写一遍。 这个功能把那件事自动化,且不猜:

reasoning:
enabled: true
rules:
- provider: 'acme-gateway' # 对路由名做 glob model: 'glm-' # 对模型 id 做 glob efforts: off: null # 只有 off 允许为 null high: high max: ultra # 给这个网关重命名一个等级
- provider: 'local-vllm'
model: ''
efforts: false # 声明为不推理

只补真正的缺口,两条铁律:

- 条目已经声明了 reasoningEfforts(包括 false——那是"这个模型不推理"的明确表态)→ 绝不触碰。
- 模型已安装 catalog 认识 → 绝不触碰,因为字段留空本来就会继承 catalog 的能力,它并不缺东西。

绝不从模型名推断能力。 等级和它的线上拼写是运营者对自己网关的陈述,不是插件能猜的东西——猜错会直接改变请求形状。所以规则写了才生效,没匹配到就什么都不做。
规则里出现拼错的等级名会被拒绝并在日志里点名是第几条规则,而不是静默失效。

工具

refresh_model_catalog(可选参数 provider:只刷新某一条路由)——让 agent 在 provider 发布新模型后按需刷新,无需改配置或重启。

它不做什么

- 不替换内置的「拉取可用模型」按钮。 ctx.llm.registerModelDiscovery(ns) 对同一 namespace 重复注册会抛 DUPLICATE_DISCOVERY,而 llm-pi-ai 已占用该 namespace,所以外部插件无法在设置页替换内置的短路逻辑。本插件走的是另一条路:把实时结果真正写进路由的 models。
- 不碰没有端点可查的路由。 一个既没有 baseURL、catalog 也没给端点的 provider(例如纯 OAuth 的 Bedrock/Vertex)会被报告为 NO_ENDPOINT 并跳过。
- 不做协议探测。 一个 catalog 路由若同时说多种协议(OpenRouter 就同时有 Anthropic 与 OpenAI 方言),列表请求按多数派协议发;该路由自己的模型仍各自保留协议不变。
- 不自动补 models 之外的字段。 见上文"不合成危险字段"。
- 大型网关会写出很长的 models 列表。 实测 OpenRouter 线上 464 个模型,写进 cordis.patch.yml 后约 88 KB。这是"把线上目录固化进配置"的必然代价;maxModels 默认 2000 是上限护栏,exclude 可以整条路由排除。

与同类插件的区别

这个方向已经有若干社区插件,选择时值得知道彼此的差别。特别值得指出:

- 不要再走 ctx.llm.discoverModels('llm-pi-ai', …)。 那个服务对 pi-ai catalog 认识的路由直接短路返回安装包里的快照,是 #3816/#5306 抱怨的根因。有的同类插件正是通过它取列表,于是「实时同步」拿到的其实是快照。本插件自己发 HTTP 请求。
- 本插件是协议通用的,不是只服务某一家网关:OpenAI 系 + Anthropic Messages 两种列表方言都读。
- provider 级没有 endpoint 时从模型级取。 opencode-go 在 catalog 里 baseUrl 为空、只有模型级才有——不处理这点,最典型的「只配了一个 credential」场景会被直接跳过。
- 只追加、读不懂就拒绝。 models 若是读不懂的值,本插件放弃该路由而不是覆盖它。
- 绝不合成 reasoningEfforts / compat。 有些同类插件会探测或按家族推断思考等级;本插件留空让其继承 catalog 能力,因为猜错会直接改变请求形状。

同类参考:mpetruc/dsh-model-sync、ddddd-ren/dsh-relay-toolkit(功能更宽,含设置页 UI 与连通性探测)、Retr67/dsh-opencode-models、fan56/dsh-model-sync、zpis666/dsh-opencode-go-sync、 dsh-model-catalog-refresh、dsh-model-catalog-sync。本插件的取舍是窄而可验证:不做 UI 面板,把力气花在合并语义的正确性和验证深度上。

开发

npm run typecheck # 源码 + 测试的类型检查(两个 tsconfig)
npm test # vitest(单元 + 真实 catalog 集成)
npm run build # src → lib
npm run verify # typecheck + test
npm run test:e2e # 真实启动一次 DSH,端到端验证

测试分两层:

- test/{listing,merge,routes,sync,index}.test.ts — 纯逻辑与编排,全部用假 seam。
- test/integration.test.ts — 若能从 node_modules 解析到真实的 @earendil-works/pi-ai,就用真实 catalog 跑一遍 #3816 的场景(只配了 credential 的 opencode-go),否则自动跳过。

做真实 catalog 集成测试时,把 profile 里的包链进来即可:

PROF=$DSH_PROFILE_DIR/node_modules
mkdir -p node_modules/@earendil-works
ln -sfn $PROF/@earendil-works/pi-ai node_modules/@earendil-works/pi-ai

端到端验证

npm run test:e2e 会:

1. 在本包的 .e2e/ 下建一个一次性的 DSH_HOME 与 scratch profile;
2. 链入你指定 profile 的依赖包(默认 ~/.dsh/profiles/desktop),并把本包按包名链进去——loader 导入的是裸标识符,绝对目录路径无法被 ESM 解析,所以 name: 必须写包名;
3. 在 127.0.0.1 起一个假的 /models 端点,写一份真实 llm-pi-ai 路由的 patch;
4. 真实启动 dsh --profile scratch;
5. 断言 profile patch 文件里新增了端点上的模型、而手写条目原样保留。

用 DSH_PROFILE_DIR=... npm run test:e2e 指定包来源。除本地假端点外不启动任何服务。

这一步不是可选的。 本项目开发中它抓到了两个单元测试不可能发现的缺陷: inject 缺 timer 导致插件在真实 profile 里根本不激活;以及 startupDelayMs: 0 让首次刷新被静默跳过。两处都已修复并有回归测试。

依赖与解析

按官方 publish.md 与 app-boot README:

- DSH 在导入插件前,会把 peerDependencies 里的 @deepseek-ai/dsh 与 @deepseek-ai/dsh- 对照运行时版本逐条校验,不匹配即拒绝加载。本插件声明 >=0.1.7-rc.2 <0.2.0。
- 但 @deepseek-ai/dsh-llm 这类包只在 DSH 安装体内分发,公共 registry 上并不存在对应版本。
所以每个 peer 都标了 optional: true——既保留版本声明供准入校验,又避免 pnpm 去 registry 抓一个取不到的包。
- 非 @deepseek-ai/dsh 的 peer(cordis、timer、pi-ai)不参与准入校验,同样标记 optional。
- @deepseek-ai/schemastery 留在 dependencies:它是无状态的 schema 工具库,官方文档明确把 "无状态 dsh 工具"归入 dependencies;自带一份也保证插件在任何 profile 里都能加载。

pi-ai 的定位:本插件不在构建期依赖 pi-ai,运行期按两级策略取用——先走普通裸导入;失败时(pnpm 非扁平布局下很常见)退化为在磁盘上定位它。require.resolve 这条常规退路走不通,因为 pi-ai 的 exports 里没有 ./package.json,且子路径只在 import 条件下导出;本插件因此自带一个最小的 exports 通配符解析器(pi-ai 声明的键是 "./providers/*",不是字面量)。两者都失败时不报错,只是新模型只带端点自报的元数据。

环境依赖

inject: ['settings', 'llm', 'timer'] 是硬依赖。timer 由 @deepseek-ai/cordis-plugin-timer
提供(dsh-base 已包含)。credentials 与 tools 通过 ctx.get 可选读取,缺失时插件照常刷新,只是无法解析 apiKeyEnv、也没有手动工具。

许可

MIT
预览分享卡片长什么样 ↓WeatherWind/dsh-llm-pi-ai-live
分享 · DeepSeek Harness Hub
WeatherWind/dsh-llm-pi-ai-live

定时拉取线上模型列表并合并元数据写入路由配置

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部