dsh-token-usage:给 DSH Web GUI 加一个 Token 用量分析页

前言

用 DSH(DeepSeek Harness)跑智能体会话时,有两个问题经常要回答:这轮对话到底消耗了多少 token,上下文窗口还剩多少。默认的 Web GUI 里只有 Chat 和 Trajectory 两个页,这些数字要么看不见,要么要自己去翻原始记录。

samecorner/dsh-token-usage 解决的就是这件事:它是一个客户端插件,在会话顶部 Tab 栏(Chat / Trajectory 之后)新增一个「Token 用量」页,把整轮对话的 token 明细和上下文占用直接展示出来。下面介绍它的功能、安装方式和使用时需要注意的口径问题。

这是什么

dsh-token-usage 是 DSH Web GUI 的 Token 用量分析插件,npm 包名 @samecorner/dsh-client-ui-token-usage,当前版本 0.1.3,MIT 许可,由 samecorner 维护。

它的思路是:host 端的 token-meter、session-stats 模块已经内置在 dsh web 中,会持续产出 tokenUsage、contextPressure、contextBreakdown、sessionStats 等投影数据;插件在浏览器端注册一个 conversation.view slot 条目,把这些投影数据渲染成可视化面板。逐轮级别的数据则由插件客户端从会话事件窗口折叠 assistant/message 的 usage 得到。

作者在 README 中提到,灵感来自 pi-web-token-usage(pi-web 的同类插件),但完全按 DSH 的插件契约重新实现。

核心功能

按数据来源分,插件提供这几块内容:

1、整轮 KPI。总 token / 计费 token / 输出 / 缓存读取四张卡片,带数字滚动动画,数据来自 host 端 tokenUsage projection。

2、上下文压力。上下文占用进度条,达到 80% 及以上会警告变色;旁边还有提示缓存命中率、推理占比、平均与峰值单次调用。

3、上下文构成。系统提示 / 工具 schema / 对话内容三段堆叠条,反映新请求的组成估算,来自 host 端 contextBreakdown projection。

4、轮次与步数统计。来自 host 端 sessionStats projection。

5、构成环形图和明细表。按输入 / 缓存读 / 缓存写 / 输出 / 推理拆分,每项带占比微条。

6、逐轮视图。逐轮堆叠柱状图(hover 显示 tooltip)、逐轮明细(含耗时)、累计计费曲线,由客户端从会话事件窗口折叠 usage 计算。

7、按模型拆分。每个模型的 token、调用数、缓存命中率。

8、辅助操作。一键复制 Markdown 报告;「加载更早记录」按钮翻阅更早的轮次。

安装与启用

推荐用 npm 一键安装,免编译、免改配置:

# 在哪里执行都可以,dsh 会自动到对应的 profile 目录里跑 pnpm
# (首次使用会自动初始化 profile)
dsh plugin --profile web add @samecorner/dsh-client-ui-token-usage

# 重启 dsh web,顶部即出现「Token 用量」Tab

这个包声明了 dsh.bundle.patch(对应包内的 bundle.patch.yml),dsh plugin add 之后会自动挂载:包被加进 profile 的 bundle 层,不需要手动改 cordis.patch.yml

有一个前提要注意:如果之前在 cordis.patch.yml 里手动 insert 过同 id 的条目,请先删掉,否则会因重复挂载报错。

更新和卸载也是一条命令:

dsh plugin --profile web update @samecorner/dsh-client-ui-token-usage
dsh plugin --profile web remove @samecorner/dsh-client-ui-token-usage

卸载时,依赖与层列表会自动一并摘除。

源码构建与本地开发

想改代码或本地调试,可以走源码构建:

# 1. 构建(需要 node >= 18;依赖只来自 npm 公开包,不需要 DSH 源码)
npm install
npm run build        # 产出 lib/client.js + lib/index.js

# 2. 以本地目录安装进 profile(同样走 dsh plugin,自动挂载)
dsh plugin --profile web add /path/to/dsh-token-usage

# 3. 重启 dsh web

目录依赖是链接语义:改代码后重新 npm run build,重启 web 即生效,不需要拷贝或同步文件。

常用的开发命令:

npm run typecheck    # tsc --noEmit
npm run build        # esbuild:浏览器 bundle + node half
npm run test         # 冒烟:loader 形态 + SSR 渲染(不启动 web)

打包格式上有一个硬性要求:lib/client.js 必须带 window.__ModuleLoader__.load({ id, factory }) 包装,react / cordis / ui-slots 等平台模块保持 external。这个包的运行时是零依赖的——package.json 里只有 devDependencies(类型和构建工具)。

如果打算自己写 DSH 客户端插件,仓库里的 docs/client-plugin-dev-guide.zh.md 是一份开发手册,覆盖官方 Demo 目录、完整流程和踩坑清单。

数据口径与已知限制

看数字之前,先弄清楚几个口径,避免误读:

  • 逐轮明细只覆盖「窗口内已装配且带 usage 的 assistant/message」。被取消的步、usage 缺失的调用不会出现在逐轮表里;整轮合计以 host projection 为准,两者口径可能略有差异。
  • 推理 token 计入输出,与 token-meter 口径一致。
  • 没有成本估算。DSH 不记录单价,插件不做猜测计费。
  • 上下文占用显示的是 token-meter 的近似投影(projectedTokens / contextWindow),不是计费口径。

适用场景与注意事项

这个插件适合两类场景:一是长会话开发,需要盯着上下文占用、决定什么时候开新会话;二是成本与效率优化,比如核对提示缓存命中率、比较不同模型的实际消耗。复制 Markdown 报告的功能,也方便把用量数据贴进 issue 或文档里讨论。

两点提醒:

第一,和所有 DSH 插件一样,它以当前 dsh 进程的权限运行。安装前建议先看一下源码(仓库公开)和许可证(MIT),确认没问题再装。

第二,插件依赖 host 端 projection 数据,逐轮视图依赖会话事件窗口内的 usage 字段。如果某些调用本身没有 usage,对应行不会出现,这不是插件坏了,是口径限制。

结尾

dsh-token-usage 做的事情很集中:把 DSH 内置的 token 投影数据变成一个看得懂的分析页。如果你在用 dsh web 跑智能体会话,装上它,重启后顶部多一个「Token 用量」Tab,就能直接回答「这次会话花了多少 token、上下文还剩多少」这类问题。

  • GitHub 仓库:https://github.com/samecorner/dsh-token-usage
  • 社区插件目录页:https://www.skillhub.cn/plugins/samecorner/dsh-token-usage

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

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

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

小夜