dsh-better-stats: Add a real-time cost and status bar to DSH Web UI

前言

用 DSH(DeepSeek Harness)跑长任务时,费用是最难心里有数的一项:deepseek-v4-flash、deepseek-v4-pro 价格不同,官方人民币价目还分峰谷时段,输入要按缓存命中与否分桶计价,agent team 下面还有并行子会话的用量要合并。流式输出进行到一半,很难估出当前 turn 已经花了多少;事后拿着 token 明细手工对账也很费劲。

DSH 的理念是「一切皆插件」,Web UI 里的信息展示同样可以交给插件补齐。dsh-better-stats 做的就是这件事:在 composer 正下方放一条状态条,把花费、余额、计时和 token 统计实时摆出来,计价直接对齐 DeepSeek 官方价格表。

这是什么

dsh-better-stats 是 null5069 维护的 DSH Web UI 插件,MIT 许可,当前版本 0.1.16,无运行时依赖,要求 Node >= 18。装好后它呈现为一条位于 composer 正下方的状态条,README 给出的示例长这样:

DeepSeek Official | Balance ¥8.67 | Turn ¥0.1676 · Session ¥29.49 | 20 turns · 345 steps | LLM 1h 12m · Tool 5m 6s | TTFT avg 3.88s · 111.72tok/s | Cache 103.98M · hit 98.64% | In 1.44M · Out 336.53K

从左到右依次是价格来源、账户余额、turn/session 金额、turn 与步数、LLM 与工具时长、整树 TTFT 与 tok/s、缓存用量与命中率、输入输出 token。

计价

官方价格表

价格不写死在插件里。host 每 6 小时从官方定价页 api-docs.deepseek.com/zh-cn/quick_start/pricing 重新同步一次人民币价格,映射官方模型表头列,并带内置回退。popover 会显示来源与抓取时间。

峰谷分时

峰时为周一至周五北京时间 09:00–12:00 / 14:00–18:00,价格 ×2,周末按谷时。计价按每条事件自己的时间戳判定所在时段;popover 显示下次峰谷切换的倒计时,会跳过周末。

按模型与缓存分桶

每条消息用产生它的模型计价:deepseek-v4-flash / deepseek-v4-pro / deepseek-v4-flash-vision-exp 各自套用官方表格。未知模型显式标记 Unpriced,token 计入总量但价格为 0,不会悄悄套一个默认价。

缓存分三桶:未缓存输入、缓存读(低价)、缓存写分开计价,状态条同时显示缓存命中率。

Turn 实时结算与流式估算

一个 turn 的金额来自两部分:已结算的步骤按事件级折叠计价;进行中的步骤用流式字符级估算,估算密度经 EMA 自校准,并按当前峰/谷时段计价。

Agent team 树合并

开 agent team 时,host 每秒经 /live 路由发布一份以 session id 和事件修订版为键的一致树快照,把子会话的用量并入所选会话的统计。合并有明确边界:仅 origin: subagent 的会话加入树,普通 fork 不合并。

余额直查与提醒

余额由 host 直接查询 api.deepseek.com/user/balanceDEEPSEEK_API_KEY 通过 DSH credentials seam 传递,不经过浏览器。查询结果缓存 15 秒;点击状态条上的余额组可以强制刷新,host 侧有 2 秒防洪冷却。popover 显示 granted/topped-up 拆分、剩余天数估算(EWMA)与充值链接。

余额提醒分两档,默认 warn ≤¥20 变黄、critical ≤¥5 变红;可用 balanceWarnCny / balanceCriticalCny 调整,设为 0 关闭对应档位。

预算提醒(可选,默认关闭)

预算提醒默认关闭,在插件 config 中写入 dailyBudgetCny / monthlyBudgetCny 即启用:

config: {
  dailyBudgetCny: 20,
  monthlyBudgetCny: 100
}

花费超过预算 80% 时金额组变黄,超支变红并带 ⚠。popover 会给出 Today ¥x · daily budget ¥20 (85%) / Month ¥y · monthly budget ¥100 (30%) 这类明细,按 Asia/Shanghai 零点与月初滚动重置。

其他细节

  • 实时计时器:LLM/工具时长仅统计所选会话,并行子会话不重复累计;整树 TTFT 与 tok/s 实时显示。
  • 全新会话占位条:新窗口/新对话首帧即渲染全部分组,空值显示合法的 0 或 -
  • Live popover:agent team 运行时,turn/session 金额、Tok、模型行、缓存、活动计数、TTFT、tok/s 实时更新。
  • 布局:与 composer 等宽,最多换行两行,丢弃行边界的孤儿分隔符,溢出截断为尾部 (基于缓存自然宽度,无闪烁)。
  • i18n:UI 字符串跟随浏览器语言,支持简体中文/英文。
  • 精度规则:计算金额(turn/session/today)4 位小数,外部金额(余额)用提供方精度,配置金额 2 位,popover 保留 6 位明细。
  • 计费口径:outputTokens 已包含 reasoningTokens,推理 token 仅作展示,不会重复计费。
  • 异常 dispose 会冻结 host 树时长并清除临时输出;临时边 5 秒无新 /live 快照即过期,被打断的子会话不会永久计时。

安装与启用

npm 方式一条命令:

cd ~/.dsh/profiles/web
pnpm add dsh-better-stats

装完还要把包注册为 bundle:在 profile 的 package.json 中把 dsh-better-stats 加入 dsh.profile.bundles 数组,然后重启 dsh web 并硬刷新浏览器。包内自带 cordis.patch.yml,会自动挂载插件行,无需手动改 YAML。

默认值:余额提醒两档开启(warn ¥20 / critical ¥5),日/月预算关闭。要自定义,在插件 config 中设置 balanceWarnCny / balanceCriticalCny(0 关闭该档),或 dailyBudgetCny / monthlyBudgetCny(写入即启用)。

GitHub clone 方式:

git clone https://github.com/null5069/dsh-better-stats.git
cd dsh-better-stats

该插件无运行时依赖,clone 后无需 npm install。下一步是把目录 symlink 进 profile——README 在这一步被截断,具体命令不完整,请以仓库内文档为准。

适用场景与注意

适合长期在 DSH Web UI 里跑任务、需要盯费用和余额的人,尤其是会开 agent team、跑并行子会话的用户——树合并与实时结算正是在这里发挥作用。

两点注意。其一,插件以当前 dsh 进程的权限运行,安装前建议先检查源码与许可证(MIT)。其二,余额查询依赖 DEEPSEEK_API_KEY,该 key 经 DSH credentials seam 传递、不经过浏览器,但仍建议确认信任作者后再启用。

结尾

dsh-better-stats 把 DSH Web UI 里最不透明的两项——花了多少钱、还剩多少——变成常驻可见的一条状态,并且计价、分时、分桶都对齐官方口径。代码与文档见 GitHub 仓库:https://github.com/null5069/dsh-better-stats。如需浏览更多 DSH 插件,社区维护的插件目录是一个独立站点,与 DeepSeek / 幻方无官方从属关系。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye