lbqcgza/dsh-quota-usage ↗★ 0

dsh-quota-usage

在侧边栏底部显示账号剩余额度与赠金 适合需要随时监控DeepSeek账户余额的Web或桌面端用户。

包名
dsh-quota-usage
兼容性
待验证
版本
0.1.2
许可证
MIT
最近更新
2026年10月3日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:lbqcgza/dsh-quota-usage

dsh-quota-usage

中文 | English

release stars license DSH web client no telemetry

装在 DeepSeek Harness 侧边栏底部的小组件:在你的用户名正上方显示账号剩余额度,点一下即刷新。

dsh-quota-usage

平时金额贴住最右边;点整行立即刷新,转圈只在这时出现。

安装

在 DSH 里用 plugin_manager 装(Creator 模式,或设置里的插件页):

plugin_manager install_bundle  target = github:lbqcgza/dsh-quota-usage

也可以直接指向本仓库的本地克隆路径:

plugin_manager install_bundle  target = 

装完要重启一次桌面 App。 客户端模块的启动图只在宿主进程启动时生成一次,之后刷新页面也拿不到新插件 —— 这一点和多数 DSH 插件不同,原因见实现要点。dsh web 浏览器模式则刷新页面即可。

装好后:侧边栏底部、设置 与头像/用户名那一行的上面会多出一行 额度。

需要 DSH 0.2.0-rc.2 或更新的 Web 版(桌面版或 dsh web)。它依赖 sidebar.footer.action 槽位与官方 remote.account 命名空间;headless / SDK / ACP 这类没有 Web 客户端的 profile 不适用。

你会得到

  • 总余额一眼看到 —— 主数值是 Platform 的充值余额(normal_wallets)与赠金余额(bonus_wallets)在该币种下的合计;括号里是赠金部分,不足 1 分(含为 0)时整个括号连单元格一起不渲染,不会留下空位或 `` 的 UA 样式默认 text-align:center, 会把撑满宽度的子元素里的文字居中**,所以插件在行上显式设了 text-align:left(有 CSS 契约测试锁住)。

  • 金额是估算 —— 会话日志里只有 token、没有任何金额字段(DSH 也不随包发布价格表),所以这一项由官方价目表推算:deepseek-flash 空闲时段 输入命中 0.02 / 输入未命中 1 / 输出 4(元每百万 tokens),高峰时段翻倍

  • token 数在悬停提示里 —— 它来自 tokenUsage 投影(整份持久日志的回放结果,分页与压缩不会改变它),口径与 DSH 自己一致:提示侧三个互斥桶 uncachedInputTokens + cacheReadTokens + cacheWriteTokens,加上 outputTokens。悬停可见精确 token 数,副标题只显示钱

两个估算固有的误差来源,都来自数据而不是算术:

  1. 只能给区间 —— 投影没有逐请求时间线,历史 token 无法还原当时是高峰还是空闲,于是两档都算出来显示成 ¥1.20–2.40。高峰时段是北京时间周一至周五 9:00–12:00、14:00–18:00(不含法定节假日)
  2. 缓存写入按未命中计价 —— 官方价目表只有"缓存命中/未命中"两列,没有缓存写入列,所以 cacheWriteTokens 按未命中输入价计,与 DSH 自己的提示侧分组一致

开关

设置 → 通用 → 本会话用量显示 可以关掉这一行。开关状态记在浏览器本地(localStorage 的 dsh-quota-usage:show-usage,这是本插件唯一写入的键),关掉后副标题与悬停提示里的用量段一起消失。 没打开任何会话时这一行本来就不渲染,组件仍是单行。

范围限制

这一行只覆盖当前会话。额度行所在的 sidebar.footer.action 是 root 作用域, 而 tokenUsage 这类投影只能从会话作用域读到 —— 所以插件额外在会话作用域的 conversation.composer.dock 挂了一个不渲染任何东西的桥接组件,把读数交给额度行。 要做到"整个工作区"(含没打开过的会话)必须加 host 半侧去汇总会话日志,那会引入一个本地路由, 与当前"零网络"的架构不符,所以没做。

刷新节奏

  • 挂载时读一次;账号命名空间答复之前每 5 秒重试(它是宿主异步挂载的独立服务,可能比本插件晚就绪), 一旦答复过就转为每 60 秒 —— 注意"答复"包括读取失败与未登录,因为那说明接口已经在,再快也没用
  • 页面重新可见、窗口获得焦点、连接重置时重读
  • 订阅 account.watch 账号状态流,登录 / 登出后立刻重读
  • 点击整行立刻重读一次,并在读取期间显示转圈
  • 并发去重:同时触发多个刷新只会发一次 Remote 调用;后台调用与你的点击重叠时共用一个请求,转圈仍会显示到该请求结束

隐私与安全

  • 不持有凭据 —— 没有 token、没有账号、没有 API key。账号 token 由宿主持有并用于发请求,客户端从来拿不到它
  • 不注册任何 HTTP 路由 —— host 半侧是空的 apply,只为让包在 Loader 里占一行
  • 不执行命令、不读文件
  • 只发一次调用 —— remote.account.getBalance,与官方「设置 → 账号」页同源;随请求的元数据只有 version(DSH 版本号)、locale(界面语言)、timezoneOffsetSeconds(UTC 偏移)三项,与官方账号页逐字一致,没有设备 ID / 用户 ID
  • 不写浏览器状态 —— localStorage、sessionStorage、cookie、indexedDB 全无使用。唯一的例外是那一个显示偏好键 dsh-quota-usage:show-usage(即「本会话用量显示」开关的状态),它不出浏览器、不参与任何请求
  • 没有任何遥测出口 —— 代码里没有 fetch / XMLHttpRequest / WebSocket / sendBeacon

需要报告安全问题请用 私密漏洞报告, 不要开公开 issue;判断边界见 SECURITY.md。

已知限制

  • 只读展示,不提供充值或跳转。Platform 原生页面由官方 ui-settings-account 的 shell.overlay 共享宿主条目独占,第三方插件不应另起一个
  • 赠送余额与充值余额取同一币种;多币种并存时优先 CNY,否则取第一个钱包的币种
  • 金额按 Platform Web 口径显示:两位小数、千分位、正的亚分显示为 ` ({ injections, streamBaseUrl }));

所以**新加一行**客户端模块后,刷新页面也拿不到它的 bundle(Loader 条目已是 active,但页面手里的模块表
是旧的)。`dsh web` 浏览器模式则刷新页面就会重新渲染启动图。**但一旦这一行已存在**,停用再启用会触发
页面重新同步并重新加载,不需要重启。

## 自诊断

- **挂载失败** —— trace 以 `shell.overlay` 的 occupant id 形式留在页面里,
  形如 `dsh-quota-usage-diag:bind=ok | dict=ok | … | seat=!`,客户端 Slot 检查即可读到;
  同时有一行 `console.error`。
- **读数未就绪** —— 只要阶段不是 `ready`,插件会把自己镜像成 `shell.overlay` 的
  `dsh-quota-usage-state:
` 条目,拿到金额后自动撤下。所以"overlay 里没有 state 条目"
  等于"这条路没有跑起来","有 state 条目"等于"跑起来了但卡在该阶段"。

## 友情链接

- [dsh-market](https://github.com/dsh-market/dsh-market) —— DSH 里的可视化插件市场。本仓库的 README
  结构、`.gitattributes` 与 `SECURITY.md` 的组织方式参考了它
- [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) —— DSH 插件精选列表

## 许可

MIT · [github.com/lbqcgza/dsh-quota-usage](https://github.com/lbqcgza/dsh-quota-usage)