dsh-token-dog · Token 小狗
DeepSeek Harness 的 Token 用量面板:按会话、按模型统计消耗,配每日堆叠矩形图与全年日历活跃图。
Token usage for the DeepSeek Harness Web GUI — per-session and per-model totals, a daily stacked bar chart, and a year-long calendar heatmap.
插件直接读 Session 日志,所以装上之前的对话也一起统计,不需要从今天开始重新记账。
效果
概览 —— 四张统计卡 + 按会话堆叠的每日矩形图(近 90 天,雾蓝主题 / 浓)

模型详情 —— 点任意模型行进入,看它自己的每日曲线与消耗过它的全部会话

活跃日历 —— 近 52 周,悬停任意一天查看当天用量

四个区块:
| 区块 | 长什么样 | 能干什么 |
|---|---|---|
| 统计卡 | 四张卡,大数字是同色系强调色 | 一眼看总量、缓存命中率、输出占比、日均调用 |
| 每日消耗 | 每天一根柱,柱内按会话分段(最多 6 段 + 其他),天数越多柱越细 | 悬停任一天,看当天总量、调用次数、前 4 个会话的明细 |
| 模型用量 / 会话排行 | 两列卡片列表,每行带占比条 | 点模型行进入该模型的详情页 |
| 活跃日历 | 52 周 × 7 天的格子,5 档深浅 | 悬停任意一天:当天总量、调用、会话数,以及每个模型各自的占比 |
功能
- 概览页:四张统计卡(总 Token / 缓存命中率 / 输出 Token / 调用次数)、每日消耗矩形图、模型与会话排行、全年日历热力图
- 每日矩形图:每天一根柱子,按当天消耗的会话堆叠;悬停显示当天总量、调用次数与前 4 个会话的明细
- 模型详情:点任意模型行进入,看该模型自己的每日矩形图与全部消耗过它的会话,可一键返回
- 日历活跃图:近 52 周、周一开头;5 档强度按当天 Token 的分位数自动分级;悬停列出当天所有模型及各自占比
- 区间切换:近 7 天 / 近 30 天 / 近 90 天 / 全部,作用于统计卡、矩形图、排行与模型详情
- 外观:白卡片 + 灰标签 + 强调色数字的版式;8 个低饱和预设色 + 自定义取色器 + 淡/中/浓三档(只作用于柱子与热度),选择记在 localStorage
- 中英双语:文案跟随宿主语言;缺字典时回退中文
- 只用本机:数据不过网,路由只接受回环请求
- 侧栏图标可关:页面右上角一个开关,关掉后左侧栏不再出现小狗图标(仍可从 设置 → Token 用量 进入),选择记在 localStorage
安装
本插件没有发布到 npm,也不经过构建,安装的是这个目录本身。已经装有
DeepSeek Harness(Desktop 版或 dsh web,0.2.x)就可以装。
第 0 步:拿到目录
git clone https://github.com/ccoderJava/dsh-token-dog.git
没有 git 也可以点仓库右上角 Code → Download ZIP 解压。
方式一:让 DSH 里的 Agent 装(推荐,不用命令行)
在 DSH 里随便开一个会话,发这样一句话(把路径换成你 clone 下来的实际路径):
把
/Users/you/plugins/dsh-token-dog这个目录装成插件
Agent 会调用内置的 plugin_manager 完成安装:把 dsh-token-dog 写进当前 profile 的
package.json(以 link: 方式指到该目录),并加入 dsh.profile.bundles。安装是即时的,
返回里的 application 为 applied 就表示已生效。
方式二:命令行
装了 dsh CLI 的环境里(Desktop 版通常没有 CLI,用方式一即可):
dsh plugin --profile desktop add link:/absolute/path/to/dsh-token-dog
desktop 是你的 profile 名(默认 desktop;CLI 用户可能是 default)。
第 2 步:刷新并打开
安装完成后 刷新页面(Cmd/Ctrl + R)。入口有两个,任选:
- 左侧栏最底部的 🐶 图标 —— 点一下整页打开;
- 设置(齿轮)→ 左侧导航最后一项「Token 用量」。
第一次打开会扫一遍历史会话(几十个会话约 1 秒以内),之后结果缓存 60 秒。
第 3 步:确认装好了
设置 → 插件 → 已安装里能看到 Token 小狗(包名
dsh-token-dog),带小狗图标;左侧栏出现了小狗图标;
想从命令行确认数据链路:
curl -s "http://127.0.0.1:<GUI 端口>/token-dog/usage?tz=Asia/Shanghai" | head -c 300
更新
方式一装的是软链,改完/拉完代码刷新页面就生效,不需要重装:
cd dsh-token-dog && git pull
卸载
对 DSH 里说「把 dsh-token-dog 插件卸了」(plugin_manager 的 remove_bundle),
或命令行 dsh plugin --profile desktop remove dsh-token-dog。
使用
首页
| 区块 | 内容 |
|---|---|
| 统计卡 | 总 Token、缓存命中率、输出 Token、调用次数;副行是会话数 / 缓存与输入拆分 / 输出占比 / 日均调用 |
| 每日消耗 | 每天一根柱、按会话堆叠(单日最多 6 段,其余合并为「其他」);悬停看当天构成 |
| 模型用量 | 每个模型的总量、调用次数、涉及会话数;可点击进入详情 |
| 会话排行 | 消耗最多的 8 个会话,含调用次数与最后使用日 |
| 活跃日历 | 近 52 周;悬停看当天总 Token / 调用次数 / 会话数,以及当天所有模型的用量与占比 |
模型详情
点模型行进入,顶部变为 ← 返回 + 模型名,内容替换为该模型的统计卡、每日矩形图,以及不截断的会话列表。顶部区间切换对详情同样生效。
侧栏图标开关
页面右上角「侧栏图标」开关决定左侧栏是否显示 🐶 入口。关掉后图标立即消失,插件的数据与设置页仍然可用——重新打开开关即可恢复。
关掉后唯一的入口变成 设置 → Token 用量;如果你连这个也不想看到,可以在 设置 → 插件 里整行禁用。
主题
右上角一排色点:雾蓝 / 青 / 苔绿 / 麦 / 陶土 / 藕紫 / 豆沙 / 中性,最后一个圆点是自定义取色器;旁边的「淡 / 中 / 浓」控制同一套色的浓度。两者都会持久化。
数据口径
数据只来自 Session 日志(ctx.sessionQuery),插件不另建账本。
| 事件 | 用途 |
|---|---|
request/header / request/context |
这次调用使用的 provider / model |
assistant/message / assistant/attempt |
该次 attempt 的 usage(message 优先,退回流里的 usage chunk) |
llm/retry-started |
重试算作新的一次调用 |
session/end-seed(inherited) |
fork 继承的父会话事件不重复计数 |
- 单次调用按
turn:step:attempt去重:同一 attempt 后来的采样会覆盖先前的 - 总 Token =
input + cacheRead + cacheWrite + output(四个桶互不重叠) - 缓存命中率 =
cacheRead / (cacheRead + input) - 不计入:不在任何 Session 日志里的调用(标题生成、压缩等)。这是「日志即唯一事实来源」的取舍
接口
Host 侧注册一条只读路由,仅本机回环可访问:
GET /token-dog/usage?tz=Asia/Shanghai[&refresh=1]
返回:
{
"ok": true,
"generatedAt": 1793860698515, // 本次扫描完成时间
"scanMs": 672,
"timeZone": "Asia/Shanghai",
"rows": [ // 已按 day / session / provider / model 聚合
{ "day": "2026-11-04", "session": "session-…", "provider": "deepseek-account",
"model": "deepseek-flash", "input": 344317, "cacheRead": 8053120,
"cacheWrite": 0, "output": 141471, "calls": 138 }
],
"sessions": { "session-…": { "title": "…", "createdAt": 1793, "cwd": "…", "origin": "", "parent": "" } },
"scanned": 26, "skipped": 0, "failures": 0, "failureSample": []
}
- 全量扫描结果缓存 60 秒;
refresh=1立即重扫 - 扫描期间复用同一次扫描,不会叠并发
- 请求带转发头(
X-Forwarded-For/CF-Connecting-IP)、跨站来源或非回环地址时返回 403
目录结构
dsh-token-dog/
├── index.js # Host 半:折叠日志、聚合、注册 /token-dog/usage
├── client.js # 浏览器半:两个视图、图表、日历、主题
├── cordis.patch.yml # bundle 补丁:插入 token-dog 这一行
├── package.json # 清单:dsh.bundle / dsh.client / exports
├── locale/{zh,en}.json # 插件管理器里的标题与描述
├── icon.svg # 插件图标(自绘)
└── README.md
开发
纯 JavaScript,无构建步骤:改完
index.js宿主侧热重载;改完client.js页面侧由 DSH 的客户端 HMR 重载,必要时刷新页面自查路由:
curl -s "http://127.0.0.1:<port>/token-dog/usage?tz=Asia/Shanghai" | head -c 400调参在
index.js顶部:SCAN_TTL_MS(缓存)、MAX_AGE_DAYS(扫描窗口)、MAX_SESSIONS图表与色板在
client.js:MAX_BARS、SEGMENT_LIMIT、THEMES、CSS 变量--dtd-ink*/--dtd-g*
常见问题
为什么旧对话也算进去了?
插件不是「从今天开始记」,而是每次打开时回放 Session 日志里的 assistant/message 事件,所以历史用量本来就在。
为什么模型只有一个?
说明这些会话都跑在同一个 provider/model 上(例如 deepseek-account / deepseek-flash)。切换模型后,新会话会各自成行。
数据会上传吗?
不会。浏览器只请求本机 127.0.0.1 上的一条回环路由,路由拒绝非本机、跨站和带转发头的请求。
为什么和账单对不上? 这里统计的是 Session 日志里的 token 数,不含标题生成、压缩等不写日志的后台调用,也不做价格换算。
装了没反应? 先刷新页面;再看 设置 → 插件 里这一行是否 enabled;最后确认宿主版本是 0.2.x(席位契约可能随大版本变化)。
已知限制
- 只统计写进 Session 日志的调用;标题、压缩这类后台调用不计入
- 扫描窗口:最近 400 天内创建、或当前在线的会话,最多 600 个;超出时页面会提示
- 每日矩形图超过 120 天只画最近 120 天;柱子只画「当天有用量」的日期,无用量的一天不占位
- 日历热度按当天 token 的分位数分级,跨主题、跨区间都会重新计算
- 依赖宿主的
settings.section/main/sidebar.panellist席位与sessionQuery服务;DSH 大版本升级后需重新验收席位行为 - 仅在 DSH
0.2.1-rc.5(Desktop, macOS)上验证过
路线图
- 估算成本(结合模型计价)
- 会话详情页(单个会话的日曲线与模型构成)
- 导出 CSV / JSON
- 按 workspace 分组统计
No comments yet. Be the first to write one.