Skip to content

Conversation

@DuckyProject
Copy link
Contributor

背景

  • OAuth2 账号(OpenAI/Claude/Gemini)用量/限额数据在“未被调度/未调用”时更新不及时,管理页容易出现滞后或假数据。
  • OpenAI OAuth(ChatGPT Codex)实际的 5h/7d 配额信息在响应头 x-codex-* 中,但此前未系统化落库,也无法用“窗口结束时间”驱动持续限流。

本次改动

Backend

  • OpenAI OAuth(Codex)
    • https://chatgpt.com/backend-api/codex/responses 响应头解析 x-codex-*,归一化为标准 5h/7d 字段并写入 accounts.extra(包含 codex_*_reset_at 绝对时间)。
    • 当 5h 或 7d 满额时写入 accounts.rate_limit_reset_at,实现“持续 429 到窗口结束”(7d 优先,否则 5h)。
    • 429 场景优先用 x-codex-* 推导真实 resetAt,替代通用 5 分钟 fallback。
  • Claude/Gemini
    • 新增统一“用量快照落库”逻辑:写入 accounts.extra.{claude_usage_snapshot,gemini_usage_snapshot},并记录 *_usage_updated_at*_usage_sourcegateway/test/probe)。
    • Claude 满额时同样写入 accounts.rate_limit_reset_at(基于 5h/7d 的 resets_at)。
  • 测试连接增强
    • OpenAI/Claude/Gemini 测试连接都会写入快照到 DB(即使非 200),并在 payload 中加入随机串(nonce)避免上游缓存。
  • 新增兜底探活(可关闭)
    • 新增 OAuthProbeService:默认关闭;启用后每 check_interval_minutes 对“闲置超过 idle_threshold_minutes”的 OAuth/Setup-Token 账号做最小探测并同步快照。

Frontend

  • Claude/Gemini 用量展示改为直接读取 account.extra 快照(不再 per-row 调接口)。
  • resets_at 已过期的快照做展示层回退:显示 0% 且不显示倒计时,减少“过期假数据”影响。

配置

  • 新增配置段 oauth_probe(默认 enabled: false),支持:
    • check_interval_minutes
    • idle_threshold_minutes(默认 15;仅闲置账号触发探活)
    • request_timeout_seconds
    • max_concurrency
    • max_accounts_per_cycle

TLS 指纹(确认点)

  • Claude 账号若开启 TLS 指纹伪装(extra.enable_tls_fingerprint),在获取 OAuth usage(快照同步)时也会走同一套 TLS 指纹请求路径(DoWithTLS)。

测试

  • 后端(通过):cd backend && go test ./internal/service ./internal/repository
  • 已知:cd backend && go test ./... 可能因 internal/pkg/tlsfingerprint 外网集成测试超时失败(与本 PR 逻辑无关)。

风险/回滚

@DuckyProject
Copy link
Contributor Author

关于模拟用量的部分需要讨论是否融入此功能

@Wei-Shaw Wei-Shaw force-pushed the main branch 3 times, most recently from 86fd7d1 to 1245f07 Compare January 26, 2026 01:19
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