- [Decouple Physical Quota Exhaustion from Adaptive Circuit Breaker; Exclude Attempted Accounts in Retry Loops] (PR #3845, Thanks to @cubelikeplayDaniel):
- Physical fact takes precedence over adaptive strategy: Decoupled “upstream-declared quota exhaustion” from the “adaptive circuit breaker backoff switch”. Previously
if !config.enabled { return; }ran before the quota predicate, so when Google returned an explicitIndividual quota reached, the signal was dropped — the account was neither marked 0% nor locked. Now the invariant is established: an upstream-declared quota exhaustion is an objective physical fact and must never be gated by the breaker switch. (PR #3845, Thanks to @cubelikeplayDaniel) - Attempted-account exclusion in retry loops: Fixed repeated hammering of the same drained account. Previously
get_tokenreceived an emptyexcluded_accounts, so P2C could re-select the just-429'd account due to its historical quota weight. Each protocol retry loop now maintainsattempted_accountsand passes it toget_token_filtered, failing fast after a full pool sweep. (PR #3845, Thanks to @cubelikeplayDaniel) - No longer bypassing realtime locks when the breaker is off: Added
is_quota_exhausted_or_explicit_limited, so accounts inQuotaExhaustedstate are still correctly intercepted even with the breaker disabled. - Frontend breaker default corrected:
circuit_breakernow initializes withenabled: true, preventing users from accidentally disabling the breaker by saving settings. (PR #3845, Thanks to @cubelikeplayDaniel)
- Physical fact takes precedence over adaptive strategy: Decoupled “upstream-declared quota exhaustion” from the “adaptive circuit breaker backoff switch”. Previously
- [Fix beta.4 Release Pipeline Failure] (Ref #3845):
- Background: The beta.4 Release pipeline hit a transient GitHub API HTTP 500 at the
publish-releasestep (all 10 build jobs succeeded), so the Release object was never created andupdater.jsonwas missing — users could not see that version. - Resolution: Removed the dangling
v5.0.3-beta.4tag and shipped beta.5 directly, delivering the PR #3845 fixes together with everything since beta.3.
- Background: The beta.4 Release pipeline hit a transient GitHub API HTTP 500 at the
- [解耦客观物理配额耗尽与自适应熔断,增加单请求重试账号排除] (PR #3845, Thanks to @cubelikeplayDaniel):
- 物理事实优先于自适应策略: 将「上游告知的配额耗尽」与「自适应熔断退避开关」彻底解耦。此前熔断关闭时,
if !config.enabled { return; }位于配额判据之前,导致 Google 明确返回Individual quota reached时信号被丢弃——账号配额不会置 0% 也不会锁定。现确立不变式:账号已被上游告知配额耗尽是客观物理事实,绝不受熔断开关影响。(PR #3845, Thanks to @cubelikeplayDaniel) - 重试循环引入账号排除机制: 修复多轮重试锤击同一耗尽账号的问题。此前
get_token传入空的excluded_accounts,P2C 可能因历史配额权重再次选中刚 429 的账号。现各协议重试循环维护attempted_accounts并传入get_token_filtered,全池遍历后快速失败。(PR #3845, Thanks to @cubelikeplayDaniel) - 熔断关闭时不再旁路实时锁定: 新增
is_quota_exhausted_or_explicit_limited,即使熔断关闭也能正确拦截处于QuotaExhausted状态的账号。 - 前端熔断默认值修正:
circuit_breaker初始默认改为enabled: true,避免用户在设置页点击保存时意外关闭熔断器。(PR #3845, Thanks to @cubelikeplayDaniel)
- 物理事实优先于自适应策略: 将「上游告知的配额耗尽」与「自适应熔断退避开关」彻底解耦。此前熔断关闭时,
- [修复 beta.4 发布流水线失败] (Ref #3845):
- 问题背景: beta.4 的 Release 流水线在
publish-release步骤遭遇 GitHub API 瞬时 500 错误(其余 10 个构建作业均成功),导致 Release 对象未创建、updater.json缺失,用户无法感知该版本。 - 修复方式: 删除悬空的
v5.0.3-beta.4tag,直接发布 beta.5,将 PR #3845 的修复与 beta.3 以来的全部改动一并交付。
- 问题背景: beta.4 的 Release 流水线在
What's Changed
- fix(proxy,quota): 解耦客观物理配额耗尽与自适应熔断,增加单请求重试账号排除防反复锤击 by @cubelikeplayDaniel in #3845
Full Changelog: v5.0.3-beta.3...v5.0.3-beta.5