dsh-quota
在 DeepSeek Harness 输入框下方的状态栏(conversation.composer.dock)显示当前模型所属厂商的套餐额度,并随模型切换自动切换。
GLM 5h 21% ▰ · 周 6% ▰ ← 当前模型在智谱(zai-coding-cn)
OpenCode 5h 8% ▰ · 周 3% ▰ · 月 1% ▰ ← 当前模型在 OpenCode Go(opencode-go,三窗口用短标签)
Kimi 5h 24% ▰ · 周 42% ▰ ← 当前模型在 Kimi For Coding(kimi-coding)
小米 套餐 12% ▰ · 月 17% ▰ ← 当前模型在小米 Token 套餐(xiaomi-token-plan-*)
(其它厂商,例如官方 DeepSeek 账号,徽标不占位)
点击徽标弹出明细面板(样式对齐官方「上下文已用」面板,264px 宽紧凑布局):
GLM 套餐额度 套餐 最高
──────────────────────────────────────
5 小时额度 已用 21%
▓▓▓▓░░░░░░░░░░░░░░░░░░
剩余 79% 重置 17:12 · 3h 12m
本周额度 已用 6%
▓░░░░░░░░░░░░░░░░░░░░░
剩余 94% 重置 11/4 11:12 · 6d 21h
本月工具额度 696 / 4000
▓▓▓░░░░░░░░░░░░░░░░░░░
已用 17% · 剩余 3304 · 重置 11/5 11:12 · 7d 21h
联网搜索 676 网页阅读 20 文档阅读 0
──────────────────────────────────────
更新于 14:12 每 60 秒刷新
自动切换逻辑
宿主侧路由 GET /quota/active 读取 DSH 的「当前默认模型选择」(agentDefaultModel 服务,每次切换模型都会更新),把 provider 映射到额度来源:
| provider | 来源 | 数据接口 |
|---|---|---|
zai-coding-cn / zai |
智谱 GLM | GET https://open.bigmodel.cn/api/monitor/usage/quota/limit |
opencode-go / opencode |
OpenCode Go | GET https://opencode.ai/zen/go/v1/usage |
kimi-coding |
Kimi For Coding | GET https://api.kimi.com/coding/v1/usages |
xiaomi-token-plan-cn / -ams / -sgp / xiaomi |
小米 Token 套餐 | GET https://platform.xiaomimimo.com/api/v1/tokenPlan/usage |
| 其它(如官方 DeepSeek 账号) | 无 | 徽标自动隐藏 |
切换模型后约 1 秒内跟着切换:客户端每秒查一次 /quota/active(宿主只读内存,开销可忽略),窗口重新获得焦点时立即查一次,另外订阅 settings/document-updated 事件做即时触发;额度本身每 60 秒刷新一次。
数据与语义
- 两个接口返回的都是已用百分比。智谱的
TIME_LIMIT同时给696/4000与percentage: 17,可证percentage= 已用;OpenCode 的rolling/weekly/monthly同理。面板里同时给「剩余」。 - 智谱窗口:
TOKENS_LIMIT(unit=3,number=5)→ 5 小时、TOKENS_LIMIT(unit=6)→ 本周、TIME_LIMIT→ 本月工具额度(含分项)。 - OpenCode 窗口:
rolling→ 5 小时(官方文档:5-hour = 月额度的 20%)、weekly→ 本周(50%)、monthly→ 本月(100%);三个都显示在徽标上,徽标里用短标签5h / 周 / 月(面板里仍是完整标题)。 - Kimi 窗口:
usage→ 本周汇总,limits[]里window.duration=300 MINUTE的是 5 小时窗口;token 数用「万 / 亿」紧凑显示。 - 小米窗口:
usage.items的plan_total_token(套餐)、compensation_total_token(补偿,仅有额度时显示)、monthUsage.items的month_total_token(本月总量);接口给的是 token 数,百分比由 used/limit 计算。 - 重置倒计时用短单位、小写:
3h 12m、6d 21h,整点省略分钟、整天省略小时、不足 1 分钟<1m。 - 徽标内文字统一 12px / 同色 / 400 字重(与官方统计徽标同规格),进度条放在数字后面:常态绿、≥70% 琥珀、≥90% 红,轨道同色 18% 浅染。
- 徽标里窗口名用短标签(
5h/周/月,面板里仍是完整标题),来源配置见client.js的SOURCES[*].shortLabels。
安装方式
git clone https://github.com/shy3130/dsh-quota.git ~/Project/dsh-quota
插件包是标准 DSH bundle。当前安装方式是写进本机用户补丁层 ~/.dsh/cordis.patch.yml(name 换成你自己的克隆路径):
- insert:
- id: dsh-quota
name: '/Users/<you>/Project/dsh-quota/index.js'
指向 index.js(而不是包目录):Node 的 ESM 不支持目录导入;客户端模块系统会从该文件向上找到 package.json,读取 dsh.client 后再加载 client.js。
宿主侧改动(index.js)需要重启一次 DSH 桌面应用才会生效(新增路由不会热加载);只改 client.js 时页面刷新即可。改 ~/.dsh/cordis.patch.yml 由 HMR 热加载。
路由
| 路由 | 用途 |
|---|---|
GET /quota/active |
当前模型 → { provider, model, source } |
GET /quota/config |
界面偏好(`{ indicator: 'bar' |
GET /quota/zhipu |
智谱额度(归一化后) |
GET /quota/opencode |
OpenCode Go 额度(归一化后) |
GET /quota/kimi |
Kimi For Coding 额度(归一化后) |
GET /quota/xiaomi |
小米 Token 套餐额度(归一化后) |
三者都带 DSH 登录门;密钥只在宿主进程内使用,不会进入返回给浏览器的 JSON。
配置
行上的 config 可覆盖各来源的地址与凭据引用:
- insert:
- id: dsh-quota
name: '/Users/shy/Project/dsh-quota/index.js'
config:
sources:
zhipu:
baseUrl: 'https://open.bigmodel.cn'
credentialRef: 'ZAI_CODING_CN_API_KEY'
opencode:
baseUrl: 'https://opencode.ai'
credentialRef: 'OPENCODE_GO_API_KEY'
kimi:
baseUrl: 'https://api.kimi.com'
credentialRef: 'KIMI_API_KEY'
xiaomi:
baseUrl: 'https://platform.xiaomimimo.com'
credentialRef: 'XIAOMI_MIMO_SESSION_COOKIE'
指示器形态(柱状条 / 环状条)
打开面板,底部有一行「指示器:柱状 / 环状」的切换:
- 点击即切换,选择记在浏览器
localStorage(键dsh-quota:indicator),刷新后保持 - 想改默认值(没点过切换的新环境):给插件行加
config:
- insert:
- id: dsh-quota
name: '@local/dsh-quota'
config:
indicator: ring # bar(默认)| ring
/quota/config是宿主侧路由,改默认值需要重启;面板里的切换只需要刷新页面。
各家凭据从哪来
| 厂商 | 需要的凭据 | 获取方式 |
|---|---|---|
| 智谱 GLM | ZAI_CODING_CN_API_KEY |
智谱开放平台 API Key(与模型路由同一个) |
| OpenCode Go | OPENCODE_GO_API_KEY |
OpenCode Zen 后台的 API Key |
| Kimi For Coding | KIMI_API_KEY,或 DSH 里 Kimi 的 OAuth 登录 |
优先读 DSH 凭据记录 llm-pi-ai/kimi-coding 的 access token;没有时用 sk-kimi-... API Key |
| 小米 Token 套餐 | XIAOMI_MIMO_SESSION_COOKIE |
小米用量接口只认浏览器 SSO Cookie(tp-... API Key 查不了):登录 platform.xiaomimimo.com → DevTools → Cookies → 整条复制 |
凭据可以放在环境变量里,也可以经 DSH 的凭据服务按上面的名字保存(插件只用引用名,不落盘)。
卸载
删掉 ~/.dsh/cordis.patch.yml 里对应的 insert 行,然后重启 DSH。
开发与维护
本目录既是插件包,也是 git 仓库(远程:https://github.com/shy3130/dsh-quota)。
npm test # 冒烟测试:清单/资源/语法/导出面,不联网
git add -A && git commit -m "..."
git push
改动生效方式:
| 改动位置 | 生效方式 |
|---|---|
client.js(徽标、面板) |
刷新页面(Cmd+R);客户端模块会热更新 |
index.js(路由、取数) |
重启 DSH 桌面应用 |
~/.dsh/cordis.patch.yml(挂载行) |
HMR 热加载 |
⚠️ 安装行指向的是本目录的绝对路径(/Users/shy/Project/dsh-quota/index.js)。如果移动或重命名这个目录,要同步改补丁层的路径;如果以后按 bundle 方式安装(见上文),则改为包名引用,不再依赖绝对路径。
目录结构
| 文件 | 作用 |
|---|---|
index.js |
宿主侧:三条路由、凭据读取、上游取数与归一化、缓存与登录门 |
client.js |
浏览器侧:徽标、自动切换、点击面板与轮询 |
cordis.patch.yml |
bundle 自身的插件行(作为 profile bundle 安装时使用) |
package.json |
清单:exports、dsh.bundle.patch、dsh.client |
locale/*.json |
插件管理页显示的标题与说明 |
icon.svg |
插件图标 |
No comments yet. Be the first to write one.