DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Model Icons — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
M

dsh-model-icons

Model Icons

DeepSeek Harness 模型选择器中的供应商标识:主机端镜像供应商的模型目录,并将 logo 设置为 loopback;浏览器端则为每个模型行绘制一个单色标识,方式与供应商自有控制面板一致。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:koliy82/dsh-model-icons#0410e0bfa9ca71f37d881774e8ec9037d922822e
README兼容性版本

兼容性与来源证明

Model Icons 以 dsh-model-icons 发布,当前版本为 1.0.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/15

版本

1.0.0stable
2026/10/15

相关插件

继续浏览 models-usage 分类下经过校验的插件。

Whale Widgetdsh-whale-widgetDSH Web 界面右下角的 DeepSeek 余额小鲸鱼挂件:余额/今日已用/峰谷定价、自定义泡泡点击序列(文本/余额/今日/峰谷/图片/随机语句与并列加权选择)、逐行样式与字体、悬浮快捷编辑、音效与每轮消耗、自定义角色/动图/音效、吸附与翻转自定义Usage@linxin666/dsh-usage用于 dsh Web GUI 的使用统计插件:检测各提供商的余额和编程套餐配额,并实时记录令牌使用情况;侧边栏 Settings 行上方显示紧凑的价格概览卡片Client Ui Model Capabilities@linxin666/dsh-client-ui-model-capabilities为自定义 pi-ai 提供商声明每个模型的能力(图像输入和推理力度),可直接在 Models 设置卡片中编辑;写入官方 llm-pi-ai 设置命名空间,不更改 DSH 源代码。Cost Meterdsh-cost-meterDeepSeek Harness 会话费用统计插件:本会话成本、当日费用、历史记录与官方价格同步,支持多厂商多模型价格计费(内置 170+ 模型 ID 价格目录与自动匹配)、主流 Coding Plan 订阅额度查询与显示(13 家,含 OpenDesign 工作区查询、含小米 MiMo Token Plan 控制台 Cookie 查询、SCNet Token Plan 本地 Credits 计量与火山方舟 Volcano Ark Coding Plan AK/SK 签名查询)、自定义 Provider
最新版
1.0.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/15
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

README

dsh-model-icons

Vendor marks in the DeepSeek Harness Web GUI model picker — the same marks the provider's own dashboard draws next to each model, in the same way it draws them.

SurfaceWhat appears
Composer model menuone 16 px monochrome mark before every model row
Composer model buttonthe selected model's mark before its name (14 px)
/model command popupthe same mark on every row
A skin that redraws the picker (dsh-claude-style)the same mark, and the skin's own lockup is hidden in that row so two never meet

The marks are painted with a CSS mask filled by currentColor, which is how the provider's dashboard paints them: one file per vendor serves both palettes and every row state (hover, selected, disabled) with no colour variants.

Where the pictures come from

Nothing is embedded in this package. The host half mirrors two public things from the provider's site into this profile, and the browser half reads them from loopback:

  1. the model catalog — the site renders its model table from a JSON island in its own page (<script id="rustvy-catalog">), so an unauthenticated reader is handed exactly the data the dashboard shows: model id, display name, vendor and the logo file name that vendor uses. Mirrored to <profile>\.dsh-model-icons\catalog.json.
  2. the logo files (/logos/<name>.svg) — copied into <profile>\.dsh-model-icons\logos\ on first use.

Both are read on the process's own outbound route (lib/net.js): the live global dispatcher first, so a proxy installed by dsh-proxy-gui — or any other route the process has — is followed, and a connector built here from HTTPS_PROXY / ALL_PROXY / HTTP_PROXY second, for the case where no dispatcher is installed. NO_PROXY is honoured on both. The page itself never leaves the machine: the browser asks 127.0.0.1 for a mark, which is what makes this work on a machine whose browser cannot reach the origin at all.

The catalog refreshes once every 24 hours and on demand; a cold mirror is waited for up to 6 seconds, and a stale one refreshes in the background while the rows keep the marks they have. When the origin is unreachable, the cache on disk still serves everything it holds.

Matching a row to a mark

