dsh-spend-meter: Composer Interaction Spending and Account Balance Ledger

前言

在 DeepSeek Harness(DSH)里用 Composer 跑长对话时,token 用量可以在「Token 用量」里看到,但「这一轮对话大概花了多少钱」「钱包还剩多少」「缓存命中省了多少」往往要切到平台用量页或自己心算。高峰与空闲时段单价不同,联网搜索从 2026-11-01 起按次计费,自动压缩摘要也会单独产生 LLM 成本——这些分散在事件流里,缺少一个和输入框同屏、可展开的账本。

下面介绍社区插件 花费与余额(仓库 TSE2006/dsh-spend-meter),维护者为 TSE2006,目录分类为 admin-security。它在输入框下方常驻一条药丸(本对话花费 + 平台余额),点开是全量账本面板:分项花费、缓存节省、按模型与逐轮成本、搜索计费、预算与近 14 天趋势,样式对齐 DSH 自带的 StatsPills 与 stat-dialog,设计令牌来自运行时的 --dsw-* / --dsh-* 变量。

这是什么

插件包名固定为 @local/spend-meter(本地 bundle,无需发布到 npm),当前版本 1.2.0(MIT)。Host 半注册会话投影 spendMeter,只读 DSH 会话事件流计花费;Client 半渲染药丸与弹层,并通过与「设置 → 账户」相同的 Remote 路径每 15 秒刷新余额。花费统计不额外请求平台账单,分子分项全部来自 usage 与 tool 事件;余额依赖已登录的 DeepSeek 平台账号,仅用 API Key 未登录时余额位显示 —,花费不受影响。

界面与能力

常驻药丸

输入框下方显示类似 ¥3.89 本对话 · 余额 ¥19.07 的裸文字按钮(与 3 轮 228 步 · 232 tok/s 同款风格)。余额低于 ¥5 变黄、低于 ¥1 变红;高峰时段 ¥ 图标变黄,空闲时段保持灰色。

账本面板

点击药丸打开弹层,主要内容包括:

区域 说明
时段 是否高峰,距下一个半价/高峰时段还有多久
花费 输入未命中/命中缓存、输出、联网搜索、自动压缩摘要:各自金额、token 数与折算单价(元/百万 tok)
缓存 命中缓存省下的钱,以及「若无缓存本应花费」
余额 充值 + 赠送余额,以及「还能聊约 N 轮」;配置了预算时按钱包、今日预算、本月预算三者中最先见底者估算
预算 今日/本月已花与上限(需在 profile 配置 budget);达 80% 变黄,超支变红;输入框上方金额同步变色
近期 最近 14 天柱状条(今天高亮)与「本周」合计(北京时间周一起算)
价目 在线更新成功时显示更新日期,失败时显示原因
细分 搜索按 web_search / web_fetch 拆次数与金额;压缩摘要按写摘要的模型拆
模型 / 逐轮 多模型会话按模型汇总;最近 8 轮成本,可展开更早轮次
导出 底部「复制 Markdown / 复制 CSV」整本账到剪贴板
链接 跳转 DeepSeek 平台「查看用量 / 去充值」

预算用尽时,药丸右侧会出现超支提示条,点 × 关闭;同一天或同一月只提示一次。

数据与计费口径

花费来自 Host 对事件流的折叠,重启或切换会话不丢本会话统计:

  • assistant/message、assistant/attempt 的 usage 按 (turn, step) 归户;重试先扣旧样本再计新值,不重复计费。
  • compaction/summary 的 usage 单列「自动压缩摘要」。
  • tool/call 中 web_search / web_fetch 按次计价(默认 ¥0.005/次,北京时间 2026-11-01 00:00 起收费;此前记为免费)。
  • 高峰/空闲按每条事件时间戳判断:北京时间周一至周五 9:00–12:00、14:00–18:00 为高峰,其余半价;可在 config.holidays 指定法定节假日全天按空闲价。

余额由 Client 调用 ctx.remote.account.getBalance(...),每 15 秒刷新,窗口重新可见或打开账本时立即刷新。

