dsh-cost-today:在 DSH 界面里看「今天花了多少钱」

前言

用 DeepSeek Harness(DSH)做智能体或日常对话时,模型调用会不断产生 token 用量。内核会推送每次调用的 usage,但不会替你算美元账单。若只靠事后翻日志或另开脚本,很难在写消息的同时感知「今天已经花了多少」。

下面介绍社区插件 dsh-cost-today(维护者 liujianqiao701):在客户端侧边栏底部、输入框下方和会话头部展示今日花费,点开可看明细;同时自带本地记账,并支持从旧的 dsh-cost-meter 账本一次性迁入历史。插件分类为客户端,当前 GitHub 星标为 0,许可证 MIT,版本 0.4.1(见仓库 package.json)。

这是什么

dsh-cost-today 是 DSH 的 Cordis 插件:监听 session/event 里的 event.data.usage,按 DeepSeek 官方单价与峰谷规则写入本机账本,再把「今日 / 本月 / 累计」金额与 token 统计展示在 GUI 上。它不替代内核计费(内核内无计费服务),而是在插件进程权限下本地汇总与换算展示。

账本路径:$DSH_HOME/storages/cost-today/ledger.json。第一次启动会从 cost-meter 的历史做一次性导入(已有日期不覆盖);之后不再读 cost-meter。若检测到 cost-meter 账本又被写入,插件会停写并在 meta 留痕,避免同一次调用被记两遍。

界面与三层金额

侧边栏底部始终可见一行摘要(例如「今日 ¥57.22 / 累计 ¥732.48」),无需打开会话。点击后打开明细面板,包含当日金额、账本原币与汇率、本月与累计、调用次数、输入/缓存命中/输出 token、按会话与按模型拆分等。

层 计算方式 面板位置
今日 账本 days[今天] 那一条 大标题
本月 days 里所有 YYYY-MM-* 等于本月的日期加总 「本月」行
累计 days 里全部日期加总 「累计」行

累计只覆盖账本保留的历史(与 cost-meter 的 config.historyDays 概念一致,示例中为 180 天)。更早日期被裁掉后累计会变小,是如实反映数据,不是统计 bug。

「今天」按本地日期 YYYY-MM-DD 判定(与 cost-meter 的 localDayKey() 一致);用 UTC 会在凌晨 0–8 点把账算到前一天。金额先以账本 USD 计,再按 config.currency、config.exchangeRate 换算(默认示例为 CNY、汇率 7.2)。

记账与单价

插件自己记账,数据来源是内核在每次追加会话事件后发布的 session/event:

ctx.on('session/event', (session, event) => { /* event.data.usage 就是这次调用的用量 */ })

要点(README 中与内核源码对照过的部分):

  • 用量字段:inputTokens(未命中缓存)、cacheReadTokens(命中)、outputTokens,以及可选的 cacheWriteTokens、reasoningTokens。
  • 失败或中断的调用:assistant/attempt 可能不带 data.usage,需从 data.stream 里查找 {type:'chunk', chunk:{type:'usage'}}。
  • 去重键:sessionId + ':' + event.seq(不用 turn/step,避免重试漏账或重复)。
  • 恢复的历史事件不会重走 session/event(Seed events 不发布)。

单价在 lib/pricing.js 维护,来源文档为 DeepSeek API 定价:

  • 平时(每百万 token,美元):缓存命中 $0.003、未命中 $0.15、输出 $0.60。
  • 峰时 = 平时 × 2,窗口为 UTC 01:00–04:00 与 06:00–10:00;周末与中国法定节假日整日按平时价(当前 holidays: [] 未配表时,法定节假日的峰时窗口会按峰价多算,README 已说明)。
  • 未知模型按 flash 价计并打 unknownModel 标记。

面板上的「单价(每百万 token,美元)」与实算使用同一份 priceTable() 数据。

启动约 3 秒后会做一次空档回补:从 max(导入时刻, 上次回补时刻) 起扫描 sessionQuery,补装插件到重启之间的调用,重叠仍靠 sessionId:seq 去重。

安装与启用

在 DSH profile 目录下安装本地链接,并把包名加入 profile 的 bundles:

# 在 DSH profile 目录下
npm install "link:<本仓库路径>"
# 并把 "dsh-cost-today" 加进 profile package.json 的 dsh.profile.bundles

改完后必须重启 DSH(宿主与客户端模块仅在启动时加载)。

插件目录页:skillhub.cn/plugins/liujianqiao701/dsh-cost-today。源码:github.com/liujianqiao701/dsh-cost-today。DeepSeek Harness 生态强调「一切皆插件」;SkillHub 目录为社区站点,与 DeepSeek / 幻方无官方从属关系。

安装前建议自行阅读仓库源码与 MIT 许可证。插件以当前 DSH 进程权限读写本机账本与订阅会话事件,请勿在未审阅代码的情况下在生产环境盲目启用。

典型用法

除 GUI 外,还有工具、命令与 HTTP 接口:

入口 用法
工具 cost_today 参数 day(YYYY-MM-DD,省略为今天)、limit;会消耗一个模型回合
命令 /cost 同上,不消耗模型回合;可带日期,如 /cost 2026-10-25
数据路由 GET /api/dsh-cost-today/report[?day=YYYY-MM-DD] → JSON
GUI 侧边栏底部 + 输入框下方 + 会话头部;面板约每 60 秒自动刷新

开发调试可在浏览器 DevTools 查看 window.__costToday(含 factoryRan、applyCalled、registered[]、error 等自检字段)。

仓库内 npm test 运行 67 项 node:test(ledger、pricing、meter、store、capture、cursor、client 等),零额外测试依赖。

适用场景与注意

适合:长期在 DSH 里调模型、希望边用边看当日花费、需要按会话/模型/token 命中率复盘用量,且接受本地账本与官方单价近似估算(非发票级对账)的用户。

需要注意的边界(README 已列出):

  • 与 dsh-cost-meter 同时活跃记账会导致重复;插件检测到 meter 再写账本会主动停写。
  • 拿不到调用 id 时不记账(宁少不多)。
  • 一次失败重试可能计两次,与内核用量投影一致。
  • 多 DSH 实例靠账本 mtime 重读降低覆盖风险,极端并发仍可能丢一条。
  • 客户端模块需正确 inject: ['slots'] 并注册 sidebar.footer.action 等插槽,否则可能出现无 UI 且无报错(作者在 README「踩过的坑」中说明)。

结尾

dsh-cost-today 把今日花费和明细推到 DSH 客户端常见位置,并用独立账本 + 官方单价规则本地计量,可选从 cost-meter 迁入历史。若你已在用 DSH 做日常开发,可按上文安装并重启后在侧边栏底部确认是否出现花费摘要。

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

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

Xiaoye