前言¶
Harness 默认只把会话写成本地日志,不会告诉你:这段时间烧了多少 Token、缓存命中率是多少、哪几个模型在吃预算、输出速度的 P50 掉到哪儿去了。想知道这些,只能翻 session.v*.jsonl.zstd 自己算,或者干脆只看账单——而账单往往滞后,也没有缓存命中和模型速度这些过程数据。
下面介绍的 dsh-token-lens 就是针对这个缺口的插件。它读的是本机会话日志,所有统计在本地完成,不联网、不上传、不需要 API Key。维护者是 muxili87-art,社区分类为「模型推理」。插件名 TokenLens · 用量透镜,作用是把日志折叠成 Token / 请求 / 费用 / 缓存命中 / 模型速度的看板。
核心功能¶
插件做的事情是「本地日志 → 按天折叠 → 看板展示」,覆盖这几类信息:
- 多口径总览:今天 / 7 天 / 30 天 / 全部 / 自定义区间,KPI 卡可对比。
- 趋势图:Token、请求、费用、模型耗时、输出速度五种指标;柱状 / 折线切换,可按模型筛选。
- 自动聚合粒度:今天按小时;7 天 / 30 天按天;更长区间按周(周一锚定)或按月。
- 热力图:近 53 周每天一格,按请求 / Token / 费用 / 耗时着色,点击格子筛选当天。
- 模型分布:按请求 / Token / 费用 / 耗时排名的占比条,点击图例筛选。
- 速度面板:速度分布(P25 / P50 / P75)与速度趋势折线,支持多模型对比。
- 请求明细:按时间 / 耗时 / Token 排序,支持模型与关键词搜索,失败请求有独立视图。
- 隐私模式:一键隐藏会话名、账号、错误详情与敏感模型名,数字不变,适合截图与共享。
- 更新检查:面板顶栏查询 GitHub 最新 Release。
- 峰谷计价:按北京时间工作日高峰 / 低谷两档估算,内置 DeepSeek / OpenAI / Anthropic / Google 公开价目。
安装后插件会自动扫描 ~/.dsh/sessions,增量折叠成按天桶并缓存到 ~/.dsh/usage-dashboard/cache.v1.json,之后每次打开只做增量更新。
安装与启用¶
前置条件:DeepSeek Harness 桌面版(开发与验证版本 0.2.1-rc.5)。
- 下载 Release 里的
dsh-token-lens-<version>.zip,解压到任意目录并记下绝对路径。 - 在 Harness 会话里执行:
plugin_manager install_bundle target=<解压后的绝对路径>
- 完全退出并重新打开 DeepSeek Harness(首次加载 / 替换插件必须重启,浏览器半的客户端模块才会重新组装)。
- 左侧边栏出现「用量分析」图标,点击进入。
升级方式相同:用新版本 zip 重跑一次 plugin_manager install_bundle,再完全退出重启。
需要特别注意:v1.0.0 的 zip 是坏的,它的 package.json 漏了 exports["./client"],Harness 启动扫描会直接抛错、整个插件组装链失败。请使用 v1.0.1 或更新版本。
装完应用起不来时,按这个顺序排查:
- 打开插件目录执行自检:
npm run doctor
报 ✗ 声明了 dsh.client,但 package.json 没有 exports 映射 就是上面那个问题,改用 v1.0.1+。
- 先卸载再重装:删掉
~/.dsh/profiles/<profile>/node_modules/dsh-token-lens,并删掉cordis.patch.yml里对应行,重启确认应用恢复,再重新install_bundle。 - 仍失败时,把 Harness 启动日志里
client-modules:开头的报错发到 Issues。
Windows 用户注意:插件本身与操作系统无关(路径全部走 homedir() / path.join)。如果从命令行启动 Harness 后静默退出,通常是环境变量同时存在 HTTPS_PROXY 和 https_proxy(大小写重复),清掉其中一个,或直接双击桌面图标启动。
计价配置与隐私模式¶
计价开箱即用:内置通用价目表,没配置过的模型按模型名自动匹配估算。匹配顺序是 providers.<名字> 精确命中 → 该 provider 价目表;否则按 fallbacks 用模型名兜底(openai/gpt-4o 与 gpt-4o 都认);都没有才算「未定价」。providers 永远优先于内置价目表。
pricing.json 的顶层结构如下:
{
"fx": { "USD": 7.2 }, // 非人民币价目折算成人民币
"peak": {
"offsetMinutes": 480,
"weekdays": [1, 2, 3, 4, 5],
"windows": [["09:00", "12:00"], ["14:00", "18:00"]]
},
"books": { "openai-usd": { "currency": "USD", "models": {} } },
"providers": { "official": { "book": "deepseek-official", "models": {} } },
"fallbacks": [
{ "match": "gpt-4o-mini", "book": "openai-usd", "model": "gpt-4o-mini" },
{ "match": "gpt-4o", "book": "openai-usd", "model": "gpt-4o" }
]
}
几个容易踩的点:
providers.<p>的 key 必须和会话日志里provider/model的前半段一致,匹配不到才走fallbacks。fallbacks[].match默认前缀匹配(mode可设prefix/contains/exact),依次比对model、provider/model和模型名最后一段,所以gpt-4o-mini要写在gpt-4o之前。books.<b>.currency不是CNY时按fx折算,界面统一显示人民币。- 只有
offPeak一档的模型,在高峰时段按同一档计算。 - 内置价目估算的模型会在页脚单独标注,不会被误当成账单金额。
隐私模式点右上角按钮后:会话标题变成 会话 01、会话 02,账号变成 账号 A、账号 B,错误信息与搜索关键词隐藏,形如 /Users/...、https://...、sk-... 的敏感模型名显示为 模型已隐藏。统计数字、图表、费用一分不变。
指标口径与聚合粒度¶
指标定义如下:
| 指标 | 定义 |
|---|---|
| 总 Token | input + output + cacheRead + cacheWrite |
| 请求数 | 成功发出的模型请求数(失败单列) |
| 缓存命中率 | cacheRead / (cacheRead + input) |
| 费用 | cacheRead×cacheHit + (input+cacheWrite)×cacheMiss + output×output |
| 模型耗时 | 该模型请求的 LLM 平均耗时(不含工具调用) |
| 输出速度 | output tokens / (耗时 ms / 1000),逐请求取样本后算 P25/P50/P75 |
聚合粒度:今天按小时;7 天 / 30 天按天;自定义区间跨度 ≤1 天按小时、≤45 天按天、≤315 天按周(周一锚定)、更长按日历月。速度的 P50 在每个桶内用请求级样本重新计算,不是「日 P50 的平均」。
数据准确性¶
唯一数据源是 ~/.dsh/sessions/<workspace>/<session>/session.v*.jsonl.zstd 会话日志,插件只读不写。统计的是本地记录的用量,与供应商账单可能有出入(重试、失败请求、缓存计费口径、免费额度等)。fork / 副本会话的「播种」请求会去重,避免同一份历史被算两遍。缓存文件可随时删除,下次打开会全量重建。
插件对外暴露两个鉴权路由:
GET /usage-dashboard/summary?from&to&tz&modeGET /usage-dashboard/requests?from&to&tz&view&sort&order&offset&limit&model&q
适用场景与注意事项¶
适合本地使用 Harness、想复盘自己 Token 与费用开销的开发者;也适合需要把用量数据截图共享、但不想泄露会话内容的场景——此时把隐私模式打开。
需要留意三点:
- 插件以当前 DSH 进程的权限运行,安装前应检查源码与许可证(MIT)。
- 它统计的是本地日志,不是供应商账单,不能直接当作财务依据。
- 计价默认用公开价目估算,第三方中转或改过名的自定义模型需要自己在
pricing.json里加,或用fallbacks兜底。
结尾¶
dsh-token-lens 把 Harness 已经记录的会话日志重新利用起来,补上了 Token、缓存命中、费用、模型速度这些「过程看板」,且全程本地计算、隐私模式可共享。
目录页:https://www.skillhub.cn/plugins/muxili87-art/dsh-token-lens
GitHub:https://github.com/muxili87-art/dsh-token-lens