← Back to home@Carrick-K7

dsh-ai-quota

DeepSeek Harness plugin: AI subscription quotas & balances (Codex, Kimi, DeepSeek, OpenCode Go) — model tool, Settings page, composer chip

Stars
1
Language
JavaScript
Created
Aug 24, 2026
Updated
Sep 20, 2026
GitHub repo

Introduction

dsh-ai-quota

A DeepSeek Harness plugin that shows your AI subscription quotas & balances — Codex, Kimi, GLM Coding Plan, DeepSeek, 302.AI, OpenCode Go — in one place.

DSH plugin GitHub stars License: MIT

English · 中文

Preview

AI Quota settings page

Settings page: per-window usage bars (Codex / Kimi / GLM Coding Plan / OpenCode Go) and plain balances (DeepSeek, 302.AI), with manual refresh and a freshness line in relative time; the gear button opens the embedded visibility settings, one switch per provider.

Features

  • Model tool query_ai_quota — ask any agent session to check your quota; returns a human-readable summary.
  • Settings page — an "AI Quota" section with per-window usage bars and balances, plus manual refresh.
  • Per-provider visibility — the gear button in the section header opens a second level inside the same settings page: one switch per provider. A provider with no key or login state keeps its row, its switch stays inert, and the row names what is missing (which key, login, or CLI); a switch you can flip is the detection signal, so there is no separate "detected" badge. Everything detected is on by default, so a key added later appears on its own. The choice applies to the list and to the composer chip, and is stored in the browser (localStorage), so flipping one is instant — no host round-trip, no plugin reload. The query_ai_quota tool always returns every provider.
  • Composer chip — a one-line quota indicator that follows the selected provider route (never the model id: the same model can be served by several routes with independent quotas), on both the new-chat page and in sessions.
  • Auto-refresh — the host re-queries all providers every refreshIntervalMs (default 2 min; 0 disables) and serves a warm cache, so every surface reads instantly. An open conversation additionally re-reads its provider's quota every 60 s (silently, without a loading flicker), so a session left running for a while never keeps the balance it loaded with; a hidden tab is skipped and caught up when it becomes visible again.
  • Unified format — providers are normalized to subscription windows or balance entries; one provider failing never affects the others.
  • Skin-aware palette — every readout color is a CSS variable: with the dsh-miku-skin Hatsune skin loaded the chip and usage bars turn soft Miku teal, and without it they keep the shipped emerald/amber/red severity colors. A bar that reaches amber or red also tints its own hairline to match, so the whole meter reads as one state; a healthy bar keeps the quiet neutral outline.
  • No secrets in output — API keys and tokens never appear in tool output or logs.

Install

dsh plugin --profile web add github:Carrick-K7/dsh-ai-quota

The bundled cordis.patch.yml declaration makes dsh plugin append the plugin row to dsh.profile.bundles automatically. Restart dsh web afterwards (pnpm must be on PATH).

Configuration

All keys optional, defaults shown.

KeyDefaultMeaning
timeoutMs15000Per-provider query timeout (ms)
refreshIntervalMs120000Auto-refresh interval (ms); 0 = off
codexClicodexcodex CLI command or absolute path
deepseekApiKeyEnvDEEPSEEK_API_KEYDSH credential ref (fallback: same-named env var)
opencodeGoApiKeyEnvOPENCODE_GO_API_KEYDSH credential ref (fallback: same-named env var)
ai302ApiKeyEnvAI_302_API_KEYDSH credential ref (fallback: same-named env var)
glmApiKeyEnvZAI_CODING_CN_API_KEYDSH credential ref for the GLM Coding Plan key (falls back to ZAI_CODING_API_KEY, then GLM_CODING_API_KEY)
deepseekBaseUrlhttps://api.deepseek.comDeepSeek API base URL
opencodeBaseUrlhttps://opencode.ai/zen/go/v1/usageOpenCode Go usage endpoint
ai302BaseUrlhttps://api.302.ai302.AI API base URL
glmBaseUrlhttps://open.bigmodel.cnGLM Coding Plan API host; only the origin is used, so a coding base like …/api/coding/paas/v4 works. International accounts: https://api.z.ai
kimiBaseUrlhttps://api.kimi.com/coding/v1Kimi usage endpoint base (appends /usages)
kimiOauthHosthttps://auth.kimi.comKimi OAuth refresh endpoint (appends /api/oauth/token)
kimiClientIdKimi Code CLI's public client idOAuth client_id (usually unchanged)

Composer chip routing

The chip reads the provider route of the current model selection (e.g. opencode-go-carrick, kimi-coding, deepseek-official, openai-codex) and never the model id — kimi-k3 on an OpenCode Go route is an OpenCode Go quota, not a Kimi one. A route is recognized when its id (or, for an opaque alias, its provider display name) contains one of 302, opencode, codex, kimi/moonshot, deepseek, zai/zhipu/bigmodel/glm. Any other route shows no chip rather than another account's balance.

The chip then re-reads that provider every 60 s while it is mounted, reading the host's warm cache (so no extra upstream calls). If the host snapshot itself is older than 10 min — i.e. the host auto-refresh is off or stalled — the poll escalates to a real query, throttled to once per 10 min per provider.

Credentials

  • DeepSeek / 302.AI / OpenCode Go: key resolved through the DSH credentials seam first — apiKeyEnv is a credential ref (defaults DEEPSEEK_API_KEY / AI_302_API_KEY / OPENCODE_GO_API_KEY), so a key stored in DSH (e.g. $DSH_HOME/.credentials.yaml) wins; a same-named process env var is the fallback for standalone deployments. OpenCode Go also falls back to the opencode-go entry in ~/.local/share/opencode/auth.json.
  • GLM Coding Plan: key resolved through the same credentials seam; the default ref is ZAI_CODING_CN_API_KEY, with ZAI_CODING_API_KEY and GLM_CODING_API_KEY tried next, so either region's key name works. Point glmBaseUrl at https://api.z.ai for an international coding plan.
  • Codex / Kimi: no keys — the local CLI login state is reused (codex CLI on PATH; Kimi Code CLI's OAuth session, auto-refreshed when expired, kimi login again if it is gone).

Data sources

ProviderSource
CodexLocal codex app-server --stdio JSON-RPC (account/rateLimits/read) — 5h / 7d windows
KimiGET {kimiBaseUrl}/usages (Kimi Code CLI's OAuth login state)
GLM Coding PlanGET {glmBaseUrl}/api/monitor/usage/quota/limit (bearer key) — 5h credit cycle / weekly quota / monthly MCP budget
DeepSeekGET {deepseekBaseUrl}/user/balance (bearer key)
302.AIGET {ai302BaseUrl}/dashboard/balance (bearer key)
OpenCode GoGET {opencodeBaseUrl} (bearer key)

License

MIT