dsh-cost-ledger:给 DSH 加一个按天、按模型看花费的标签页

前言

在 DSH 里跑模型,多数人不是只用官方 API。你在阿里百炼上调模型,但市面上的用量插件几乎都内置同一份 DeepSeek 官方价。结果就是:模型名一样、服务商不一样,价格可能差好几倍;官方有峰谷时段,百炼不一定有;私有部署带租户前缀的模型,在任何公共价目表里都查不到。最后 token 统计得很准,金额是错的,而且错得悄无声息。

下面介绍 looriann/dsh-cost-ledger。它定位是 DSH 的「费用」标签页,按天、按模型看 token 花了多少钱。它认的不只是 DeepSeek,同一份权重经百炼、官方、第三方转售卖出、价格不同时,它按「服务商 + 模型」二元组查价,不是按模型名瞎猜。界面照着 DeepSeek 官方控制台做:按天堆叠柱状图,鼠标悬停看到当天明细。

这是什么

这是一个客户端插件,由 Looriann 维护,分类归在客户端(client,web 平台)。仓库地址是 https://github.com/Looriann/dsh-cost-ledger,社区目录页是 https://www.skillhub.cn/plugins/Looriann/dsh-cost-ledger。当前 GitHub 星标 1。

它解决的核心问题分三层:

1、认身份:按 服务商 + 模型 二元组查价,而不是只看模型名。
2、讲出处:每个模型一行都带置信度徽章(手填 / 官方 / 聚合目录 / 继承 / 未定价)。
3、能补价:查不到就明确标「未定价」,点一下就地填,填完历史数字立刻重算。

插件的设计口径是:宁愿显示「未定价」,也不显示一个看起来很专业的假 ¥0.00。

核心功能

能力 说明
按天图表 天 × 模型的堆叠柱状图,悬停显示当天各模型花费,可切「金额 / tokens」
KPI 条 今日 / 近 N 天 / 本月 / 缓存命中率 / 样本数
价格来源徽章 每个模型一行徽章,一眼看出这个数是查来的还是你填的
就地补价 未定价横幅点开填四个单价(元 / 百万 token),保存即重算
随包价目 自带阿里百炼 142 个模型的官方人民币价:千问全系 + DeepSeek / Kimi / GLM / MiniMax 的百炼上架版
历史回填 首次启动自动扫描 ~/.dsh/sessions/,过去几天的账立刻就有
可对账 npm run replay 用同一份代码在终端复算,界面数字必须能复现

其中「可对账」是它区别于普通用量面板的一点:界面和 replay 共用 lib/ 下的同一份代码,所以界面上的数字一定能在终端复现。

安装与启用

安装有两种方式。

方式一:插件商场,搜索 cost-ledger,完整包名是 @looriann/dsh-cost-ledger,点击安装。

方式二:命令行,在 DSH 桌面 profile 下安装:

dsh plugin --profile desktop add @looriann/dsh-cost-ledger

装完重启 DSH,浏览器按 Ctrl+Shift+R 硬刷新。打开任意会话,顶部标签栏会多一个「费用」。

依赖条件写在 package.json 里,运行时属于零依赖:

"engines": {
  "node": "^22.19.0 || >=24.0.0"
}

README 同时写明需要 DSH 0.2.0-rc.2 / 0.2.1-rc.2。这里的 Node 范围来自 package.json 的 engines 字段,DSH 版本约束来自 README 原文。注意控制命令必须按上面原文一字不改,尤其不要凭目录名去拼 dsh plugin add github:owner/repo。

典型用法

1、打开任意会话,点顶部的「费用」。
2、首次打开会自动回填历史;几秒后图表和 KPI 就有了。
3、顶部如果出现橙色横幅「有 N 个模型还没定价」,点里面的 chip 补价,填四个单价并保存。

需要核对原始账目时,在仓库目录跑回放:

npm run replay                 # 回放全部会话,打印每天的 tokens 与金额
npm run replay -- <日志文件>    # 单个会话,逐轮成本

