Skip to content
dsh.fish
Bundle

dsh-token-cost

DSH plugin: per-project LLM token usage and RMB cost (input / cache-hit / output) based on model standard prices.

Source
gdy01
stars
1 stars
License
MIT
Updated
Updated 4 days ago

Readme

# dsh-token-cost

A DSH plugin that shows per-project LLM token usage and converts tokens to **RMB cost**, split into:

- **输入(未命中)** — uncached input tokens
- **命中** — cache-hit input tokens (`cacheReadTokens`)
- **输出** — output tokens

Costs are calculated from the model's standard price table (CNY per 1M tokens). Unknown models are listed with their token counts but no cost, so you can add/override prices without touching code.

## Features

- Reads local DSH session logs (`~/.dsh/sessions` or `$DSH_HOME/sessions`).
- Aggregates by **project** (the session `cwd`) and by **model**.
- Adds a 💰 button to the DSH web sidebar footer; the panel shows project totals and expandable model-level breakdown.
- Zero runtime npm dependencies: uses Node's built-in `node:zlib` Zstandard decoder.
- Loopback-only HTTP API (`/dsh-token-cost/*`).

## Install

Install the **subdirectory** `dsh-token-cost`, not the parent `dsh plugin` folder. The parent folder has no `package.json`, so installing it produces no sidebar button.

Use the absolute path (the path contains a space, so **quote it**):

```sh
dsh plugin --profile web add "file:/Users/dg/Documents/dsh plugin/dsh-token-cost"
```

Or, from inside this directory:

```sh
cd /Users/dg/Documents/dsh plugin/dsh-token-cost
dsh plugin --profile web add "file:$PWD"
```

If you previously installed the wrong folder, remove it first:

```sh
dsh plugin --profile web remove "dsh plugin"
dsh plugin --profile web add "file:/Users/dg/Documents/dsh plugin/dsh-token-cost"
```

Then restart `dsh web` and refresh the browser. A 💰 button appears at the bottom of the sidebar.

You can also use the included installer script:

```sh
./scripts/install.sh
```

## How it works

The host plugin scans every `session.jsonl.zstd` / `session.jsonl` under the DSH sessions directory. It replays:

- `session.cwd` → project
- `request/header` → current model
- `assistant/chunk { type: 'usage' }` and `assistant/message.usage` → input / cache-hit / output tokens

The same `(turn, step)` usage sample is de-duplicated (a later `assistant/message` replaces the earlier usage chunk), matching DSH's own token-meter accounting.

## Price table

Built-in DeepSeek official RMB prices (元 / 1M tokens):

| Model | Input (miss) | Cache hit | Output |
|---|---:|---:|---:|
| `deepseek-chat` / `deepseek-v4-flash` | 2 | 0.5 | 8 |
| `deepseek-reasoner` / `deepseek-v4-pro` | 4 | 1 | 16 |

You can override prices in the profile's `cordis.patch.yml` (a patch row replaces the whole `config`, so include every price you want to keep):

```yaml
- id: token-cost
  config:
    prices:
      deepseek-chat:
        input: 2
        hit: 0.5
        output: 8
      deepseek-reasoner:
        input: 4
        hit: 1
        output: 16
      deepseek-v4-flash:
        input: 2
        hit: 0.5
        output: 8
      deepseek-v4-pro:
        input: 4
        hit: 1
        output: 16
```

## API

- `GET /dsh-token-cost/api/stats` — full per-project/per-model JSON
- `GET /dsh-token-cost/api/prices` — active price table
- `GET /dsh-token-cost/healthz` — liveness

## License

MIT

Install

dsh plugin --profile web add github:gdy01/dsh-token-cost#637ea42376fe29c309d7484c2edaf65420f9aa13

Profile: web

Source