问题概要
v2.2.6 下,用量显示和「按用量自动暂停」不可靠,导致账号池可能在额度耗尽后仍继续调度。
我现场观察到几个组合问题:
- 开启 lazy_mode 后,主动用量探针会暂停,很多账号已经有请求 / token / cost 统计,但 Codex 官方 quota 百分比仍为空或长期不刷新。
- 上游返回
usage_limit_reached · The usage limit has been reached 时,日志里可能被记录成 HTTP 500 / server,而不是 429;这时账号没有被标记为 7d 100% 或自动暂停,仍可能显示可用。
- 关闭 lazy_mode 并点击「立即采样」后,部分 free 账号显示
5h 100%,但 reset 时间明显像长周期 / 7d 窗口,疑似 free 账号的长周期窗口被写到了 5h 栏。
- 用量探针当前是 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_only 或 disable_responses_probe_fallback=true,避免 wham 失败后自动发送真实 responses 探针。
相关代码路径
auth/store.go:quotaAutoPausedByWindow(...) 在 usage snapshot invalid 时返回 false;TriggerUsageProbeAsync() 在 lazy mode 下直接 return。
admin/usage_probe.go:ProbeUsageSnapshot(...) wham 失败后 fallback 到真实 responses 探针;ForceUsageProbe(...) 在 lazy mode 下不会真正触发。
proxy/handler.go:Apply429Cooldown(...) 看起来主要在 429 分支处理 usage_limit_reached,5xx/server 没有进入同等处理。
proxy/usage_wham.go:pickClassifiedWhamWindows(...) 在窗口长度未知时 fallback 为 primary -> 5h、secondary -> 7d,对 free 账号不安全。
环境:v2.2.6,SQLite + Memory,主要请求路径 /v1/responses,Codex free 账号。
问题概要
v2.2.6 下,用量显示和「按用量自动暂停」不可靠,导致账号池可能在额度耗尽后仍继续调度。
我现场观察到几个组合问题:
usage_limit_reached · The usage limit has been reached时,日志里可能被记录成 HTTP 500 / server,而不是 429;这时账号没有被标记为 7d 100% 或自动暂停,仍可能显示可用。5h 100%,但 reset 时间明显像长周期 / 7d 窗口,疑似 free 账号的长周期窗口被写到了 5h 栏。/backend-api/codex/responses探针。对于只想安全查询用量、不想发真实请求的场景,希望能有 wham-only 模式。期望行为
usage_limit_reached,无论 HTTP 状态是 429 还是 5xx,都应按账号级额度耗尽处理,并触发冷却 / 自动暂停。primary_window兜底归类为 5h;当 reset 时间明显超过 5h 或 plan 为 free 时,应优先归类为 7d / 长周期窗口。usage_probe_mode=wham_only或disable_responses_probe_fallback=true,避免 wham 失败后自动发送真实 responses 探针。相关代码路径
auth/store.go:quotaAutoPausedByWindow(...)在 usage snapshot invalid 时返回 false;TriggerUsageProbeAsync()在 lazy mode 下直接 return。admin/usage_probe.go:ProbeUsageSnapshot(...)wham 失败后 fallback 到真实 responses 探针;ForceUsageProbe(...)在 lazy mode 下不会真正触发。proxy/handler.go:Apply429Cooldown(...)看起来主要在 429 分支处理usage_limit_reached,5xx/server 没有进入同等处理。proxy/usage_wham.go:pickClassifiedWhamWindows(...)在窗口长度未知时 fallback 为primary -> 5h、secondary -> 7d,对 free 账号不安全。环境:v2.2.6,SQLite + Memory,主要请求路径
/v1/responses,Codex free 账号。