dsh-where-did-my-tokens-go
Verifieddsh-where-did-my-tokens-go · v1.9.0 · MIT · Web UI
DSH plugin: realtime token counter after the deep-thinking indicator
Install
dsh plugin add dsh-where-did-my-tokens-go Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
Where Did My Tokens Go? 是社区维护的 DeepSeek Harness(DSH)插件,并非 DeepSeek AI 官方产品。
本文描述 1.9.0。
功能概览
把「这一轮的 token 花到哪了」直接显示在对话流里:深度思考进行中实时计数,每个已完成的操作行标注它自己那一步的用量。插件是全局的——启用后所有对话都会生效。
- 实时 in / out token 徽标:在蓝色「深度思考 / 深度求索」指示后,实时显示 token 数;复刻官方字体特效,与整行文字浑然一体。
in N= 输入 token,out N= 输出 token(思考文本也计入其中)。- 两个数字都按完整请求计价,包含提示词缓存。供应商上报的
inputTokens只含未命中缓存的那部分(接口在返回前已把缓存读、缓存写减掉),而缓存命中率高时这部分极小——实测某真实会话里缓存占提示词的 99%,2.5 万 token 的提示词只报出 628 个新 token。因此插件会把cacheReadTokens+cacheWriteTokens加回结算值,使其与宿主contextPressure投影处于同一个「完整提示词」量级。该投影定价的是下一次请求,输入阶段即为实时值;而刚结束这次请求的 usage 优先级更高;两者都未就绪时沿用上一次的完整提示词。输出数字在流式阶段为客户端估算(中文/全角字符 ≈ 1 token,拉丁字符 ≈ 4 字符/token),流结束时自动校准为权威值——思考文本同样计入这个out总量,不重复计数,也不再单独打印思考占比。
- 单位自适应(默认):数字按大小自动换算 K(1e3)、M(1e6)、G(1e9)、T(1e12),如
1866 → 1.9K、2 500 000 → 2.5M;不足 1000 显示原值;四舍五入会到1000K时自动进位为1M。也可以在齿轮菜单里为某个部位锁定单位,选定后该部位始终按所选单位换算。 - 合并 / 分开两种显示模式(可配置):合并模式下标签互相替换——输入阶段只显示
in …,思考与输出阶段显示out …;分开模式整轮同时显示in … · out …。 - in / out / use 三个独立开关(可配置):分别控制输入、输出与每操作用量的显隐(默认全开)。其下另有两个嵌套开关(均默认关闭),分别把缓存拆分的两半追加到每个
use数字后,各管各的——详见下条。三个主开关各带一个齿轮按钮,向下展开该部位的编辑器(两个嵌套开关复用 use 部位的字号/颜色/单位,故不带齿轮)——字体大小(0/留空 = 跟随界面文字)、颜色(原生取色器 + 「跟随界面」复位)、单位(自适应 / K / M / G / T)。 - 每个操作后的
use N token:每个已完成操作(「已完成思考」「已完成命令」等)后显示use N token,样式与该行文字统一,展示该操作自身那一步消耗的 token——供应商上报了totalTokens就以其为准,否则按完整成本计算(未缓存输入 + 缓存读 + 缓存写 + 输出)。绝不是一整条回复的累计值。缓存项不可省:该供应商系列根本不发totalTokens,只按「输入+输出」求和会悄悄漏掉提示词缓存,实测某真实会话少报 25 倍。 use的缓存拆分(两半均默认关闭):use开关下方有两个嵌套开关,一个管一半,各自只追加自己那一段 —use 24.8K token · miss 628 token、use 24.8K token · hit 24.1K token,或两个都开:use 24.8K token · miss 628 token · hit 24.1K token。其中miss是供应商按原价计费的未命中输入,hit是提示词缓存服务掉的部分(缓存读 + 缓存写)。两者之和是提示词部分,因此miss + hit等于该轮的in数字;而use还计入输出,所以前面的总量是miss + hit + out。所有数字共用该部位设定的单位,因此一行里不会出现两种量级。use开关本身关掉时两个开关都会置灰——没有数字可拆。- 可视化配置界面:自适应两栏布局;合并、分开各有一张还原真实对话场景的预览卡片(「已完成命令 use N token」操作行 + 带扫光的深度思考徽标,数据为模拟值)。悬停即演示数字增长(依次为 in、out 涨到各自上限),点击即切换模式,开关一变两张卡片同步更新——齿轮里的单位、字号、颜色同样即时反映。
- 跟随界面主题:整个面板——卡片、预览气泡、开关与齿轮弹层——都跟随宿主的明 / 暗主题。宿主切换主题的方式是给
<body>加上data-ds-dark-theme;在该属性下,全部颜色改由宿主自己的--dsw-alias-*设计变量解析,因此深色窗口里面板会随之重绘,不会留一块白色孤岛。预览徽标在两种主题下都沿用宿主「深度思考」的蓝色与扫光色。
界面预览
深度思考指示旁的实时徽标(分开模式):

每个已完成操作行后标注自身用量:

设置页的预览卡片与开关:

