dsh-quick-model
Đã xác minhdsh-quick-model · v1.0.1 · MIT · Giao diện web
DSH web plugin: replaces the Settings → Models page with a one-stop panel — pick a preset or paste a baseURL + API key, fetch the model list from the endpoint, tick what you want, and save. Writes llm-pi-ai providers and credentials for you.
Cài đặt
dsh plugin add dsh-quick-model Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.
Mã nguồn
Phát hành lên npm mà không có repository công khai. Hãy kiểm tra nội dung package trước khi cài.
Thẻ
Tác giả
Readme
dsh-quick-model
把 DSH 的 设置 → 模型 页换成一个「一步到位」的面板。
原来的流程要自己想清楚服务商标识、接口地址、线路协议、密钥变量名,再一个一个手打模型 id。这个面板把这件事压成两步:粘贴地址和密钥 → 勾选模型 → 保存。
安装
三个来源,任选其一 —— 都是同一条命令的形式。
从 npm(包已发布时,其他人最省事):
dsh plugin --profile <profile名> add dsh-quick-model
从 GitHub(未发 npm 时也能一行装。本包是纯 JavaScript、没有构建步骤,
所以不会撞上 pnpm 默认拦截 git 依赖 prepare 脚本的 allowBuilds 门槛):
dsh plugin --profile <profile名> add github:<用户名>/dsh-quick-model
从 GitHub Release 的 tarball URL(最适合嵌进别的安装器):
dsh plugin --profile <profile名> add https://github.com/<用户名>/dsh-quick-model/releases/download/v1.0.0/dsh-quick-model-1.0.0.tgz
从本地 tarball / 本地目录(离线分发或开发时):
dsh plugin --profile <profile名> add ./dsh-quick-model-1.0.0.tgz
dsh plugin --profile <profile名> add D:\path\to\dsh-quick-model
dsh plugin是 pnpm 的转发器:它在 profile 目录里跑pnpm add,然后对照安装结果把dsh.profile.bundles补齐。绝对路径与file:规格会原样传递;只有./..这类相对 路径会被锚定到你当前所在目录。
安装后必须重启 DSH。 profile 的 bundle 列表是启动时的快照 —— 只有用户
cordis.patch.yml 被编辑时才会热重载,新增 bundle 不会热挂载。重启后打开
「设置 → 模型」,看到的就是这个面板。
卸载:
dsh plugin --profile <profile名> remove dsh-quick-model
卸载并重启后,官方模型页自动回来。
给安装器作者
scripts/install.ps1 与 scripts/install.sh 是对上面那条命令的薄封装,可直接嵌入别的安装器:
.\install.ps1 -Profile web -Source github:someone/dsh-quick-model
./install.sh web github:someone/dsh-quick-model
它们在 dsh 不在 PATH 时报错退出(码 2)、安装失败时退出(码 1)、安装后调用本包自己的
契约自检(失败则退出码 3),最后打印"必须重启"的提示。两者都是纯 ASCII,不受编码或
区域设置影响。SKIP_VERIFY=1(sh)或 -SkipVerify(ps1)可在未随附 validate.mjs 时跳过自检。
发布(维护者)
[email protected] 已发布到 npm。首次发布之后,后续版本有三种方式:
# A. 本地手动发(npm 会在发布时要求一次 2FA 验证码)
npm login --registry https://registry.npmjs.org/
npm publish --registry https://registry.npmjs.org/ --access public --otp <6位验证码>
# B. 打 tag 交给 CI(推荐)
npm version patch && git push --follow-tags
# C. 只推代码,不发 npm
git push -u origin main
认证现状(容易踩坑,务必看)
npm 的认证方式在 2025-12-09 变过一次,网上大量教程已经过时:
- classic token 被永久撤销,包括以前常说的 "Automation token"。那个选项在 npmjs.com 的令牌页面上已经不存在了。
npm login现在拿到的是两小时会话令牌,且发布时会额外要求一次 2FA 验证 —— 所以npm publish通常需要--otp <验证码>。- granular access token 只有在勾选 Bypass two-factor authentication (2FA) 时才能用于
发布。勾了之后令牌元数据里
bypass_2fa: true—— 可以用GET https://registry.npmjs.org/-/npm/v1/tokens(带该令牌)自查这个字段。这类令牌对"直接 发布"正在收紧,属于过渡方案。 - CI 的推荐路径是 OIDC trusted publishing(本仓库工作流已采用):不需要任何长期令牌。
一次性配置:在包的 npm 设置页添加 Trusted Publisher,provider 选 GitHub Actions,
repository 填
<owner>/dsh-quick-model,workflow filename 填publish.yml。配好之后 方式 B 就能无人值守发布,并自动附带 provenance 证明。
GitHub 通道可以独立于 npm 工作 —— 只推仓库不发包,dsh plugin add github:<用户名>/dsh-quick-model
一样能装。
自检
安装前后都可以跑这两个脚本,它们检查的是 loader 与客户端模块扫描器真正会强制的契约, 而不是"看起来对":
# 1. 打包契约 + 客户端半在桩浏览器里真实加载
node scripts/validate.mjs <profile目录> dsh-quick-model
# 2. Host 半挂到桩服务上,真跑一遍路由与全部动作
node scripts/smoke-host.mjs lib/index.js
第一个验证:包能否从 profile 解析、dsh.bundle.patch 是否存在且能解析出 insert 行、
dsh.client 是否声明、exports["./client"] 是否可读、Host 半是否导出
{ name, inject, apply }、客户端半是否真的调用 __ModuleLoader__.load 并以
settings.section + 官方 models id 注册。
第二个验证:路由注册、/state 的组装、discover 的规范化、save 的校验与写入顺序、
remove / set-default / probe、以及各种拒绝路径。
两个脚本都不需要启动 DSH。
它到底做了什么
面板里所有读写都走 Host 半注册的两个接口,密钥从不进入浏览器:
| 接口 | 作用 |
|---|---|
GET /api/quick-model/state |
当前已配置服务商、pi-ai 服务商目录、当前默认模型 |
POST /api/quick-model/action |
discover / save / remove / set-default / probe |
Host 半用的就是官方模型页同一套接缝:
ctx.settings—— 读写settings.yaml里的llm-pi-ai.providers.<route>ctx.credentials—— 把密钥写进$DSH_HOME/.credentials.yaml,配置里只留apiKeyEnv引用ctx.llm——discoverModels探测端点、resolveModelInfo解析模型能力ctx.agentDefaultModel—— 保存{ provider, model, reasoningEffort }
界面
当前默认模型 —— 显示 provider / model,旁边的推理强度下拉(默认 / off / low / medium / high / max)改完点「应用」。
添加服务商 —— 两个页签:
- 常用网关 / 自定义:13 个预设一键填入地址与协议(DeepSeek、阿里云百炼、硅基流动、Kimi、智谱 GLM、火山方舟、MiniMax、OpenRouter、OpenAI、Anthropic、Ollama、vLLM/LM Studio)。填好后点「拉取模型列表」,面板会请求
baseURL + /models,把模型列出来供你搜索、全选、勾选。 - 内置服务商目录:从 pi-ai 已安装的目录里选,模型列表离线可得,不联网。
已配置服务商 —— 每行显示名称、标识、端点、协议、模型数量与密钥状态;展开可看全部模型,点任意一个模型即把它设为默认;右侧可删除。
几个刻意的设计
- 密钥变量名留空会自动生成(如
OPENROUTER_API_KEY)。若该引用已被环境变量或.env提供,则跳过写入并如实告知来源,不会假装成功。 - 勾选全部模型时不写
models字段,让该路由继续跟随目录;只有你手动削减时才写死清单。 - 内置目录里已存在的服务商,保存时不写
api,避免把目录路由强行变成手写路由(后者会收窄可用范围)。 - 写入走
settings.mutate的路径寻址,只动你看到的那一项,不覆盖同文件里的其他配置。 - 面板只显示走 pi-ai 适配器的路由。
deepseek-official之类由 composition 提供的路由不出现在列表里 —— 这不是遗漏,是这个页面的职责边界。
它是怎么把官方页面关掉的
两件事一起做,缺一不可:
关掉官方那一行。 本包的
cordis.patch.yml里有一条 id 定向补丁:- id: ui-settings-models disabled: trueui-settings-models就是 web bundle 里提供「设置 → 模型」页的那一行。bundle patch 按dsh.profile.bundles顺序叠加,而dsh plugin add把新 bundle 追加到最后 —— 所以我们的 补丁在@deepseek-ai/dsh-web-app之后生效,disabled覆盖成功。占用同一个导航格子。 浏览器半注册进
settings.section并复用官方那个modelsid。 按该插槽契约,新 id 会被加在官方条目旁边;而官方那一行已被关掉,格子是空的 —— 两边 都对上,导航里就只剩一个「模型」。
代价
官方那一行被关掉后,它声明的扩展点也随之消失:settings.models.provider-card、
settings.models.footer、settings.onboarding。标准 web profile 里没有别的插件往这些位置
注册,所以无影响。如果你之后装了依赖这些扩展点的第三方插件,就把上面那条 disabled
从 cordis.patch.yml 里删掉 —— 本插件会转而与官方页面并排显示,而不是替换它。
取消替换
卸载 + 重启,官方模型页自动回来。不需要改任何产品代码。
依赖
需要 profile 里有 settings、credentials、llm、agentDefaultModel、webServer 五个服务(标准 web profile 全部自带)。浏览器侧需要 slots。
License
MIT