dsh-cost-plugin

August 14, 2026 · View on GitHub

DSH Web 界面的输入框统计行(3 轮 · 27 步 | …)旁追加一行实时费用读数:

本次 ≈¥0.0123 | 会话 ≈¥1.2346 | 余额 ¥70.16

三个读数:本次费用(最新一轮 token 消耗 × 单价)、会话费用(会话累计 token × 单价)、余额(DeepSeek 官方账户余额,可选)。

这是一个 DSH 动态 Cordis 插件,由 Host(进程端)与 Client(浏览器端)两半组成,纯 JavaScript、无构建步骤。

功能

  • ✅ 与官方统计行并列显示(list 槽位叠加,order 1),不覆盖、不破坏任何现有 UI
  • ✅ 内置 DeepSeek 官方价目表(deepseek-v4-flash / deepseek-v4-pro,CNY + USD 双币种),可自由增删模型/改价
  • ✅ 支持 2026-08-17 起生效的峰谷定价:高峰时段为北京时间 9:00-12:00、14:00-18:00(低谷价减半);生效前的历史节点按旧价计,本次费用按每个节点时间戳自动选档
  • ✅ 计价公式与 DeepSeek-ReasonixOriginalCostAmount 一致:缓存命中按 cacheHit 价,其余输入(含 cache-write)按 input 价,输出按 output 价,每 1M token
  • ✅ 费用一律带 (估计值);模型不在价目表时显示 n/a绝不把 0 当真实花费
  • ✅ 余额通过官方 GET /user/balance 查询,异步拉取、失败静默降级(显示 n/a 或隐藏),不阻塞会话;多币种只显示非零项(对齐官方页面 ¥13.68 + \$0.00 的呈现)
  • ✅ 余额不配置 key 就不查询、不显示(网关/代理部署无余额项属正常行为)

工作原理

位置职责
HostDSH 进程内harness.handle('get-balance'):经 credentials.resolve('DEEPSEEK_API_KEY') 取 key,经 shell 服务跑 curl 调官方 GET /user/balance;key 走 env 传递,不落 argv;顺带返回会话默认模型(agentDefaultModel 服务,legacy 节点不携带模型名)
Client浏览器注册进 conversation.composer.dock 槽位(kind: list, id: cost, order: 1);用会话快照的 assistant 节点 usage + tokenUsage 投影本地计价并渲染

官方价目表(内置,每 1M token)

2026-08-17 00:00(北京时间)起:峰谷定价,高峰时段为北京时间 9:00-12:00、14:00-18:00,空闲时段价格为高峰一半。此前为旧价(legacy)。

模型币种时段缓存命中输入输出
deepseek-v4-flashCNY旧价(8/17 前)¥0.02¥1¥2
deepseek-v4-flashCNY高峰¥0.10¥3¥9
deepseek-v4-flashCNY空闲¥0.05¥1.5¥4.5
deepseek-v4-proCNY旧价(8/17 前)¥0.025¥3¥6
deepseek-v4-proCNY高峰¥0.30¥9¥27
deepseek-v4-proCNY空闲¥0.15¥4.5¥13.5

USD 价为参考汇率 7.2 折算(见 RATE_CARDS),以官方公告为准。来源:DeepSeek 峰谷定价公告(DoNews 报道)

安装与使用(DSH 创造模式动态插件)

  1. 在 DSH Web 新建一个**「创造模式」(cordis)**会话。
  2. cordis_define
    • code.hostplugin-host.js 全文
    • code.clientplugin-client.js 全文
    • name / purpose 自填(如 cost-line / 「会话费用与余额读数」)
  3. cordis_run 运行刚定义的包:Host 半立即生效;浏览器弹出审批卡片时确认授权(单勾授权当前包即可)。
  4. 回到任意会话页面(不止安装它的会话),输入框统计行旁即出现费用行,数值随轮次推进变化。

动态插件是进程内存态:DSH 重启后需要重新定义/运行。如需常驻,见下文「永久安装」。

验证清单

  • 统计行旁出现 本次 / 会话 读数,数值随轮次推进变化(对照统计行 token 数 × 价目表可复核)
  • 余额项显示 ¥xx.xx(直连官方 API 且配置了 DEEPSEEK_API_KEY 时)
  • 停止插件后费用行消失、官方统计行不受影响(list 槽位叠加,互不覆盖)
  • 网关部署或 key 缺失时:余额自动消失或显示 n/a,会话无任何报错

配置定制点

配置位置说明
价格表Client RATE_CARDS可增删模型/改价(按你的网关单价填)
显示币种Client DISPLAY_CURRENCY'auto' | 'CNY' | 'USD';auto = 余额唯一币种优先,否则 CNY
余额接口Host BALANCE_URL网关/代理部署建议留空字符串 = 完全禁用余额查询
API key 引用名Host API_KEY_ENV默认 DEEPSEEK_API_KEY(与 llm-deepseek 适配器一致)
显示位置Client 注册调用默认 conversation.composer.dock order 1(统计行旁);想单独占一行可改注册到 conversation.input.dock
会话模型Host 自动取自 agentDefaultModel.currentSelection()(settings 的 agent-default-model);网关部署可改 host 半的 model 取值逻辑

已知限制

  1. 本次费用按「最新一轮」的 assistant 节点求和,依赖节点携带 provider usage;中断的 partial 消息无 usage,不计入。
  2. 会话费用tokenUsage 投影按当前时段费率近似(投影无时间分布,峰谷切换后不追溯);口径为当前会话,与官方页面的 Total cost(账户所有会话累计)不同。
  3. 模型不在价目表 → 显示 n/a(不猜价)。
  4. 余额只对直连官方 DeepSeek API 有效;网关/代理部署显示不了。
  5. 动态插件为进程内存态,DSH 重启后消失。

永久安装(常驻,DSH 重启后自动加载)

本仓库即一个正式的 DSH 插件包:host 半(lib/index.js)通过 webServer 注册 GET /_dsh-cost/balance 路由,client 半(lib/client.js,dsh ModuleLoader 格式)注册进 conversation.composer.dock 槽位。

# 1. 安装到 web profile(等价 pnpm add,需要 pnpm 在 PATH)
dsh plugin --profile web add "file:/path/to/dsh-cost-plugin"
# 或发布 npm 后:dsh plugin --profile web add dsh-cost-plugin

# 2. 在 ~/.dsh/profiles/web/cordis.patch.yml 追加插件行(参考本仓库 cordis.patch.yml):
#    - insert:
#        - id: cost-plugin
#          name: 'dsh-cost-plugin'
#          inject: [webServer]

# 3. 验证组合配置(不启动服务)
dsh --profile web --dump-config   # 应看到 cost-plugin 行

# 4. 重启 DSH Web,费用行自动出现(无需任何会话内操作)
dsh web

更新版本:改完仓库代码后重跑 dsh plugin --profile web add "file:..." 同步副本,再重启。

借鉴与致谢

设计借鉴自 esengine/DeepSeek-Reasonix(MIT)的 internal/billing/ 包:三桶单价 RateCard、OriginalCostAmount 计价公式、GET /user/balance 余额查询(Bearer key、短超时、失败静默)、/n/a 展示约定。

License

MIT