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

供应商启停开关 dunlingzi/dsh-provider-toggle

DeepSeek Harness
dunlingzi21 天前有提交已提供中文文档扫描:未发现敏感能力

在模型设置页开关供应商,停用即移除路由并自动存档

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

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

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dunlingzi/dsh-provider-toggle
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · model
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 21 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✗npm 包dsh-provider-toggle(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖要求 >=0.2.0-rc.1 <0.3.0-0 · 最新 0.2.1-rc.2 兼容
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/20 00:17:46

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

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 开关模型服务商
  • 停用移除路由
  • 配置档归档还原

DeepSeek Harness 的模型设置页给模型服务商加了启用/停用开关:停用会真正移除 pi-ai 路由(模型选择器和所有选择器里都不再出现),完整配置档会归档,重新启用时逐字段还原。

README

由 DeepSeek 最新模型翻译生成
dsh-provider-toggle 为 DeepSeek Harness 的 设置 → 模型 页提供模型供应商的启用/停用开关,并在页脚给出一个存档列表,让停用的供应商能回到配置里。 停用是真正的停用:它 unset llm-pi-ai.providers.<route> —— 与官方「删除供应商」按钮执行的是同一处写入 —— 因此路由会注销,供应商会从 composer 选择器与子代理选择共同读取的模型目录里消失。由于这次写入删掉的是整段配置,插件会先把它原样存档进自己的设置项,启用时逐字段还原(所有手写字段 —— headers、compat、reasoningEfforts、逐模型覆盖 —— 都能往返,因为存档字段是开放类型的)。 针对 DSH 0.2.0-rc.2(desktop 档)构建。无构建步骤:两半都是纯 JavaScript。 它渲染什么 | 位置 | 槽位 | 内容 | | 供应商行 | settings.models.provider-card(keyed llm-pi-ai) | 每个自定义供应商卡片内的一行设置项 —— 左标题、右开关 | | 页面页脚 | settings.models.footer | 全部已存档供应商,以及用于恢复它们的开关 | 被停用的供应商不再有行留存,所以页脚是它唯一能被重新启用的地方。
展开完整文档(README 剩余 1 节)
dsh-provider-toggle

为 DeepSeek Harness 的 设置 → 模型 页提供模型供应商的启用/停用开关,并在页脚给出一个存档列表,让停用的供应商能回到配置里。

停用是真正的停用:它 unset llm-pi-ai.providers.<route> —— 与官方「删除供应商」按钮执行的是同一处写入 —— 因此路由会注销,供应商会从 composer 选择器与子代理选择共同读取的模型目录里消失。由于这次写入删掉的是整段配置,插件会先把它原样存档进自己的设置项,启用时逐字段还原(所有手写字段 —— headers、compat、reasoningEfforts、逐模型覆盖 —— 都能往返,因为存档字段是开放类型的)。

针对 DSH 0.2.0-rc.2(desktop 档)构建。无构建步骤:两半都是纯 JavaScript。

它渲染什么

| 位置 | 槽位 | 内容 |
| 供应商行 | settings.models.provider-card(keyed llm-pi-ai) | 每个自定义供应商卡片内的一行设置项 —— 左标题、右开关 |
| 页面页脚 | settings.models.footer | 全部已存档供应商,以及用于恢复它们的开关 |

被停用的供应商不再有行留存,所以页脚是它唯一能被重新启用的地方。存档为空时,页脚完全不出现在页面上。

它把自己当页面的访客,而不是自成一套。 该行用的是宿主自己的「带标签开关行」(dsh-client-ui-settings-general 的 DeveloperToolsRow):左侧是标题 + 描述块,字号沿用宿主;右侧是控件,两者间距 24px —— 开关是宿主 Switch 在 dpt- 前缀下的一份拷贝(36×20,关态 --dsw-alias-border-l3/开态 --dsw-alias-brand-primary,120ms 滑动,禁用时半透明)。该行刻意不带自己的 margin、padding 或 border,因为卡片本身已经是一个 gap:12px 的纵向 flex。被阻断的原因就是该行的 description,失败信息以 role="alert" 渲染在这个文本块内 —— 与宿主放置它们的位置完全一致。引用的每一个自定义属性都是 --dsw-* 主题令牌,任何地方都不出现字面色值;tests/run.mjs 对以上全部做了断言。

截图

pi-ai 供应商在 设置 → 模型 页拿到的那一行 —— 宿主自己的带标签行,插件开关在右侧:

供应商行及其启用/停用开关

被守卫拦下的行会通过该行的 description 自我说明,位置正是宿主放说明文案的地方 —— 这里 agent 的默认模型指向了该供应商,同时子代理策略仍然列着它:

被阻断的行,同时显示默认模型阻断与子代理警告

页脚存档 —— 被停用供应商唯一能被重新打开的地方,因为它自己的行已经没了:

页脚存档列出被停用的供应商

截图取自实机 profile。图中的供应商名是本仓库通篇使用的虚构示例。

用法

1. 设置 → 模型。 每个 pi-ai 供应商行末尾都有一个开关。本 README 与 tests/ 里的供应商名均为虚构(Acme Local、Acme Relay (OpenAI)、Globex Cloud)。
2. 点它停用。该行消失,供应商从模型选择器里消失,页脚存档里出现它的条目。
3. 在页脚点它的开关启用。供应商带着与停用前逐字节相同的配置回来,它的行也回来了。

状态存在 profile patch 里(profiles/<profile>/cordis.patch.yml → - id: provider-toggle → config.disabled),所以重启后依然有效。

守卫规则

| 情况 | 行为 |
| agent 的默认模型指向该供应商 | 开关被禁用并显示原因。请先切换默认模型。 |
| 该供应商同时出现在子代理可选模型里 | 允许停用并显示警告;那条可选模型条目将失效。 |
| 该供应商在组合层里也有声明 | 拒绝 —— unset 用户 profile 不会把它摘下来,所以插件不假装做到了。 |
| 期间有别人改了设置 | 按冲突拒绝,重新读取文档,可重试。 |
| 设置文档只读 | 用宿主自己的消息拒绝该操作。 |

安装(desktop 档)

profile 的 package.json 只允许写精确的 registry 版本号,所以本地 tarball 是通过 pnpm-workspace.yaml 的 overrides 装进去的(第 2 步有两处):

$REPO = '<this checkout>'
$DSH = "$env:USERPROFILE\.dsh" # 或你的 $DSH_HOME $PROFILE_DIR = "$DSH\profiles\desktop"

1. 打包
cd $REPO
pnpm pack --out "$PROFILE_DIR\local-packages\dsh-provider-toggle-0.2.7.tgz"

2. 声明 —— package.json 写精确版本,tarball 写进 pnpm-workspace.yaml 的 overrides package.json "dsh-provider-toggle": "0.2.7"
+ dsh.profile.bundles 里加 "dsh-provider-toggle" pnpm-workspace.yaml overrides: dsh-provider-toggle: file:local-packages/dsh-provider-toggle-0.2.7.tgz

3. 安装,然后校验
cd $PROFILE_DIR
CI=true pnpm install --no-frozen-lockfile
CI=true pnpm install --frozen-lockfile
再跑一遍你 DSH home 自带的只读安装门禁

然后重启应用。这道门禁就是标准的本地插件安装检查 —— 改前只读校验、精确版本 + workspace override、改后同样门禁 + frozen 安装。

自测

node tests/run.mjs # 77 项 —— 插件本身
node tests/uninstall.test.mjs # 32 项 —— 卸载工具端到端
node tests/desensitize.test.mjs # 12 项 —— 脱敏门禁
npm test # 三套连跑

tests/uninstall.test.mjs 会读取活动 profile patch (默认 %USERPROFILE%\.dsh\profiles\desktop\cordis.patch.yml);把 DSH_PROFILE_DIR 指向别处即可校验另一个档。它的 scratch 目录建在系统临时根下,因此跑测试永远不会写进你自己保留的目录。

除 node_modules/ 下随仓库携带的 schemastery 之外没有依赖,它用于校验宿主半边的 Config。

tests/run.mjs 在 vm 里配一个 window.__ModuleLoader__ 壳来求值 client.js(于是语法错误或顶层 TDZ 会在这里失败,而不是把设置页整个搞白),对两个槽位做浅渲染,并在一个内存版设置文档上端到端驱动开关协议 —— 该文档模拟了宿主的 revision 栅栏与 path-op 语义。

tests/uninstall.test.mjs 在 scratch 目录里对真实 profile patch 的一份副本跑维护工具 —— 从不碰活动 profile —— 并断言移除插件那段之后文档逐字节相同。

卸载 / 回滚

1. 在「模型」页页脚把每个已存档供应商都启用(否则工具会拒绝执行)。
2. 先看计划,再从 profile patch 里移除插件的设置段:
node tools/uninstall.mjs
node tools/uninstall.mjs --execute
3. 从 profile 的依赖列表里移除该包(命令由工具打印)。

tools/uninstall.mjs 默认是 dry run,除非传入 --execute;写之前会连同字节数与 SHA-256 一起备份;存档里还有供应商时会拒绝执行 —— 卸载永远不会悄悄丢掉某个供应商的配置。

那份备份同时就是回滚件:把它拷回 cordis.patch.yml 覆盖,然后重启。

已知限制

- 只针对 llm-pi-ai。 DeepSeek Account 与 DeepSeek 行是官方内置段,「停用官方路由」语义不同,不在范围内。
- 开关位于行的末端、行头下方。 官方页面把这个扩展槽位渲染成行内操作按钮的兄弟节点,所以开关无法插到 编辑/删除 之间。没有修改任何官方包。
- 已经绑定到被停用供应商的会话会保持绑定。 只有默认模型被守卫;已经选中该路由的会话在下一次请求时会失败,直到它切换为止。这正是默认模型守卫是硬阻断的原因。
- 存档是部署配置,不是密钥库。 只暂存 profile 配置;API key 留在凭据服务的 <ROUTE>_API_KEY 下,插件从不读取也从不写入。

目录结构

index.js 宿主半边 —— Config 里 volatile 的 disabled 字段就是存档 client.js 浏览器半边 —— 两个槽位与开关协议 cordis.patch.yml bundle patch —— 插入 provider-toggle 行(id == 设置 namespace) locale/ 插件管理器显示文案(en / zh) tests/run.mjs 执行门禁 —— 两半真跑,77 项 tests/uninstall.test.mjs 卸载工具端到端 —— 32 项 tools/uninstall.mjs 卸载辅助工具 docs/images/ README 截图

致谢

写入路径协议(先存档后 unset 的顺序、先恢复后清空的顺序、拒绝分类,以及重命名后按 schema 形状找回存档行的兜底)参照了 dsh-web 包里的 @linxin666/dsh-client-ui-model-capabilities —— 它在 Apache-2.0 下针对 0.2.0-rc.2 发布了同一处缝。本包是一个独立且小得多的实现:一个开关加一个存档,没有逐模型能力编辑器。

dpt-switch / dpt-thumb 规则是 @deepseek-ai/dsh-client-ui-primitives 的 Switch.module.css 改名后的一份拷贝;该行的字号、间距与令牌取自 dsh-client-ui-settings-models 编译产物 ModelsSection.module.css —— 两者都是 DSH 自己的设计系统,所以插件与它所在的那一页保持一致,而不是去近似它。插件在运行期仍然不 import 这两个包(practices.md:自己写控件并贴合宿主才是被支持的路径)。

许可证

MIT。
预览分享卡片长什么样 ↓dunlingzi/dsh-provider-toggle
分享 · DeepSeek Harness Hub
dunlingzi/dsh-provider-toggle

在模型设置页开关供应商,停用即移除路由并自动存档

回到顶部