Rows are matched by their visible name, in this order:

  1. the mirrored catalog's model id (claude-opus-5-5, abyss/glm-5.3, …);
  2. its display name (OPUS 5.5);
  3. an id the label starts with — a skin can leave its own description line in the same element, so the name is often a prefix rather than the whole string, and the longest matching id wins so claude-opus-5-5 is never claimed by claude-opus-5;
  4. the shape of the id, for a model the mirror has never seen: claude-* → Anthropic, gpt-*/o1…o9 → OpenAI, glm-* → Zhipu, kimi-*/k3 → Moonshot, qwen-* → Alibaba Qwen, deepseek-* → DeepSeek, ahmia-* → Ahmia, mimo-* → Xiaomi, fable-* → Anthropic, gemini-* → Google, grok-* → xAI.

A model that matches nothing gets no mark at all — an invented icon would be a wrong answer rather than a missing one. A model that matches but whose logo the mirror could not fetch gets a monogram chip (the vendor's first letters) instead of a blank box: a mask whose URL 404s would otherwise paint a solid square.

Effort rows, provider headings, the menu's root cells, the search field and catalog-failure rows are matched by nothing and stay bare.

Routes

One prefix registration on the harness's own web server. Plugin routes are not seen by the host's request fence, so every one of them checks the peer itself: loopback only, a loopback Host, a same-origin Sec-Fetch-Site and a matching Origin.

RouteMethodAnswer
/dsh-model-icons/catalog.jsonGETthe mirrored catalog plus the settings the browser half draws with
/dsh-model-icons/logo/<name>.svgGET, HEADone cached logo, fetched from the origin on first ask; 404 when the origin has no such mark, 400 for any name that is not [A-Za-z0-9._-]+.svg
/dsh-model-icons/stateGETmirror status for the settings page: version, model count, cached logos, route, proxy (credentials masked), cache directory, last error
/dsh-model-icons/refreshPOSTre-read the catalog and re-warm every logo it names
/dsh-model-icons/configPOSTwrite settings; never touches the network

Settings

Settings → Иконки моделей

SwitchDefaultMeaning
Показывать иконки моделейonmaster switch; off removes every mark
Иконка в кнопке выбранной моделиonalso mark the composer's model button, not just the menu rows
Прятать логотипы других скиновonhide a skin's own lockup in a row this plugin marked

The page also shows what the mirror holds and refreshes it on demand.

Stored in <profile>\.dsh-model-icons\config.json. Two environment variables override it, for a deployment that points the mirror elsewhere or wants the plugin mounted but inert: DSH_MODEL_ICONS_ORIGIN (default https://rustvy.xyz) and DSH_MODEL_ICONS_DISABLED=1. The mark size is a config field (size, 10–32 px, default 16).

No restarts

The host half reloads itself, the same way dsh-proxy-gui does: the loader row names ./lib/live.js, which imports the implementation through a cache-busting ?rev= query, and a one-second poll of the lib directory disposes the previous revision and starts the next one once a changed fingerprint repeats. The browser half arrives in an open page through the harness's own live plugin composition; a page refresh works too.

Install

pwsh -File .\install.ps1

Copies the package into <profile>\node_modules\dsh-model-icons as a real directory, regenerates lib/live.js from lib/index.js so the two cannot drift, and appends the package to dsh.profile.bundles in the profile manifest. A running harness picks the row up from the manifest change.

Uninstall: remove the name from dsh.profile.bundles, delete <profile>\node_modules\dsh-model-icons, and delete <profile>\.dsh-model-icons if you also want the cache gone.

Layout

FileRole
lib/index.jsstable loader entry; owns the reload loop
lib/live.jsbyte-identical copy of the entry, named by the loader row
lib/host.jsroutes, catalog mirror, logo cache, settings
lib/net.jsone outbound GET on the process's route, then the environment's proxy
client/client.jshand-authored browser bundle: the decorator and the settings page
cordis.patch.ymlthe loader row the profile's bundle list pulls in
install.ps1install into a profile

Tests

Both halves are covered without touching the running app:

node _probe\model-icons-host-test.mjs      # host: fake webServer, real origin fetch
node _probe\dom-test\model-icons-client-test.mjs   # browser: linkedom + stubbed mirror

The host test drives the registered route with fake request/response pairs and asserts the catalog answer, a real logo fetch, 404 for a mark the origin does not have, 400 for a traversal attempt, 403 for a non-loopback peer, 405 for a wrong method, and the on-disk cache. The client test builds the exact markup the harness menu, the /model popup and the skin render, and asserts which rows get a mark, which icon each gets, that effort rows and headings stay bare, that the monogram fallback appears for a missing logo, that a row added later is picked up by the observer, that a pass is idempotent, and that an unload removes every trace.