dsh-chat-cost

usagetested: passnpmMIT

Live token cost for every chat in the DSH Web UI: the chat, its subagents and the whole session tree, priced from a bundled models.dev snapshot of seven providers and 139 priced models, with cache read and write rates wherever the provider publishes them and DeepSeek from its own peak and off-peak t

下载量 / Downloads
1,213
依赖体积 / node_modules
0.46 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add dsh-chat-cost

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

dsh-chat-cost

为 DeepSeek Harness(dsh)Web UI 显示每个对话的 token 费用:本对话、其子代理以及整棵会话树,价格来自内置的多供应商目录,并把只追加的 JSONL 费用日志写入你的项目目录。

[English](README.md) | 中文 | [Русский](README.ru.md)

![license](LICENSE)

![DeepSeek Harness plugin](#安装)

![npm](https://www.npmjs.com/package/dsh-chat-cost)

![Awesome DSH Plugin](https://awesome-dsh-plugin.com)

![providers](#计价规则)

关键词: DeepSeek Harness 插件、dsh 插件、dsh-plugin、token 费用、单次对话费用、子代理费用、会话树费用、LLM 花费统计、token 用量、费用日志、JSONL、本地优先、DeepSeek V4.1 Flash、DeepSeek V4 Pro、OpenAI GPT-5、Anthropic Claude、Google Gemini、Kimi K3(Moonshot)、xAI Grok、Mistral、缓存读取与写入计价、峰谷计价、Cordis 插件。

状态

端到端可用,并且是在真实宿主上验证过的,而不只是测试里:内置的七家供应商目录、计价引擎(峰谷时段、缓存读取与写入规则)、遍历会话树并按区间为每个会话计价并写入 JSONL 费用日志的宿主端、从会话自身事件折算的按轮计价、六个预算工具(cost_price、cost_history、cost_estimate、cost_plan、cost_mark、cost_scenarios),以及英语、中文、俄语的客户端读数——输入区显示整个对话,每个完成的回答下面显示该回答自身的费用。

已知限制(明示而非隐藏):平台账单可能高于任何基于会话的数字,因为网络搜索调用是在一个请求内用服务端工具完成搜索,它读取的网页会计费到你头上,却不进入会话的 token 用量 —— 读数会统计这类调用并点名,而不是假装知道它们的费用;在 harness 尚未把最后一轮写入检查点之前就结束的会话(宿主在轮次中途被杀),只能按现存最新的检查点计价,因此最后几分钟可能缺失;从检查点读回的历史 token 按读取时生效的价位计费,记录中写着 "basis":"durable",因此补记不会被误认为实测区间;自身日志已不在的子会话按从会话树继承的模型计价,"modelSource":"inherited" 会说明这一点;仅从日志得知的对话没有轮次边界,因此它显示总额而不显示每个回答的费用;部分 Gemini 与 Grok 模型公布的长上下文档位价格尚未应用。

配置

- id: dsh-chat-cost
  name: dsh-chat-cost
  config:
    writeLog: true        # 将 JSONL 费用日志写入项目目录
    logDir: .dsh-cost      # 项目目录中的子目录名
    language: en          # en | zh | ru;省略则跟随 harness 语言设置,其次为浏览器语言
    ledgerTailBytes: 2097152  # 每次汇总回读的日志字节数(2 MiB)

功能

  • 多供应商价格。 内置 models.dev 目录快照,覆盖七个供应商——DeepSeek、Moonshot、OpenAI、Anthropic、Google、xAI、Mistral——及其全部有价模型(当前 139 个)。
  • 诚实的计算。 DeepSeek 使用其官方价格表并区分峰谷时段;缓存写入在有独立价格的供应商(Anthropic、OpenAI)按缓存写入价计费,否则按输入价计费;没有价格的模型显示 —,绝不编造数字。
  • 按对话、子代理、会话树分级。 悬停提示会分开显示本对话与其子代理,并给出会话树合计、token 明细与涉及的模型。
  • 子代理会被计入,包括已经结束的。 会话树是三个来源的并集:查询引擎的追踪、活动会话存储,以及持久化会话存储;而宿主已不再运行的会话,其用量取自 harness 自己的持久化投影检查点——也就是它恢复该会话时会用的同一组计数。已结束的子代理是常态而非边角情形:看不见子节点的对话不是便宜的对话,而是没被测过的对话。
  • 项目目录中的费用日志。 <project>/.dsh-cost/cost.jsonl,每个会话每次落盘一行 JSON,包含会话树位置、四项 token 统计、累计与增量费用以及价格来源。在 git 工作树中,首次写入时会把 .dsh-cost/ 加入项目的 .gitignore;普通目录不做任何改动——日志可以写入,但不留下多余文件。
  • 按区间计价。 以 JSONL 日志为准:每次落盘只对上次记录之后新增的 token 按当时生效的价格计费。跨过 DeepSeek 峰时边界的对话保留实际计费价格,不会被追溯重算。
  • 有界读取与缓存。 汇总只读取日志尾部(ledgerTailBytes,默认 2 MiB),并在文件大小与修改时间未变时复用缓存;若尾部从文件中间开始,插件会报告 truncated 与 skippedBytes,而不是假装掌握全部历史。
  • 不会悄悄漏账。 未归入任何计划单元的费用会在提示中点名($1.230 未归入任何计划单元),而不是混进合计。
  • 每个回答下面都有它自己的费用。 已完成的每一轮都会在对话中显示费用:它按该轮自身的使用事件计价,而不是从会话总额里切一块,并在该轮结束时立即刷新。输入区的读数与这些标记共用同一次轮询,因此回答完成时两者会同时更新。
  • 每个对话都有读数,无论是否打开。 未打开的对话没有活动会话,因此读数按 harness 的持久化记录与费用日志为它本身及其子代理计价,并标注为“日志记录”。两个来源都不认识的会话显示 — 并说明原因,而不是整行消失。打开它后会成为活动会话,被精确计价,并补写缺失的记录。
  • 三种语言。 英语、中文、俄语,依次按插件配置、harness 语言设置、浏览器语言选择。

安装

dsh plugin --profile web add dsh-chat-cost

本包是 DSH bundle:profile 会自动合并它的补丁层(声明了 dsh.bundle 的依赖会自动加入 dsh.profile.bundles),无需手工编辑补丁。安装后重启宿主。

计价规则

规则 · 行为

DeepSeek · 官方价格表;工作日 01:00-04:00 与 06:00-10:00 UTC 为峰时,价格翻倍;缓存写入无单独费用,按输入价计费

其他供应商 · 内置 models.dev 快照,缓存读取与写入价完全按公布值使用

未公布缓存读取价 · 回退到输入价,即上界

未知模型 · 解析为无价格;读数显示 —,提示中会列出该模型

归属 · 以日志为准:已记录区间保留当时价格,只对新增 token 计费

data/prices.json 记录了快照的来源(source)与生成时间(generatedAt),因此价格的新旧可以被核查,而不是靠猜。刷新方式:npm run prices(七个精选供应商)或 npm run prices:all(目录中的全部供应商)。

数字如何得出

汇总以日志为基础:已记录的增量直接由文件求和,只有最后一条记录之后的 token 才按当前价格计费。因此跨峰时边界的对话显示的是实际花费,而不是被追溯翻倍的结果。

会话树中每个会话都会说明自己的数字来自哪里,以免一个来源被当成另一个:

basis · 读取自 · 计价方式

live · 正在运行的会话的用量投影 · 按当前生效价位,减去日志已记录的部分

durable · harness 对已结束会话的持久化记录 · 按当前生效价位,减去日志已记录的部分

log · 仅本插件的费用日志 · 按日志已记录的数字;不再对新增 token 计价

modelSource 说明模型是如何得知的:session 来自该会话自己最后一次请求头,inherited 来自会话树——当会话已不存在、只剩计数时如此。

平台账单里有什么是任何会话都没有的

有两类供应商调用会计费,但不属于任何会话的 token 用量:

调用 · 为何不可见 · 读数的做法

网络搜索 · DeepSeek 搜索提供方用服务端 web_search 工具在一个请求内完成搜索;模型读到的网页计费到你头上,而响应中的用量从不写入会话日志 · 统计活动会话中可见的调用数,并说明该数字是下限

轮次之外的模型调用 · 会话日志里没有任何描述 · 不做处理 —— 提示中的合计是会话合计,并且如此标明

在搜索频繁的日子里,这类调用可能占账单的大头。对照平台导出(2026-08-24 至 09-22)核算:没有搜索的日子,会话侧数字与平台数字相差在 $0.04 以内;有数百次搜索的日子,差额随搜索次数变化,约为每次搜索 $0.004。

npm run reconcile 就是那次核算,而且可以复现:

node scripts/reconcile.mjs --export ~/Downloads/usage_data_2026-08-24_2026-09-22.zip

它读取平台导出与本机的会话日志,用 harness 自身用量投影所用的“替换而非累加”规则折算日志,按平台当天的实际单价为差额计价,并把结果与该日的网络搜索次数并列打印。在给出任何结论之前,它会用 harness 的持久化计数逐会话校验自己的折算结果;当自己的算术对不上时,它拒绝把问题归咎于平台 —— 这正是这类工具最容易犯的错误。

费用日志格式

{"ts":"2026-09-12T20:00:00.000Z","plugin":"dsh-chat-cost@0.6.9","rootSessionId":"root-1","sessionId":"child-1","parentSessionId":"root-1","depth":1,"kind":"subagent","provider":"moonshot","model":"kimi-k3","modelSource":"session","basis":"live","pricingSource":"catalog","tier":"flat","tokens":{"uncachedInput":5000,"cacheRead":0,"cacheWrite":0,"output":1000},"totalTokens":6000,"deltaTokens":{"uncachedInput":1000,"cacheRead":0,"cacheWrite":0,"output":200},"deltaTotalTokens":1200,"cumulativeUsd":0.014,"deltaUsd":0.002}

带有 "basis":"durable" 的记录属于补记:读回这些 token 时会话已经结束,因此它的增量是本日志此前未见过的那部分历史。

写入了什么

一切都放在项目目录里,与被描述的工作放在一起。

路径 · 由谁写入 · 内容

<project>/.dsh-cost/cost.jsonl · 每次落盘 · 每个会话每个区间一条 JSON:会话树位置、四项 token 统计、增量与累计费用,以及当时的费率

`<project>/.dsh

…(truncated)

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::17,最后更新 2026-09-22

Links

GitHub · Homepage · npm

Same category