DeepSeek Harness(DSH)插件:把输入框下方的统计行换成服务商与模型、余额或订阅额度、高峰/低谷价格,以及会话花费。
52/100
综合分
55
GitHub 星标
7,985
npm 周下载
—/5
用户评分
数据截至 2026/11/4 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-bottom-info-barnpm 源 · dsh-bottom-info-bar 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功(非静态推断);本次验证针对插件 v1.21.9,当前版本为 v1.21.10
L5 · 运行时冒烟等级说明 →数据截至 2026/10/29·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-bottom-info-bar @ 1.21.10
✓Node 引擎要求 >=22.13.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/30 09:04:36
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 97 处,展示前 53 条)
- 读取本地文件lib/index.js:102
const entries = readdirSync(join(dshHomeDir(), 'profiles'), { withFileTypes: true }) - 读取本地文件lib/index.js:139
try { return readFileSync(file, 'utf8') } catch { return null } - 读取本地文件lib/index.js:147
if (existsSync(marker)) { - 读取本地文件lib/index.js:149
try { isDirectory = statSync(marker).isDirectory() } catch { return null } - 读取本地文件lib/index.js:195
if (existsSync(join(layout.commonDir, 'refs', 'remotes', remote, candidate))) return candidate - 读取本地文件lib/index.js:226
if (!existsSync(buildScript)) return gitCommand - 发起网络请求lib/index.js:290
return fetch(UPDATE_REGISTRY_URL, { - 发起网络请求lib/index.js:737
inFlight[key] = src.fetch(arg).then(function (result) { - 删除本地文件lib/index.js:1390
rmSync(filePath, { recursive: filePath === USAGE_ARCHIVE_DIR, force: true }) - 删除本地文件lib/index.js:1392
rmSync(LEDGER_CLEAR_MARKER_FILE, { force: true }) - 写入本地文件lib/index.js:1594
if (opts.ensureDir) mkdirSync(opts.ensureDir, { recursive: true, mode: 0o700 }) - 写入本地文件lib/index.js:1607
try { renameSync(filePath, opts.backupPath) } catch (err) { } - 写入本地文件lib/index.js:1609
renameSync(tmp, filePath) - 写入本地文件lib/index.js:1617
mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 }) - 写入本地文件lib/index.js:1629
try { chmodSync(DATA_DIR, 0o700) } catch (err) { } - 写入本地文件lib/index.js:1631
if (existsSync(USAGE_JOURNAL_FILE)) chmodSync(USAGE_JOURNAL_FILE, 0o600) - 发起网络请求lib/index.js:2014
const res = await fetch(REMOTE_PRICING_URL, { headers, signal: timeoutSignal(10000) }); - 发起网络请求lib/index.js:2337
const res = await fetch(freshBalanceURL(prov.balanceAPI), { - 请求外部主机opencode.ailib/index.js:2436
const res = await fetch('https://opencode.ai/zen/go/v1/usage', { - 发起网络请求lib/index.js:2436
const res = await fetch('https://opencode.ai/zen/go/v1/usage', { - 发起网络请求lib/index.js:2470
const res = await fetch(COMMAND_CODE_API_BASE + path, { - 请求外部主机api.fireworks.ailib/index.js:2787
const accRes = await fetch('https://api.fireworks.ai/v1/accounts', { - 请求外部主机api.fireworks.ailib/index.js:2794
const summaryRes = await fetch('https://api.fireworks.ai/v1/accounts/' + encodeURIComponent(accountId) + '/billing/summary?granularity=DAILY', { - 请求外部主机api.fireworks.ailib/index.js:2804
const usageRes = await fetch('https://api.fireworks.ai/v1/accounts/' + encodeURIComponent(accountId) + '/billingUsage', { - 请求外部主机sts.amazonaws.comlib/index.js:2883
const stsRes = await fetch('https://sts.amazonaws.com/?' + query, { headers: headers, signal: timeoutSignal(HTTP_TIMEOUT_MS) }); - 请求外部主机api.cloudflare.comlib/index.js:2902
const res = await fetch('https://api.cloudflare.com/client/v4/accounts/' + encodeURIComponent(accountId) + '/billing/usage/paygo', { - 读取本地文件lib/version.js:19
const pkg = JSON.parse(readFileSync(PACKAGE_FILE, 'utf8')) - 读取本地文件lib/self-update.js:71
if (lstatSync(base).isSymbolicLink()) return null - 读取本地文件lib/self-update.js:74
if (existsSync(cursor) && lstatSync(cursor).isSymbolicLink()) return null - 读取本地文件lib/self-update.js:74
if (existsSync(cursor) && lstatSync(cursor).isSymbolicLink()) return null - 读取本地文件lib/self-update.js:260
try { names = readdirSync(dir) } catch { return } - 读取本地文件lib/self-update.js:266
try { info = lstatSync(full) } catch { continue } - 删除本地文件递归lib/self-update.js:289
rmSync(backupDir, { recursive: true, force: true }) - 写入本地文件lib/self-update.js:290
mkdirSync(backupDir, { recursive: true }) - 读取本地文件lib/self-update.js:295
if (!source || !target || !existsSync(source)) continue - 写入本地文件lib/self-update.js:296
mkdirSync(dirname(target), { recursive: true }) - 写入本地文件lib/self-update.js:297
copyFileSync(source, target) - 删除本地文件递归lib/self-update.js:301
rmSync(backupDir, { recursive: true, force: true }) - 写入本地文件lib/self-update.js:307
mkdirSync(dirname(target), { recursive: true }) - 写入本地文件lib/self-update.js:309
writeFileSync(temp, file.data) - 写入本地文件lib/self-update.js:310
renameSync(temp, target) - 删除本地文件lib/self-update.js:331
rmSync(target, { force: true }) - 发起网络请求lib/self-update.js:355
const fetchImpl = config.fetch || ((...args) => fetch(...args)) - 删除本地文件递归lib/self-update.js:462
rmSync(join(backupRoot, name), { recursive: true, force: true }) - 写入本地文件lib/ledger-store.js:156
mkdirSync(dir, { recursive: true, mode: 0o700 }) - 写入本地文件lib/ledger-store.js:157
chmodSync(dir, 0o700) - 写入本地文件lib/ledger-store.js:165
function permissions() { for (const name of [file, file + '-wal', file + '-shm']) { if (existsSync(name)) chmodSync(name, 0o600) } } - 读取本地文件lib/ledger-store.js:165
function permissions() { for (const name of [file, file + '-wal', file + '-shm']) { if (existsSync(name)) chmodSync(name, 0o600) } } - 读取本地文件lib/ledger-store.js:226
if (!existsSync(path)) continue - 读取本地文件lib/ledger-store.js:239
} else if (existsSync(archive) && readdirSync(archive).some(name => name.endsWith('.jsonl'))) { - 读取本地文件lib/ledger-store.js:239
} else if (existsSync(archive) && readdirSync(archive).some(name => name.endsWith('.jsonl'))) { - 读取本地文件lib/ledger-store.js:242
const temps = readdirSync(dir).filter(n => n.startsWith('usage-records.json.tmp.')).sort((a, b) => statSync(join(dir, b)).mtimeMs - statSync(join(dir, - 读取本地文件lib/ledger-store.js:242
const temps = readdirSync(dir).filter(n => n.startsWith('usage-records.json.tmp.')).sort((a, b) => statSync(join(dir, b)).mtimeMs - statSync(join(dir,
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
涉及外部主机:opencode.ai、api.fireworks.ai、sts.amazonaws.com、api.cloudflare.com、huggingface.co
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
界面预览
3 张 · 点击查看大图功能亮点
- 显示服务商与模型
- 显示余额或订阅额度
- 显示高峰低谷价格
最近更新
在 GitHub 查看全部 →v1.21.102026-10-29
· 1.21.10 (2026-10-29)
· Bug Fixes
· recognize Volcengine Ark and price DeepSeek Flash models (#257) (7f05de1)
原文(未汉化)
v1.21.92026-10-25
· 1.21.9 (2026-10-25)
· Bug Fixes
· keep exhausted subscription quota windows visible (#253) (076cdc7)
原文(未汉化)
v1.21.82026-10-17
· 1.21.8 (2026-10-17)
· Bug Fixes
· restore native button switches and density toggle on DSH 0.2.1 (#250) (655212c)
原文(未汉化)
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成底部信息栏
加入内测群 DeepThinking
问题和需求群里反馈解决得最快——扫码进内测群,直接说遇到的问题或者想要的功能,我们会优先安排。二维码有有效期,扫不动了就在 issue 里说一声。
DeepSeek Harness 插件:把输入框下方那行统计栏换成一行信息栏——服务商与模型、真实余额或订阅额度、高峰/空闲定价,以及本会话已经花了多少。
信息栏完整模式
它显示什么
信息栏跟随当前会话,按服务商自动选择三种口径之一(互斥,不用手动切):余额制显示官方接口的真实余额,订阅制显示各额度窗口剩余额度与重置倒计时(额度用尽时窗口仍显示 0%,不会从信息栏消失,并标红提示「低」),云账单制显示官方账单接口的本月真实花费。之外还有本会话/今天/近 30 天/累计四档花费,以及时间、自定义文字等通用项。这四档都来自插件自己的账本,从插件开始运行那一刻起记账:装上之前(或清除账单之后)已经发生的调用不在其中,把鼠标停在花费上会写明统计起点;要整场会话的权威数字,请以服务商的余额或账单为准。余额制下把鼠标停在余额上,会展开「充值余额 / 赠金余额」两行明细,赠送的那部分不再是糊涂账。
DSH 0.2.1-rc.1 提供新版原生统计按钮时,原生那一行在上、插件账户信息在下。点击插件信息行的任意字段仍可切换完整/简洁,保留原来的高度收合与淡出动画:完整显示原生行,简洁把它收起。
展开完整文档(README 剩余 1 节)
底部信息栏 加入内测群 DeepThinking 问题和需求群里反馈解决得最快——扫码进内测群,直接说遇到的问题或者想要的功能,我们会优先安排。二维码有有效期,扫不动了就在 issue 里说一声。 DeepSeek Harness 插件:把输入框下方那行统计栏换成一行信息栏——服务商与模型、真实余额或订阅额度、高峰/空闲定价,以及本会话已经花了多少。 信息栏完整模式 它显示什么 信息栏跟随当前会话,按服务商自动选择三种口径之一(互斥,不用手动切):余额制显示官方接口的真实余额,订阅制显示各额度窗口剩余额度与重置倒计时(额度用尽时窗口仍显示 0%,不会从信息栏消失,并标红提示「低」),云账单制显示官方账单接口的本月真实花费。之外还有本会话/今天/近 30 天/累计四档花费,以及时间、自定义文字等通用项。这四档都来自插件自己的账本,从插件开始运行那一刻起记账:装上之前(或清除账单之后)已经发生的调用不在其中,把鼠标停在花费上会写明统计起点;要整场会话的权威数字,请以服务商的余额或账单为准。余额制下把鼠标停在余额上,会展开「充值余额 / 赠金余额」两行明细,赠送的那部分不再是糊涂账。 DSH 0.2.1-rc.1 提供新版原生统计按钮时,原生那一行在上、插件账户信息在下。点击插件信息行的任意字段仍可切换完整/简洁,保留原来的高度收合与淡出动画:完整显示原生行,简洁把它收起。原生两个按钮保留自己的点击行为,点开是 Harness 的明细弹窗;也可以在插件设置页分别隐藏这两个原生按钮。上下文圆环继续保留现有明细和插件设置。 旧宿主仍保留点击信息栏切换完整/简洁:完整显示旧统计行,简洁收起它;插件字段在两种模式下一致。兼容方式通过实际扩展入口判断,不依赖版本号猜测。 安装 最推荐:打开 DSH 的插件页 → 添加插件,在「包名或地址」里填 npm 包名——DSH 会直接从 npm 下载已发布的版本,不用敲命令,也不用构建: dsh-bottom-info-bar 习惯用终端?命令行装的是同一个包: dsh plugin --profile web add dsh-bottom-info-bar 想跑默认分支上的最新代码而不是已发布的版本,就在同一个输入框里填仓库地址: https://github.com/songoao25/dsh-bottom-info-bar 然后重启 DSH(插件在宿主启动时组合,只刷新页面不够)。桌面客户端请使用插件 → 添加插件;它的配置由客户端管理,不能通过命令行安装。其他装法(含 Windows PowerShell)与排障见 docs/INSTALL.md。 上下文占用圆环保留原生悬浮提示,点击可打开统计面板。提示和面板都显示在底栏外层,避免出现时改动底栏内部。 设置 插件设置都在插件 → bottom-info-bar,改完自动保存。插件信息和提醒信息保留各自的开关与配色。新版的原生信息为两个原生按钮各提供一个开关(会话统计 / 用量统计),可以分别隐藏;旧统计行的逐字段控件不再显示,也不计入搜索结果和启用数量,旧设置仍保留供旧宿主使用。旧宿主继续显示原生字段控件。重置插件字段或颜色不会改动 Harness 原生按钮的偏好。 插件信息:按计费方式分块 「插件信息」里再按计费方式分块——你用哪种服务,就只看哪一块,哪几项有数据的说明写在块标题旁。时区、自定义文字、订阅窗口方向、账单数据是独立设置区: 时间与日期:只设时区 密钥填在 DSH 的设置 → 模型;订阅类(Codex、OpenCode、小米 Token Plan、Command Code、MiniMax)读本机登录,MiniMax 必须用 Subscription Key。列表里没有的服务商只会显示未适配提示,绝不借用别家的数据。 花费与更新 账本需要 DSH 内部运行环境为 Node.js 22.13 或更新版本。账目和历史会话保存在本机磁盘,按需分批读取,导出直接下载。升级会迁移旧账,但保留旧文件供恢复核对;详见 账本存储与恢复。 每次模型响应记一条(用量 × 单价,单价在响应完成时锁定),重启不丢。插件每次随 DSH 启动检查一次新版本:全自动更新(默认)下载好等你重启生效,手动更新只提示不下载;新版有问题可以在设置页回滚到上一版。账本只记 token 与金额,不记对话内容;数据存放在本端 DSH_HOME 下的 dsh-bottom-info-bar/ 目录(默认 ~/.dsh/dsh-bottom-info-bar/,可用 DSH_BOTTOM_INFO_BAR_DATA_DIR 覆盖),卸载不删——要清零去设置页的账单数据里导出或清除。 卸载与回退 在 DSH 插件页移除(或 dsh plugin --profile web remove dsh-bottom-info-bar)后重启 DSH:原生统计栏会自动恢复,插件代码不留残留。账本是有意保留的——想彻底清零,先在设置页「账单数据」里导出或清除,再卸载。只想退回上一版的话,在有新版本等待重启时、以及更新失败后,设置页的更新区会给出回滚到上一版。细节见 docs/INSTALL.md。 语言 插件内置简体中文、繁体中文、英语、日语、韩语、西班牙语、葡萄牙语、法语、德语、意大利语、俄语、印地语和印度尼西亚语。默认跟随 DSH 的语言;也可以在本插件设置页的语言中单独选择,选择会保存在当前浏览器。墨西哥西班牙语、巴西葡萄牙语等地区变体使用对应的内置语言;不支持的语言显示英语。 开发 - 构建:npm run build - 测试:node tests/run-all.mjs - 贡献:CONTRIBUTING.md 许可证 MIT © 2026 songoao25 节假日计价已覆盖国务院公布的 2026 年中国放假调休日期。后续年份需在年度通知公布后更新日历;未收录年份使用周一至周五/周末规则。调休上班的周末仍为空闲价,已冻结的历史费用保持不变。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
songoao25/dsh-bottom-info-bar
DeepSeek Harness(DSH)插件:把输入框下方的统计行换成服务商与模型、余额或订阅额度、高峰/低谷价格,以及会话花费。
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个插件,给…
★ 850已汉化DSH
68.9
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 387已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。