dsh-session-cost
Real-time session cost meter for the DeepSeek Harness web GUI: folds provider token usage into a per-session cost projection and displays it live under the composer.
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:dog-lin/dsh-session-cost说明文档
阅读完整 README ↗dsh-session-cost
一个 DeepSeek Harness Web 插件:实时显示当前会话已花费的金额(费用),显示在输入框下方的状态条区域。
A DeepSeek Harness web plugin that shows, in real time, how much the current session has spent — rendered as a cost line under the composer (next to the stats line).
原理 / How it works
- 宿主侧(
lib/index.js):注册一个sessionCost会话投影单元。它重放会话的持久化日志,把每次模型调用的 token 用量(assistant/chunk的 usage 采样与assistant/message的最终 usage)按当时生效的模型路由(request/header快照)乘以价格表换算成金额。 - 浏览器侧(
lib/client.js):一个手写的客户端 bundle,通过框架标准的useProjection('sessionCost')座位读取该投影,挂载到conversation.composer.dock插槽(自带统计条 StatsLine 所在的位置)。宿主每次推送新的session/projection帧,金额实时刷新;悬浮提示会显示价格来源与更新时间。
计费口径与 dsh-token-meter 一致:input / cacheRead / cacheWrite / output 四个桶互不相交;同一 (turn, step) 先出现 usage 采样、后有最终 usage 时以后者替换前者,一步只计费一次。
价格怎么保持正确(重点)
三层机制,价格变动时要么自动跟上、要么明确提示,不会静默算错:
-
官网价格自动同步(默认开启) 插件在启动时和每
updateIntervalHours(默认 24h)抓取 DeepSeek 官方价格页 (模型 & 价格), 模型无关地自动识别价格表里的全部模型(价格表按"每模型一列"排布,解析器按列数发现模型、 逐列取价——所以将来 DeepSeek 出新模型(比如 v5),只要官网价格表列出,插件就会自动为它取价), 并把检测到的变动按生效时间追加到每个模型的价格时间轴(每次请求按其自身时间戳取价)。 官方页面若预告了未来调价(例如 2026-08-17 的峰谷定价公告),解析器会连同生效日期一起读入, 到时自动切换,无需人工操作。已观测到的价格历史持久化在$DSH_HOME/storages/dsh-session-cost-pricing.json,重启不丢失。 每次变动都会在服务日志里打一条明显的变更记录;抓取失败则沿用上次价格并在投影中报告pricingWarn,界面悬浮提示可见。 -
本地配置可覆盖 / 冻结
pricing里的条目是"种子":官网抓取到新价后会被更新。给某模型加pin: true即完全由你掌控,永不自动改动。fallback仍是未收录模型的兜底(默认 0 = 未计价并计入unpricedRequests)。 -
来源可见 投影值携带
pricingSource(official-auto/official-auto-failed/config)、pricingUpdatedAt(最近一次成功抓取时间)和pricingWarn(抓取失败/疑似巨变待确认时非空), 客户端悬浮提示直接展示,价格是否"新鲜"一目了然。
价格变动时的行为:新请求按新价计费;过去请求按其发生时刻的价格计费(时间轴)。若你手动改了配置, profile 补丁热加载会重启该行并用当前时间轴重算全部历史(确定性重放,结果一致)。
峰谷定价
DeepSeek 自 2026-08-17 00:00(北京)起实行峰谷价:高峰 9:00–12:00、14:00–18:00(北京),闲时为高峰一半。 插件支持两种写法(可同时用于配置与自动同步):
pricing:
deepseek-v4-flash:
peak: { input: 3.0, output: 9.0, cacheRead: 0.10 }
offPeak: { input: 1.5, output: 4.5, cacheRead: 0.05 }