DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-token-cost

n

dsh-token-cost

Manifest valid
UI (client)

dsh-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.020.040.150.3
输入(缓存未命中)124.59
输出4813.527

高峰时段 = 北京时间周一至周五(不含中国法定节假日)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 解析、货币符号未被控制台编码写坏。

配置

键默认说明
enabledtruefalse 时两半都不激活
holidays[]全天按谷价的日子,北京时间 YYYY-MM-DD。官方规则里的"中国法定节假日"无法由时钟推导,必须显式列出,否则节假日会被误判为峰价
currency'¥'金额前缀
refreshIntervalMs30000峰谷复算周期,钳制在 1000–3600000
tierTotalsPath'/api/token-cost/tier-totals'完整日志结算路由的路径(host 注册、浏览器调用,两端必须一致)
cacheEntries8host 侧保留的会话折算结果条数,钳制在 1–64

账目口径(请先读)

费用由三条路径得出,按权威性依次降级:

  1. host 侧完整日志结算(最权威):host 半把会话完整事件日志里每一次 provider 上报的用量,按该事件自身的时刻判峰谷、分别累加,并按北京时间分日汇总,通过一条缓存路由(默认 GET /api/token-cost/tier-totals?session=<id>)下发。浏览器只有分页窗口,所以长会话只有这条路能算准。面板上会写「已按完整日志结算(N 次请求)」。
  2. 逐轮计价(本地,次之):路由不可达时,用当前加载窗口里每一轮 turn-tail 节点的精确四桶用量,按该轮请求发出时刻判峰谷计价。适用于新开、未被分页的会话。
  3. 单时段估算(兜底):以上都不可用时,用会话级 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.jshost 半:日志折叠(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 环境完成端到端验证。

相关

License

MIT

Comments

Loading…