前言¶
用 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 做日常开发,可按上文安装并重启后在侧边栏底部确认是否出现花费摘要。