hiro-nikaitou
dsh-ocg-billing
DeepSeek Harness (dsh) plugin: OpenCode Go billing layer with cached official pricing, proactive update checks, bill computation and a resident composer bill line
- Stars
- 1
- Language
- JavaScript
- Created
- Aug 14, 2026
- Updated
- Aug 14, 2026
Introduction
dsh-ocg-billing
中文 | English
OpenCode Go billing layer for DeepSeek Harness (dsh).
This plugin adds a billing layer on top of dsh's existing usage tracking (per-session TokenUsage recorded in session logs). It fetches the official OpenCode Go pricing docs once, caches the price table to disk, and re-checks it proactively — billing always runs against the cache, never against a live fetch. It also calls the default model to analyze the bill, and shows a resident bill line under the web composer.
This is a community plugin, not affiliated with DeepSeek AI or OpenCode. Prices are estimates computed from the official docs; actual charges come from your OpenCode Go subscription statement.
Features
- Resident bill line (web UI) — under the composer card (conversation.composer.dock): global 7-day cost, monthly limit progress, current-session cost, top models, price-source freshness. Auto-refreshes every 60s; click to refresh instantly.
- Cached official pricing — ocg_pricing_check re-fetches opencode.ai/docs/go, diffs against the cache, and updates the cache only when the table changed (force: true forces a refresh). A 24h background check runs automatically. Billing never re-queries the website.
- Bill computation — ocg_bill: global (all sessions in the last N days) or per-session (scope=session + sessionId), broken down by model and by session. Uses the official per-1M-token rates including Cached Read / Cached Write, and tiered rates (GPT 5.6 Luna 272K, Qwen3.7/3.6 Plus 256K). Unknown models are listed at zero cost.
- Default-model analysis — ocg_bill_analyze computes the bill and asks the default model (the agent-default-model selection, e.g. opencode-go/deepseek-v4-flash) for a summary, anomalies, top cost drivers, and saving recommendations.
Install
Prerelease note: DeepSeek Harness is in developer preview; peer ranges follow the installed 0.1.0-rc.6 mainline.
# from a profile
dsh plugin --profile web add <path-to-this-repo> # or link:/absolute/path
# or overlay-style in ~/.dsh/config.yaml
# - insert:
# - id: ocg-billing
# name: '@hiro-nikaitou/dsh-ocg-billing'
Restart dsh web. The bill line appears under the composer once the plugin loads (browser half activates after approval).
Tools (model-visible)
| Tool | Purpose |
|---|---|
| ocg_pricing_status | Cached price table, source, fetch time, cache health. Never fetches. |
| ocg_pricing_check | Proactively re-fetch the official docs and diff against the cache; updates only on change (or force). |
| ocg_bill | Bill computation: global or per-session, by model and by session. |
| ocg_bill_analyze | Bill + default-model analysis (summary, anomalies, savings). |
How it works
- Price cache: D:\appdata\dsh\ocg-billing\pricing.json (first run seeds from the built-in snapshot of the official docs; seed flag in status). Model list: 20 docs models + extra seed entries for models configured but not listed in the docs (source tagged models.dev/unknown).
- Usage source: relies on dsh's existing usage records — request/header + assistant/message events in each session log (the same data live-stats reads). Global scope aggregates sessions created within the window; session scope prices one sessionId.
- Fetch channel: ctx.subprocess + curl.exe (the bash/shell seam is unavailable on Windows); falls back to ctx.shell elsewhere.
- RPC: client polls GET /api/ocg-billing/panel?sessionId=... (registered via ctx.webServer); the host caches the global aggregation for 5 minutes.
Pricing rules
- cacheRead billed at the official cache-read rate (fallback: input rate); cacheWrite at the official rate (fallback: output rate).
- Tiered models pick the tier by per-request input tokens.
- Unknown models are priced at 0 and reported in unknownModels.
- Subscription fee ($10/month) is shown as reference, not added to usage cost.
License
Disclaimer
Prices are parsed from the official docs page and may lag or mis-parse after upstream layout changes — run ocg_pricing_check to refresh. This plugin is not affiliated with DeepSeek AI or OpenCode.