dsh-quota-panel
Bottom-right quota capsule that auto-discovers every configured provider (DeepSeek, OpenRouter, SiliconFlow, GLM, one-api/new-api, coding plans) and shows balance or rolling 5-hour and weekly usage, with per-provider visibility, alert thresholds and proxy support; also queries Volcengine Ark Agent P
Install
dsh plugin --profile web add dsh-quota-panel
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✗ |
| 2 list | — |
| 3 mount | — |
| 4 boot | — |
dsh: initialized profile web at /home/node/.dsh/profiles/webFour stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-quota-panel
[English](README.md) | 中文
dsh-quota-panel 是 DeepSeek Harness(DSH)网页端(dsh web)的供应商额度/余额状态组件。
它驻留在产品界面右下角,监控你配置过 API Key 的每一个 AI 供应商,
一眼看清还剩多少余额/额度——DeepSeek、OpenRouter、SiliconFlow、Moonshot、
StepFun、xAI、智谱 GLM、OpenCode Go、火山方舟(Agent/Coding Plan),one-api / new-api 风格的聚合站,
以及各家 Coding Plan(智谱 GLM Coding、Z.AI、Kimi Coding、MiniMax
Coding 国际/国内):5 小时窗口、周配额与 MCP 月度额度一目了然。
StepFun、xAI、智谱 GLM、OpenCode Go、ChatGPT 订阅(Plus/Pro,经 Codex 登录),
one-api / new-api 风格的聚合站,以及各家 Coding Plan(智谱 GLM Coding、Z.AI、
Kimi Coding、MiniMax Coding 国际/国内、火山方舟 Agent/Coding Plan):5 小时窗口、
周配额与 MCP 月度额度一目了然。
v0.5 起为双面插件 + 内置供应商目录自动发现:安装并重启 dsh web 后,
凡是 key 能解析的供应商都会自动出现在面板上——零配置。
它零 npm 依赖,也不需要 allowBuilds 构建授权。
效果图(真实浏览器渲染)
收起胶囊,浅色:
展开卡片,浅色:
设置面板(⚙),浅色:
收起胶囊,深色:
展开卡片,深色:
设置面板(⚙),深色:
支持的功能
- 自动发现 —— 宿主侧内置常见供应商目录,每项声明该供应商标准的 credential
引用名;**key 能解析($DSH_HOME/.credentials.yaml / .env / 环境变量)的供应商
自动出现在面板上**,零配置;删除 key 行即消失。DSH 没有凭据枚举 API,
因此每个刷新周期都会探测一次目录。
- 两种尺寸 —— 收起:极简胶囊,每个账户一个「独立状态点 + 数值」对
(● ¥58.36 · ● 45%);展开:完整卡片,每个供应商一行(状态点、名称、主数值、
次级信息,用量型供应商还有进度条)。
- 自动刷新 —— 跟随配置间隔(默认 60 秒),页面隐藏时暂停;刷新按钮请求期间旋转,
重复点击不会触发并发请求。
- 逐账户状态 —— 余额行按分级阈值(
critical <= warn <= healthy),
用量行按百分比(error >= warn);只有异常的点和数值变色,其余保持平静。
用量百分比使用手机电量式三色着色,与状态点独立。
- 设置面板(⚙) —— 逐供应商显示开关、刷新间隔、逐供应商预警阈值、
逐供应商 HTTP(S) 代理 URL、胶囊显示模式(自动 = 最高窗口(默认)/
5h 窗口 / 周窗口 / 最高窗口)、「恢复默认」。全部本地设置即时生效,
保存在浏览器 localStorage,绝不写入 profile 或上传。
- 按行 HTTP(S) 代理 —— 为无法直连的供应商配置代理(见下)。
- Coding Plan 用量窗口 —— 智谱 / Z.AI / Kimi / MiniMax 套餐渲染为用量行:
5 小时窗口、周配额与(GLM/Z.AI)MCP 月度车道,各带重置倒计时;
套餐没有的窗口显示 —,绝不伪造 0%。
- one-api / new-api 聚合站 —— 内置
openai-billing格式适配聚合站仪表盘。 - 主题跟随 —— 完全使用 Harness 设计 Token(
--dsw-alias-、--dsw-static-、
--dsw-shadow-、--dsw-font-)驱动,token 缺失时有合理 fallback,
自动跟随产品主题(浅色/深色),不携带自己的配色。
- 构架即安全 —— API Key 绝不进入浏览器;浏览器只与本插件在 DSH 自带
/api
鉴权通道(受信任主机 + 浏览器会话围栏)中的方法通信,只接收归一化视图(见「实现逻辑」)。
不支持的功能(规划中)
- usage-only 供应商 —— OpenAI、Anthropic、Together、Groq、Mistral、Cohere、
DashScope、百川没有公开的「剩余余额」接口,只有 usage/cost 类查询
(通常需要 admin key 与时间窗参数,语义是「已花多少」而非「还剩多少」)。
计划作为独立的 usage 型行接入,显示月度花费(首选 Anthropic Admin API 与
OpenAI usage API)。
- 仅 Cookie / CLI 的 Coding Plan —— 通义 Token Plan(百炼控制台)、小米 MiMo
Token Plan 与 Qoder 的配额页没有 API-key 查询端点:需要网页 Cookie、
arkcli 命令行或聊天接口限频探测(依据
CodexBar 的调研)。
火山方舟(豆包)的 Agent Plan / Coding Plan 已通过 AK/SK OpenAPI 接入(见上表)。
本插件其余供应商只使用 API key/Bearer 认证。
- socks5 代理 —— 仅接受 HTTP/HTTPS 代理(socks URL 会被拒绝并给出清晰的单行错误)。
- 自定义适配器 —— 无法从 profile 扩展新的上游格式;
format值超出内置集合时
在挂载时 fail loud。
- 多位置挂载 —— 组件只存在于
shell.overlay槽位(右下角),
不支持侧边栏、顶栏或状态栏位置。
申请新增供应商
缺少你想监控的供应商?欢迎提 issue,附上:
1. provider id(^[a-z0-9-]+$,如 together);双站点供应商的国内站用
-cn 后缀(参考 siliconflow / siliconflow-cn);
2. 获取余额的 API URL —— 用该供应商的标准 API key 即可查询剩余
余额/额度的公开端点(如 GET https://api.provider.com/v1/user/info,
Bearer 认证);能贴一段响应 JSON 结构更好。
目录接入只需要这些:一个标准凭据引用可解析的 id、一个端点、一个响应
格式适配器。只有 Cookie/CLI 配额页的供应商(见上)在官方提供
API-key 端点前无法支持。
实现逻辑
┌─────────────── browser (lib/client.js) ───────────────┐
│ shell.overlay 槽位 → 胶囊 / 卡片 / 设置面板 │
│ localStorage: 显示开关 · 间隔 · 阈值 · │
│ 代理 URL(前端设置) │
└──────────────┬─────────────────────────────────────────┘
│ Connection /api 通道(浏览器会话围栏):
│ POST /api/dsh-quota-panel/specs(渲染提示)
│ POST /api/dsh-quota-panel/fetch-all { proxy }
┌──────────────▼────────────── host (lib/index.js) ──────┐
│ ctx.credentials → API Key(绝不离开宿主) │
│ 目录探测 → 自动发现(15 个内置供应商) │
│ 逐行请求 → 代理引擎(CONNECT 隧道 / 绝对 URI)→ 上游 JSON │
│ 归一化 → {balance | usage | info} 视图模型 │
└─────────────────────────────────────────────────────────┘
- 宿主侧(
lib/index.js)注册一条仅限回环的 Connection RPC 通道
/dsh-quota-panel,两个端点:
specs—— 解析后的行,只含渲染提示(id、label、行类型、货币、阈值分级、
窗口标签、已配置的代理名)。不含凭据,不含 endpoint。
fetch-all—— 拉取每个可见行,把上游响应归一化为通用视图模型
(balance / usage / info),返回 {rows: [{id, view} | {id, error}], fetchedAt}。
上游原始 JSON 与 key 一样留在宿主侧;单行失败不影响其他行。
- 自动发现 —— DSH 的凭据库没有枚举 API,因此宿主侧在每个刷新周期探测目录项
的标准引用名;key 能解析的条目加入面板,解析不到的跳过(只有通过 providers
显式配置的行,key 缺失才会给出清晰的单行错误)。
- 代理引擎 —— 零依赖手写
proxiedGetJson:https 目标走 HTTPCONNECT隧道
(TLS over 隧道),http 目标走绝对 URI 转发。每行独立 15 秒超时、1 MB 响应上限。
代理选择优先级:前端设置面板 > profile 配置 > 直连。
- 阈值判断发生在客户端 —— 基于
specs提示,因此本地阈值覆盖无需重新拉取;
profile 阈值随 specs 下发,前端设置在其之上本地覆盖。
- 配置校验 —— 导出的
Configschema(vendor 的 schemastery)声明结构与默认值;
跨字段约束(id 唯一、critical <= warn <= healthy、代理引用存在、catalog 覆盖键合法)
由宿主侧在挂载时校验,失败即报错(fail loud)。
- DOM 安全 —— 卡片只用
createElement/textContent构建 DOM,API 返回值绝不
经过 innerHTML;技术错误(401、超时、凭据缺失、代理拒绝)只写入 title 悬停提示
或行内错误文案。
- 代理故障绝不会带崩宿主 —— 代理引擎打开的每个 socket 与请求都会把
error
事件汇入该行结果,因此代理不可达(例如 clash 没开、ECONNREFUSED 127.0.0.1:7890)
只显示为该行的错误,而不是未处理的 EventEmitter error。
需要的配置
开箱即用:什么都不用配。 安装、重启,key 能解析的供应商自动出现。
下表只用于调优。
所有键都可选——结构与默认值在导出的 Config schema 里,profile patch 可省略一切
带默认值的字段。
键 · 含义 · 默认值
auto · 探测内置目录,key 已配置的供应商自动上板 · true
hide · 要隐藏的行 id 列表(目录行与显式行都生效) · []
proxies · 代理定义 {<名称>: "http://host:port"},仅 HTTP(S) · {}
catalog · 对自动行的局部覆盖 {<目录id>: {...}} · {}
refreshMs · 自动刷新间隔 · 60000
providers · 显式行;同 id 整体替换目录行 · []
catalog 每项可覆盖:label / endpoint / format / proxy / refs(探测的
credential 引用名,UPPER_SNAKE)/ secretRefs(第二凭据引用,火山方舟 AK/SK 场景使用,
必须与
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::24,最后更新 2026-09-24