- Home
- Plugins
- Usage & Billing
- dsh-tokstats
dsh-tokstats
plusqi/dsh-tokstats
A token toolbox for DSH: next-turn token forecast, a cross-session usage analytics panel built on the host session-projection unit, and prompt restructuring that writes back only when accepted.
Install
dsh plugin --profile web add github:plusqi/dsh-tokstatsREADME
dsh-tokstats
简体中文 | English
可能有用的 DeepSeek Harness (DSH) token汇总插件,告诉你token花哪了:
| 插件 | 有什么用 | 在哪看到 |
|---|---|---|
| tokprev | 发送前告诉你这一轮大概要喂多少 token | Composer 底部一行灰色小字 |
| tokstats | 跨会话统计 token 都花在哪儿了 | 侧栏「Token 用量统计」→ 全局面板 |
| promptopt | 把口语草稿整理成结构化提示词 | Composer 工具行右端的星标按钮 |
安装
前置:Node.js、git、pnpm。
npm i -g pnpm
npx @deepseek-ai/dsh plugin --profile web add github:PlusQi/dsh-tokstats
装完必须重启宿主进程(profile 组合只在启动时生效),再刷新页面。没有配置文件、没有 API key、没有构建步骤。
- 固定版本:
add github:PlusQi/dsh-tokstats#v0.8.0 - 本机开发:
add link:D:\path\to\dsh-tokstats,改完代码重启即生效 - profile 不叫
web就换成你自己的
装完看这三处
- 侧栏多了一项 「Token 用量统计」,点进去有四张指标卡;
- Composer 底部多了一行灰色小字,打几个字,「草稿」那个数会跟着变;
- 工具行右端多了一个星标按钮(模型选择与发送按钮之间),打了草稿后可用。
三处全没有?看 出问题了。
tokprev:发送前,先算这一轮要花多少
官方 ContextMeter 已经给了上下文长度,它没说的是你正在输入框里敲的这段草稿还要额外花掉多少。tokprev 会补上这个。

下一轮输入 ≈ 20K · 草稿 17 · 输出预估 -
- 下一轮输入 = 当前上下文 + 草稿估算,边打字边跳;
- 草稿 = 本地按字符数估的,不发请求;
- 输出预估 = 最近几轮真实输出的区间。只统计已结束的轮次,所以新会话或当前轮还没跑完时显示
-(上图就是),跑完一轮就变成1.5K–3K这样的区间; - 会话正在跑时整行隐藏;没有真实请求锚点时数字前带
*,表示纯估算。
tokstats:谁偷走了我的token
看看token花了多少,谁花得多?

侧栏「Token 用量统计」进入全局面板:
| 区块 | 它回答什么 |
|---|---|
| 四张指标卡 | 所选区间用了多少?缓存省了多少?(跟档位走,切档即变) |
| 每日调用量 | 这几天里哪一天用得凶?窗口跟档位走(最短 7 天;卡头写着实际跨度),超 30 列按整日合并;与热力图并排,日期刻度对齐每根柱 |
| 近 12 周用量 | 哪些天在用、哪些天断档?点某天只看那一天 |
| 上下文长度分布 | 请求有多长?长请求占多大比例?按计费输入分 6 桶:[0,8K) / [8K,32K) / [32K,128K) / [128K,256K) / [256K,512K) / [512K,∞) |
| 趋势(按周) | 这周比上周多还是少?每周一条比例条,本周标「进行中」并置灰(还没过完);周合计恒等于总计 |
| 模型排行 | 用量集中在哪个模型?按 provider/model 组合计,拿不到路由的归「未标注」排最后,各行之和等于总计 |
| 工作区排行 | 用量集中在哪个项目?可下拉切到单个工作区,子会话归并到根工作区 |
| 提示词整理使用情况 | promptopt 真被用上了吗?发起 / 采纳 / 放弃计数与采纳率 |
时间窗五档:当日 / 近 7 天 / 本月 / 近 30 天 / 全部,默认当日——档位决定四张指标卡与分布 / 排行 / 周趋势的口径,切换即重算。热力图恒为近 12 周、不跟档位走;日柱图的窗口跟档位走、但最短 7 天(当日档也画 7 根柱,超 30 列按整日合并),卡头写着实际跨度。
promptopt:把口语草稿摆整齐
把「那个登录报错你帮我看看 别动其他文件」这种草稿,保真重排成模型更容易解析的结构化输入。不扩写成执行计划,也不补原文没有的事实、路径、约束、步骤。

- 怎么用:点星标按钮 → 弹层里原文与整理结果上下对照 → 满意才点采纳,只有采纳才写回输入框;
- 按钮置灰(悬浮有原因):草稿为空,或含引用 chip、图片附件、
/命令——写回是全量替换,重排会破坏引用坐标与图片归属; - 采纳 以点击那一刻的草稿快照为准,会覆盖等待期间的编辑,没有二次确认;
- 走宿主已有的模型路由,没有配置项,不新建 API key;
- 关闭、Esc、点弹层外都算取消,会中止这次调用。
中文 / English
界面文案跟随 DSH 的 设置 → 常规 → Language,插件本身没有语言开关。promptopt 是例外:整理结果跟随草稿的语言,不跟界面语言。
出问题了
插件 UI 整个不见,按顺序排这几条:
- 宿主版本对不上。 本包钉死了实测过的宿主版本,不匹配时宿主会安静地跳过整个包(连日志都不打),表现就是「插件坏了」。跑
dsh plugin --profile web list,出现is incompatible with dsh …就是它; - 没重启宿主进程,只刷新了浏览器;
- 装到了别的 profile,或换了
DSH_HOME; - locale 服务被禁用了,界面文案依赖它,缺席时整包不加载。
其它常见现象:
- 面板一直「统计中…」:首次要扫一遍历史日志,几秒到十几秒正常;
- 数字比你以为的少:先看页脚有没有「跳过 M 个(日志不可读)」,再确认当前是哪个时间档;
- 面板显示「校验中…」:后台还在核校,屏上是缓存值,几秒后自动变准;
- promptopt 报「模型调用失败」:宿主没有可用模型路由,检查模型配置。
更新与卸载
# 更新
npx @deepseek-ai/dsh plugin --profile web update dsh-tokstats
# 卸载整个包
npx @deepseek-ai/dsh plugin --profile web remove dsh-tokstats
想临时关掉其中一个,在 $DSH_HOME/profiles/<profile>/cordis.patch.yml 里加:
- id: tokprev
disabled: true
重启生效。注意关 tokprev 不会让它从页面上消失——只要包里还有别的行活着,浏览器侧整包就仍在加载;要真正按插件独立开关,只能拆成独立包(见 docs/MAINTAINING.md)。
维护
维护者与 AI Agent 从 AGENTS.md 进入;发布流程与宿主侧契约在 docs/MAINTAINING.md,不变量证据在 docs/INVARIANTS.md,变更记录在 CHANGELOG.md。
License
Related plugins
DeepSeek-Balance-Whale-Widget
meteornox/deepseek-balance-whale-widget
dsh-context
bowenliang123/dsh-context
dsh-cost-meter
han-1413141/dsh-cost-meter
dsh-damage-pulse
wssfk12138/dsh-damage-pulse