Skip to content

feat(opencode): 支持 OpenCode Go 官方用量窗口查询与自动刷新 - #5

Merged
alfadb merged 1 commit into
mainfrom
feature/opencode-go-usage-window
Aug 13, 2026
Merged

feat(opencode): 支持 OpenCode Go 官方用量窗口查询与自动刷新#5
alfadb merged 1 commit into
mainfrom
feature/opencode-go-usage-window

Conversation

@alfadb

@alfadb alfadb commented Aug 13, 2026

Copy link
Copy Markdown
Owner

背景

OpenCode Go($10/月订阅,5h/$12、周/$30、月/$60 三个用量窗口)已接入 sub2api 上游(openai apikey 账号,base_url = https://opencode.ai/zen/go/v1)。Go 官方于 2026-08-11 上线了用量端点 GET /zen/go/v1/usage(PR anomalyco/opencode#16513,复用消费端 Bearer key,未写入官方文档),返回 rolling/weekly/monthly 三窗口的 percentresetsAt

本 PR 为这类账号实现管理端用量窗口,架构对齐既有 Ollama Cloud usage 功能,但按 API 形态大幅裁剪。

变更

后端

  • OpenCodeGoUsageService:手动刷新(每账号 10s 节流)、周期自动刷新(全局开关 + 账号开关双开启;interval 5–1440 min 默认 15;leader lock + 每轮 20 账号 + 并发 4)、失败指数退避(2^n 上限 24h,±10% 抖动,尊重 Retry-After)
  • 状态语义:401 → unauthorized(保留旧数据);403 → failed(无 Go 订阅);非 2xx/畸形 JSON → failed;解析宽松(顶层可包 usage 对象,字段缺失不整体失败)
  • snapshot 持久化于 accounts.extra(单账号写入,无分组 CAS、无会话加密——API 无需 Cookie)
  • 资格判定:platform=openai && type=apikey && base_url host 精确 opencode.ai、path /zen/go/v1
  • admin API 5 端点(settings GET/PUT、state GET、auto-refresh PUT、refresh POST),账号 DTO 内嵌 opencode_go_usage,extra 脱敏

前端

  • 账号列表行内三窗口进度条(rolling/weekly/monthly,复用 UsageProgressBar,状态徽章)
  • 编辑弹窗配置面板:详情 + 手动刷新 + auto-refresh Toggle(无 Cookie 会话 UI)
  • 全局设置卡片(enabled + interval 5–1440)
  • en/zh i18n

验证

  • 上游端点生产实测(2026-08-13,真实 Go key):HTTP 200
    {"usage":{"rolling":{"status":"ok","percent":6,"resetsAt":"..."},"weekly":{...},"monthly":{...}}}
  • go build ./... OK;service / handler/admin / repository / dto / cmd 全量回归 OK;gofmt、go vet 干净
  • 后端新增单测 20 例(真实响应解析、401/403/畸形 JSON、退避、节流、RunDue、资格、settings 校验)全绿
  • 前端 vitest 新增 7 例 + Ollama 回归 4 例全绿;vue-tsc --noEmit 零错误

已知限制

  • 端点未文档化、字段以实测为准(percent/resetsAt),解析做了防御但上游结构变动仍需跟进
  • 限额($12/$30/$60)为静态常量,仅用于展示口径,不在本 PR 使用
  • 5h 窗口为服务端锚定式(resetsAt 直接信上游,不自行计算滚动)
  • 生产部署后的真实刷新链路(管理端展示 + 自动刷新)待合并部署后验证

OpenCode Go 上游(https://opencode.ai/zen/go/v1)官方提供用量端点
GET /zen/go/v1/usage(Bearer 复用消费 key),返回 rolling(5h)/weekly/monthly
三窗口的 percent 与 resetsAt。本提交为 openai apikey 账号(base_url 为
opencode.ai/zen/go/v1)接入该用量窗口:

- 后端:OpenCodeGoUsageService——手动刷新(每账号 10s 节流)、
  周期自动刷新(全局开关 + 账号开关双开启,interval 5-1440 分钟,
  leader lock + 每轮 20 账号 + 并发 4)、失败指数退避(上限 24h)、
  Retry-After 尊重;401→unauthorized、403→failed;snapshot 持久化于
  accounts.extra(单账号写入,无分组 CAS、无会话加密)
- admin API:settings GET/PUT、/:id/opencode-go-usage GET、
  auto-refresh PUT、refresh POST(与 Ollama Cloud usage 同构)
- 前端:账号列表行内三窗口进度条(复用 UsageProgressBar)、
  编辑弹窗内配置面板(详情+手动刷新+auto-refresh)、全局设置卡片、
  en/zh i18n

验证:
- 上游端点已用生产真实 Go key 实测 200,响应
  {"usage":{"rolling":{"status":"ok","percent":6,...},...}}(2026-08-13)
- go build ./... OK;service/handler/repo/dto/cmd 全量回归 OK
- 新增单测 20 例(解析 401/403/畸形 JSON、退避、节流等)全绿
- frontend vitest 新增 7 例 + Ollama 回归 4 例全绿;vue-tsc 零错误
@alfadb
alfadb merged commit 8a3b3e9 into main Aug 13, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant