CCCq-C
dsh-api-cost
DeepSeek Harness 插件:实时显示本会话 API 用量开销 / Real-time per-session API cost meter for DeepSeek Harness
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 15, 2026
- Updated
- Aug 15, 2026
Introduction
dsh-api-cost
English | 中文
A Host + Web Client plugin for deepseek-harness
(dsh): shows the real-time per-session API cost — the provider-reported
token usage (uncached input / cache-hit input / output) priced with a
configurable per-model rate table, rendered as a live chip above the composer.
Installable via dsh plugin add.
Features
apiCostsession projection (host half): a pure fold over the session log that prices each provider usage sample at the model's rate, so streaming usage chunks update the cost live and the finalizedassistant/messagenever double-counts.- Composer-dock chip (browser half):
API cost $0.0023 1.2K + 3.4K tok, updating in real time; hover shows a per-bucket breakdown (input / cache hit / cache write / output, plus the model id). - Configurable pricing: USD per one million tokens; unknown models fall back
to a default rate table, and per-model overrides ride the plugin row's
config(see Configuration). - Bilingual UI (中文 / English), following the host locale.
- Self-contained: no host-repository changes — the in-package
cordis.patch.ymlinserts its own row as a bundle layer.
Installation
dsh plugin --profile web add dsh-api-cost
The installer adds the package to the web profile's dependencies and bundle
list; after restarting dsh web, the loader applies the in-package
cordis.patch.yml automatically. Then open any session and send a message —
the cost chip appears above the composer and ticks up as tokens stream.
Manual install (same mechanism, bypassing the installer): edit
$DSH_HOME/profiles/web/package.json — add "dsh-api-cost": "<version>" to
dependencies and "dsh-api-cost" to the dsh.profile.bundles array — then
run pnpm install in that directory and restart.
Peer dependencies are the official @deepseek-ai/* packages (^0.1.0-rc.6)
plus react, all provided by the host.
Configuration
The plugin ships usable defaults and has no Config schema: override pricing by
setting config on the api-cost row in the profile's cordis.patch.yml
(e.g. $DSH_HOME/profiles/web/cordis.patch.yml):
- id: api-cost
config:
currency: USD
# fallback rates for unknown models (USD per 1M tokens)
rates:
input: 0.27
cacheRead: 0.07
cacheWrite: 0.27
output: 1.1
# per-model overrides (partial objects merge over `rates`)
models:
deepseek-chat:
input: 0.27
cacheRead: 0.07
cacheWrite: 0.27
output: 1.1
deepseek-reasoner:
input: 0.55
cacheRead: 0.14
cacheWrite: 0.55
output: 2.19
deepseek-v4-pro:
input: 0.27
cacheRead: 0.07
cacheWrite: 0.27
output: 1.1
deepseek-v4-flash:
input: 0.14
cacheRead: 0.03
cacheWrite: 0.14
output: 0.55
Billing buckets follow the harness TokenUsage convention (disjoint counts):
DeepSeek's prompt_tokens already includes cache hits, and the official
adapter subtracts cacheReadTokens out of inputTokens, so:
| bucket | meaning | rate |
|---|---|---|
inputTokens | cache-miss input | input |
cacheReadTokens | cache-hit input | cacheRead |
cacheWriteTokens | cache write (not reported by DeepSeek) | cacheWrite |
outputTokens | output | output |
deepseek-v4-pro/deepseek-v4-flashdefaults are placeholders — update them once official pricing is published.
Projection
The apiCost session projection exposes:
| field | meaning |
|---|---|
cost | total cost (currency units) |
inputCost / cacheReadCost / cacheWriteCost / outputCost | per-bucket cost |
inputTokens / cacheReadTokens / cacheWriteTokens / outputTokens | per-bucket tokens |
model / provider | current route (last-wins) |
currency | currency code |
Known Limitations
- Estimate, not a bill: cost is computed from the local session log and may differ from the official invoice (provider-side caching, price changes, model renames). The rate table is the single source of truth — keep it current.
- Model-switch granularity: each usage sample is priced at the route that was current when it was reported, so switching models mid-session prices later steps at the new model's rate.
- Subagents have their own session ids and are not aggregated into the parent session's chip.