dog-lin
dsh-session-cost
Real-time session cost meter for the DeepSeek Harness web GUI: folds provider token usage into a per-session cost projection (official DeepSeek price auto-sync) and displays it live under the composer.
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 15, 2026
- Updated
- Aug 15, 2026
Introduction
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 }
或显式时间轴(from 接受 ISO 时间、epoch 毫秒或中文日期"2026 年 8 月 17 日 00:00"):
pricing:
deepseek-v4-flash:
schedule:
- from: 0
input: 1
output: 2
cacheRead: 0.02
- from: 2026-08-17T00:00:00+08:00
peak: { input: 3.0, output: 9.0, cacheRead: 0.10 }
offPeak: { input: 1.5, output: 4.5, cacheRead: 0.05 }
peakWindow: ["09:00-12:00", "14:00-18:00"] 可自定义高峰时段(默认即官方窗口,北京时间)。
安装 / Install
从 GitHub 安装(推荐):
dsh plugin --profile web add git+https://github.com/dog-lin/dsh-session-cost.git
或用 pnpm 的 github: 简写:
dsh plugin --profile web add github:dog-lin/dsh-session-cost
本地安装:在插件包目录执行(<path> 可以是本目录或打包后的 tarball):
dsh plugin --profile web add <path>
然后刷新浏览器页面(F5)。若 Web 服务正在运行,把激活行加入
$DSH_HOME/profiles/web/cordis.patch.yml 可热加载(配置变更无需重启);
宿主代码变更(如本插件的功能升级)需要重启一次 dsh web,因为宿主模块走 Node 模块缓存。
配置 / Configuration
config:
currency: CNY # 显示与计价货币(ISO 4217)
autoUpdate: true # 是否自动同步官网价格(默认 true)
updateIntervalHours: 24 # 抓取间隔(默认 24)
pricing: # 按模型 id 计价;种子值会被官网新价更新,加 pin: true 则冻结
deepseek-v4-flash: { input: 1, output: 2, cacheRead: 0.02, cacheWrite: 0 }
deepseek-v4-pro: { input: 3, output: 6, cacheRead: 0.025, cacheWrite: 0 }
fallback: # 未在 pricing 中的模型(默认全 0 = 未计价)
input: 0
output: 0
cacheRead: 0
cacheWrite: 0
投影值 / Projection value
sessionCost 投影的值为:
{
"currency": "CNY",
"totalCost": 0.0123, // 本会话累计费用
"requests": 3, // 已计费的模型调用步数
"unpricedRequests": 0, // 价格表中没有的模型调用步数
"inputTokens": 12000,
"outputTokens": 600,
"cacheReadTokens": 3000,
"cacheWriteTokens": 200,
"lastModel": "deepseek-v4-flash",
"pricingSource": "official-auto", // official-auto | official-auto-failed | config
"pricingUpdatedAt": 1786805927947, // 最近一次官网抓取时间(epoch ms)
"pricingWarn": null // 抓取失败或疑似巨变待确认时非空
}
已知限制 / Limitations
- 费用按会话自身日志统计;子代理(subagent)的模型调用发生在子会话的日志里,不会计入父会话的金额。
- 推理 token(reasoningTokens)是输出桶的子集,按输出价计费,不再重复加价。
- 新模型计价有一个窗口:模型首次出现在官网价格表后,插件要等下一次抓取(启动或每 24h)才认识它;
在认识之前,该模型的请求计入
unpricedRequests并在悬浮提示标注「未计价」(不会静默漏算——你总能看见)。 认识之后按官网价从时间 0 起算。若你关闭了autoUpdate,新模型需手动加入pricing。 - 官网页面是唯一自动价格源,解析基于页面结构,失败即安全降级(沿用上次价格并提示),不会给出错误的"自动"数字;若官网改版导致连续抓取失败,
pricingWarn会一直提示,届时应手动更新配置。 - 价格终归是部署事实:自动同步只是让"默认跟随官网"成为常态,
pin: true的条目和fallback始终由你掌控。