在模型选择器里为每个模型显示对应厂商图标
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add koliy82/dsh-model-icons该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · ads
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 19 处,展示前 19 条)
- 读取本地文件lib/index.js:97
return readdirSync(HERE) - 读取本地文件lib/index.js:100
const stats = statSync(join(HERE, entry)) - 读取本地文件lib/live.js:97
return readdirSync(HERE) - 读取本地文件lib/live.js:100
const stats = statSync(join(HERE, entry)) - 发起网络请求client/client.js:500
const response = await fetch(`${API}/catalog.json`, { headers: { accept: 'application/json' } }) - 发起网络请求client/client.js:530
const probe = await fetch(`${API}/logo/${encodeURIComponent(icon)}`, { headers: { accept: 'image/svg+xml' } }) - 发起网络请求client/client.js:607
const response = await fetch(`${API}/state`, { headers: { accept: 'application/json' } }) - 发起网络请求client/client.js:623
const response = await fetch(`${API}${path}`, { - 写入本地文件lib/host.js:139
mkdirSync(dirname(file), { recursive: true }) - 写入本地文件lib/host.js:141
writeFileSync(temporary, data) - 写入本地文件lib/host.js:142
renameSync(temporary, file) - 读取本地文件lib/host.js:152
return JSON.parse(readFileSync(file, 'utf8')) - 读取本地文件lib/host.js:302
return readdirSync(logosDir()).filter(entry => entry.toLowerCase().endsWith('.svg')).length - 读取本地文件lib/host.js:316
return statSync(file).isFile() ? readFileSync(file) : undefined - 读取本地文件lib/host.js:316
return statSync(file).isFile() ? readFileSync(file) : undefined - 读取本地文件lib/host.js:747
if (existsSync(stateDir())) mirror.logos = countCachedLogos() - 发起网络请求lib/net.js:254
const request = transport.request({ - 发起网络请求lib/net.js:334
const request = transport.request({ - 发起网络请求lib/net.js:377
const response = await fetch(url, {
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 模型选择器里的服务商标记:把服务商自己的模型目录和 logo 镜像到本地回环路由,再用 CSS 遮罩画进输入框菜单、模型按钮和 /model 弹窗。
README
由 DeepSeek 最新模型翻译生成dsh-model-icons
DeepSeek Harness Web GUI 模型选择器里的厂商标识——和服务商自家仪表盘在每个模型旁边画的是同一套标识,画法也一致。
| 界面位置 | 显示内容 |
| 输入框模型菜单 | 每一行模型前有一个 16 px 单色标识 |
| 输入框模型按钮 | 选中模型的标识显示在名称前(14 px) |
| /model 命令弹窗 | 每一行都显示同一个标识 |
| 重绘选择器的皮肤(dsh-claude-style) | 显示同一个标识,同时隐藏该行皮肤自带的组合标识,避免两个标识同时出现 |
标识用 CSS mask 绘制,填充色为 currentColor,服务商仪表盘就是这么画的:每个厂商一个文件,同时服务两套配色和所有行状态(悬停、选中、禁用),不需要任何颜色变体。
图片从哪来
这个包里没有嵌入任何东西。宿主端把服务商网站上的两样公开内容镜像到当前配置档,浏览器端再从回环地址读取:
1. 模型目录 —— 网站用自己页面里的一个 JSON 岛()渲染模型表格,所以未登录的读取者拿到的数据,和仪表盘显示的完全一样:模型 id、显示名称、厂商,以及该厂商使用的 logo 文件名。镜像到 <profile>\.dsh-model-icons\catalog.json。
展开完整文档(README 剩余 1 节)
dsh-model-icons DeepSeek Harness Web GUI 模型选择器里的厂商标识——和服务商自家仪表盘在每个模型旁边画的是同一套标识,画法也一致。 | 界面位置 | 显示内容 | | 输入框模型菜单 | 每一行模型前有一个 16 px 单色标识 | | 输入框模型按钮 | 选中模型的标识显示在名称前(14 px) | | /model 命令弹窗 | 每一行都显示同一个标识 | | 重绘选择器的皮肤(dsh-claude-style) | 显示同一个标识,同时隐藏该行皮肤自带的组合标识,避免两个标识同时出现 | 标识用 CSS mask 绘制,填充色为 currentColor,服务商仪表盘就是这么画的:每个厂商一个文件,同时服务两套配色和所有行状态(悬停、选中、禁用),不需要任何颜色变体。 图片从哪来 这个包里没有嵌入任何东西。宿主端把服务商网站上的两样公开内容镜像到当前配置档,浏览器端再从回环地址读取: 1. 模型目录 —— 网站用自己页面里的一个 JSON 岛()渲染模型表格,所以未登录的读取者拿到的数据,和仪表盘显示的完全一样:模型 id、显示名称、厂商,以及该厂商使用的 logo 文件名。镜像到 <profile>\.dsh-model-icons\catalog.json。 2. logo 文件(/logos/<name>.svg)—— 首次使用时复制到 <profile>\.dsh-model-icons\logos\。 两者都走进程自己的出站路由(lib/net.js):优先用当前生效的全局 dispatcher,这样 dsh-proxy-gui 装的代理——或者进程已有的任何其他路由——都能被沿用;其次用这里根据 HTTPS_PROXY / ALL_PROXY / HTTP_PROXY 构建的连接器,应对没有安装 dispatcher 的情况。两者都遵守 NO_PROXY。页面本身从不离开本机:浏览器向 127.0.0.1 请求标识,所以即使浏览器完全连不上源站,这套机制照样能用。 目录每 24 小时刷新一次,也支持按需刷新;冷镜像最多等待 6 秒,过期镜像在后台刷新,期间各行继续显示已有的标识。源站不可达时,磁盘上的缓存仍然能提供它保存的全部内容。 把行匹配到标识 按行的可见名称匹配,顺序如下: 1. 镜像目录里的模型 id(claude-opus-5-5、abyss/glm-5.3……); 2. 它的显示名称(OPUS 5.5); 3. 标签以某个 id 开头 —— 皮肤可能把自带的描述行留在同一个元素里,所以名称常常只是前缀而非完整字符串,此时匹配最长的 id,这样 claude-opus-5-5 不会被 claude-opus-5 抢走; 4. id 的形状,用于镜像从未见过的模型: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。 匹配不到任何厂商的模型不加任何标记——硬造一个图标是错误答案,而不是缺失答案。匹配到了、但镜像拉不到 logo 的模型,给一个字母组合标记(厂商首字母),而不是留一个空框:否则一张 URL 404 的遮罩会画出一个实心方块。 Effort 行、服务商标题、菜单的根单元格、搜索框、目录加载失败行都匹配不到任何东西,保持原样。 路由 在 harness 自己的 web 服务器上注册一个前缀。插件路由不受宿主请求围栏的检查,所以每一条都自己校验对端:仅限 loopback、Host 为 loopback、Sec-Fetch-Site 同源、Origin 匹配。 | 路由 | 方法 | 返回 | | /dsh-model-icons/catalog.json | GET | 镜像后的目录,外加浏览器端绘制时用到的设置 | | /dsh-model-icons/logo/<name>.svg | GET、HEAD | 一个缓存后的 logo,首次请求时从源站拉取;源站没有这个标记时返回 404,名字不符合 [A-Za-z0-9._-]+.svg 时返回 400 | | /dsh-model-icons/state | GET | 设置页用的镜像状态:版本、模型数量、已缓存 logo、路由、代理(凭据已打码)、缓存目录、最近一次错误 | | /dsh-model-icons/refresh | POST | 重新读取目录,并重新预热其中提到的每个 logo | | /dsh-model-icons/config | POST | 写入设置;不碰网络 | 设置 设置 → Иконки моделей | 开关 | 默认 | 含义 | | Показывать иконки моделей | 开 | 总开关;关闭后移除所有标记 | | Иконка в кнопке выбранной модели | 开 | 同时标记输入框的模型按钮,而不只是菜单行 | | Прятать логотипы других скинов | 开 | 在本插件已标记的行里,隐藏皮肤自带的标识 | 页面还会显示镜像当前持有的内容,并支持按需刷新。 存储在 <profile>\.dsh-model-icons\config.json。两个环境变量可以覆盖它,用于把镜像指向别处、或想让插件挂载但保持静默的部署:DSH_MODEL_ICONS_ORIGIN(默认 https://rustvy.xyz)和 DSH_MODEL_ICONS_DISABLED=1。标记尺寸是配置字段(size,10–32 px,默认 16)。 无需重启 宿主端会自行重载,方式和 dsh-proxy-gui 一样:loader 行指向 ./lib/live.js,它通过带缓存失效的 ?rev= 查询参数导入实现;同时每秒轮询一次 lib 目录,一旦变化的指纹重复出现,就销毁上一个版本、启动下一个版本。浏览器端通过 harness 自带的实时插件组合进入已打开的页面;刷新页面也可以。 安装 pwsh -File .\install.ps1 把包复制到 <profile>\node_modules\dsh-model-icons,作为真实目录;并从 lib/index.js 重新生成 lib/live.js,让两者不会出现偏差,并把包追加到配置档清单里的 dsh.profile.bundles。运行中的 harness 会从清单变更里读到这一行。 卸载:从 dsh.profile.bundles 里删掉这个名字,删除 <profile>\node_modules\dsh-model-icons,如果连缓存也想清掉,再删除 <profile>\.dsh-model-icons。 目录结构 | 文件 | 作用 | | lib/index.js | 稳定的加载器入口;负责重载循环 | | lib/live.js | 入口的逐字节副本,由加载器行指定名称 | | lib/host.js | 路由、目录镜像、logo 缓存、设置 | | lib/net.js | 在进程路由上发起一次出站 GET,然后走环境的代理 | | client/client.js | 手写的浏览器 bundle:装饰器和设置页 | | cordis.patch.yml | 配置档的 bundle 列表拉进来的加载器行 | | install.ps1 | 安装到配置档 | 测试 两半都有覆盖,不用碰正在运行的应用: 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 host 测试用伪造的请求/响应对驱动注册的路由,断言目录应答、一次真实的 logo 抓取、源站没有的标记返回 404、路径穿越尝试返回 400、非回环对端返回 403、方法错误返回 405,以及磁盘缓存。client 测试构造出 harness 菜单、/model 弹窗和皮肤渲染所用的精确标记,断言哪些行会拿到标记、各自拿到哪个图标、effort 行和标题保持空白、logo 缺失时出现字母组合兜底、后加的行会被观察器捕获、一轮处理是幂等的,以及卸载会清掉所有痕迹。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
koliy82/dsh-model-icons
在模型选择器里为每个模型显示对应厂商图标
相关插件 · 营销 / 广告
复古广告弹窗Nagi-ovo/dsh-ads
把 DSH 变成 2005 年门户网站|Parody ads, fake games, and popups for…
★ 679已汉化DSH
67.4
精酿竖版宣传片Finderchangchang/brewreel
精酿 BrewReel:让 DeepSeek 这类便宜模型也能做出好看的竖版宣传片。写一份产品简报,AI…
★ 166已汉化DSH
62.6
工作区分组树KannaKuron/dsh-better-workspace
给 DeepSeek Harness DSH 的侧边栏「工作区」列表装上一套两层文件夹系统——磁盘层按目录路径嵌套官方…
★ 28已汉化DSH
47.4
跨窗提醒Aisland-SJL/dsh-reminder
🔔 DeepSeek Harness 跨窗口完成与审批通知——弹窗提醒把你拉回 DSH,Codex/WorkBuddy 风格。
★ 18已汉化DSH
40.4
推理档位自动选择justhalfbit/dsh-plugin-jev-effort-selector
让 Jev System One 模型替你决定每条消息该用多深的推理。
★ 7已汉化DeepSeek 客户端
37.1
模型价格看板vitas/dsh-model-pricing
在选择模型之前比较 LLM API 价格——并在使用之后查看你实际支付了多少。 这是一个
★ 2已汉化DeepSeek 客户端
36.5