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-Reasonix 的
OriginalCostAmount一致:缓存命中按 cacheHit 价,其余输入(含 cache-write)按 input 价,输出按 output 价,每 1M token - ✅ 费用一律带
≈(估计值);模型不在价目表时显示n/a,绝不把 0 当真实花费 - ✅ 余额通过官方
GET /user/balance查询,异步拉取、失败静默降级(显示n/a或隐藏),不阻塞会话;多币种只显示非零项(对齐官方页面¥13.68 + \$0.00的呈现) - ✅ 余额不配置 key 就不查询、不显示(网关/代理部署无余额项属正常行为)
工作原理
| 半 | 位置 | 职责 |
|---|---|---|
| Host | DSH 进程内 | 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-flash | CNY | 旧价(8/17 前) | ¥0.02 | ¥1 | ¥2 |
| deepseek-v4-flash | CNY | 高峰 | ¥0.10 | ¥3 | ¥9 |
| deepseek-v4-flash | CNY | 空闲 | ¥0.05 | ¥1.5 | ¥4.5 |
| deepseek-v4-pro | CNY | 旧价(8/17 前) | ¥0.025 | ¥3 | ¥6 |
| deepseek-v4-pro | CNY | 高峰 | ¥0.30 | ¥9 | ¥27 |
| deepseek-v4-pro | CNY | 空闲 | ¥0.15 | ¥4.5 | ¥13.5 |
USD 价为参考汇率 7.2 折算(见
RATE_CARDS),以官方公告为准。来源:DeepSeek 峰谷定价公告(DoNews 报道)
安装与使用(DSH 创造模式动态插件)
- 在 DSH Web 新建一个**「创造模式」(cordis)**会话。
cordis_define:code.host← plugin-host.js 全文code.client← plugin-client.js 全文name/purpose自填(如cost-line/ 「会话费用与余额读数」)
cordis_run运行刚定义的包:Host 半立即生效;浏览器弹出审批卡片时确认授权(单勾授权当前包即可)。- 回到任意会话页面(不止安装它的会话),输入框统计行旁即出现费用行,数值随轮次推进变化。
动态插件是进程内存态: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 取值逻辑 |
已知限制
- 本次费用按「最新一轮」的 assistant 节点求和,依赖节点携带 provider usage;中断的 partial 消息无 usage,不计入。
- 会话费用用
tokenUsage投影按当前时段费率近似(投影无时间分布,峰谷切换后不追溯);口径为当前会话,与官方页面的 Total cost(账户所有会话累计)不同。 - 模型不在价目表 → 显示
n/a(不猜价)。 - 余额只对直连官方 DeepSeek API 有效;网关/代理部署显示不了。
- 动态插件为进程内存态,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 展示约定。