dsh-token-stats:在 DeepSeek Harness Web UI 里统计 Token 消耗

前言

用 DeepSeek Harness(DSH)跑会话时,token 用量分散在各个会话日志里。想知道这个月每个模型各消耗了多少、哪几天用得最频繁,只能手动翻日志或自己写脚本统计,费时且容易算错。dsh-token-stats 是为 DSH Web UI 打造的 Token 消耗统计插件,它以会话日志为数据源,把用量聚合成按天、按模型的视图,直接显示在设置面板里。下面介绍它的功能、安装方式和工作原理。

这是什么

dsh-token-stats 由 MoonlitDropOfBlood 维护,遵循 MIT License。README 中声明:本项目是基于 DeepSeek Harness 构建的社区插件,并非 DeepSeek 官方产品。

它的定位很明确:不改会话流程,不解析请求头,直接把 DSH 会话日志作为唯一权威数据源,聚合出每个模型每天、每个统计区间的 token 用量。

核心功能

图表能力:

  • 两个统计 Tab:近 7 天 / 近 30 天,两个区间都包含今天
  • 堆叠柱状图:统计区间内每个模型每天的消耗,悬停查看具体数字
  • 饼图:统计区间内每个模型的总消耗占比,图例带精确值和百分比
  • GitHub 风格热力图:近一年每日活跃,天数随容器宽度自适应,最多显示 365 天(一年)
  • 汇总卡片:区间总 Tokens / 输入(含缓存) / 输出

数据与体验:

  • 本地持久化:聚合结果落盘 <DSH_HOME>/data/dsh-token-stats/stats.json,冷启动只扫描新会话、秒开
  • 自动刷新:页面打开期间每 30s 刷新;历史回填期间每 2s 轮询进度
  • 主题适配:全部使用 DSH 设计 token,明暗主题自动跟随
  • 去重:按 session+seq 水位线去重,历史回填与实时监听合并后不重复计数

安装与启用

这是一个标准 DSH bundle:package.json 声明 dsh.bundle.patch,包内自带 cordis.patch.yml,用官方 dsh plugin 命令安装:

dsh plugin --profile web add https://github.com/MoonlitDropOfBlood/dsh-token-stats/releases/download/v1.2.0/dsh-token-stats-1.2.0.tgz

dsh plugin add 会把插件装成 profile 的 npm 依赖并追加到 dsh.profile.bundles,启动时 DSH 自动应用包内的 cordis.patch.yml 挂载插件。

本地开发时可以软链到本仓库,改代码即生效:

dsh plugin --profile web add /path/to/dsh-token-stats

重启 DSH 后,打开 Web UI 的设置(侧栏底部),左侧导航会出现 Token 统计页。

卸载:

dsh plugin --profile web remove dsh-token-stats

典型用法

1、打开 设置 → Token 统计。

2、在 近 7 天 / 近 30 天 两个 Tab 间切换:

  • 柱状图展示区间内每天、每个模型的消耗(堆叠)
  • 饼图展示区间内每个模型的总消耗占比
  • 顶部卡片给出区间总 Tokens / 输入 / 输出

3、下方 每日活跃 热力图展示更长时间范围:格子越多 = 容器越宽,最多覆盖近一年。

如果想强制全量重扫历史数据,删除聚合文件即可,下次启动会重新扫描全部会话:

rm <DSH_HOME>/data/dsh-token-stats/stats.json

工作原理

数据采集分实时和历史两条路,合并后统一落盘:

  • LIVE:插件启动后,监听 session/event 中的 assistant/message(usage)实时累计
  • HISTORY:通过 sessionQuery.readSession() 回填历史,仅扫描从未回填过的会话
  • DEDUP:按 session+seq 水位线去重,绝不重复计数
  • PERSIST:聚合结果和水位线落盘 stats.json(防抖写盘 + 停止时 flush)

历史回填只统计插件启动前发生的调用,实时监听只统计启动后的,两者通过每个会话的事件序号水位线合并,不会重复。

聚合规则:

  • 数据按本地日历天 × 模型(provider::model)聚合
  • total = input + output + cacheRead + cacheWrite
  • 模型信息来自 assistant/message 的 message.source(kind = ‘model’)

代码结构:

dsh-token-stats/
├── index.js            # Host TokenStatsServiceRemote 服务采集 + 回填
├── client.js           # Client 设置页Token 统计UI bundle
├── typert.host.js      # Typert Host manifesttokenStats/getStats 描述
├── cordis.patch.yml    # dsh bundle patch挂载行
├── AGENTS.md           # 面向 AI agent 的开发指南含踩坑
└── LICENSE             # MIT

依赖方面,peerDependencies 声明 @deepseek-ai/cordis ^4.0.1 和 @deepseek-ai/dsh-typert-protocol ^0.1.0-rc.7,运行时依赖 zod ^4.4.3。

适用场景与注意

适合两类人:

  • 日常使用 DSH 的开发者,想了解每个模型的消耗分布和长期活跃趋势
  • 想写 DSH 插件的开发者,AGENTS.md 记录了 DSH 正式插件(Host/Client/Typert 三件套)的完整机制和踩坑,可以作为参考

安装前注意:插件以当前 dsh 进程的权限运行,建议安装前检查源码与许可证。本项目为社区插件,并非 DeepSeek 官方产品。

小结

装好 dsh-token-stats 后,每个模型每天的 token 消耗、长期活跃趋势都能在 Web UI 里直接看到,不用再手动翻会话日志。仓库地址:https://github.com/MoonlitDropOfBlood/dsh-token-stats ,社区目录页:https://www.skillhub.cn/plugins/MoonlitDropOfBlood/dsh-token-stats 。

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

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

Xiaoye