dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
按来源分块的输入框模型选择器:先选来源渠道卡片,再下钻进该渠道选择模型,保留跨来源搜索与推理强度调节。
English | 中文
DeepSeek Harness (DSH) 插件 —— 按模型来源分块的输入框模型选择器。
把官方那个「所有模型拉成一条长列表」的选择器,换成先按来源渠道分块、再下钻进块内选模型的两级结构;搜索、推理强度(Reasoning Effort)、模型可用性等原有能力完全保留。
点击输入框右下角的模型位,弹出的不再是长长的平铺列表,而是按来源分块的卡片网格:
v3 / sonnet / r1,跨全部来源聚合匹配;回车选中首项。截图中的来源名称已做打码处理。
深色模式使用同一套主题 token,强调色为 --dsw-alias-link(#7aaaff),不再出现白底白字:
搜索框左侧的 ⚙ 打开显示设置:可按提供方整体开关、展开逐个开关模型,行内 ✎ 直接改名、模型行可拖动排序,顶部的「同步到全部界面」把新名字写进模型注册表:
触发按钮本身与同排的截图 / 麦克风图标保持同一设计语言(主题描边与文字):
← 所有来源 或 Esc 返回。v3 / sonnet / r1 等关键词即可跨所有来源聚合匹配,回车选中首项;清空即回到分块视图。恢复模型默认 一键回到提供方推荐值。speedMode / outputVerbosity,浮层底部会额外出现对应的分段控件;不支持的模型或提供方这两项自动隐藏,不会出现死开关。/model 弹窗同时改名;保存在 DSH 状态目录的 aliases.json,适配器重新注册或下次启动后自动重放,设置面板顶部可手动「同步到全部界面」或「恢复默认」。localStorage(key dsh-model-block-picker.prefs.v1),刷新与重启后保持;不存在的来源会在下次自动清理。--dsw-alias-link(#7aaaff)而非会反转成近白的 --dsw-alias-brand-primary。在 DSH 会话里对 Agent 说:
帮我安装位于 `` 的插件
Agent 会执行 plugin_manager(action: 'install_bundle', target: '')。
安装后彻底退出 DSH 桌面端再重新打开(客户端 bundle 有启动基线缓存,仅刷新页面不一定加载新代码)。
卸载:plugin_manager(action: 'remove_bundle', target: 'dsh-model-block-picker'),回退到官方原生选择器。
输入框模型位是 DSH 公开的一个命名插槽:conversation.input.model(kind: "single",会话作用域)。
-10;priority: -20,因此作为 winner 覆盖原生组件,卸载即自动回退。注意:single 槽位要求同优先级唯一,所以必须用负数优先级,否则会抛single slot already has a registration。不自己请求后端。通过 ctx.modelDirectories:
const directory = models.directoryFor(sessionId);
directory.store // 快照:{ groups: [{ id, name, models: [...] }], current: { provider, model, reasoningEffort } }
directory.load() // 拉取目录
directory.select({ provider, model, reasoningEffort }) // 提交选择与 /model 命令弹窗共用同一份会话级目录,任一入口的切换另一入口立即可见。
早期版本手写 #1c1f23 之类的兜底色,在深色下不会反转,导致字和箭头变深灰。现在全部改用真实 token:
用途 · token · 深色取值 主文本 · --dsw-alias-label-primary · #f9fafb(off-white,非纯白) 边框 · --dsw-alias-border-l1 · #ffffff0f 背景 · --dsw-alias-bg-layer-1/2、--dsw-alias-bg-overlay · — 品牌色 · --dsw-alias-brand-primary · —
深色下额外用 body[data-ds-dark-theme] 把触发按钮设为 .5px 描边 + 该 token,与右侧截图插件 (color: var(--dsw-alias-label-primary) + fill:none stroke=currentColor stroke-width=1) 保持同一笔画重量。
踩坑记录:写 CSS 时别凭印象编变量名。DSH 里不存在
--dsw-alias-text-regular、--dsw-alias-border-subtle、--dsw-alias-surface-overlay、
--dsw-alias-primary 这些名字——它们会静默回落到你写的兜底值,浅色看着没事、深色就崩。可用 cordis_inspect_query(platform: 'client', provider: 'Theme', method: 'listTokens') 查真实 token。dsh-model-block-picker/
├── package.json # 清单:dsh.bundle.patch + dsh.client 声明
├── cordis.patch.yml # Loader patch:把本包插进 profile 名单
├── index.js # 宿主半边(/diag 诊断 + /aliases 改名持久化)
├── client.js # 浏览器半边:React 组件 + 样式 + 插槽注册
├── CHANGELOG.md
├── LICENSE
└── README.md排障时会用到:
[dsh-model-block-picker](DSH 日志里搜这个)。GET /plugins/dsh-model-block-picker/aliases 返回 { ready, store, aliases, providers },其中providers[].base 是注册表原名、name 是当前生效名,ready:false 说明模型服务还没起来。
/plugins/dsh-model-block-picker/diag:module-evaluated → apply-called → slot-inject-triggered → registered-success。 若停在 register-error,说明槽位/优先级冲突;停在 apply-error 多半是 inject 未声明就访问了服务。
另一个坑:客户端沙箱对服务访问有白名单。顶层inject声明了['slots','modelDirectories'],
就不能再直接读ctx.sessions,否则抛service "sessions" is not declared并当场崩溃。
/model 命令弹窗仍是官方样式(两者共用同一份数据,切换互通)。localStorage。speedMode / outputVerbosity 偏好的提供方(如 dsh-codex-subscription 的 openai-codex)会被识别;其他提供方这两项不显示。/model 弹窗等界面一并改名),保存在 DSH 状态目录state/dsh-model-block-picker/aliases.json,跟随 DSH home 而不是浏览器 profile;卸载插件后不再重放。
localStorage,因此按浏览器 profile 隔离,不随 DSH 账号同步。MIT