重新抓取官方价目用:

npm run prices     # 重新抓官方价目,合并进账本(不覆盖手填行)

开发自检命令也一并列出,均为原文脚本:

npm run check      # 语法检查(8 个模块)
npm test           # 22 项单元用例 + 8 项插件冒烟
npm run replay     # 回放本机真实日志
npm run seed       # 从抓取结果重建随包价目表
npm run rename     # 一键改包名(换 npm 作用域时用)

价格是从哪来的

按优先级从高到低:

来源 说明
你手填的 最高优先级,永远不会被自动抓取覆盖
官方价目 随包种子(阿里百炼官方页,142 个模型,含第三方模型的百炼版),或 npm run prices 重新抓
聚合目录 计划接入 models.dev / LiteLLM
继承同模型 同模型在别的服务商下有条目,借用但降级标注
未定价 只有 token 没有钱,界面明确标红

关于自动抓价,README 的口径比较直接:bailian.console.aliyun.com 的模型广场是登录态 SPA,程序抓不到表格;但同一份表格有公开 Markdown 导出 help.aliyun.com/zh/model-studio/model-pricing.md,能解析出 CNY 单价、阶梯区间和免费额度,当前 142 个模型。官方页只列输入 / 输出单价,缓存单价不单列,插件按百炼公开规则推算(缓存命中 10%、显式创建 125%),并在价目表里标 cacheRule 字段。真正抓不到的只有私有部署(cmaas-glm-5.3 这类带租户前缀的),设计上留空手填,不猜。

数字为什么可信

  • token 不猜:直接读 harness 的 assistant/message 事件,input / cacheRead / cacheWrite / output 四个分项原样落账。
  • 不重复计费:以 sessionId + turn + step 为键,同一步骤重复上报是替换,不是累加。
  • 整数微元:micro = round(tokens × 单价),避免浮点误差滚雪球;null ≠ 0。
  • 读时计价:金额永远按当前价目表现算,改价不用重建历史。

数据完全本地:

~/.dsh/cost-ledger/
├─ samples.ndjson   ← 只追加的 usage 样本(唯一事实来源)
└─ prices.json      ← 你的价目表

不联网,不上传任何内容,也不读对话正文,只读 usage 里的数字。删掉 samples.ndjson 重启等于从零重来。

适用场景与注意

适合这类人:同时在 DeepSeek 官方和百炼上跑模型,需要按服务商区分同一模型的实际花费;有私有化部署模型,公共价目表里查不到价;希望界面数字能在终端复现,而不是只看一个面板。

有几点需要写在前面:

1、插件以当前 DSH 进程权限运行,安装前应先检查源码(lib/ 与 scripts/)和许可证,而不是只看 README。许可证是 MIT,作者 Looriann,README 注明事件解析语义参考了 @kidli1412/dsh-session-cost 与 dsh-context 的公开实现,代码为独立编写。
2、它是纯本地工具,除你手动跑 npm run prices 时访问阿里云文档页之外不联网,因此没有后端账号体系,也就不存在云端账单能力。
3、它显示的是按你填的价目表算出来的估算,不是账单。和官方账单对不上时,常见原因包括缓存读写价没填、阶梯档位不同、官方免费额度没扣、四舍五入。
4、它只读 session/event、只注册自己的 /api/cost-ledger/* 路由、只在标签栏加一个页,不改任何内置组件,README 明确说明不会和其他用量插件冲突。

结尾

dsh-cost-ledger 把一个容易出错的问题拆得很小:先记住每一笔 token 分项,再按「服务商 + 模型」框架计价,查不到就标「未定价」留给你填。它的价值不在把界面做得像官方控制台,而在让金额可追溯、可复算、不静默出错。

目录页:https://www.skillhub.cn/plugins/Looriann/dsh-cost-ledger
GitHub:https://github.com/Looriann/dsh-cost-ledger

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

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

小夜