DeepSeek Harness Hub
← 返回列表

Six6stRINgs/dsh-thinking-token-stat

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

在底部Dock添加模型思考token统计信息的轻量化插件。A lightweight plugin that adds…

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/13 · 已提供中文文档

在底部Dock添加模型思考token统计信息的轻量化插件。A lightweight plugin that adds model thinking token statistics to the bottom Dock.

综合分
30.1
GitHub 分
30.1
用户评分
★ Stars
1
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add Six6stRINgs/dsh-thinking-token-stat
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/20(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-primitives
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-thinking-token-stat

dsh
license
npm version
npm downloads
repo
GitHub stars

在消息框下方的统计行中,直接查看整个对话的思考 token 总数。展开后可查看推理输出的占比、实际进行了思考的轮数,以及该数字中有多少是推算得出而非直接上报的。
第二个视图会逐轮拆解该数字,并显示每轮所使用的模型。

composer 停靠区中的读数,会话概览已展开

消息框下方的统计行,以及它展开后的概览:会话总计、
两项占比、实际进行了思考的轮数、该数字中有多少是推算得出
而非直接上报的,以及这些数字涵盖的范围。

逐轮思考

逐轮表格:每轮一行,包含其思考量、该轮写入的所有内容、
该数字的来源、运行该轮的模型,以及该轮在自身
输出中的占比。

你将获得

消息框下方统计行中新增的一项数字:

💭 37.2K · 70.7% · 4 / 6 turns

- 思考 token 数量:该对话总共使用了多少;
- 占输出的比例:这些轮次产生的输出中——即模型在思考时写入的所有内容中,有多大比例是思考;
- 实际进行了思考的轮数:仅当部分轮次未进行思考时才显示,因此其余情况下该行保持简短。

点击它可查看详情。

为什么不再有每条回复的数字

DSH 自带的回复面板已经会报告某一轮的推理 token,而且除此之外还能说明该轮的更多信息。此插件的早期版本还会在每条回复旁显示一个数字,但那只是重复了本就只需点击一次即可看到的内容,因此该数字已被移除。

回复面板无法显示的是模型提供商从未上报的数字。
与其在每条回复旁放一个猜测值,此插件将该信息放在它该在的地方:
会话详情中,作为一行清晰标注的内容。

详情显示的内容

Thinking tokens (session)                    37.2K tok
──────────────────────────────────────────────────────
思考 / 推理输出(52.6K tok)         70.7%
思考 / 全部 token(12.4M tok)                0.3%
推理轮次                              4 / 6 轮
未报告计数的轮次     2 轮 · ~5.1K tok
估算 ≈ 5.1K tok ?
范围:整个会话,6 轮,其中 1 轮未产生回复。?

| 行 | 含义 |
| --- | --- |
| 思考 / 推理输出 | 在思考时写出的输出中,思考占了多少 |
| 思考 / 全部 token | 同样的占比,但以这些轮次计费的全部 token 为基准 |
| 推理轮次 | 有多少轮进行了思考,占运行轮次的比例 |
| 未报告计数的轮次 | 有多少轮需要推算出的数字而非报告的数字,以及这占总量的多少 |
| 估算 … | 同样的推算占比,用文字表述,并附一个 ? 说明其背后的原因 |
| 范围 | 这些数字实际涵盖的内容,是计算得出的而非断言的:轮次计数、任何未产生回复的轮次、分叉会话中被排除的历史记录,以及逐轮列表自身的上限——每一项在适用时都带有一个 ? 及其原因 |

百分比保留一位小数;大数字会被缩写,如 24.8K。

依赖文本折叠得出的数字带有 ~ —— ~37.2K、~70.7% —— 出现在消息框下方的
那一行以及详情中的各处。估算旁边的 ? 会打开一条简短消息,解释为何存在这样的
数字;它和详情本身一样,在你点击其他任何地方时关闭。

在详情底部,有一行通向逐轮视图。

逐轮

逐轮视图每轮列出一行,最新的在最前面:

| 列 | 含义 |
| --- | --- |
| 轮次 | 这是第几轮 |
| 思考 | 该轮的思考 token,在推算得出时标记为 ~ 并着色为估算值 |
| 输出 | 该轮写出的全部内容——最后一列是其占比的基准 |
| 思考来源 | 思考数字的来源:由提供商报告、从思考文本推算得出,或两者兼有 |
| 模型 | 该轮运行所用的模型 |
| 占输出比 | 该轮的思考占其所写内容的比例,在推算得出时标记为 ~ |

表格上方有三个开关,用于选择列出哪些内容:有报告计数的轮次、有推算计数的轮次,
以及完全没有思考数字的轮次。最后一组默认关闭,因为一轮没有思考并不值得逐一列出
——该开关会显示隐藏了多少轮。

对话启动的每一轮都会被列出,包括失败的轮次。 出错或被中断的轮次永远不会
组装出回复,因此没有 token 可报告;它仍会出现,每一列都是 —,来源为 None,
因为一个默默跳过它的表格会看起来像对话丢失了一轮。这些就是 None 开关计数背后
的轮次,而概览的范围行会说明
其中许多都有——用一个 ? 说明它们没有产生回复,而不是没有推理。

每次渲染 100 轮中的一页。 一段很长的对话会变成一张很长的表,而为了读其中十行就要铺开一千行,这是没人要求的苦差事,所以页面中只存在当前视图中的那一页:Newer / Older 和 page 2 of 5 在它们之间切换。

每一行末尾都有一个跳转按钮,带你到对话中该轮的回复。对于对话视图已不再保留的轮次,它不起作用。

详情可以从任何地方关闭。 点击输入区中的另一个控件,或点击外部任意位置,都会关闭概览和表格,Escape 也是如此——与 DSH 自带的统计面板行为相同。

这些数字从何而来

这个插件由两半组成。宿主端逐轮折叠会话的事件日志一次,并将结果注册为 DSH 的会话投影——与官方统计所使用的机制相同。浏览器端读取那一个值并将其绘制出来。

这就是整个设计,也正是它让这些数字值得信赖:

- 折叠覆盖整个日志,而不是窗口。 DSH 将对话保存为最近若干轮的窗口,而压缩会重写该窗口,因此任何从屏幕上所见内容统计出的东西都是局部的、不稳定的。投影是从每一个已提交事件折叠而来,随会话一起做检查点,并且只对自那以后到达的事件重新折叠——因此这些数字在构造上就是整个会话的,无论对话有多长,并且在重新加载后完全一致。
- 从不加载任何东西。 该插件从不把消息读回对话,也从不要求 DSH 这样做。没有“加载更多”,因为没有什么可加载的:宿主已经折叠过了。
- 浏览器不缓存任何东西。 没有 localStorage,没有账本,也没有按会话区分的浏览器状态。投影的检查点就是持久化,它属于会话,而不属于这个插件。
- 每一个不是助手结算的事件都是空操作,折叠每轮保留六个数字外加一个模型名称字典。在一个真实的 88 轮会话中,它总共用约 5 毫秒折叠 8 988 个事件,并存储 3 KB。

如果宿主无法提供该投影——较旧的 DSH、尚未折叠的会话——读数会回退到官方的整个会话 token 投影并说明这一点,而不是编造逐轮数字。

它在存储上的开销

折叠的检查点是 DSH 自身投影缓存中的一行
(<root>/session_projcache/sessions/<sessionId>.json),与官方单元并列。一行是每轮六个数字外加一个共享模型字典,所以大小取决于长度,而不是内容:

| 轮数 | 持久化状态 | 发布到浏览器 |
| --- | --- | --- |
| 88(此处测量的一个真实会话) | 3.0 KB | 2.4 KB |
| 1 000 | ≈ 35 KB | 上限为最新的 200 行 |
| 5 000(该状态自身的上限) | ≈ 175 KB | 上限为最新的 200 行 |

作为对比,DSH 自己的 turnOutline 单元为同一会话保留了更大的逐轮记录,其 contextBreakdown 状态为 54 KB。已发布的视图被有意限制范围:每个快照帧都携带一个客户端可见的投影值,因此逐轮行数上限为最新的 200 行,而总计仍保持整个会话的范围。超出部分,概览会用一行说明。

模型列从何而来

每条已定稿的助手消息都会标明生成它的提供商和模型,因此折叠过程会在该消息所属的轮次上记录该名称——只记录一次,存于字典中,而不是每行记录一次。一次在重试后运行于两个模型上的轮次会同时列出两者。不向 DSH 的 Trajectory 视图索取任何内容,也不会为它创建第二个折叠。

这些数字从何而来

某个数字是否可用取决于模型提供商:有些会报告推理 token 数,有些只发送思考文本,还有些两者都不发送。

| 提供商发送的内容 | 你看到的内容 |
| --- | --- |
| 推理 token 数 | 该计数,精确值 |
| 仅思考文本 | 根据文本推算出的数字 |
| 两者皆无 | 无——该回复计为没有思考 |

为什么有些数字必须推算。 并非每个提供商都会报告推理 token 数,而 DSH 无法强制要求。如果在缺少计数时忽略思考文本,那么一整类模型都会显得完全没有思考过——即便思考内容就明明白白地显示在屏幕上。因此改为对文本进行计量,其密度取决于文字系统——单一英语规则会让其他所有语言少计两到四倍:

| 文字系统 | 每 token 字符数 | 原因 |
| --- | --- | --- |
| 中文、日文假名、韩文谚文、全角形式 | 1 | 这些文字根据分词器的不同,大致按每字符 0.6–1.7 个 token 进行分词,而 DeepSeek 和 Qwen 自己的分词器处于密集端(约 0.6–0.8) |
| 西里尔文、希腊文、阿拉伯文、希伯来文、亚美尼亚文、印度系文字、泰文、格鲁吉亚文 | 2.5 | 比 CJK 有更好的表示,但仍非英语;实测分词器行为显示它们大致为每 token 2–3 个字符 |
| 拉丁字母、数字、标点、空白 | 4 | 熟悉的英语经验法则 |

密集端取 1 而非 0.7 是有意为之:对于针对中文优化的模型,这会略微偏高,而略微偏高的数字比一个以测量之名呈现却偏低的数字是更好的失败方式。

这是估算而非测量,并且也按估算对待:每个依赖它的数字都带有 ~,面板会说明有多少轮次需要它以及它占总量的多少,旁边的 ? 会打开规则本身。

拆分的代价。 每个推理块进行两次 replace 遍历,而折叠仍是插件中最快的东西:在本会话 230 万字符的范围内测得
推理文本,按脚本计费会给一次耗时 5 ms 的折叠增加 1.7 ms——每次结算约
5 µs,只支付一次,由宿主在进入持久化投影的过程中支付。它完全不在渲染路径上运行。

份额只使用真正思考过的轮次。 这是有意为之:如果你切换到一个不思考的模型,旧数字不会仅仅因为对话变长就开始下滑。这也意味着“4 / 6 轮”清楚地告诉你该数字描述了多少对话内容。

这个插件做什么,不做什么

它做:汇总一段对话中的思考量,并解释这个总量是如何得出的。

它不做:

- 改变对话、引导模型,或向任何地方发送任何内容——它读取宿主上会话自己的事件日志以及 DSH 提供的投影,并且不发起任何网络请求;
- 在模型没有思考或没有暴露其思考时显示任何内容;
- 声称它并不具备的精确度。提供方报告的数字是精确的;从思考文本推算出的数字是估计值,详情中会将其标注为估计值;
- 统计一个窗口而不是一个会话。这些数字属于会话,因此分页和压缩无法改变它们;
- 背着你读取你的历史记录,或在你面前加载它。宿主折叠它已经拥有的日志;浏览器从不读取或请求任何消息;
- 向你的浏览器写入任何内容。没有本地存储,也没有按插件划分的状态。

轻量设计

- 一个小数字。 单个回复旁边不会添加任何内容。
- 由宿主折叠一次。 对一种事件类型使用一个 reducer,每轮六个数字,在真实会话中每个事件 0.6 µs——而其他每个事件只花费一次引用比较。
- 不加载、不分页、不缓存。 浏览器端只读取一个投影值;它不持有会话绑定,不打开对话,也不存储任何内容。
- 只读。 没有后台服务,没有额外请求,没有网络访问。
- 无需配置。 没有设置,没有账户,没有数据收集。
- 空闲时不可见。 没有思考的对话完全不显示任何内容。
- 有界。 状态保留 5 000 行(约 175 KB),发布的视图保留 200 行,表格一次渲染一页 100 行。
- 跟随你的主题,浅色或深色。
- 跟随你的语言。 该插件使用 DSH 自带的两种语言编写,中文和英文,并跟随 ——其他任何语言,包括来自语言环境插件的第三种语言,都会回退到英文。

安装

从 GitHub:

dsh plugin add github:Six6stRINgs/dsh-thinking-token-stat

或安装已发布的 npm 包:

npm install dsh-thinking-token-stat

然后重启 dsh web 并重新加载页面。模型开始思考后,该数字就会出现。

许可证

MIT——参见 LICENSE。

更新日志

每个已发布版本一行:CHANGELOG.md。

面向开发者
仅当你打算修改代码时。该插件由两个文件组成,每个文件各司其职:

- lib/index.js —— 宿主端部分。注册一个会话投影(thinkingStats),
一个对 assistant/message 结算进行折叠的纯 apply(state, event)。它自带
微小的 { parse } schema,因此该包保持无依赖,并且它导出
__testProjection 供单元测试使用。
- lib/client.js —— 浏览器端部分。注册一个 composer-dock 条目,读取
useProjection("thinkingStats"),并绘制胶囊、概览和每轮表格。它依赖
插槽服务,除此之外不依赖任何其他东西。

npm test 在无浏览器且无宿主的情况下运行两个测试套件:

- node test/projection.mjs 驱动折叠 —— 提供方报告的计数、从文本推导的
计数、重试替换、分叉继承、推理作用域的分母、两个上限以及 schema 门禁 ——
并且,在将 DSH_TEST_LOG 设置为某个 session.v3.jsonl.zstd 时,
重新折叠一个真实录制的会话,并将总计与对同一批事件的独立遍历进行核对。
- node test/harness.mjs 针对合成的投影值渲染浏览器端部分:
~ 标记、? 消息、作用域和上限说明、各列、过滤器和分页、
模型字典、从任一层级关闭,以及针对不提供每轮投影的宿主的回退。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群