预算与跨会话日统计写入台账文件:默认 %USERPROFILE%\.dsh\spend-meter-ledger.json(设 DSH_PROFILE_DIR 时在该目录下;也可用环境变量 SPEND_METER_LEDGER 指定路径),保留约 70 天。未配置 budget 时弹层不显示预算小节;「近期」柱状条在台账全为 0(刚安装)时不显示。

失败且 usage 为 0 的请求(如 401)不计费;与 README 说明的实际账单行为一致。

价目与在线更新

内置默认价目(元/百万 tokens,格式为高峰/空闲)示例:

模型 缓存命中 缓存未命中 输出
deepseek-flash(含 v4-flash 别名) ¥0.04 / ¥0.02 ¥2 / ¥1 ¥8 / ¥4
deepseek-v4-pro ¥0.30 / ¥0.15 ¥9 / ¥4.5 ¥27 / ¥13.5

查表顺序:精确模型名 → 去掉日期/版本后缀 → 按模型族近似(弹层会注明)。未匹配模型计入 unpriced,不参与金额合计。

Host 半每天拉取仓库根目录 pricing.json 合并(先试 jsDelivr CDN,再试 raw.githubusercontent.com;可设 SPEND_METER_PRICING_URL 自建镜像)。本地缓存 %USERPROFILE%\.dsh\spend-meter-pricing.json,24 小时内不重复请求。优先级:config.models > 在线/缓存表 > 内置表。关闭在线更新:config.autoPricing: false。

安装与启用

需要 DSH 0.2.1-rc.5 及以上桌面端(插件以 bundle 形式注册到 profile)。安装步骤来自仓库 README,不是 dsh plugin add github:... 一类命令。

  1. 将整个插件目录放到任意位置,例如 Windows 下 %USERPROFILE%\.dsh\plugins\spend-meter。
  2. 在 DSH 中让 Agent 执行 plugin_manager 的 install_bundle,target 填该目录的绝对路径;插件管理器中显示为「花费与余额」。
  3. 输入框下方出现 ¥0.00 本对话 · 余额 ¥0.00 即表示 Client 半挂载成功。

插件以当前 DSH 进程权限运行;安装前应自行查看 GitHub 源码 与 MIT 许可证,确认 bundle 内容与组织策略一致。

配置示例

在 profile 的 cordis.patch.yml(例如 %USERPROFILE%\.dsh\profiles\<profile>\)里为 spend-meter 条目增加 config(插件不声明 Config schema,字段按 README 兜底):

- id: spend-meter
  config:
    holidays: ['2026-10-01', '2026-10-02']
    searchPerCall: 0.005
    turnHistory: 120
    currency: CNY
    budget:
      daily: 20
      monthly: 200
      warnRatio: 0.8
    autoPricing: true
    models:
      deepseek-flash:
        peak: { cacheHit: 0.04, cacheMiss: 2, output: 8 }
        offPeak: { cacheHit: 0.02, cacheMiss: 1, output: 4 }

第三方渠道若不分峰谷,可在 models 下用平价写法(单组 cacheHit / cacheMiss / output 全天生效)。改源码后按 README 将 client.ui.js 复制为 client.js,客户端 HMR 约 3–4 秒生效。

适用场景与限制

适合需要在 Composer 同屏核对本会话花费、缓存节省、搜索与压缩摘要成本,并顺带看平台余额与可选日/月预算的开发者。跨会话累计仍以平台用量页为准(弹层有入口)。

README 列出的限制 worth 留意:价目以内置表为底、在线更新为补;预算与「本月」从插件开始记账日起算,安装前的历史不在台账中;「还能聊 N 轮」为本会话平均轮成本外推,长会话偏差会变大;只统计本会话事件,不替代官方账单对账。

客户端半在异常时不向 Cordis 抛错,避免拖垮整个应用;药丸可降级为 —,弹层底部有「插件异常」诊断块。

结尾

花费与余额把 DSH 事件流里的 usage 与工具调用折成人民币分项,并把余额、预算、近期趋势收到输入框旁,和 Harness 自带统计 UI 同一套视觉语言。社区目录页:skillhub.cn/plugins/TSE2006/dsh-spend-meter;源码与完整配置说明:github.com/TSE2006/dsh-spend-meter。

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

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

Xiaoye