dsh-opencode-go-usage
OpenCode GO 套餐用量显示插件,为 DeepSeek Harness Web GUI 而生。
在对话框输入框下方显示一个小药丸:Go · 5h 7% · 周 7% · 月 3%(Go 前缀 + 三个额度窗口,间距按自带统计栏压缩)。

点击后在指示条上方弹出详情卡片——头部是图标 + OpenCode GO + 本月已用 / 额度,单条分隔线下是
5 小时 / 每周 / 每月三行(百分比 + 重置倒计时),底部是更新时间、套餐名与到期 / 续费状态;
刷新按钮在卡片头部。配色、字号、行距与分隔线都对齐输入框自带的「Token 用量」统计弹层。

功能
- 5 小时 / 每周 / 每月三个额度窗口的已用百分比,鼠标悬停 / 键盘聚焦有底色反馈。
- 详情卡片:精确已用金额($)与额度、剩余估算、各窗口重置倒计时、套餐名与到期状态。
- 弹层按药丸位置左对齐锚定,不占布局、不被输入框 dock 行裁切。
- 设置页填 API Key:设置 → OpenCode GO 用量,支持保存 / 清除 / 重新读取,实时显示当前凭据来源。
- 没配 Key 时药丸显示
Go · 设置 Key,不会再凭空消失。 - 主题适配:只用
--dsw-alias-*主题变量,跟随深浅色。 - 零运行时依赖:Host 是纯 Node ESM,Client 是手写懒加载 bundle,不依赖 Typert 代码生成。
安装
需要 DSH 0.2.1(在 0.2.1-rc.3 实测)。
包名沿用本地安装名
@local/dsh-opencode-go-usage。npm 上同名的dsh-opencode-go-usage是另一个作者的项目, 如果要发布到 npm,请改成自己的 scope。本仓库定位为从 git / 本地目录安装的 DSH bundle。
方式 A:git 源(需要 DSH CLI)
dsh plugin --profile <你的 profile> add github:zyhnbyyds/dsh-opencode-go-usage
装好后刷新 DSH 页面即可。
方式 B:本地目录
git clone https://github.com/zyhnbyyds/dsh-opencode-go-usage.git
然后在 DSH 的「设置 → 插件」里从这个目录安装(bundle 名 @local/dsh-opencode-go-usage),
或让 agent 用 plugin manager 的 install_bundle 指向该目录。插件行会通过
cordis.patch.yml(dsh.bundle.patch)自动注入,不需要手改 profile。
使用
输入框下方是药丸:Go · 5h 7% · 周 7% · 月 3%。点开是详情卡片,头部 ↻ 立即刷新。
Windows 上鼠标移入会有底色变化。
设置页填 Key:设置 → OpenCode GO 用量
- 输入
oc_sk_…→ 保存:写入 Harness 凭据服务里本插件专用的OPENCODE_GO_USAGE_API_KEY, 不会改动 DSH 模型 provider 用的那把 Key;保存后立即重读用量。 - 清除已保存的 Key:删除专用凭据,回到 DSH 模型凭据 / 环境变量 / auth.json 的回退链。
- 顶部实时显示来源(插件设置 / DSH 凭据 / 环境变量 / auth.json);Key 无效时显示「当前读取:…」。
- Key 只在 Host 进程内使用,接口响应只暴露
configured/source,不返回明文。
API Key 解析顺序
- 设置页保存的
OPENCODE_GO_USAGE_API_KEY(插件专用,优先级最高) - Harness 凭据服务里的
OPENCODE_GO_API_KEY(「设置 → 模型」里给 opencode-go provider 配的 Key) - 进程环境变量
OPENCODE_GO_API_KEY - OpenCode 自己的
auth.json:~/.local/share/opencode/auth.json或~/.config/opencode/auth.json, 格式{ "opencode-go": { "type": "api", "key": "oc_sk_..." } }
注意:设置页里填的 Key 只用于用量展示;DSH 调用模型仍用「设置 → 模型」里的 Key,两者可以是不同账号。 如果两把 Key 属于不同账号,界面显示的会是设置页那把 Key 对应账号的用量。
数据来源
| 数据 | 来源 |
|---|---|
| 三窗口额度百分比、重置时间 | GET https://opencode.ai/zen/go/v1/usage(Bearer API Key,Host 侧请求) |
| 套餐名、计费周期、精确美元额度与已用 | GET https://opencode.ai/console/api/go/status(同一把 Key;micro-cent 金额,1 USD = 1e8)。内部接口,失败时自动退回下一条的估算 |
| 剩余美元估算 | 无 status 数据时按官方 Go 用量说明:5 小时窗口 = 月额度 20%,每周 = 50%,每月 = 100%;月额度默认 $60(Go 套餐),可在配置中改 |
结构
index.js Host 半:解析 Key、读取用量接口、注册 /opencode-go-usage/api/state 与 /api/key 路由
client.js Client 半:输入框下方药丸 + 详情弹层 + 「OpenCode GO 用量」设置页
cordis.patch.yml bundle 插件行(dsh.bundle.patch 自动注入)
locale/ 插件市场 / 设置页显示用的标题与描述(en / zh)
icon.svg 插件图标
docs/ 截图
Host 与 Client 之间只用同源 HTTP 路由通信(/opencode-go-usage/api/*),带同源围栏与请求体大小限制。
配置
安装后如需自定义,在 profile 的 cordis.patch.yml 用户层覆盖该行 config:
- id: opencode-go-usage
config:
# 凭据名(环境变量 / 凭据服务里的名字),作为回退来源
credential: OPENCODE_GO_API_KEY
# 设置页保存 Key 时使用的专用凭据名
settingsRef: OPENCODE_GO_USAGE_API_KEY
baseUrl: https://opencode.ai/zen/go/v1/usage
statusUrl: https://opencode.ai/console/api/go/status
enrich: true
# 缓存刷新间隔(毫秒)
refreshMs: 60000
timeoutMs: 15000
# 套餐月额度(美元):Go 是 60;按实际套餐改
monthlyLimitUsd: 60
# 也可以直接给三个窗口的额度(美元),优先生效
# limits: { rolling: 12, weekly: 30, monthly: 60 }
planLabel: Go
debug: false
状态语义
error |
含义 | 界面表现 |
|---|---|---|
null |
读取成功 | 显示三个窗口 |
no-key |
没有找到 API Key | 药丸显示 Go · 设置 Key,点开提示去设置页填写 |
unauthorized |
Key 无效 / 被撤销 | 显示红色错误提示 |
no-subscription |
账号未订阅 GO | 显示错误提示 |
network |
连不上 opencode.ai | 保留上次快照并提示 |
bad-shape / bad-json / http-* |
接口异常 | 显示错误提示 |
验证记录
在 DSH 0.2.1-rc.3(Windows,Web GUI)实测:
- Host:
GET /opencode-go-usage/api/state返回 200,keySource: "credentials",sources: { usage: "ok", status: "ok" };?refresh=1会真正重新拉取(fetchedAt变化);POST /api/key非法参数 400、跨站来源 403。 - Client:
conversation.composer.dock槽位有效;药丸约 151×18 逻辑尺寸;弹层左边缘与药丸左边缘对齐(左差 0px、垂直间距 11px); 详情卡片 334×169 逻辑尺寸,数据行距 25px,仅头部一条分隔线。 - 设置页:设置面板出现导航项「OpenCode GO 用量」;用假 Key 走完整流程——保存后状态变为「已在插件设置里保存 · 插件设置」 并提示「当前读取:… 无效或已被撤销」,清除后回退到「使用 DSH 模型凭据 …」且用量恢复。测试用假 Key 已清除。
- 暗色主题未单独截图验证;样式只使用主题变量。
已知限制
- 用量接口没有公开文档,官方可能调整;解析做了防御式处理,异常显示为状态而不是崩溃。
/console/api/go/status是 Console 内部接口,失败时只影响精确美元与套餐信息,百分比照常显示。 - 百分比是账户级数据(含同一账号其他设备 / 客户端的用量);同一把 Key 在凭据服务和
auth.json里可能属于不同账号。 - 三个窗口的百分比含义以官方说明为准。
开发
node --check index.js
node --check client.js
改完源码后,在 DSH 里重新加载该 bundle(插件管理器里关闭再启用该 bundle,或重启 DSH)并刷新页面。
License
MIT © 2026 zyhnbyyds
No comments yet. Be the first to write one.