DSH Plugin Store
Back to home

Ychris12138

dsh-usage-stats

Token usage heatmap, per-model breakdowns, and DeepSeek account balance for the DeepSeek Harness Web GUI (dsh web).

Stars
9
Language
JavaScript
Created
Aug 14, 2026
Updated
Aug 14, 2026
UIRuntime
GitHub repo

Introduction

dsh-usage-stats

CI version license

DeepSeek Harness 网页端提供 Token 用量热图、多供应商余额与订阅额度。

Token usage heatmap, provider/model breakdowns, account balances, and subscription quotas for the DeepSeek Harness Web GUI (dsh web).

dsh-usage-stats panel

功能 / Features

功能说明
统一供应商账户卡一次只显示当前选择的供应商;DeepSeek 等展示余额,OpenCode Go、Z.ai 展示订阅额度
订阅额度OpenCode Go 显示 5 小时/每周/每月窗口;Z.ai Coding Plan 显示会话、周额度与 MCP 月度额度
用量概览今日、本月、累计 Token,以及今日缓存命中率
月历热图按月浏览;颜色越深表示用量越高
日期下钻点击日期查看分供应商/分模型 Token、占比和输入/输出/缓存明细
增量聚合只折叠新增事件;检测到日志截断或重写时自动从头计算
本机边界API 同时校验 peer socket 与 Host;浏览器永远拿不到 API key

界面支持中文和英文。余额与订阅共用同一套供应商卡片框架:余额型供应商在卡内显示金额,订阅型供应商显示分窗口进度条;选择器切换后只渲染当前供应商。各类请求独立刷新,打开面板后立即加载,之后 Token 用量每分钟刷新、余额和订阅额度每五分钟刷新。

安装 / Installation

一条命令安装

需要 DeepSeek Harness 的 web profile(面向 @deepseek-ai/dsh >= 0.1.0-rc.6),以及随 Node.js 提供的 npx

在 PowerShell、命令提示符或 macOS/Linux 终端运行同一条命令:

npx --yes github:Ychris12138/dsh-usage-stats

安装器会自动完成两件事:把运行文件复制到 ~/.dsh/profiles/node_modules/dsh-usage-stats,并在 profiles/web/cordis.patch.yml 中幂等启用插件。重复运行同一命令即可更新,不会重复添加配置。

如设置了 DSH_HOME,安装器会使用该目录而不是 ~/.dsh。可先预览或只检查现有安装:

npx --yes github:Ychris12138/dsh-usage-stats --dry-run
npx --yes github:Ychris12138/dsh-usage-stats --check

如果不希望安装器修改 Cordis patch,可加 --no-enable,再自行配置。

可选:配置余额查询

余额查询会自动读取 Harness 中已配置的供应商:官方 DeepSeek 路由(llm-deepseek)以及每个 pi-ai 供应商 profile(llm-pi-ai,如 opencodeopencode-goopenrouterark 等)。每个供应商的 API key 由 Harness 的凭据服务按需解析,插件不存储任何 key。用量统计无需 key。

内置的余额查询方案:

供应商 id余额接口
deepseek / deepseek-official{baseURL}/user/balance
openrouter{baseURL}/api/v1/credits
moonshotai / moonshotai-cn / kimi{baseURL}/v1/users/me/balance
zai / zai-coding-cn{baseURL}/api/paas/v4/balance

其余供应商(如 OpenCode Go、火山方舟、OpenAI、Anthropic 等)没有公开的余额查询接口,面板会明确显示"该供应商没有公开的余额查询接口",而不是报错。

以 DeepSeek 为例,凭据保存在:

# ~/.dsh/.credentials.yaml
DEEPSEEK_API_KEY: sk-your-key-here

pi-ai 供应商(如 ark)的凭据按其 profile 里的 apiKeyEnv 保存(例如 ARK_API_KEY)。安装器不会读取、创建或修改凭据文件。不要把真实 key 提交到 Git,也不要把它粘贴给编码 Agent。

可选:配置订阅额度

订阅额度不是账户余额,因此使用独立的进度条界面。只配置你实际使用的供应商即可:

# ~/.dsh/.credentials.yaml
OPENCODE_GO_API_KEY: sk-opencode-your-key
ZAI_API_KEY: your-zai-key
# 中国区 Z.ai 用户可选;默认 global
ZAI_API_REGION: bigmodel-cn

