前言¶
用 DSH 的 Web 界面跑任务时,比较常见的困惑是不知道自己还剩多少额度、这个窗口打开以来花了多少钱。想确认余额,通常要切到「设置 → 账户」;想看烧钱速度,基本只能靠事后算用量。dsh-usage-footer 针对这个场景做了一条常驻底部状态条,把余额、赠送额度、本次打开消耗、消耗速度和最近刷新时间一次摆出来,不需要改 DSH 本体。
插件由 Roccn 维护,分类为客户端,简介是「DeepSeek balance and burn-rate status strip for the DeepSeek Harness Web UI」。它是第三方社区插件,与 DeepSeek / 幻方没有官方从属关系,使用前建议先检查源码与许可证。下面按 README 里写明的能力与口径介绍。
状态条显示的是什么¶
状态条挂在 shell.bottom 槽位,显示顺序固定为:
↻ · 余额 · 赠送 · 本次打开消耗 · 消耗速度 · 最近刷新时间
各项含义如下。
- 余额:DeepSeek 账户剩余额度与币种,来自已有的
account/getBalanceRemote(与「设置 → 账户」同一数据源)。账户可能有多个币种钱包,插件按币种分别汇总后取总额最大的那个显示,符号随币种(CNY 用¥、USD 用$)。 - 赠送:赠送钱包余额合计,大于 0 时显示。
- 本次打开消耗:打开本窗口时第一次读到的(充值余额 + 赠送余额)减去当前两者之和,充值部分显示为
+。 - 消耗速度:所有正在运行会话的 token 增量折算成人民币,单位元/秒,取近 2 分钟平均。
- ↻:手动刷新按钮,点击后立刻重读余额并重新采样会话,按钮短暂变淡表示进行中;支持 Enter / 空格触发。
两个容易踩的坑,README 里已经写清楚:一是多币种钱包若不按币种汇总取最大,一个排在前面、余额为 0 的 CNY 钱包会把真实额度盖住,整条永远显示 0;二是 DeepSeek 抵扣先走赠送额度,如果只看充值余额,本次打开消耗会一直是 0,插件第一版就踩过这个坑。
消耗速度怎么算¶
速率不是接口直接返回的,插件按下面四步计算。
- 每 5 秒调
session/list,只取running === true的会话,累加整段日志的 token 用量(uncachedInputTokens/cacheReadTokens/cacheWriteTokens/outputTokens)。 - 与 2 分钟窗口内最早一次采样求差,得到 Δtoken / Δt。
- 按 deepseek-flash 单价折算(元 / 百万 tokens),价格来源是 DeepSeek 官方定价页:
| 时段 | 缓存命中输入 | 缓存未命中输入 | 输出 |
|---|---|---|---|
| 高峰 | 0.04 | 2 | 8 |
| 空闲 | 0.02 | 1 | 4 |
高峰定义为北京时间周一至周五 9:00–12:00、14:00–18:00,其余为空闲。
4. 账户钱包不是 CNY 时(例如 USD),用 client.js 顶部的 CNY_PER_CURRENCY 常量折算成钱包币种,使「消耗速度」与「余额」同为 $ 或同为 ¥。当前常量为 USD = 6.67,是 2026-11-04 查自 wise.com 的中间市场汇率;汇率漂移后改这个常量即可。
「消耗速度」的悬浮提示可以看到更多明细:首行是当前时段价格,写成 每百万token(命中:X元 未命中:X元 输出:X元);非 CNY 账户多一行折算说明;其后按会话拆分正在运行的会话数、每个会话各自的元/秒与 tok/s。没有会话在跑时,写明「当前没有正在运行的会话」。
已知口径限制:cacheWriteTokens 按「未命中」单价计费(平台不单列缓存写入价);中国法定节假日未建模,按高峰计价;token 用量按步上报,速率呈台阶式,用 2 分钟窗口平滑;无运行会话时显示 ¥0.00。
金额显示与刷新机制¶
金额显示对齐 Platform Web 的规则:两位小数、千分位分组、正数按分截断(1.6999 显示 1.69,不是四舍五入的 1.70),负数四舍五入且最小 0.01,正数不足一分显示 <0.01。这样做的目的是和「设置 → 账户」里的数字逐位一致。
刷新方面:余额没有推送接口,「实时」等于轮询,不是逐笔流水。余额每 30 秒轮询一次,窗口获得焦点、页面可见性变化、hashchange 时立即刷新;消耗速度每 5 秒采样一次。
「本次打开消耗」的基线存在 sessionStorage 的 dsh-usage-footer:<path+search+hash> 键下(当前是 dsh-usage-footer:/),格式为 v2,同时记录充值余额与赠送余额。这一点带来明确的边界:关闭应用再打开,计数从 0 重新开始;页面内 Ctrl+R 刷新则保留当前计数。sessionStorage 不可用时退回内存基线。
安装¶
官方推荐的方式是在 Harness 里让 agent 用 plugin_manager 的 install_bundle,target 填仓库地址。装完按 Ctrl+R 刷新页面即可,不必重启应用。
target: https://github.com/Roccn/dsh-usage-footer.git
安装状态落在下面两处:插件以 junction 形式装进 ~/.dsh/profiles/desktop/node_modules/@local/dsh-usage-footer,并在 ~/.dsh/profiles/desktop/cordis.patch.yml 末尾追加:
- insert:
- id: usage-footer
name: "@local/dsh-usage-footer"
卸载时,删掉那段 insert,再删掉 node_modules/@local/dsh-usage-footer 链接即可。
典型用法¶
插件没有额外配置项,装好状态条直接出现在 Web 窗口底部。日常使用基本是看一眼窗口底部:余额 是当前账户可用额度,本次打开消耗 是这轮窗口打开以来的净支出,消耗速度 是当前跑着会话的烧钱速率;需要立刻重算时点 ↻。
当多个会话同时运行、想确认哪个会话在空转时,可以把鼠标停在 消耗速度 上看悬浮提示,那里按会话拆分了各自的元/秒与 tok/s。
适用场景与注意¶
适合在 DSH Web 界面里跑长任务、想随时掌握额度与消耗的用户,尤其是不方便反复切到「设置 → 账户」的场景。要留意的几点:
- 插件以当前 dsh 进程权限运行。它调用的是账户 Remote,安装前应检查源码与许可证,确认来自可信来源。
CLIENT_VERSION硬编码为0.2.1-rc.5,仅用于账户接口的客户端标识头;DSH 升级后如接口校验变严,需要同步改这个常量。- 客户端
inject必须同时声明remote与remote.account/remote.session。只声明后者时访问ctx.remote会抛cannot get property "remote" without inject,而桌面端 web boot 审计会把它当成致命错误,导致整个窗口打不开。 - 账户钱包不是 CNY 时,折算汇率写在源码常量里,不会自动更新,需自行维护。
小结¶
dsh-usage-footer 的价值在于把余额、赠送额度、本次打开消耗和消耗速度收进一条状态条,数据源沿用 DSH 已有的账户与 session 接口,不需要改本体,也不需要额外配置。想随时掌握账户余量与烧钱速度的用户值得一试。
- 目录页:https://www.skillhub.cn/plugins/Roccn/dsh-usage-footer
- GitHub:https://github.com/Roccn/dsh-usage-footer