前言¶
DSH 里的用量到这一层通常只是一个 token 数字:能读到本轮用了多少 token,但很难直接回答“这条消息花了多少钱”。价格是分模型、分时段的——DeepSeek 在部分时段对推理价打折,同一段对话里早高峰和深夜产生的用量单价并不相同,缓存命中与未命中又是两套价。要把这些摊到每一轮,就得自己读官方用量投影、做时段判定和金额换算,还要自己维护“所有会话累计”那一层。
下面介绍 dsh-plugin-usage-budget。它把 token 用量按可配置的价目换算成人民币金额,提供会话费用读数、逐轮价格、账户余额与每日/每周/每月预算守卫。它本身不参与推理,只管核算花费。
这是什么¶
一句话定位:DSH 的用量费用与预算插件,负责“token → 金额 → 预算提醒”这条链路。
- 仓库:dddfuxi/dsh-plugin-usage-budget
- 维护者:dddfuxi(GitHub);包
author字段为fuxi - 分类:模型推理(用量计费侧,非推理本体)
- 许可证:MIT
- 版本:
0.1.0(package.json) - 运行要求:Node
>=20,对@deepseek-ai/cordis~4.0.5
插件由早期的两个自用小插件合并而来:dsh-plugin-usage-cost(费用读数)与 dsh-plugin-account-balance(账户余额),并新增了预算守卫与逐轮价格。
运行机制¶
Host 侧在 lib/index.js 注册两个 session projection:
usageCost:对每条已结算的assistant/message用量事件,用事件自身的时间判断峰谷时段,按tokens / 1e6 × 单价 × 时段折扣计价并累加,同时按轮累计,保留最近 120 轮。usageBudget:把每笔用量折成金额写入按本地自然日聚合的账本,输出今日 / 本周 / 本月、预算等级与下一条预估所需的单价表。
两个文件承担核心逻辑:
lib/pricing.js:价目核心,无任何依赖,时段判定用Intl处理Asia/Shanghai与 DST。lib/budget.js:账本核心,纯函数,48 个单测,浏览器与 Node 都能跑。
账本落在 $DSH_HOME/usage-budget/ledger.json。首次运行(或账本版本变化)时会做一次全局回填:读取所有已落盘的会话日志,按每条用量事件自己的时间与价目重建账本,之后只做增量;fork 会话的继承前缀(session/end-seed 之前)会被跳过,避免重复计费。
界面与功能¶
插件不改动官方 DOM,而是走扩展点:
| 界面 | 位置 | 数据来源 |
|---|---|---|
| 本会话用量费用 | 输入框状态栏(用量图标) | Host usageCost 投影,按每轮实际时段计价 |
| 预算 / 剩余 / 下一条预估 | 输入框状态栏(盾牌图标) | Host usageBudget 投影 + 全局账本 |
| 账户余额 | 会话顶部预设栏 + 预算弹窗 | remote.account.getBalance(与“设置 → 账号与余额”同源) |
| 逐轮价格 / 缓存节省 | 每条消息的“本轮用量”弹窗 | 用该轮 token 桶匹配 usageCost.turns |
| 每条消息用量行 | 每条助手消息底部 | usageCost.turns 里该轮的 tokens + 金额 |
输入框控件通过 conversation.composer.dock 槽位注册,与内置用量控件同 id、更低 priority,从而原位替换;消息底部用量行走官方扩展点 conversation.chat.turnTail。预算弹窗与逐轮价格弹窗分别覆盖“今日 / 滚动 7 天 / 自然月”的累计与单价拆解。
峰谷价目¶
内置默认价目为人民币元 / 100 万 token(2026-11 取自 DeepSeek 官方价格页):
| 模型 | 缓存命中 | 缓存未命中 | 输出 |
|---|---|---|---|
deepseek-flash |
0.04 | 2 | 8 |
deepseek-v4-pro |
0.30 | 9 | 27 |
峰时为北京时间周一至周五 09:00–12:00、14:00–18:00,其余时间(含周末)一律 5 折;DeepSeek 不单列缓存写入价格,故 cacheWrite: 0。pricing 配置项可整张覆盖:
pricing:
currency: CNY
timezone: Asia/Shanghai
models:
deepseek-flash: { cacheRead: 0.04, cacheWrite: 0, input: 2, output: 8 }
deepseek-v4-pro: { cacheRead: 0.30, cacheWrite: 0, input: 9, output: 27 }
fallback: { cacheRead: 0.04, cacheWrite: 0, input: 2, output: 8 }
windows:
- { id: offpeak, label: { zh: 优惠时段, en: Off-peak }, start: "00:00", end: "09:00", days: [1,2,3,4,5], factor: 0.5 }
- { id: offpeak, label: { zh: 优惠时段, en: Off-peak }, start: "12:00", end: "14:00", days: [1,2,3,4,5], factor: 0.5 }
- { id: offpeak, label: { zh: 优惠时段, en: Off-peak }, start: "18:00", end: "24:00", days: [1,2,3,4,5], factor: 0.5 }
- { id: offpeak, label: { zh: 优惠时段, en: Off-peak }, start: "00:00", end: "24:00", days: [6,7], factor: 0.5 }
金额是估算,不是账单:按可配置价目换算,峰谷按事件结算时刻判定;中国法定节假日未建模(窗口只支持星期),需要精确数额时以实际账单为准。
安装与启用¶
方式一是插件管理页(README 推荐):
git clone https://github.com/dddfuxi/dsh-plugin-usage-budget.git
然后在 DSH 侧栏打开 插件 → 添加插件 → 安装第三方插件,把上面的仓库地址粘贴到“包名/Git 地址”,或在“本地目录”里填 clone 下来的绝对路径。安装完成后启用它,侧栏“插件”里会出现名为 用量费用 的卡片(自带图标与中文描述)。
方式二是手动 bundle 安装:
1. 复制本目录到 %USERPROFILE%\.dsh\profiles\<profile>\node_modules\dsh-plugin-usage-budget
2. profile 的 package.json:
- dependencies 加 "dsh-plugin-usage-budget": "link:<本目录绝对路径>"
- dsh.profile.bundles 追加 "dsh-plugin-usage-budget"
3. HMR 会自动重组;页面未更新时刷新一次;没有 HMR 的 profile 需要重启。
注意:README 未提供 dsh plugin add ... 这类一行式命令,安装入口就是插件管理页或手动 bundle,不要凭名称自行拼接。
配置¶
预算数字写在 profile 的 cordis.patch.yml 里,只放 override(即预算数值),不要手写 insert 行:
- id: usage-budget
name: dsh-plugin-usage-budget
config:
dailyBudget: 30
weeklyBudget: 100
monthlyBudget: 200
warnAt: 0.75
完整配置项如下:
| 键 | 默认 | 说明 |
|---|---|---|
dailyBudget |
20 | 日预算(元);0 关闭 |
weeklyBudget |
0 | 滚动最近 7 天预算(元);0 关闭 |
monthlyBudget |
0 | 自然月预算(元);0 关闭 |
warnAt |
0.8 | 花费/预算 ≥ 该比例时进入告警色(0–1) |
assumedOutputTokens |
600 | 发送前预估使用的输出 token 数 |
assumedCacheReadRatio |
null | null = 用会话实测缓存命中率;0..1 可强制 |
pricing |
— | 可选:覆盖价目(结构见上一节);省略则用内置默认价目 |
timezone |
Asia/Shanghai |
账本与时段判定所用时区 |
预算数字也可以在 设置 → 通用设置 → 用量预算 里直接改,回车或失焦即保存、立即生效。
计量口径与测试¶
插件只统计已结算的 assistant/message 用量,被中断、重试后未落盘的流式请求可能少算;累计范围按所有会话共享,被拦的预算只是“守卫 + 提醒”,不拦截发送。
测试:
npm test
# 等价于 node --test test/budget.test.mjs test/pricing.test.mjs
覆盖时段边界、跨午夜、时区与 DST、逐桶金额、缓存节省、未知模型回退、账本滚动与脏数据容错。
已知限制:
- 只统计已结算的
assistant/message;被中断、重试后未落盘的流式请求可能少算。 - 全局回填只发生一次、范围约最近 130 天;之后导入更早的会话日志需要删除账本让它重新回填。
- 预算只是守卫与提醒,不拦截发送(DSH 的发送路径没有对外拦截槽位)。
- 发送前预估是启发式:输入 token 取上下文压力投影,输出长度取配置假定值。
适用场景与注意¶
适合已经在用 DSH、想要按金额而非 token 数看开销的人:做长会话成本复盘、跨会话预算控制、确认缓存命中带来的实际节省,或者给团队一个统一的费用口径。
两点提醒:一是插件以当前 dsh 进程的权限运行,安装前应检查源码与许可证;二是 DSH 生态的社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系,本插件并非官方应用商店里的条目。如需核对,可对照仓库 README 与目录页 skillhub.cn/plugins/dddfuxi/dsh-plugin-usage-budget。
小结¶
它的价值在于把分散的 token 数字变成可读的金额和可执行的预算门槛:费用按事件时刻的时段计价,预算跨会话累计并落地到本地账本,逐轮价格和消息用量行让每次改动都能对上账。预算是用“提醒”而非“拦截”来落地,精确金额仍以账户账单为准。许可证为 MIT,可自行审计后启用。