OpenCode Go 按以下顺序寻找凭据:

  1. Harness 凭据 OPENCODE_GO_API_KEY
  2. OpenCode 自己的 ~/.local/share/opencode/auth.jsonopencode-go,回退 opencode);
  3. 高级兼容回退:OPENCODE_GO_AUTH_COOKIE + OPENCODE_GO_WORKSPACE_ID

前两种方式调用 https://opencode.ai/zen/go/v1/usage。它使用 sk-opencode-… Bearer Key,安装最简单,但目前仍是 OpenCode 自用的未公开文档接口,将来可能变化。第三种方式读取登录后的 workspace 页面,只建议接口发生兼容问题时临时使用;浏览器 Cookie 等同登录凭据,不应提交到 Git、日志或 issue。

Z.ai 使用 Coding Plan 的 quota/subscription 接口;全球区请求 api.z.ai,中国区请求 open.bigmodel.cn。选择 Z.ai 时优先展示更适合订阅计划的比例窗口,不会同时再堆叠一张余额卡。

重启

dsh web

浏览器硬刷新后,侧边栏底部会出现“用量/余额”(Usage/Balance)入口。

无法使用 npx 时:从源码安装
git clone https://github.com/Ychris12138/dsh-usage-stats.git
cd dsh-usage-stats
node scripts/install.mjs

使用 / Usage

  • 点击侧边栏入口打开面板。
  • 使用“当前供应商”选择器切换账户视图;面板一次只显示一个供应商。
  • DeepSeek、OpenRouter、Moonshot/Kimi 等余额型供应商显示金额;OpenCode Go 与 Z.ai 显示订阅比例、窗口和重置时间。
  • 未配置、凭据失效、限流和接口不可用会在同一张供应商卡片中显示不同状态。
  • 使用 切换月份,点击“今天”返回当前月份。
  • 点击热图日期或最近 14 个日历日列表,查看当天的分供应商/分模型明细(同一模型来自不同供应商会分开显示,如 deepseek-official · deepseek-v4-flashark · deepseek-v4-flash)。
  • 标题栏刷新按钮会同时重新请求用量、供应商列表、当前供应商余额和订阅额度。

“最近 14 天”按本地日历计算,只显示窗口内存在用量的日期;未来时间戳不会计入该列表。

Agent 友好安装 / Agent-friendly installation

可以把下面整段直接交给 Codex、Claude Code 或其他本地编码 Agent:

Install or update dsh-usage-stats from:
https://github.com/Ychris12138/dsh-usage-stats

Constraints:
- Resolve DSH_HOME from the environment; otherwise use ~/.dsh.
- Do not read, print, edit, or request .credentials.yaml, auth.json, cookies, or any API key.
- Do not expose the plugin through a reverse proxy.
- Do not restart or terminate an existing dsh process without asking me.

Procedure:
1. Confirm node, npx, and dsh are available.
2. Run: npx --yes github:Ychris12138/dsh-usage-stats
3. Require the installer to report a verified package and exactly one Cordis patch entry.
4. Report the resolved install and patch paths.
5. Run the installer again with --check and require a zero exit code.
6. If dsh web is already running, tell me a restart is needed and stop.

Optional subscription setup (do not handle secrets yourself):
- Tell me that OpenCode Go can reuse its local auth.json automatically, or I can add OPENCODE_GO_API_KEY to the Harness credentials file myself.
- Tell me that Z.ai requires ZAI_API_KEY; China-region accounts may also set ZAI_API_REGION=bigmodel-cn.
- Never ask me to paste a key or browser cookie into chat.

安装器本身提供清晰的退出码:未知参数返回 2;文件、版本或配置验证失败返回非零;成功时输出已验证版本、安装路径和 patch 路径。因此 Agent 不需要自行解析或重写 YAML。

Agent 如果只获准检查而不能修改,应运行:

npx --yes github:Ychris12138/dsh-usage-stats --check

隐私与安全 / Privacy & security

  • API key、OpenCode auth.json 内容与兼容 Cookie 不会发送到浏览器、写入插件缓存或日志。服务端只通过 HTTPS 把相应凭据发往对应供应商域名。
  • 余额响应只包含 isAvailablecurrencytotalgrantedtoppedUpfetchedAt,不包含 key。
  • 订阅响应只包含供应商、计划、状态、额度窗口百分比和重置时间,不包含 key、Cookie 或 workspace 页面正文。
  • 用量缓存在 ~/.dsh/storages/usage-stats-cache.json,只保存按日期/供应商/模型聚合的 Token、会话 id、不透明修订号与折叠游标,不保存提示词、回复正文或文件路径。
  • 四个端点仅接受 GET,并同时校验 req.socket.remoteAddress 与 Host;支持 IPv4、IPv4-mapped IPv6 和 [::1]:port

本机反向代理会让插件看到代理自身的回环地址。请勿把这些端点经反向代理暴露到局域网或公网;如确需代理,请在代理层增加可靠的认证与访问控制。

安全问题请按 SECURITY.md 私下报告,不要在公开 issue 中附带 API key、会话内容或可利用细节。

聚合与正确性 / Aggregation & correctness

统计值来自 assistant/chunkassistant/message 事件中的 provider-reported usage,不是本地估算。相同 turn/step 的后续 usage 样本会替换前一个样本,与 Harness 的 token usage projection 语义一致。每个样本按 provider/model 归集(取自 data.message.source,兜底 request/headerdata.header.config),因此同一模型在不同供应商下会分开统计。

  • 活跃会话只处理内存中新追加的事件。
  • 持久化会话优先使用 sessionPersistence.listSnapshots() 的不透明 revision;revision 未变化时不读取日志。
  • seq 出现缺口、revision 变化但没有新尾部,或 live/persisted 状态切换时,会对该会话完整重折叠。
  • 聚合请求采用 single-flight,并在同一临界区内原子写入缓存,避免并发保存覆盖。

开发环境中的真实日志曾以四条路径交叉核对:原始 JSONL/Zstandard artifact、session.history、插件端点和官方 tokenUsage projection。验证脚本会逐会话比较,并在文件缺失、读取失败、覆盖不完整或数值不一致时返回非零退出码。

开发与验证 / Development

客户端是无需构建步骤的手写 __ModuleLoader__ bundle;服务端是 Cordis 插件,聚合核心位于纯函数模块。

npm install
npm run check
npm test
npm pack --dry-run

npm test 完全离线运行:客户端渲染/请求并发/币种回归,以及服务端的 IPv6、外部 peer、GET-only、会话切换和日志重写回归。干净 clone 会从项目 devDependencies 解析 React;只有显式设置 SMOKE_NODE_MODULES 时才改用其他模块目录。

真实数据集成验证需要先运行 dsh web(默认 127.0.0.1:3080):

npm run validate:live
node scripts/check-balance.mjs

validate:live 依赖 JSONL/Zstandard 会话 artifact,并要求每个带 token projection 的会话都有可读 raw artifact;否则会明确失败,而不是给出假阳性。check-balance.mjs 会访问官方 API 并打印余额响应,适合本机诊断,不应把输出粘贴到公开 issue。

所有服务端脚本都遵循 DSH_HOME;未设置时默认为 ~/.dsh

API

MethodPathResponse
GET/api/usage-stats/usage按日期/供应商/模型统计的 Token、缓存命中率与更新时间
GET/api/usage-stats/providers已配置的供应商列表(含余额方案与凭据是否已配置)
GET/api/usage-stats/balance?provider=<id>所选供应商的脱敏余额与获取时间;省略 provider 时默认官方 DeepSeek 路由
GET/api/usage-stats/subscriptionsOpenCode Go 与 Z.ai 的脱敏订阅状态、百分比窗口和重置时间

其他方法返回 405,非回环请求返回 403。响应均为 JSON,并带 Cache-Control: no-cache

项目结构

lib/index.js              server routes, incremental cache, provider-aware balance
lib/usage.js              pure token-usage aggregation (provider/model keys)
lib/balance.js            provider balance schemes (deepseek/openrouter/moonshot/zai)
lib/subscriptions.js      normalized OpenCode Go and Z.ai quota adapters
lib/client.js             balance and subscription UIs, provider picker, heatmap
scripts/smoke-client.mjs  offline client regressions
scripts/install.mjs       cross-platform idempotent installer
scripts/test-install.mjs  installer regression and idempotency test
scripts/test-server.mjs   offline server regressions
scripts/test-balance.mjs  offline balance-scheme unit tests
scripts/test-subscriptions.mjs offline subscription-adapter tests
scripts/validate-fold.mjs live projection comparison
scripts/verify-raw.mjs    four-path raw-data verification

兼容性说明

当前版本为 0.1.2。插件依赖 DeepSeek Harness 的客户端模块加载器、Cordis 服务和 session persistence 接口;Harness 预发布版本升级后如这些内部接口变化,可能需要同步适配。

参考与致谢 / References

本项目重新实现统一的 subscription adapter 和单供应商账户卡片,不复制上述项目的 UI;OpenCode Go 的 usage endpoint 尚未公开文档,因此保留 dashboard 兼容回退并由测试锁定两种响应格式。

License

MIT