dsh-plugin-token-usage:跨会话统计 DSH 的 token 用量

前言

用 DSH 做日常任务时,token 花在哪里并不直观。会话日志里虽然带着每次模型调用 provider 上报的用量,但数据分散在所有持久化会话中——包括 subagent 会话。想知道「最近 7 天某个模型用了多少」,只能手工翻日志或临时写脚本聚合,插件安装之前的历史数据更是难以覆盖。

dsh-plugin-token-usage 把这件事做成了插件:按 (date, provider, model) 分桶聚合,一条 /usage 命令出报表,Web GUI 侧也有对应面板。下面介绍它的定位、设计与用法。

这是什么

dsh-plugin-token-usage 由 lovedheart 维护,定位是「QwenPaw 风格的 DSH 跨会话 token 用量统计」:把所有持久化会话(含 subagent 会话)中每次模型调用的 provider 上报用量,聚合到 (date, provider, model) 桶里,通过 /usage 命令与 Web GUI 的 Token 用量面板展示。当前版本 0.2.0,许可证为 MIT。

核心设计

会话日志即事实来源

插件直接读取 ~/.dsh/sessions 下的会话日志作为持久事实来源。这意味着两点:

1、插件安装之前的历史数据也能统计;
2、写入侧不需要任何额外记账,正常使用 DSH 即可,聚合由插件增量扫描完成。

防重复计数与幂等

统计口径的处理规则如下:

1、已落盘的 assistant/message.usage 优先采用;
2、没有产生消息的失败步骤,回退到最后一个 streaming usage chunk(在 turn/end 时落盘);
3、每个会话文件维护一个持久化水位({hiSeq, framesIngested}),保证增量扫描在跨重启、崩溃恢复重编码的场景下依然幂等,不会重复累计。

零运行时依赖

运行时只使用 Cordis 的 ctx API 与 Node 22 内置的 node:zlib(zstd)。@deepseek-ai/cordis ^4.0.1 以 optional peer dependency 的形式声明。

安装与启用

README 没有提供官方安装命令。插件是 out-of-tree 模块,通过 profile patch 挂载,与 telegram、thinking-mode 插件是同一模式。步骤如下:

1、将 GitHub 仓库克隆到本地;
2、编辑 ~/.dsh/profiles/web/cordis.patch.yml,添加一段 insert 行:

- insert:
    - id: token-usage
      name: '/path/to/dsh-plugin-token-usage/lib/index.js'
      config:
        defaultDays: 30
        backfillIntervalSec: 30
        enableCommand: true
        verbose: true

name 指向仓库内 lib/index.js 的绝对路径,config 四项来自 README 示例,可按需调整。

另外一个细节:commands 是可选依赖(通过 optional child fiber 消费),因此插件在没有命令注册的程序集中也能加载——只是不注册交互命令,存储照常工作。

用法:/usage 命令

查询入口是单一命令 /usage,支持时间范围与模型过滤:

/usage                 # 最近 30 天(defaultDays 可配置)
/usage 7d              # 最近 7 天
/usage 7d qwen3.8      # 最近 7 天,模型过滤(provider/model 子串匹配)
/usage qwen3.6         # 默认时间范围,模型过滤

时间范围不写时取 defaultDays;过滤参数对 provider/model 字符串做子串匹配。

README 给出的示例输出,按总量、按模型、按天三段展示:

📊 Token Usage  2026-07-17 → 2026-08-16

Total: 906.9M tokens · 4954 calls
  input 473.3M · output 3.4M · cache read 430.1M

By model:
  sglang/Qwen3.8-27B  —  719.4M tokens · 3320 calls
      in 337.7M · out 2.8M · cacheR 378.9M
  sglang/Qwen3.6-27B  —  187.4M tokens · 1634 calls
      in 135.6M · out 669900 · cacheR 51.2M

By day:
  2026-08-13  42.6M tokens · 481 calls
  2026-08-14  195.7M tokens · 1587 calls
  2026-08-15  380.5M tokens · 1513 calls
  2026-08-16  288.1M tokens · 1373 calls

数字以缩写展示:达到百万级显示 M(如 1.2M),达到十亿级显示 B(如 1.5B),以下为普通整数;统一保留一位小数,末尾 .0 去掉。

配置项

key 默认值 说明
defaultDays 30 /usage 的回看窗口
backfillIntervalSec 30 增量回填间隔(秒),保持状态文件更新
sessionsRoot ~/.dsh/sessions 会话日志根目录,留空时从 DSH_HOME 自动推导
stateFile ~/.dsh/token-usage.json 聚合状态与水位的落盘文件
flushDelayMs 5000 状态写入的防抖延时
enableCommand true 是否注册 /usage
verbose false 是否输出回填进度日志

Web GUI 面板

package.json 提供 ./client 导出,dsh.client 字段声明 platformweb,并注入 @deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-locale,对应 Web GUI 中的 Token 用量面板。

开发与测试

代码结构:

  • src/frames.js — zstd 帧扫描器(对应 DSH 的 scanZstdFrames
  • src/store.js — 分桶聚合、去重、持久化、summarize
  • src/backfill.js — 增量遍历会话日志 + listSessionFiles
  • src/render.jsfmtTokensrenderUsageReportparseUsageArgs
  • src/index.js — 插件入口(name/inject/Config/apply
  • test/ — 单元与 harness 测试

仓库自带的开发命令:

npm install        # 为 harness 测试安装 cordis peer
npm test           # node --test test/*.test.mjs
npm run prepare    # 从 src/ 同步 lib/

npm run prepare 会把 src/*.js 复制到 lib/。由于挂载路径指向 lib/index.js,修改源码后需要同步一次。

适用场景与注意事项

适合的场景:DSH 会话多、常跑 subagent,想按天、按模型看用量分布;或者想在统计口径里包含插件安装之前的历史数据。

使用前注意:

1、插件以当前 dsh 进程权限运行,可读写 sessionsRootstateFile 指向的路径(默认 ~/.dsh/sessions~/.dsh/token-usage.json),启用前确认目录权限符合预期;
2、安装前建议自行检查源码与许可证(当前为 MIT);
3、统计对象是 provider 上报的用量,来自会话日志本身,不需要改动任何写路径配置。

结尾

dsh-plugin-token-usage 的思路很克制:不引入新依赖、不改动写路径,把会话日志当作唯一事实来源,做好去重与幂等,然后用一条 /usage 命令交付结果。如果你在 DSH 上有多会话用量的统计需求,它值得一看。

  • GitHub:https://github.com/lovedheart/dsh-plugin-token-usage
  • 社区目录收录页:https://www.skillhub.cn/plugins/lovedheart/dsh-plugin-token-usage

其中社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

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

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

小夜