截图取自 1.6.0 版本、运行于 DeepSeek Harness 0.2.0-rc.2;仅保留相关面板,采用无损 WebP。
安装
需要已安装并能正常运行 DeepSeek Harness。以下命令使用 desktop profile,请按实际环境替换。
让 Agent 帮你安装
把这段话发给能够操作本机终端的 Agent:
请把 npm 上的 dsh-where-did-my-tokens-go 安装到我的 DSH profile,安装后确认已生效并告诉我如何重新加载。
从 npm 安装(推荐)
dsh plugin --profile desktop add dsh-where-did-my-tokens-go
从 GitHub 安装
dsh plugin --profile desktop add github:RevxZxCx/dsh-where-did-my-tokens-go
从源码安装
# 1. 打包插件
cd packages/dsh-where-did-my-tokens-go
pnpm pack
# 2. 安装到 desktop 配置
dsh plugin --profile desktop add ./dsh-where-did-my-tokens-go-<version>.tgz
# (或手动:把 tarball 加入配置的 package.json dependencies,
# 并把 "dsh-where-did-my-tokens-go" 追加到 dsh.profile.bundles,然后 `pnpm install`)
# 3. 重启 DSH
安装后重启 DSH,打开任意对话发送消息即可看到徽标。更新时重新执行安装命令。
- 已在 DeepSeek Harness
0.2.1-rc.2(desktop profile,Windows)验证运行,并针对该版本重新核对了插件依赖的宿主接口。
使用说明
| 你想做什么 | 如何操作 |
|---|---|
| 看本轮输入 / 输出 token | 发送消息后直接看「深度思考」指示后的徽标,实时累加。 |
| 切换合并 / 分开模式 | 打开 设置 → Token 计数器,点击对应的预览卡片。 |
| 只保留 in 或只保留 out | 关掉另一个开关;两张预览卡片立即同步去掉该段。 |
| 看每个操作自己花了多少 | 保持 use 开关打开;每个「已完成…」行尾自动标注。 |
| 让大数字更好读 | 单位保持自适应;或在齿轮菜单为某部位锁定 K / M / G / T。 |
| 调整某个部位的字号 / 颜色 | 点击对应开关的齿轮,在展开的编辑器里设置;0 / 「跟随界面」= 不覆盖。 |
| 保存前先看效果 | 齿轮改动即时反映到预览卡片;聊天徽标只在点「保存」后变化。 |
- 三个配置入口:设置 → Token 计数器(设置导航中的独立条目)、插件 面板中本插件页面里的配置区(「dsh-where-did-my-tokens-go」→ 配置),以及该面板「官方」分组里的「Token 计数器」卡片。三处打开的是同一份表单。
- 未保存的草稿不影响聊天:预览与齿轮编辑都在表单内暂存;徽标实际渲染只读已保存配置;「保存」写入宿主配置,「放弃」整体回退。
- 锁定单位仍逐级进位:锁
K后遇到极端大数也不会打印1000K,会继续向上换算,最高1000T。 - 思考文本不再单独成数:它本就包含在供应商的
outputTokens里(平台会校验reasoningTokens <= outputTokens),所以流式阶段直接计入out总量;在out之外再打印一个think只会重复计算,因此徽标不再显示思考拆分。 - 减少动态效果:系统开启「减少动态效果」偏好时,扫光装饰停用,数字照常显示。
- 高光带内的颜色:扫光带经过徽标时显示该行的高光色(与官方「深度思考」同一机制);字号与单位全程按设置生效。
实现原理
- 浏览器端订阅 DSH 客户端
sessions服务,以及当前(主视图)会话的binding.eventSource。 - 实时统计
text-delta/reasoning-delta流式分片(两类文本共同计入同一个输出总量);输入数字优先读权威 usage 的完整提示词(inputTokens+cacheReadTokens+cacheWriteTokens),其次读宿主的contextPressure投影;权威 usage 来自usage分片 /assistant/message事件(按 turn + step 记录,忽略其中的reasoningTokens)。 - 通过 DOM 向运行指示器注入徽标(该处没有 slot),用两层方向相反的位移复刻平台 TextShimmer 的几何;每个已完成的操作行按文档顺序认领其对应步骤的用量。
- 宿主端以 schemastery 声明配置 schema(15 个字段,全部为可即时生效的 volatile 字段);设置表单经
configForms读写同一命名空间。
包结构
lib/index.js—— 宿主端:schemasteryConfig+apply。lib/client.js—— 浏览器端:window.__ModuleLoader__.load。cordis.patch.yml—— 注册插件 profile 条目。package.json——dsh.bundle+dsh.client = { platform: "web", inject: [...] }。
开发 / 测试
node test/run-tests.mjs # 模拟浏览器的单元测试(约 480 条断言,覆盖全部功能)
node test/probe-served.mjs # 校验运行中的 DSH 提供的是当前磁盘上的 client 构建
反馈与贡献
遇到问题或有建议,欢迎提交 Issue。请附上 DSH 与插件版本、复现步骤;界面问题可附完整截图。若表单显示「该插件当前未加载,暂时无法配置」,说明宿主端未挂载——请先用 dsh --profile desktop --dump-config(或查看配置目录的 cordis.patch.yml)确认后再提 issue。