dsh-convo-tally
DSH 侧栏会话记账。 两行数字,回答一个问题:这个对话花了多少钱?

功能
- 本对话今日花费 / 累计花费 —— 只算当前这个对话,不是全局账。
- 峰谷角标 —— 现在按高峰价还是谷价计费,还有多久切换。
- 人民币 / 美元切换 —— 两种货币各用官方自己那张价目表,不做汇率折算。
- 一键重置累计 —— 只清「累计」的显示,「今日」保持真实值;只影响这个对话。
- 金额统一两位小数。
- 不联网、不发遥测、不读凭据。
安装
要求:Node.js 20+(见 package.json 的 engines),且已装好 DSH。
目前只支持从 GitHub 安装(npm 包尚未发布)。
安装最新版:
dsh plugin --profile web add github:Fireawa/dsh-convo-tally
锁定到某个版本(推荐,避免以后主分支变动影响你):
dsh plugin --profile web add github:Fireawa/dsh-convo-tally#v0.1.1
离线安装:从 Releases 下载 dsh-convo-tally-0.1.1.tgz,把下面路径换成实际文件位置:
dsh plugin --profile web add ./dsh-convo-tally-0.1.1.tgz
本地开发(改完立即生效):
git clone https://github.com/Fireawa/dsh-convo-tally.git
cd dsh-convo-tally
npm install
dsh plugin --profile web add link:$PWD
装完硬刷新页面(Ctrl/Cmd+F5)。宿主侧若有改动则需重启 dsh web。
卸载:
dsh plugin --profile web remove dsh-convo-tally
计价规则
两处时间口径先说明白:
- 「今日」按北京时间 0 点(UTC+8)切换,不是你的本地时区。
- 结算粒度是「每次模型调用」:一次调用结算一次,做不到逐 token 实时跳动。
单价(每百万 tokens,¥ / $)
| 模型 | 档位 | 缓存命中 | 缓存未命中 | 输出 |
|---|---|---|---|---|
| deepseek-flash | 空闲 | 0.02 / 0.003 | 1 / 0.15 | 4 / 0.6 |
| deepseek-flash | 高峰 | 0.04 / 0.006 | 2 / 0.3 | 8 / 1.2 |
| deepseek-v4-pro | 空闲 | 0.15 / 0.022 | 4.5 / 0.66 | 13.5 / 1.98 |
| deepseek-v4-pro | 高峰 | 0.3 / 0.044 | 9 / 1.32 | 27 / 3.96 |
价格取自官方中文页与英文页(2026-10 核对)。历史档位(2026-09-10 12:00 北京时间之前的 Flash、2026-08-16 16:00 UTC 之前的平价)也内置,用于给旧会话计价。
公式
花费 = (未命中输入 × 未命中价
+ 缓存命中 × 命中价
+ 缓存写入 × 命中价
+ 输出 × 输出价) / 1_000_000
- 宿主的
inputTokens是已扣除缓存命中的部分,和cacheReadTokens互斥——两个桶不能相加再套一个价。 reasoningtoken 官方单独上报且不计费,不进入公式。- 官方表未单列「缓存写入」,按命中价计;实测 19000+ 条用量记录中该桶恒为 0。
峰谷
- 高峰:北京时间周一至周五 9:00–12:00、14:00–18:00。
- 其余时段、周末与中国法定节假日全天为空闲;空闲价 = 高峰价的一半。
- 按每次调用的「发起时刻」定档,不是按现在,也不是按流结束时刻。
口径说明
- 金额是「tokens × 官方价目表」的估算,不是账单凭证;实际扣费以 DeepSeek 官方账单为准。
- Search / Fetch 未计入:官方自 2026-11-01 起按每 1000 次成功请求计费,届时侧栏数字会偏低。
- 子代理单独记账,不并入主对话;无
sessionId的后台调用(标题生成、历史压缩等)不计入。
设计要点
为什么用「不可见探针」
sidebar.footer.action 是 root 作用域插槽,框架只传 { wide }——侧栏自己拿不到当前会话,也就拿不到 useProjection。
所以本插件在会话作用域的 conversation.composer.dock 放一个不渲染任何内容的探针,它拿得到框架按当前会话绑定的投影值,写进同一 bundle 的模块级变量,侧栏读它。切换对话时探针重渲染,侧栏随即跟上。
不能用"最近活动会话"这种启发式:那样能显示出数字,但切到别的对话时不会变——那是本项目修过的 bug。
为什么两张价目表
官方中文页与英文页的单价不是按统一汇率对齐的:flash 的内嵌比值是 6.667,pro 是 6.818。用一张表乘汇率,换成另一种货币必然有一边偏。所以两种货币各算各的,切换只是换显示。
折叠语义
数字算错通常不是公式错,而是事件折叠错。这里照搬宿主官方 tokenUsage 投影的语义:
| 规则 | 为什么 |
|---|---|
| 同 turn/step 的新结算替换旧值 | 流式多次回报用量,累加会翻倍 |
| 同 turn/step 且分桶相同短路 | 重放日志必须幂等 |
只有 llm/retry-started 才开新槽位 |
重试是真实的第二次请求 |
| 跳过 fork 继承前缀 | 父会话已付过,不能重复计 |
模型取自 request/header |
assistant/message 只带 usage,不带模型 |
自测
npm test # 三套离线测试:计价折叠 / 客户端渲染 / 两份时刻表一致性
npm run check # 语法检查 + npm test
离线测试不需要 DSH。CI 在 Node 20 / 22 上跑同一套。
目录
lib/index.js 宿主侧:注册 convoCost 会话投影(折叠 + 双币计价)
lib/pricing.js 官方价目表、峰谷判定、花费计算(纯函数)
lib/client.js 浏览器侧:探针 + 侧栏渲染 + 两个按钮
test/ selftest / client-selftest / consistency
反馈
- 遇到问题、发现金额对不上,或想提建议:开 issue。
- 报问题时请尽量带上:
- DSH 版本与插件版本(Release 版本号,或
npm ls dsh-convo-tally); - 侧栏显示金额与官方账单的对比(涉及计价偏差时);
- 复现步骤:什么时候开始的、切过币种或重置过没有。
- DSH 版本与插件版本(Release 版本号,或
- 以 issue 为主,PR 不保证合并。
No comments yet. Be the first to write one.