前言¶
DSH 桌面版在输入框下方有一行官方用量行:轮次、步数、采样速度、Token 用量、缓存命中、上下文占用,都在。唯独账户里有多少钱,界面上看不到。要确认余额得另外打开 DeepSeek 的网页账户页,切窗口、看数字、再切回来,和当前会话的消耗对不上。
dxxo77 维护的插件 dsh-plugin-quota-balance 解决的就是这件事:把余额放到用量行最左侧,和官方那几组数字同一行、同一字号、同一灰度,不额外占位;点一下原地展开明细,能看到普通余额和赠送额度分项。下面是它的功能、安装方式和实现要点。
这是什么¶
一句话定位:DSH 的 Host + Client 双半边插件,新增一个 HTTP 接口把 deepseekAccount 的余额读出来,再往客户端输入框的用量行里塞一个单元格。
- 维护者:dxxo77
- 许可证:MIT
- 仓库:https://github.com/dxxo77/dsh-plugin-quota-balance
- 目录页:https://www.skillhub.cn/plugins/dxxo77/dsh-plugin-quota-balance
- 目录页上的分类是「客户端」,星标 1(以目录页为准)
- README 里提交给 awesome-dsh-plugin 的市场条目分类是
usage
前提是宿主要具备 deepseekAccount 服务,也就是需要 DSH 桌面版,并且当前已登录 DeepSeek 账号。只装浏览器插件环境跑不了。
核心功能¶
从 README 的功能描述看,覆盖这几件事:
- 用量行最左侧显示当前账户余额(¥),和官方数字同一行、同一字号、同一灰度。
- 点击徽标原地展开明细浮层:账户余额、普通余额、赠送额度、更新时间,以及「刷新」和「去充值」。
- 未登录或读取失败时整块隐藏,不占位。
- 徽标与浮层全部读取宿主暴露的表面 token,不做自己的一套配色,因此自动跟随
dsh-plugin-wallpaper-engine的玻璃参数、明暗主题和壁纸切换;没装壁纸引擎时它是普通的深色浮层。
显示规则细节:
- 同币种的多个钱包(普通余额 + 赠送额度)合并求和,例如
¥10.47;多币种时用·连接。 - 徽标为
order: -10,排在conversation.composer.dock的最左侧。 - 浮层底边对齐徽标上方 6px,直接盖在输入框上,窗口缩放时重新贴靠。
- 收起方式:
Esc、点击卡片外部、再点一次徽标。 - 字体与颜色跟随用量行:
font: inherit、12px、--dsw-alias-label-tertiary。 - 悬停有浅色圆角底、按下更深、
focus-visible有强调色描边;底衬用「内边距 + 等量负外边距」实现,悬停文字不位移。 - 卡片挂在
document.body上并用独立样式表,原因是输入框卡片自带裁剪与层叠上下文,放在插槽里的悬浮层会被它盖住。
安装与启用¶
README 给的安装方式不是命令行一条命令,而是先拿到代码,再在插件管理里挂载目录:
git clone https://github.com/dxxo77/dsh-plugin-quota-balance
然后在 DSH 的插件管理里安装该目录,install_bundle 指向仓库路径。安装后即时生效,输入框下方用量行最左侧出现余额,点它展开明细。
卸载:在插件管理里移除 dsh-plugin-quota-balance 即可。
仓库自带的文件分工:
| 文件 | 作用 |
|---|---|
index.js |
Host 半边:注册 GET /plugin/quota-balance/status,通过 deepseekAccount.getBalance() 读取余额并做 30s(失败 5s)缓存 |
client.js |
Client 半边:往 conversation.composer.dock 注册一个 order: -10 的单元格,每 60s、以及窗口重新可见时刷新 |
cordis.patch.yml |
安装时插入 quota-balance 这一行 |
locale/*.json |
插件在「插件」列表里的标题与描述 |
icon.svg |
插件图标,由 package.json 的 dsh.client.exports 导出 |
package.json 里跟安装相关的字段:
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" },
"client": {
"platform": "web",
"immediately": true,
"inject": ["@deepseek-ai/dsh-client-ui-conversation"]
}
}
inject 声明了客户端依赖的宿主模块,immediately 为 true 意味着随客户端一起加载。
接口与本地数据¶
插件内部接口:
GET /plugin/quota-balance/status
{"ok":true,"wallets":[{"currency":"CNY","balance":"5.40"},...],"normal":[...],"bonus":[...],"links":{"usageUrl":"...","topUpUrl":"..."},"fetchedAt":1793627086526}
{"ok":false,"reason":"unavailable"|"signed-out"|"failed"}
余额只在本地回环地址上暴露,且响应不带 CORS 头,网页无法跨源读取。这条限制可以放心:余额不会因为你装了这个插件而传到别的站点。
典型用法:改代码后怎么生效¶
- 改
client.js:保存后页面会热更新,README 注明本插件实测即时生效。 - 改
index.js:在插件管理里把本插件禁用再启用即可重载 Host 模块,不必重启应用(已实测);之后点卡片里的「刷新」取一次新数据。
与壁纸引擎的关系¶
这里的做法值得单独说:壁纸引擎不是给插件一套「浮层样式」,而是把宿主自己的表面 token 就地改写成玻璃配方,--dsw-alias-bg-layer-*、--dsw-alias-bg-overlay、--dsw-alias-border-* 全部被重映射。官方那些浮层(Token 用量、会话统计)读的就是这些 token,所以这个插件直接读同一个宿主 token,而不是抄壁纸插件的参数:
| 用途 | 取值 |
|---|---|
| 面板底色 | var(--dsw-alias-bg-overlay, #26272b) |
| 毛玻璃 | backdrop-filter: blur(var(--we-blur, 13px)) saturate(var(--we-saturate, 1.3)) |
| 边框 | --dsw-alias-border-l2 |
| 文字 | --dsw-alias-label-primary/secondary/tertiary |
| 强调色(去充值) | var(--we-accent, var(--dsw-alias-brand-primary, #7db3ff)) |
README 里记了两个坑值:--dsw-alias-bg-base 在壁纸引擎下是 transparent,--dsw-alias-border-l1 的 alpha 是 0,拿这两个去铺底不会得到预期效果;--we-panel-color 这类实色会变成不透明板子。
另有一条值得抄的思路:样式注入到 <style id="quota-balance-css">,热更新时旧节点还在页面上,injectPanelCss() 必须覆盖 textContent,不能发现节点就 return;样式表原先只在浮层首次展开时注入,导致刷新页面后徽标没有样式,现在改为在 ctx.slots.inject(...) 里先调一次 injectPanelCss()。
适用场景与注意¶
适合这几类人:
- 常驻桌面版跑会话、需要边看边算消耗的开发者;
- 账户里有赠送额度,想看普通余额和赠送额度分项的人;
- 已经在用
dsh-plugin-wallpaper-engine,希望浮层样式自动跟上主题和壁纸的人。
注意几点:
- 插件以当前 DSH 进程的权限运行,能读到宿主已登录账户的余额。装之前建议先打开
index.js和client.js看清楚,认同之后再启用。许可证是 MIT,作者是 dxxo77。 - 余额数据只在本地回环暴露、无 CORS 头,本地脚本或浏览器控制台理论上可读,页面外无法跨源取。如果在意,装之前要确认这个边界符合你的预期。
- 依赖两个宿主条件:DSH 桌面版(Host 有
deepseekAccount服务)和已登录 DeepSeek 账号。只装客户端半边、不满足这两个条件时插件不会显示任何东西(未登录或读取失败整体隐藏,不报错也不占位)。 - 这个插件不是官方出品,README 中列出的市场条目也投放在社区维护的 awesome-dsh-plugin 仓库,站点与市场会自动读入,和 DeepSeek / 幻方没有官方从属关系。
最后回顾:它做的事很窄,就是把余额从网页账户页挪到用量行里,顺带复用宿主表面 token 让浮层跟着壁纸引擎走。如果你已经在桌面版上长期使用,这是一条低成本的信息补全。