🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

用量统计 SJTUMalPan/dsh-usage-stats

DeepSeek Harnessv0.1.16
SJTUMalPan37 天前有提交已提供中文文档扫描:含敏感能力

统计各工程会话的 token 消耗与花费

30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/28 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:缺少 main/exports/bin 入口声明。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add SJTUMalPan/dsh-usage-stats
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · ui
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 37 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-usage-stats @ 0.1.16
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 17:39:43

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 14 处,展示前 14 条)
  • 读取本地文件
    dsh-usage.mjs:69
    return readdirSync(workspace)
  • 读取本地文件
    dsh-usage.mjs:86
    return statSync(path).isDirectory()
  • 读取本地文件
    dsh-usage.mjs:122
    const catalog = JSON.parse(readFileSync(options.prices, 'utf8'))
  • 写入本地文件
    dsh-usage.mjs:154
    writeFileSync(options.out, text)
  • 读取本地文件
    lib/html.mjs:147
    const css = readFileSync(join(HERE, 'client.css'), 'utf8')
  • 读取本地文件
    lib/html.mjs:148
    const js = readFileSync(join(HERE, 'client.js'), 'utf8')
  • 读取本地文件
    lib/sessions.mjs:38
    workspaces = readdirSync(root)
  • 读取本地文件
    lib/sessions.mjs:45
    for (const session of readdirSync(workspaceDir)) {
  • 读取本地文件
    lib/sessions.mjs:60
    return statSync(path).isDirectory()
  • 读取本地文件
    lib/sessions.mjs:73
    return statSync(path).isFile()
  • 读取本地文件
    smoke-html.mjs:11
    const html = readFileSync(new URL('./usage-dashboard.html', import.meta.url), 'utf8')
  • 读取本地文件
    smoke-html.mjs:15
    const client = readFileSync(new URL('./lib/client.js', import.meta.url), 'utf8')
  • 读取本地文件
    verify.mjs:30
    for (const name of readdirSync(cacheDir)) {
  • 读取本地文件
    verify.mjs:33
    const record = JSON.parse(readFileSync(join(cacheDir, name), 'utf8'))
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 统计缓存与花费
  • 单文件仪表盘

DSH 各工程/会话/步骤的 token、缓存与花费统计(零依赖离线工具 + 单文件仪表盘,并作为 DSH 子页面挂载)

README

由 DeepSeek 最新模型翻译生成
dsh-usage-stats 统计 DeepSeek Harness 每个工程、每个步骤的 token 开销、缓存命中率和花费。 零依赖:只用 Node 22+ 内置能力读 DSH 已经写好的会话日志,不发任何模型请求,不改动任何会话数据。 快速开始 全部工程,Markdown 报表 node dsh-usage.mjs 单文件可视化仪表盘(推荐) node dsh-usage.mjs --format html --out usage-dashboard.html 只看某个工程 node dsh-usage.mjs --project abstractAI 逐步骤明细 CSV(工程 / 会话 / turn / step 一行) node dsh-usage.mjs --format csv --out steps.csv 机器可读 JSON(含每会话的 turn 汇总) node dsh-usage.mjs --format json --out usage.json 自检:把折叠结果与 DSH 自己的 tokenUsage 投影对账 node verify.mjs 可视化仪表盘
展开完整文档(README 剩余 1 节)
dsh-usage-stats

统计 DeepSeek Harness 每个工程、每个步骤的 token 开销、缓存命中率和花费。

零依赖:只用 Node 22+ 内置能力读 DSH 已经写好的会话日志,不发任何模型请求,不改动任何会话数据。

快速开始

全部工程,Markdown 报表
node dsh-usage.mjs

单文件可视化仪表盘(推荐)
node dsh-usage.mjs --format html --out usage-dashboard.html

只看某个工程
node dsh-usage.mjs --project abstractAI

逐步骤明细 CSV(工程 / 会话 / turn / step 一行)
node dsh-usage.mjs --format csv --out steps.csv

机器可读 JSON(含每会话的 turn 汇总)
node dsh-usage.mjs --format json --out usage.json

自检:把折叠结果与 DSH 自己的 tokenUsage 投影对账
node verify.mjs

可视化仪表盘

--format html 产出一个自包含的 HTML 文件:数据、样式、脚本全部内联,零 CDN、零 npm 依赖、无任何网络请求,直接双击用浏览器打开即可(file:// 可用)。

包含:KPI 概览、各工程花费排行、成本构成环图、主会话/子代理与峰谷堆叠对比、每日花费趋势、可排序可筛选的会话表、点击会话展开逐轮曲线、最贵步骤排行。

图表是手写 SVG(lib/client.js),所以不需要任何图表库。样式在 lib/client.css,两者在生成时被内联进产物——改样式或图表只改这两个文件,重新生成即可。

在浏览器里看(DSH 插件)

配套的 DSH 宿主插件已拆成独立仓库: dsh-usage-dashboard,把报表挂到宿主 Web 服务器的 /usage:

http:///usage

用的是宿主自己的登录态——先在同一个地址登录 GUI,/usage 直接就能开,不需要第二个令牌。

安装(插件市场里也能直接装;装完重启 dsh web 生效)
dsh plugin --profile web add github:SJTUMalPan/dsh-usage-dashboard

生成报表(本工具负责的部分;插件默认读 /report/usage-dashboard.html)
node dsh-usage.mjs --format html --out usage-dashboard.html

本仓库的 dsh-plugin/ 是一个 git submodule 指向那个仓库,本地开发时两边的路径关系不变(git clone --recursive 即可拿到)。

插件靠宿主两个现成接口:ctx.webServer.register() 挂路由,
ctx.connection.requestRejection() 复用宿主的 Host/Origin 围栏与浏览器鉴权。
未登录返回 401,报表未生成返回 404。

不修改任何其它工程——报表由本工程自己的插件承载。详见 dsh-plugin/README.md。

输出内容

| 章节 | 内容 |
| 一、按工程汇总 | 会话数、子代理会话数、步骤数、未命中输入、缓存命中输入、输出、缓存命中率、花费 |
| |主会话 / 子代理拆分 | 每个工程的钱有多少来自子代理 |
| |峰谷拆分 | 峰时花费 / 谷时花费 / 未定价步骤数 |
| |成本构成 | 输出、缓存命中输入、未命中输入各占多少钱 |
| 二、按工程 → 会话 | 每个会话的模型、步骤、命中率、花费、起始时间 |
| 三、按工程 → turn | 同序号 turn 跨会话汇总,按花费排序 |
| 四、最贵的 N 个步骤 | 全局最贵的单步调用 |

口径

这些口径直接决定数字对不对,改动前请先读:

- step = 一次 LLM 调用。 DSH 每个完成的步骤写一条 assistant/message 事件,带 data.usage。只折叠这一条——流式过程中的 usage 采样报的是同一次调用,重复折叠会翻倍。
- inputTokens 是「缓存未命中」部分,不是输入总量。
totalTokens = inputTokens + cacheReadTokens + outputTokens。
两者单价差 50 倍(flash 命中 0.02 元/M vs 未命中 1 元/M),相加再计价会严重失真。
- reasoningTokens 已包含在 outputTokens 里,只做展示,不重复计费。
- 缓存写入不单独计费,DSH 日志中 cacheWriteTokens 恒为 0。
- 峰谷按调用发生时刻判定,不是按跑报表的时刻。高峰 = 北京时间周一至周五(不含中国法定节假日)9:00–12:00、14:00–18:00,其余为空闲;空闲价 = 高峰价的一半。
- 子代理单独列出,但计入所属工程合计。 本项目实测子代理占工程花费的 37%–66%,只统计主会话会严重少算。
- 按 cwd 归属工程(取自会话头),不靠目录名猜。

价目表

prices.json 是数据不是代码,调价只改这个文件。当前取自官方定价页(中文|英文),单位 元 / 百万 tokens:

| 模型 | 缓存命中(谷/峰) | 未命中(谷/峰) | 输出(谷/峰) |
| deepseek-flash | 0.02 / 0.04 | 1 / 2 | 4 / 8 |
| deepseek-v4-pro | 0.15 / 0.30 | 4.5 / 9 | 13.5 / 27 |

- deepseek-v4-flash、deepseek-v4-flash-vision-exp 是已下线旧名,请求由 DeepSeek-V4.1-Flash 提供并按 Flash 价格计费 —— 因此它们作为 aliases 映射到 deepseek-flash。
漏掉这层映射会让历史会话的这部分花费算成 0。
- 模型不在表里时,工具按 0 计并在 stderr 报警,不会静默少算。
- 调价后请更新 fetchedAt 与价格;peak.holidays 需要按年份补中国法定节假日(留空 = 不扣节假日;当前统计区间内无节假日,结果不受影响)。

数据来源

$DSH_HOME/sessions///session.v3.jsonl.zstd。

DSH 每追加一条事件就写一个独立的 zstd 帧,所以整个文件是多个帧的拼接。
Node 自带的 zstdDecompressSync 和流式接口都在第一帧后停止,会静默把日志截断成一条事件 —— lib/zstd.mjs 因此自己走帧结构定位边界后逐帧解压。

校验

node verify.mjs 把每个会话的折叠合计与 DSH 自己的 tokenUsage 投影逐会话对账:

sessions folded : 112
projection cache size: 112
exact match : 112
lagging (live) : 0
mismatch : 0
no projection entry : 0

投影缓存是周期性快照,正在写入的会话会领先于它,直接比 token 数会在活跃会话上报假失败。
所以脚本按投影的 seq 把两种情况分开:lagging 是快照落后(无法佐证,不算错), mismatch 才是真的折叠错误。只有 mismatch 会让退出码非 0。

已知限制

- 会话日志存在期间才有数据;会话被删除后其花费也随之消失(本工具无自有账本)。
- 逐步骤明细只覆盖 assistant/message 事件可解析的会话;更早的会话格式版本(v0–v2)未验证。
- 高峰期排除中国法定节假日,需要手工维护 peak.holidays。
预览分享卡片长什么样 ↓SJTUMalPan/dsh-usage-stats
分享 · DeepSeek Harness Hub
SJTUMalPan/dsh-usage-stats

统计各工程会话的 token 消耗与花费

这是你的仓库?认领条目

回到顶部