Skip to content

[Bug] 用量采样和自动暂停不可靠:lazy、500 usage_limit、free 窗口误分类 #201

@solan0122

Description

@solan0122

问题概要

v2.2.6 下,用量显示和「按用量自动暂停」不可靠,导致账号池可能在额度耗尽后仍继续调度。

我现场观察到几个组合问题:

  1. 开启 lazy_mode 后,主动用量探针会暂停,很多账号已经有请求 / token / cost 统计,但 Codex 官方 quota 百分比仍为空或长期不刷新。
  2. 上游返回 usage_limit_reached · The usage limit has been reached 时,日志里可能被记录成 HTTP 500 / server,而不是 429;这时账号没有被标记为 7d 100% 或自动暂停,仍可能显示可用。
  3. 关闭 lazy_mode 并点击「立即采样」后,部分 free 账号显示 5h 100%,但 reset 时间明显像长周期 / 7d 窗口,疑似 free 账号的长周期窗口被写到了 5h 栏。
  4. 用量探针当前是 wham 优先,wham 失败后 fallback 到真实 /backend-api/codex/responses 探针。对于只想安全查询用量、不想发真实请求的场景,希望能有 wham-only 模式。

期望行为

  • 只要响应体命中 usage_limit_reached,无论 HTTP 状态是 429 还是 5xx,都应按账号级额度耗尽处理,并触发冷却 / 自动暂停。
  • quota 快照缺失或过期时,自动暂停不要静默失效;lazy 模式下建议保留低频 wham-only 刷新,或在 UI 明确提示自动暂停依赖旧快照。
  • free 账号不要把未知 primary_window 兜底归类为 5h;当 reset 时间明显超过 5h 或 plan 为 free 时,应优先归类为 7d / 长周期窗口。
  • 增加配置,例如 usage_probe_mode=wham_onlydisable_responses_probe_fallback=true,避免 wham 失败后自动发送真实 responses 探针。

相关代码路径

  • auth/store.goquotaAutoPausedByWindow(...) 在 usage snapshot invalid 时返回 false;TriggerUsageProbeAsync() 在 lazy mode 下直接 return。
  • admin/usage_probe.goProbeUsageSnapshot(...) wham 失败后 fallback 到真实 responses 探针;ForceUsageProbe(...) 在 lazy mode 下不会真正触发。
  • proxy/handler.goApply429Cooldown(...) 看起来主要在 429 分支处理 usage_limit_reached,5xx/server 没有进入同等处理。
  • proxy/usage_wham.gopickClassifiedWhamWindows(...) 在窗口长度未知时 fallback 为 primary -> 5hsecondary -> 7d,对 free 账号不安全。

环境:v2.2.6,SQLite + Memory,主要请求路径 /v1/responses,Codex free 账号。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions