Bundle
dsh-token-stats
DSH plugin: token usage & cost statistics per model / date / session with history backfill and CSV/JSON export
- Source
- 1841220388zzzcccxxx-star
- stars
- 3 stars
- License
- MIT
- Updated
- Updated 9 hours ago
Readme
# dsh-token-stats
Token usage & cost statistics plugin for [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeek-Harness) (DSH).
Tracks token consumption per **model**, per **date**, and per **session** with cost estimation in **USD / CNY**,
served as a native page under **Settings β π Token Stats**. Installed as an external DSH plugin, it loads
automatically at DSH startup β no manual activation needed.
[δΈζθ―΄ζ](./README.zh-CN.md)
## Features
- π Native settings page (dark/light aware, follows DSH theme tokens, i18n zh/en)
- π Daily / weekly / monthly trends with an SVG line chart (zero dependencies)
- π° Cost estimation (USD & CNY) from a built-in pricing table for DeepSeek, GPT, Claude, Gemini, Qwenβ¦
- π History backfill: scans all persisted session logs at startup, so stats survive restarts
- β‘ Fast: batched session-title reads with an in-memory cache (TTL 5 min), single-pass summaries, memoized pricing
- π€ CSV / JSON export, filterable by model and session
## Screenshot

## Installation
The plugin is installed as an external DSH profile dependency.
1. Clone / copy this repository to a local folder, e.g. `D:\dev\dsh-token-stats`
2. In your DSH profile manifest (`~/.dsh/profiles/web/package.json`):
```jsonc
{
"dependencies": {
"dsh-token-stats": "file:D:/dev/dsh-token-stats"
},
"dsh": {
"profile": {
"bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-token-stats"]
}
}
}
```
3. `cd ~/.dsh/profiles/web && pnpm install`
4. Restart DSH web. Open **Settings β π Token Stats**.
> `cordis.patch.yml` declares the bundle-layer mount point so the plugin auto-loads at startup.
## How it works
- **Authoritative data** = DSH persisted session logs: `assistant/message` events carry real `usage`
(input / output / cache-read / cache-write / reasoning tokens), `request/header` events carry provider/model.
- A one-shot backfill at startup (`sessionQuery`) rebuilds the in-memory aggregation index from all history
(bounded concurrency).
- `llm/stream` usage chunks are captured for live (display-only) in-flight totals.
- When an adapter reports no usage, `tokenMeter.estimateMessage` is used and the record is flagged `estimated`.
## HTTP API (`/token-stats/api`)
| op | description |
| --- | --- |
| `summary` | today / week / month / total aggregates |
| `query` | time series (day/week/month) + per-model / per-session aggregates; filters: `model`, `sessionId`, `from`, `to` |
| `models` | built-in pricing table (USD per 1M tokens) + USDβCNY rate |
| `sessions` | session list (`id` + `title`) |
| `export` | CSV / JSON dump (`format=csv\|json`, optional `model` / `sessionId`) |
## Development
```powershell
node --check index.js # server half
node --check client.js # browser half
node test-plugin.js # standalone mock tests: correctness + performance benchmarks
.\sync-deploy.ps1 # re-sync sources into the DSH profile (then restart DSH web)
```
## Performance
Measured on the author's machine (14 sessions / ~10k records):
| endpoint | before | after |
| --- | --- | --- |
| `sessions` | ~1700 ms (N serial `readTitle` calls) | ~12 ms (one batched `readTitleSnapshots` + cache) |
| `summary` | ~110 ms (4Γ full-array filters) | <1 ms (single pass) |
| `query` | ~10 ms | ~18 ms at 10k records (memoized cost) |
## License
[MIT](./LICENSE) Β© 2026 quansheng
Install
dsh plugin --profile web add github:1841220388zzzcccxxx-star/dsh-token-stats
Profile: web
With the hub plugin installed, ask your agent to install it by name β it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-token-stats from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.