dsh-turn-price
在每个已完成回合的下方单独一行显示这一轮的花费金额(人民币),点击展开明细,列出各 token 类别的数量、单价、命中的价格规则与计费时刻;单价可在 DSH 设置页里按模型维护,含四类 token 单价、每周循环的峰谷规则(系数自定)与绝对时间区间的限时优惠价。0.2.3 起还能看账户:读取 14 家 provider 的余额或剩余额度(DeepSeek、OpenRouter、智谱 GLM、月之暗面、MiniMax、Kimi Coding、OpenAI 兼容中转站等),在旁边显示今日 / 本月 / 本会话花费;花费记在本机日账里(原子写、按 API key 分本、保留 1-24 个月、可导出
安装
dsh plugin --profile web add dsh-turn-price
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-turn-price




在 DeepSeek Harness(dsh)的 Web 界面里,在每个已完成回合的下方单独一行显示这一轮花了多少钱,点击可展开明细(各 token 类别的数量 × 单价 = 金额、命中的价格规则、计费时刻)。
A DeepSeek Harness (dsh) web plugin that shows what each turn cost, in CNY, on its own row under the turn. Click the amount for a breakdown: tokens per category × unit rate = money, which price rule matched, and the billing instant.
金额按当前价格表实时计算:token 用量取自 dsh 会话日志里每个步骤的 usage,插件不做字符数估算,所以你事后修改价格,所有历史回合的金额会立刻跟着更正 —— 这正是「忘了提前改价」的补救方式。
界面上的金额是预估,不是账单:它等于 provider 上报的 token 数乘以你本地价格表的单价,实际结算以平台为准。
安装
本插件是标准的 dsh 组合包(dsh.bundle.patch + dsh.client),三种地址形式等价:
地址形式 · 命令
npm 包名 · dsh plugin --profile <profile> add dsh-turn-price
Git 仓库 · dsh plugin --profile <profile> add github:littlefish04/dsh-turn-price
本地目录 / tarball · dsh plugin --profile <profile> add <绝对路径>
也可以在应用内侧边栏的插件页用「添加插件」,填入上面任一形式的地址。
- 把
<profile>换成目标 profile 名(桌面版是desktop,dsh web常见web)。 - 装好后需要重启该 profile 才生效:插件行在启动时确定(桌面应用完全退出后重开,或重启
dsh web)。 - 卸载:
dsh plugin --profile <profile> remove dsh-turn-price。
装哪个版本
推荐 0.2.3 —— 本文档〈它是怎么记账的〉〈设置页的 4 张卡片〉里写的余额、日账、消费日历、
手工记账,都是 0.2.x 才有的(npm 上目前有 0.1.0 / 0.1.1 / 0.2.3):
dsh plugin --profile desktop add dsh-turn-price@0.2.3
想要 · 版本号写 · 说明
完整功能(推荐) · @0.2.3 · 余额 / 今日 / 本月 / 会话汇总、消费日历、手工记账、日账导出
只要最初那版:每轮花费 + 价格表 · @0.1.1 · 没有余额与日历;功能稳定,但不再更新
—— · @0.1.0 · ⚠️ 不要装:它会让 dsh 起不来(客户端模块 id 与包名不一致),0.1.1 就是修这个的
从 git 仓库装 · 不写版本号:github:littlefish04/dsh-turn-price · 取 main 分支的当前内容(当前 = 0.2.3),不走 npm
- 建议钉死版本号(写成
dsh-turn-price@0.2.3)。不写版本号会装 npm 上的latest,
而国内镜像(npmmirror)同步有延迟,裸包名可能解析到旧版。核对官方源上的最新版:
npm view dsh-turn-price version --registry https://registry.npmjs.org
- 升级 = 先卸再装(dsh 目前不支持插件自动更新;价格表存在 profile 配置的同一命名空间里,
卸载重装不会丢):
dsh plugin --profile desktop remove dsh-turn-price dsh plugin --profile desktop add dsh-turn-price@0.2.3
- 各版本要求的 dsh 版本都是
>=0.2.0-rc.1 <0.3.0(见〈兼容性与边界〉);
每一版改了什么见〈版本更新〉。
<details>
<summary>从源码目录安装(开发用)</summary>
dsh plugin --profile desktop add "<本仓库的绝对路径>"
本插件没有构建步骤(lib/ 既是源码也是发布产物),所以 git 安装不需要 prepare 脚本、
也不需要用户在 pnpm-workspace.yaml 里批准构建脚本。
</details>
它长什么样
每个已完成回合的操作行上方多出一行金额(不占用 hover 才出现的操作行):
上图里那一行由四部分组成:本轮花费+ 金额¥0.0874+ 徽标限时优惠+ 展开箭头▼。
徽标只在命中规则时出现,显示规则名,系数不是 1 时写成 高峰×2 这样。
点击金额展开明细:
显示项 · 内容
面板标题 · 本轮花费明细 + 合计金额
模型 · 模型:<provider> / <model>;一个回合换过模型时附注 (本轮经过 N 个路由,按路由表中的最后一个计价)
计费时刻 · 计费时刻:2026-10-03 19:16(UTC+8,星期六)
token 来源 · token 来源:宿主折叠的会话事件,按每步 usage 容错求和(N 个样本);宿主不可用时写明「本页会话数据」
生效价格 · 生效价格:基础价(DeepSeek Flash),或 高峰 ×2 / 限时优惠 ×1
单价口径 · 单价口径:每 1,000,000 tokens
明细表 · 类别 / tokens / 单价 / 金额 四列,之下是 合计 行
设置 → 每轮花费:按模型分页签维护价格表,改完保存,所有历史回合的金额立即重算。
它是怎么算的
token 用量来源
按每个步骤的 usage 容错求和,而不是直接用 dsh 内置的严格折叠:
宿主(lib/session-usage.js)折会话事件 → 每轮 { buckets, routes, endSeq, endTime, reason }
桶 = { inputTokens, outputTokens, cacheReadTokens ?? 0, cacheWriteTokens ?? 0 }
为什么要换掉严格折叠(deriveTurnTokenUsage):它要求「有 totalTokens,或 cacheRead + cacheWrite 都有」,
否则整轮判为不可证、一个字都不显示。实测(本机 24 份真实会话日志 / 79 个回合)有 15 个回合因此
连金额都出不来 —— 它们的共同形状是 {inputTokens, outputTokens, cacheReadTokens}
(zai/glm-5.3-flash、deepseek-vision/deepseek-v4-flash 都这样:有缓存命中、缺缓存写入、缺 total)。
被手动停止的回合也一样会整轮消失。
容错求和的口径(与 dsh 的 tokenUsage 投影逐项相等,测试里拿官方定义对拍过):
- 缺
cacheReadTokens/cacheWriteTokens→ 记 0; - 缺
usage的步骤(中途被停止的那一步)→ 跳过,其余步骤照常计; totalTokens/reasoningTokens不参与计价;- 同一步的后续样本替换前一个;
llm/retry-started之后的样本累加(重试的两次尝试都算钱); - 整轮一个样本都没有 → 不显示金额(而不是显示
¥0.0000)。
浏览器侧还有一条回退路径:宿主不可用时按页面上每步的 assistant-step.usage 同样容错求和。
回退路径拿不到路由时会借用严格折叠留下的 routes,明细里会注明数据来源。
计价公式
金额 = Σ( 类别 token 数 ÷ 每单位 tokens × 该类别的生效单价 ) 类别 = 未缓存输入 / 缓存命中 / 缓存写入 / 输出
生效单价的优先级
按回合结束时间判定(时区用设置里的「时区偏移」,默认 +8 北京时间):
优先级 · 机制 · 说明
① 最高 · 限时特价 promos · 绝对时间区间。区间内自成一套价格:基础价 × 系数,再用各项「覆盖价」单独替换。不叠加峰谷系数。
② · 峰谷规则 rules · 一周内的循环时段(可选星期 + 起止时刻),价格 × 系数。支持跨零点(end < start)。
③ · 基础价 · 上面都没有命中时使用。
同类规则多条命中时,列表靠后的优先(便于后来追加例外)。
DeepSeek 官方口径怎么填
DeepSeek 的价格政策是「空闲时段价 = 高峰时段价的一半;高峰时段为北京时间周一至周五 09:00–12:00、14:00–18:00」。
所以本插件推荐的填法是:
- 基础价 = 空闲时段价(平时就是原价,直觉一致)
- 峰谷规则填 ×2,两条:
周一~周五 09:00–12:00、周一~周五 14:00–18:00
插件默认已按此预填 deepseek-flash 与 deepseek-v4-pro,设置页里也有「恢复 DeepSeek 官方价」按钮。
法定节假日整天都是空闲时段,无法用「星期几」表达;用限时特价把该日期区间的系数设为 1
(或直接写覆盖价)即可单独处理。
设置项
设置路径:设置 → 每轮花费,同一节内 4 张卡片:模型价格 → 账户与余额 → 消费记录 → 显示项。
逐项说明见下面的〈设置页的 4 张卡片〉一节;这里只列最常用的几个数:
项 · 默认 · 说明
显示每轮花费与汇总行 · 开 · 总开关,关闭后不渲染任何金额
货币符号 · ¥ · 估算金额用它(余额段用余额接口返回的币种)
明细小数位 · 4 · 轮尾明细的位数
汇总行小数位 · 2 · 输入框下方汇总行的位数
时区偏移 · +8 · 判定峰谷/特价、以及日账归属哪一天都用它
每多少 tokens · 1000000 · 单价分母,与官方口径一致
未配置的模型 · 不显示金额 · 或「用兜底价计算」;默认不显示以免误导
兜底价 · 全 0 · 选择兜底时使用的四个单价
模型价格 · 见上 · 每个模型:模型 id / 提供方 / 显示名 / 四个基础单价 / 峰谷规则 / 限时特价
提供方留空 = 不限提供方:同一个模型在多个 provider 下价格相同时只写一条即可;
若某个 provider 价格不同,再单独加一条并填上 provider(精确匹配优先)。
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:3,最后更新 2026-10-07