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

模型开关与思考强度 Salty-Mocha/dsh-model-controls

DeepSeek 客户端
Salty-Mocha16 天前有提交已提供中文文档扫描:无法判定兼容 / 相关生态

按模型和供应商启停,并为第三方配置思考档位

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

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

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/Salty-Mocha/dsh-model-controls.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
该类项目属生态应用(桌面端 / Web 外壳),不以 dsh plugin add 方式安装,请按仓库说明部署
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成

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

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/31) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

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

展开查看检查明细 ↓

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

✗npm 包@local/dsh-model-toggle(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

安全扫描自动 · 静态分析源码
v2.7.0
⚪ 扫描:无法判定尚无人工评估
展开查看扫描说明与证据 ↓

已尝试扫描但取不到可分析的源码:仓库或包不存在、已删除,或为非 JS/TS 实现、未随包发布源码。无法判定,不代表安全。

  • · 取源不可用(Error: github tarball HTTP 404 @ https:
  • · api.github.com
  • · repos
  • · Salty-Mocha
  • · dsh-model-controls
  • · tarball)
扫描于 2026/10/31(1 天前)

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

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

按模型、按服务商分别开关,外加第三方思考强度规则,给 DeepSeek Harness(DSH)桌面应用用的。非官方;不动 app.asar。

README

由 DeepSeek 最新模型翻译生成
dsh-model-controls — 模型开关 + 思考强度 平台支持 | 平台 | 状态 | | macOS | ✅ 在 macOS 上开发、安装并验证(DSH 桌面版,Electron)。这是参考平台。 | | Windows | ⚠️ 已适配但未实测。工具改用 os.homedir() 解析主目录(即 %USERPROFILE%\.dsh\profiles\desktop),临时目录用 os.tmpdir(),并自动探测 %LOCALAPPDATA%\Programs\… / %ProgramFiles% 下常见的 app.asar 位置;探测不到就用 --asar <路径> 显式指定。 | | Linux | ⚠️ 已适配但未实测。app.asar 候选位置包括 /opt、/usr/lib、/usr/share、~/.local/share;都不匹配时用 --asar <路径>。 | 插件本体(lib/)是跑在 DSH 自带运行时里的普通 JavaScript,与平台无关;与平台相关的只有工具里的路径探测,所以工具都支持 --profile 和 --asar 覆盖。页面补丁是唯一可能随 DSH 版本失效的部分,它锚点失配时会明确报错,不会写出半成品。
展开完整文档(README 剩余 1 节)
dsh-model-controls — 模型开关 + 思考强度

平台支持

| 平台 | 状态 |
| macOS | ✅ 在 macOS 上开发、安装并验证(DSH 桌面版,Electron)。这是参考平台。 |
| Windows | ⚠️ 已适配但未实测。工具改用 os.homedir() 解析主目录(即 %USERPROFILE%\.dsh\profiles\desktop),临时目录用 os.tmpdir(),并自动探测 %LOCALAPPDATA%\Programs\… / %ProgramFiles% 下常见的 app.asar 位置;探测不到就用 --asar <路径> 显式指定。 |
| Linux | ⚠️ 已适配但未实测。app.asar 候选位置包括 /opt、/usr/lib、/usr/share、~/.local/share;都不匹配时用 --asar <路径>。 |

插件本体(lib/)是跑在 DSH 自带运行时里的普通 JavaScript,与平台无关;与平台相关的只有工具里的路径探测,所以工具都支持 --profile 和 --asar 覆盖。页面补丁是唯一可能随 DSH 版本失效的部分,它锚点失配时会明确报错,不会写出半成品。

给 DSH 的 设置 → 模型 页面加上「每个模型一个开关、每个供应商一个总开关」:停用后该模型不会再出现在输入框右下角的模型选择器(以及 /model 弹窗)里,配置完整保留,随时可重新启用。

同时给第三方(自定义 baseURL)供应商补上「思考强度」:按「模型 ID / API 协议 / baseURL」正则声明档位与线上映射,规则只写回用户没覆盖过的字段(详见下面的「思考强度(规则层写回)」)。

现在长这样

┌ 设置 → 模型 ─────────────────────────────────────────────────────┐ │ myrouter-ds-低价 [自定义] ● [●━ 总开关] [编辑] [删除] │ │ ┌───────────────────────────────────────────────────────────┐ │ │ │ API 密钥 / 自定义设置(显示名称、API 地址、API 协议…) │ │ │ │ 模型目录 [获取可用模型] │ │ │ │ [deepseek-v4.1-flash] [测试] [●━] [🗑] │ │ │ │ [glm-5.3-flash] [测试] [━○] [🗑] │ │ │ └───────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘

- 供应商卡片右上角:总开关(放在「编辑」左边),一键启用/停用该供应商下所有模型。
- 每个模型行:名称输入框已去掉(按 zcode 的样子只保留模型 ID),换成右侧的 [测试] 和 [启用/停用开关],紧挨删除图标左侧。
- 模型行不再需要单独的开关面板 —— 之前卡片里那个「Availability」块已删除。

两个组成部分

| 部分 | 位置 | 作用 |
| host 插件 @local/dsh-model-toggle | <profile>/node_modules/@local/dsh-model-toggle | 拥有设置命名空间 model-toggle(disabled: ["provider/model"],volatile,写入 profile 的 cordis.patch.yml);窄包装 sessionController.modelCatalog(),把停用模型从模型选择器目录里剔除;并跑思考强度规则层(见下节) |
| 打补丁的模型页 | <profile>/node_modules/@deepseek-ai/dsh-client-ui-settings-models + profile 清单里的同名依赖 | 模型页本体(编译后的客户端包)。同名包放进 profile 就会覆盖 app.asar 里的原件,于是可以在供应商行、模型行里直接放开关 |

DSH 的扩展插槽(settings.models.provider-card / footer / sign-in)够不到供应商操作行和模型行,所以 UI 只能走「覆盖整页」这条路。这也意味着修改后必须重启一次 DSH,而且 DSH 升级后需要重新打补丁(patch-page.mjs 可重复运行;锚点失效会明确报错而不是写出坏文件)。

思考强度(规则层写回)

问题:第三方供应商的模型在 DSH 里没有强度可选,因为目录元数据来自适配器,而第三方模型没有声明 reasoningEfforts。

做法(对齐 ZCode 的分层规则,但用 DSH 自己的机制,见 docs/design-notes.md §八/§九):规则匹配后,把 pi-ai 原生的 reasoningEfforts / compat 写回 llm-pi-ai.providers.<供应商>.models[]。

- pi-ai 本来就用这个字段同时决定「目录里显示哪些档位」和「请求里发什么值 / 发到哪个字段」,所以界面和请求天然一致,而且写进 cordis.patch.yml 后重启仍在。
- 不拦请求、不包 resolveModelInfo、不改 pi-ai 库。

配置

cordis.patch.yml 里 model-toggle 那一行的 config rules: # 按顺序求值,后面的规则逐字段覆盖前面的
- match: { provider: "^myrouter-grok$" }
levels: [off, low, medium, high]
map: { off: null, low: low, medium: medium, high: high }
- match: { baseUrl: "myrouter-anthropic\\.com" } # 命中供应商站点
levels: [off, high]
map: { off: null, high: high } # off=不发任何字段;high=发 "high"
compat: { thinkingFormat: deepseek } # 可选:钉住线上字段家族
overrides: # 单模型规格,优先级最高(下一步的界面会写这里)
"myrouter/deepseek-v4.1-flash": { levels: [off, medium], map: { off: null, medium: medium } }
fallback: false # 未命中任何规则的模型怎么办;默认 false = 不给强度行

- match:provider / model / api / baseUrl,都是正则,全部满足才命中;不写就是不限制。
- levels + map:map 里没写的档位按同名映射,off 默认映射到 null(= 不发)。也可以直接写 efforts: { off: null, high: high }。
- compat:可选,按键合并;可用项就是适配器暴露的那些(thinkingFormat、supportsReasoningEffort、supportsThinkingTokenBudget、thinkingTokenBudgetField、maxTokensField …),写错协议不接受会由 llm-pi-ai 明确报错。
- fallback: true 等价于两档兜底 { levels: [off, high], map: { off: null, high: high } }。

注意:ZCode 的 .* 兜底是「显示 Off/On 但什么都不发」的占位符(map: "{}")。DSH 里没法表达这种惰性档位(非 off 档必须写明发什么值),所以 fallback 默认关闭——没写规则的陌生模型就是没有强度行。要占位效果可以显式写:

fallback: { levels: [off, high], map: { off: null, high: high }, compat: { supportsReasoningEffort: false } }
(supportsReasoningEffort 只有 openai-completions 协议接受;openai-responses / anthropic-messages 没有等价开关。)

谁拥有哪个字段(「手动改过的就不再跟规则」)

规则的产物写进 llm-pi-ai 的配置层,和用户在模型页里的修改是同一层,所以插件在 model-toggle.managed 里记下「这个字段是我写的、写的是什么」:

- 用户层里没有该字段、插件也没写过 → 规则填。
- 用户层里的值等于插件上次写的 → 还是插件的,规则变化时继续跟着更新。
- 用户层里的值不等于插件写的(用户手改过)→ 释放该字段,规则以后不再碰它(对齐 ZCode 的 "When you manually change a setting, that setting becomes manually managed")。
- 插件写过的值被删掉 → 同样视为手改,释放。
- 规则不再声明某字段(比如规则被删了)→ 插件清掉自己填的值,且不留所有权记录,之后加回规则可以重新接管。

compat 按键判定归属:模型页回写时会把 schema 默认值(chatTemplateKwargs、chatTemplateArgs 等)一起带回来,这些额外键不算用户手改,规则仍会继续管理自己那几个键。

已验证

- 纯逻辑:node tools/test-rules.mjs — 55/55(匹配、分层覆盖、档位校验、所有权与释放、compat 键级归属、幂等)。
- 端到端:node --expose-internals tools/verify-rules.mjs — 17/17。它自己搭一个隔离 profile(/tmp/dsh-test/rules,结构复刻真实 profile:条目由 insert 层挂载、profile patch 作为用户层)并启动打包运行时,覆盖:规则写回落到用户配置层、目录里出现 reasoning.efforts、陌生模型没有强度行、第二次读目录不重写、规则改动会更新自己拥有的字段、用户手改的值不被覆盖且被记为 released、fallback 只作用于未释放的模型、停用过滤不受影响、重启后全部保持。
需要磁盘上存在从 app.asar 抽出的运行时(默认系统临时目录下的 dsh-test/runtime2,可用 DSH_TEST_RUNTIME 覆盖;先用 node tools/extract-runtime.mjs 生成)。
- 安装器:node tools/test-manage.mjs — 8/8(在临时 profile 上验证 install 不会丢掉已保存的设置、可重复执行、uninstall 干净)。
- 运行时抽取:node tools/extract-runtime.mjs —— 只读地从打包 app 里把运行时树复制到临时目录(约 317 MiB),供下面两个端到端脚本使用;--asar / --out / --only / --list 可控,绝不回写 app.asar。
- 请求体预演:node --expose-internals tools/probe-request-body.mjs <patch> [档位] — 离线启动真实供应商配置、把 fetch 换成桩,打印每个模型在「未选档」与「选了某档」时实际会发出去的 JSON。不出网、用假 key。加规则前先跑一遍,就能看出规则会不会改变默认请求体。
- 回归:会话里的 verify.mjs(停用开关)与 verify-override.mjs(整页覆盖)仍通过;verify.mjs 里有 3 项断言是早期「客户端半」留下的、现在插件是 host-only,已过时。

预演与回档

关键结论(离线抓真实请求体验证过):在 openai-completions 路由上,加规则本身是惰性的 —— 没选档时请求体与加规则前逐字节相同,只有选了档才多一个 reasoning_effort。但在 openai-responses 路由上不是:只要模型声明了档位,pi-ai 在没选档时也会发 reasoning: { effort: "none" }(判据是 thinkingLevelMap.off !== null,而 DSH 的 off: null 会被解析成"键缺席")。所以 responses 路由要不要开规则要想清楚。

回档三档(详见 docs/design-notes.md 的「回档」表):

整包回退到加规则之前(连带插件写回的 reasoningEfforts / managed 一起消失)
cp ~/.dsh/profiles/desktop/cordis.patch.yml.bak-before-reasoning-rules-<时间戳> \
~/.dsh/profiles/desktop/cordis.patch.yml
只删 rules: 里的某一条 → 插件下次 reconcile 会自动清掉它给该供应商写的 reasoningEfforts(它写的、现在没人声明 = 干净清除)。只想临时不用某个模型 → 在选择器里选「供应商默认」或「关」即可,不用改配置。

注意写回发生在下一次读目录时(打开模型选择器,或重启 DSH):插件必须先写、才能记下"这些字段是我写的",人预先写上反而会被当成手改而永久释放。

安装 / 卸载

cd dsh-model-controls
node tools/manage.mjs install # 1. 装 host 插件(热生效,不用重启)
node tools/patch-page.mjs install # 2. 装打补丁的模型页(需要重启 DSH 才生效)

node tools/manage.mjs status # 查看状态
node tools/patch-page.mjs check # 只做锚点校验 + 语法检查,不落盘

node tools/patch-page.mjs revert # 回滚模型页(再重启一次)
node tools/manage.mjs uninstall # 卸载 host 插件

每一步都会先备份 cordis.patch.yml;patch-page.mjs 复制/打补丁失败时不会留下半成品(先在系统临时目录里构建并跑 node --check)。

测试按钮

现在点「测试」会:先把探测请求写进 model-toggle 命名空间,若 4 秒内没有 host 答复,就回退到 llm/discoverModels 直接探测该供应商端点,把结果(连接正常 · N 个模型 · Xms 或 失败:…)显示在开关左边。

你最初选的是「发一条最小对话请求」——那需要 host 侧真的发一次补全,我还没有接线(要用同样的设置通道把探测请求交给 host,host 用 ctx.llm 发一次极短请求再把结果写回来)。这是下一步。

已验证内容

- host 插件(隔离启动打包运行时):命名空间可写、modelCatalog() 过滤、写入 cordis.patch.yml、重启后仍生效、卸载后还原服务方法。
- 思考强度规则层:见上面「已验证」小节的 55/55 与 17/17。
- 打补丁的模型页:从 app.asar 提取 → 9 处锚点全部命中 → 打补丁后 node --check 通过;再用桩模块物化 bundle 并调用 apply(ctx),不抛异常,且仍然只依赖基线模块。
- 覆盖机制:localPackageNames 认到模型页为本地包、浏览器会取到的 bundle 路径就是 profile 里那份(含补丁标记)、host 插件已不再有客户端行。

已知限制

- 需要重启 DSH 才生效;DSH 升级后要重新跑 patch-page.mjs。升级后如果插件用到的内部接缝变了,条目会「未能激活」(应用照常启动、功能消失),需要适配。
- 做不到 ZCode 那种「用户往请求体里塞任意字段」:DSH 只能决定值,字段家族由枚举 compat.thinkingFormat 选定(证据见 docs/design-notes.md §九)。
- 只为「配置里声明了模型」的供应商提供开关(模型列表来自设置文档的 models)。
- 思考强度规则层同样只管理声明了 models 列表的供应商:完全依赖 pi-ai 内置目录的路由不碰(否则会把内置目录冻结进用户配置)。
- 规则写回会把整条 models 数组写进 cordis.patch.yml(设置 API 的数组是整体替换)。对「模型本来就声明在用户配置里」的供应商,这只是补上字段;只有模型来自更低层时才等于把它物化一份。
- defaultEffort(打开模型时的默认档位)没有接线:DSH 的这个字段是路由级的 reasoning,由插件代填会影响整条供应商。所以默认是「供应商默认」(不发字段),你自己选档。
- 停用当前会话正在使用的模型会让输入框变成不可用,直到你另选一个模型。
- 模型行去掉名称输入框后,模型显示名只能通过「获取可用模型」或配置文件维护。

设计说明

内部接缝、文件:行号 证据、取舍与失败模式都记在 docs/design-notes.md;思考强度的方案来自 zai-org/ZCode(Apache-2.0)的调研,笔记在 docs/zcode-reasoning-effort.md。

免责声明

这是一个非官方社区项目,与 DeepSeek、Z.ai 均无隶属或背书关系,两家官方也没有参与或审核本项目。「DeepSeek Harness」「ZCode」等名称归各自所有者,此处仅用于说明本项目与什么集成。

它从外部改造一个已发布的桌面应用(不修改签名的 app.asar,但会遮蔽其中的一个页面),因此上游更新可能使其失效。请自行评估风险。

许可

MIT,见 LICENSE。
预览分享卡片长什么样 ↓Salty-Mocha/dsh-model-controls
分享 · DeepSeek Harness Hub
Salty-Mocha/dsh-model-controls

按模型和供应商启停,并为第三方配置思考档位

回到顶部