dsh-token-cost
Manifest validdsh-token-cost
给 DeepSeek Harness Web GUI 输入框下方那一条,加一个 DeepSeek 官方峰价 / 谷价与费用 显示。
English · English README
[ 谷价 ¥3.4830 119M tok ]
鼠标移上去展开明细:
峰/谷混合 · 会话累计
模型 deepseek-flash
统计时段 11:40 – 13:01 · 共 2 轮
峰价 ¥0.0380
谷价 ¥0.0200
单价(元 / 百万 tokens)
tokens 单价 费用
输入·缓存命中 1.5M 0.0267 ¥0.0400
输入·缓存未命中 1K 2 ¥0.0020
输出 2K 8 ¥0.0160
合计 ¥0.0580
上下文 45%
点击它弹出账单,按北京时间逐日列出当天的峰谷费用 —— 这是跨天任务最需要的一屏:
费用明细 ×
统计时段 09-01 11:40 – 09-02 13:01 · 4 次请求
日期(北京时间) 峰价 谷价 合计
2026-09-01 ¥0.0380 ¥0.0080 ¥0.0460
503K tok 400K tok 903K tok
2026-09-02 ¥0.0000 ¥0.0120 ¥0.0120
0 tok 600K tok 600K tok
合计 ¥0.0580
已按完整日志结算(4 次请求)
会话跨峰谷时(例如上午用到下午),两部分分别计价;跨天时再按天分组,而不是整场会话给一个数。 单独的时段在单价列显示该时段的原始单价,混合时段的类目显示加权后的实际单价,所以每一行相加恒等于合计。
特性
- 峰价 / 谷价实时判定:按官方规则(北京时间周一至周五 09:00–12:00、14:00–18:00 为高峰,其余含周末与法定节假日为谷价),跨边界自动翻转,默认每 30 秒复算。
- 逐轮分时段计价:每一轮按它自己发出请求的时刻判峰谷、按对应单价计价,再分别汇总为「峰段 / 谷段」两个小计。上午用到下午这类会话因此是算对的,而不是整场取一个价。
- 点击看逐日账单:点击 chip 弹出账单,按北京时间每天一行列出峰价、谷价、当日合计与 token 数,末行是任务至今的总花费 —— 跨多天的任务用它看"哪天花了多少"。
- 费用明细分行:缓存命中、缓存未命中、输出各自计价,末行合计;混合时段显示加权后的实际单价,保证行之和恒等于合计。
- 统计时段可见:面板顶部给出本次统计覆盖的时间段与轮次数,便于判断边界是否落在其中。
- 不确定就明说:某轮横跨边界、或宿主未提供某轮的精确账目、或历史被分页导致逐轮之和对不上会话总量时,插件会降级并标注原因("部分历史未加载"等),不会拿部分数据冒充全量。
- 只读展示:不改 dsh 源码,不新增任何模型侧能力。
- 一处口径、两处消费:浏览器与 node 共用同一份价格核心,并有测试断言两侧算出同一个数字。
为什么值得看明细
官方缓存命中价与未命中价差 50 倍(deepseek-flash 空闲时段 0.02 vs 1 元/百万 tokens)。所以"token 量大"未必"贵":一次会话绝大部分可能是便宜的缓存命中,而账单往往被少量"未命中输入"主导。只给一个总额会掩盖这件事,明细把三行拆开就是为了让钱花在哪一目了然。
零开销与隐私
这个插件不消耗 token:
- 它不注册任何工具、skill、提示词片段或请求钩子 —— host 半只做两件事:读会话日志、在本地回环上服务一条只读的统计路由。没有工具 schema 进入请求,因此不存在那类 token 开销。
- 浏览器半只读到本站的投影与那一条路由;无遥测、无外发数据。
- 详细数据全部来自宿主本来就在算/本来就在存的东西(
tokenUsage/contextPressure/modelSelection三个投影 + 会话事件日志)。
工具会消耗 token,是因为工具 schema 要进入每一轮请求;本插件没有任何面向模型的注册,因此不存在这条开销。
官方价目与峰谷规则
价目取自 https://api-docs.deepseek.com/zh-cn/quick_start/pricing,单位 元 / 百万 tokens:
| deepseek-flash 空闲 | deepseek-flash 高峰 | deepseek-v4-pro 空闲 | deepseek-v4-pro 高峰 | |
|---|---|---|---|---|
| 输入(缓存命中) | 0.02 | 0.04 | 0.15 | 0.3 |
| 输入(缓存未命中) | 1 | 2 | 4.5 | 9 |
| 输出 | 4 | 8 | 13.5 | 27 |
高峰时段 = 北京时间周一至周五(不含中国法定节假日)9:00–12:00、14:00–18:00;其余时段一律空闲价,空闲价恰为高峰价的一半。判定按北京时间硬算,与宿主时区无关。
模型名解析覆盖 deepseek-flash、deepseek-v4-pro,以及官方声明按 Flash 计费的退役别名(deepseek-v4-flash、deepseek-v4-flash-vision-exp 等)。未知模型只显示 token 数,不猜单价。
官方调价时改 lib/core.cjs 里的
RATE_TABLE即可,npm test会立刻告诉你代码与文档是否还一致。
安装
前置:可用的 dsh(Web 形态)与你自己的 profile(下文以 web 为例)。
# 1) 把仓库放到任意路径,例如 D:/dsh-token-cost,然后装进 profile
dsh plugin --profile web add file:D:/dsh-token-cost
# 2) 在 $DSH_HOME/profiles/web/cordis.patch.yml 末尾追加
- insert:
- id: token-cost
name: dsh-token-cost
config:
currency: '¥'
holidays: [] # 中国法定节假日,形如 ['2026-10-01'],全天按谷价
refreshIntervalMs: 30000
# 3) 重启 dsh web,然后刷新页面
仓库自带的安装脚本会做同样的两件事,并顺手校验一遍:
node scripts/verify.mjs # 只读校验(23 项),不改任何东西
node scripts/verify.mjs --apply # 写入 profile:装依赖 + 追加 patch 行
--apply 是唯一会写 profile 的开关。写入前会自动备份,且会验证补丁文件能被 YAML 解析、货币符号未被控制台编码写坏。
配置
| 键 | 默认 | 说明 |
|---|---|---|
enabled | true | false 时两半都不激活 |
holidays | [] | 全天按谷价的日子,北京时间 YYYY-MM-DD。官方规则里的"中国法定节假日"无法由时钟推导,必须显式列出,否则节假日会被误判为峰价 |
currency | '¥' | 金额前缀 |
refreshIntervalMs | 30000 | 峰谷复算周期,钳制在 1000–3600000 |
tierTotalsPath | '/api/token-cost/tier-totals' | 完整日志结算路由的路径(host 注册、浏览器调用,两端必须一致) |
cacheEntries | 8 | host 侧保留的会话折算结果条数,钳制在 1–64 |
账目口径(请先读)
费用由三条路径得出,按权威性依次降级:
- host 侧完整日志结算(最权威):host 半把会话完整事件日志里每一次 provider 上报的用量,按该事件自身的时刻判峰谷、分别累加,并按北京时间分日汇总,通过一条缓存路由(默认
GET /api/token-cost/tier-totals?session=<id>)下发。浏览器只有分页窗口,所以长会话只有这条路能算准。面板上会写「已按完整日志结算(N 次请求)」。 - 逐轮计价(本地,次之):路由不可达时,用当前加载窗口里每一轮
turn-tail节点的精确四桶用量,按该轮请求发出时刻判峰谷计价。适用于新开、未被分页的会话。 - 单时段估算(兜底):以上都不可用时,用会话级
tokenUsage累计值 × 当前时刻单价,并标注原因。
dsh 官方按"每次请求被处理的时刻"计费,而单次请求不会横跨时段,所以路径 1 与 2 都在复现官方的拆分方式,而不是近似。
仍然可能不精确的情况,插件都会标注而不是隐藏:
- 某一轮自身横跨边界(仅路径 2):该轮只能取起始时刻的价,显示「N 轮跨界」。
- 宿主拒绝给出某轮用量:
deriveTurnTokenUsage宁可返回空也不给出不可靠的数字,这类轮次不计入。 - 逐轮求和对不上会话总量(历史被分页):受影响类目回退为会话累计值,显示「部分历史未加载」。
- host 路由不可达:自动降级到路径 2/3,不报错。
路径 1 让 host 半不再"什么都不做",但仍然零 token 开销:它只读日志、不发任何模型请求,也不注册任何面向模型的东西。
想做到与账单逐字一致,还需要 host 侧按每条 usage 事件计价(本插件的路径 1 已按每次上报的 usage 事件计价,残余差异仅来自"同一轮内跨界"这一处)。见 docs/architecture.md。
开发
npm run build # 由 lib/core.cjs + src/client.js 生成 lib/client.js(浏览器 bundle)
npm test # 校验器 38 + 核心 24 + host 18 + 产物 24 + 渲染 8
npm run hover-check # 真实浏览器验证:悬停面板、费用表、点击弹窗与逐日账单
npm run probe # 隔离宿主 + CDP 抓浏览器报错
node scripts/route-check.mjs <DSH_HOME> <dsh.cmd> [port] # 验证 tier-totals 路由已注册
结构:
| 路径 | 角色 |
|---|---|
| lib/core.cjs | 唯一真源:价目表、北京时间峰谷判定、费用算术、格式化 |
| src/client.js | 浏览器半源码:chip、悬停面板、点击账单弹窗、三条计价路径、locale 词表、slot 注册 |
| lib/client.js | 生成产物,勿手改,由 scripts/build-client.mjs 生成 |
| lib/index.js | host 半:日志折叠(foldTierTotals,含按日分桶)+ tier-totals 路由 + 配置归一化 |
| scripts/verify.mjs | 只读校验器;--apply 才会写 profile |
| scripts/hover-check.mjs | 无头浏览器验证:悬停面板、费用表、点击弹窗与逐日账单 |
| scripts/probe.mjs | 隔离宿主 + CDP 抓浏览器报错 |
| scripts/route-check.mjs | 验证 host 路由真的注册(区分 401 与未知路径 404) |
| test/ | 价格核心 / host / 生成产物 / 渲染四条测试线 |
测试与验证策略(为什么有这些检查、它们各自防什么)见 docs/verification.md。
平台支持
- 宿主:dsh
0.2.0-rc.2(客户端插件契约:dsh.client.platform = 'web'、ctx.slots、会话级 slot)。 - 浏览器半只把
react当作外部依赖,并通过ctx.slots取注册表;对较老的、把注册表放在@deepseek-ai/dsh-client-ui-renderer的宿主代次同样适用(注册时会先试带locale选项的形式,不支持则自动降级)。 - 已在 Windows + Edge 环境完成端到端验证。
相关
- DeepSeek API 价目:https://api-docs.deepseek.com/zh-cn/quick_start/pricing
- DeepSeek Harness:https://github.com/deepseek-ai/deepseek-harness
License
Comments
Loading…