dsh-plugin-usage-budget:按峰谷价目换算 token 费用并守住预算

前言

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,可自行审计后启用。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