DeepSeek Harness Hub
← 返回列表

mrdevlorx/dsh-model-garden

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
✓ 可直接安装

一个可搜索、可排序的模型选择器,用于 DeepSeek Harness Web UIdsh…

自动检查通过:npm 包已发布且 engines 声明满足基线(声明 Node >=22);该结论来自程序自动检查,未经人工实机验证。 · 最近上游提交 2026/9/16 · 已提供中文文档

一个可搜索、可排序的模型选择器,适用于 DeepSeek Harness Web UI——支持提供商分组、收藏、models.dev 价格、上下文窗口、按任务实时 token 成本以及本地模型筛选。一条命令安装:dsh plugin add dsh-model-garden。

综合分
36.5
GitHub 分
36.5
用户评分
★ Stars
6
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add dsh-model-garden
npm 包 dsh-model-garden 已校验归属本仓库,走 npm 安装最省事
数据截至 2026/9/19(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查✓ 自动检查通过

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

npm 包dsh-model-garden @ 0.7.0
Node 引擎要求 >=22 · 基线 Node 22.19 满足
dsh CLI 依赖未声明 dsh 版本约束
入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/19 16:50:21

用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-model-garden

一个可搜索、可排序的模型选择器,用于 DeepSeek Harness Web UI(dsh web)。它用一个表格样式的选择器替换了原生的编辑器模型座位,补齐了原版选择器缺失的所有功能:

status npm license

功能特性

- 🔍 即时搜索——跨模型名称和描述进行搜索
- 📊 可排序的表格列——点击 Name、Ctx 或 Price 可按升序/降序排序;第三次点击则返回按提供商分组的视图
- ⭐ 收藏——为模型加星,从表头切换仅显示收藏;持久化保存在 localStorage 中
- 🙈 隐藏与精简——通过黑名单让选择器更小巧:悬停某一行并点击 ✕ 即可隐藏该模型(或在分组标题上点击 ✕ 隐藏整个提供商),然后从搜索栏中的 ⚙ 按钮管理一切——查看已隐藏的条目、取消隐藏单个条目,或点击 show all。持久化保存在 localStorage 中,因此你精简后的列表在重新加载后依然保留;隐藏设置绝不会改动 DSH 配置文档
- 🏠 本地标签——提供商根据其真实端点(来自设置的 baseURL:loopback / RFC1918 / LAN 主机名)被标记为 local,绝不靠价格猜测;搜索输入框旁的 Local 复选框可筛选出它们
- ▾ 可折叠的提供商分组——折叠状态按提供商持久化保存
- 🔄 自动更新模型列表——在选择器挂载期间,提供商/模型目录每 5 分钟自动重新加载一次(可配置),因此本地添加的模型无需重新打开面板即可显示出来
- ⟳ 从提供商 API 手动刷新——搜索行中的 ⟳ 按钮会从每个已配置的 llm-pi-ai 提供商的实时 GET {baseURL}/models 重新同步,并将合并后的模型列表写回配置文档(详情见下文);在一轮运行期间,按钮显示 ⟳ … 并处于禁用状态,每个提供商的工具提示会报告 +added / −removed 以及任何错误
- 🔌 本地网关的实时清单——对于指向本地网关的路由,选择器会向网关本身询问它当前提供哪些模型(GET /model-garden/server-models,每条路由 5 秒);Local 旁的 Live 开关随后会隐藏网关实际并未提供的已配置条目,而无法访问的路由则保留其已配置的列表
- 💰 模型价格来自 models.dev(与 OpenCode 使用的同一数据源),以每 100 万 token 的 $输入/$输出 形式显示,缓存 24 小时。订阅路由(在目录中成本全为零,例如编码套餐提供商)会通过 PROVIDER_ALIASES 从其按量付费提供商解析出参考价格,因此套餐模型仍会显示其 token 按 API 费率计算的价格;只有真正的本地模型保持无价格
- 🧠 上下文窗口——从宿主 llm 服务实时读取(适配器自有数据,对 llama.cpp / Ollama 风格网关等本地提供商同样适用),并以 models.dev 作为回退
- 🎚️ 推理强度选择器——支持推理级别的模型会在聊天输入框中模型名称旁获得一个紧凑的下拉菜单,其样式和打开方式与模型选择器完全一致(相同的触发胶囊、相同的浮动菜单表面,✓ 标记当前激活级别,点击外部 / Esc / 选择后关闭)。选择模型时会以适配器自身的默认级别(reasoning.defaultEffort)启动——插件绝不会凭空捏造适配器未要求的强度,因此成本和延迟保持适配器的预期(若未声明默认值,则省略该字段并由适配器决定);下拉菜单会以所选强度重新选择当前模型——选择器面板内不会杂乱
- 💸 实时每任务用量与成本——面板打开时始终显示提供商报告的真实 token 用量(来自会话日志)(输入 / 输出 / 缓存)。每个模型的用量乘以其自身(参考)价格——即使会话中途切换了模型也能正确归属——与 OpenCode 使用的算法相同(用量 × 价格,而非启发式估算)
- 🧾 会话成本明细——将鼠标悬停在 approx cost 数字上会弹出一个与选择器尺寸相同、并排停靠在其左侧(间隔 1 px)的弹窗:一个表格样式明细,包含每个模型的总计(步数、输入/输出/缓存各占一列、≈ 成本)以及一个带时间戳的步骤表。可点击的列标题像 Excel / 主列表一样工作(升序 → 降序 → 关闭,▲/▼ 指示器),两个表格均如此;复制摘要或将(排序后的)步骤列表导出为 CSV(可直接用于 Excel)。不可见的悬停目标横跨成本行一直延伸到其左边缘。每个步骤到其模型的归属直接来自会话日志(request/context 事件);不存储任何额外内容
- 🖱️ 详情工具提示在面板旁边打开(绝不覆盖列表):描述、价格、上下文窗口、最大输出、推理强度
- 🎨 原生外观——仅基于 harness 设计令牌构建(--dsw-alias-、--dsw-elevation-prominent、--dsw-specific-menu);选择器面板和强度菜单使用原生菜单几何(圆角 20 px、elevation 描边、无边框、表面无人工变暗),而详情工具提示和成本弹窗是同一表面令牌上的 12 px 卡片——浅色与深色主题完全遵循 harness

工作原理
这个包是一个静态配置插件,由两部分组成:

| 部分 | 文件 | 作用 |
|---|---|---|
| 客户端 | client.js | 注册 conversation.input.model 插槽(优先级 -1,遮蔽原生座位)并渲染选择器 |
| 宿主端 | index.js | 在 harness 的 webServer 服务上提供同源 JSON 路由(cost、cost-history、catalog、server-models、refresh-models) |

刷新按钮(选择器中的 ⟳)

选择器搜索行中的 ⟳ 按钮会从每个已配置的 llm-pi-ai 提供方的实时模型 API 重新同步:

POST /model-garden/refresh-models
→ { summary, invalidateCatalog, results: [ { id, ok, changed, total, added, removed, error } ] }

宿主端从设置服务读取已配置的提供方路由,通过凭据服务(~/.dsh/.credentials.yaml)解析每个凭据,并以进程环境变量作为回退,查询提供方兼容 OpenAI 的 GET {baseURL}/models,并将实时 id 合并到设置中的 models 列表——现有条目保留所有手工调整的字段及其顺序,新 id 以最小条目形式加入(OpenRouter 条目携带实时元数据),已移除的 id 会被删除。变更后的列表会以保留注释的方式写回,并通过 llm-pi-ai 热重载,就像人工编辑了 settings.yaml 一样。一行德语摘要以及每个提供方的工具提示会直接在选择器中报告结果。

同样的逻辑也可作为独立 CLI 使用,无需运行中的 DSH——便于 cron 或脚本调用:

node dsh-model-garden/bin/refresh-models.mjs [--dry-run] [--provider ]
[--keep-removed] [--timeout-ms ] [--home ]

宿主端端点

GET /model-garden/cost?session=
→ { inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens, reasoningTokens, steps }

GET /model-garden/cost-history?session=&limit=
→ { steps: [ { time, provider, model, turn, step, inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens, reasoningTokens } ] (newest first, capped),
models: [ { provider, model, steps, inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens } ],
totalSteps }

GET /model-garden/catalog
→ { "provider::model": { local, context?, maxOutput? } }   (cached 10 min)

GET /model-garden/server-models
→ { providers: { "": { models: [ "", … ] } | { error } } }   (live probe of local gateways)

POST /model-garden/refresh-models
→ { summary, invalidateCatalog, results: [ … ] }   (see "Refresh button" above;
405 on another method, 403 on a cross-site request, 409 while a pass is
already running — exactly one pass at a time — 504 on timeout)
成本端点会聚合持久会话日志中 assistant/message 事件的真实 usage 载荷——不做估算。成本历史端点还会将每个用量步骤归因到当时生效的模型:assistant/message 事件携带用量但不携带模型,因此它会跟踪 request/context(以及 request/header)事件,这些事件以 { provider, model } 形式先于它们所描述的请求出现——对同一批内存中的事件做单次遍历,无需额外持久化。目录端点通过宿主 llm 服务(resolveModelInfo)解析每个模型的 contextWindow / defaultMaxTokens,因此本地/自托管提供商会报告其真实限制。每个路由都仅限同源:不对外声明 CORS 通配符,且会改变状态的刷新操作会在触及任何提供商之前以 403 拒绝跨站请求——同一浏览器中打开的网站既无法读取会话用量,也无法用你存储的提供商凭据触发重新同步。

安装

一条命令——官方插件 CLI 会安装该包并挂载它(该包带有一个 dsh.bundle.patch 层,因此 CLI 会自动将其追加到配置档的 bundle 栈中):

dsh plugin --profile  add dsh-model-garden

然后重启 DSH 服务器并硬刷新浏览器(Cmd/Ctrl+Shift+R)。

宿主端需要 web 栈(webServer 服务)。在没有它的最小化/TUI 配置档中,该插件按设计保持惰性——启动绝不会被阻塞。

从手动安装升级?请先移除旧的 model-garden 依赖以及配置档 cordis.patch.yml 中任何为其手动添加的 - insert: 行——否则该插件会被挂载两次。

验证

curl -s http://127.0.0.1:3080/model-garden/catalog | head -c 200
→ {"deepseek::deepseek-chat":{"local":false,"context":...}, ...}  (JSON, not HTML)

手动安装(不使用 CLI)

如果你用普通 npm 管理配置档:添加依赖,在配置档 package.json 的 dsh.profile.bundles 中列出 dsh-model-garden,重新安装,重启。包内的 bundle 补丁会为你插入加载器行——无需编辑 cordis.patch.yml。

配置

无需配置。若干可调整的常量位于相应文件顶部:

- 自动模型列表更新间隔——client.js 中的 MODEL_LIST_REFRESH_MS(默认 5 分钟)控制选择器挂载期间提供商/模型目录的重新加载频率。
- 隐藏的提供商路由——client.js 中的 HIDDEN_PROVIDER_PREFIXES(以及 index.js 中的 SKIP_PREFIXES)。某些插件会将提供商镜像为内部路由(例如某个视觉工具包将每个提供商复制为 vision-toolkit-);此类前缀会从选择器和目录中排除。
- 价格别名 — client.js 中的 PROVIDER_ALIASES / MODEL_ALIASES 将 DSH 路由 id 映射到 models.dev 目录 id。它们服务于两种情况:重命名的路由(deepseek-official → deepseek)以及目录条目全为零的订阅路由(kimi-for-coding → moonshotai、alibaba-tp → alibaba-cn、oneprovider → anthropic),从而为套餐模型提供其按量付费的参考价格。
- 价格缓存 TTL — PRICE_TTL(默认 24 小时)以及目录 TTL — CATALOG_TTL(默认 10 分钟)。
- index.js 中的刷新时机 — REFRESH_TIMEOUT(每个提供商默认 15 秒)、REFRESH_HARD_CAP_MS(整个刷新过程默认 60 秒硬性上限)以及 SERVER_MODELS_TIMEOUT(针对 Live 清单的每次本地网关探测默认 5 秒)。

收藏、折叠的提供商、隐藏模型/提供商黑名单(dsh.modelgarden.hidden)以及价格缓存都存放在浏览器 localStorage 中的 dsh.modelgarden. 下。

兼容性

针对 DeepSeek Harness 0.1.0-rc.6 … 0.1.5-rc.1(@deepseek-ai/dsh-host-webserver、dsh-session、dsh-llm、dsh-client-ui-model-selection)开发和测试。客户端部分是通过 window.__ModuleLoader__ 使用的纯 React——无需构建步骤,无依赖。

成本端点通过会话门面(snapshotEvents(),回退到 ownEvents() 以及更早的公共 events 数组)读取持久会话日志,因此 token 用量和成本明细可跨会话门面各代正常工作。

插槽说明:客户端部分在其 inject 列表中声明了 remote + remote.session。modelDirectories.directoryFor() 会访问 ctx.remote.session,而 cordis 服务代理会将 ctx 绑定到调用纤程——如果没有这些声明,插槽的 inject 工厂会抛出异常,该条目会放弃,原生选择器(优先级 0)会悄然重新占据该位置。

致谢

- 定价数据:models.dev API(也被 OpenCode 使用)
- 设计令牌与插槽 API:DeepSeek Harness

许可证

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群