鲸鱼挂件 0.2.12:修好 5 个 token 计量 bug,重启也不清零
本文最后更新于8 天前,其中的信息可能已经过时,如有错误请留言告知

缘起

小鲸鱼挂件 fork 自 MeteorNOX 的 DeepSeek-Balance-Whale-Widget——DSH 界面右下角那只鲸鱼,原本显示 DeepSeek 账户余额。我的工作流变了之后,余额对我没什么用,于是把大数字改成了「当前对话消耗了多少 token」:大字是当前对话累计,小字是今日消耗。

用了一阵总觉得数字不太对劲:跑几个子代理之后大数字会莫名变小,凌晨看的「今日」和实际对不上,明明重度依赖上下文缓存、今日消耗却偏低。认真排查了一遍——先对着 DSH 宿主源码把 token 归一化口径逐字段核对,又在修复上线后发现「重启后数字从零开始」这个更深的问题——一口气修掉 5 个实打实的计量 bug(0.2.11 + 0.2.12)。

先把口径说清楚:token 到底怎么数

DSH 会把各家提供商返回的 usage 归一化成一个 TokenUsage,约定是互斥分桶:

  • inputTokens —— 没有命中缓存的输入
  • cacheReadTokens / cacheWriteTokens —— 缓存命中 / 缓存写入,单列
  • outputTokens —— 输出(推理 token 已包含在内)

总消耗 = 四项相加。最容易踩坑的是两个细节:① inputTokens 不含缓存命中——DeepSeek 官方 API 的 prompt_tokens 是包含缓存命中的,DSH 在适配层把它减出来单列了;② 推理 token 已经含在 output 里,不能再单独加一遍。

五个 bug

1. 今日统计漏了缓存分桶

读 DSH 用量账本(~/.dsh/dsh-usage/usage-ledger.json)时,老代码只加了 inputTokens + outputTokens。可看一眼真实账本:我某天的 input 是 68 万,cacheRead 是 380 万——缓存命中才是大头。漏掉它,「今日已用」直接缩水到零头。

2. 用 UTC 日期去读按本地日归档的账本

账本的日期键(如 2026-09-03)是按本地日期写入的,而组件用 toISOString().slice(0,10) 取的是 UTC 日期。东八区每天 0:00–8:00,UTC 还停留在「昨天」,于是今天明明用了 token,小字读出来的却是昨天的数——经常直接是 0。修法很简单:改用本地日期键。

3. 子代理把「当前会话」顶掉

原实现按 session id 分桶,「当前会话」取最近一个发过消息的会话。但 DSH 的 subagent / fork 是并行跑的,子代理的 assistant/message 事件一到,「当前会话」就指向了子代理——大数字从「整场对话」变成「某个子代理自己」,看起来就是数字乱跳、越跑越小。现在利用会话头部的 parentSession 字段把派生会话全部归并到根会话

4. 推理 token 重复计

老代码把 reasoningTokens 又单独加了一遍。DSH 归一化的 outputTokens 本来就包含推理 token,DeepSeek 官方通道下等于双倍计。计价公式同步修正:缓存写入按「未命中输入」档计价,和官方计费口径对齐。

5. 重启清零:挂件数的是「进程内」,DSH 数的是「整场对话」(0.2.12)

这是最隐蔽的一个。修完前四个 bug 后实际验证,挂件显示 5.28M,而 DSH 自己的会话统计条显示输入 9.5M + 输出 109K ≈ 9.6M——差了 4M 多。

原因:挂件靠监听事件在内存里累加,DSH Desktop 一重启计数器就归零;而对话是持久化的,重启后接着聊,DSH 统计条从完整会话日志里算,自然把重启前的历史都算进去。挂件永远只显示「进程启动之后」的部分。

正确修法是别自己数了,直接读 DSH 的权威数据源:挂件现在通过 sessionProjections / sessions 服务查询当前对话的 tokenUsage 投影——它由 DSH 从会话完整日志折叠而出,和统计条同源同口径,重启后数字依然完整,还会自动累加当前对话派生的全部子代理会话。进程刚启动还没有事件时,用磁盘上最近写入的会话文件定位当前对话,沿 parentSession 上溯到根。原来的事件累加降级为兜底;每轮结束弹的消耗泡泡仍用进程内的事件分桶(一场进行中的轮次投影查不到)。

修完之后

修复后的鲸鱼挂件:当前对话消耗 14.71M tok,今日已用 28.64M tok
修复并重启后的挂件:「当前对话消耗」14.71M——含重启前的历史轮次,与 DSH 统计条同源同口径;「今日已用」28.64M,全分桶口径。
  • 当前对话(大数字):DSH tokenUsage 投影,根会话 + 全部活跃子代理会话,与界面统计条一致,重启不清零
  • 今日消耗(小字):账本全分桶累加 + 本地日期键
  • 每轮泡泡:根会话 turn/end 时结算,含本轮内子代理的消耗

口径和 DSH 官方 token-meter 的统计公式逐字段核对过(直接读了宿主源码里的 usageTokens 实现来对),现在两边不会再各说各话了。

链接

仓库地址:github.com/dkvkvk/DeepSeek-Balance-Whale-Widget(MIT,基于上游 0.2.10 修改)。安装方式见仓库 README,支持 GitHub 安装和本地 link: 安装。另外我之前还给 DSH 写过一个 SSH 会话看板插件,同样开源,感兴趣可以一并看看。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
加载中...