mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-26 09:52:11 +03:00
fix: auto-decay backoffLevel when rate limit window has passed
High backoffLevel (up to 15) persisted permanently in the DB after a burst of 429s. The account health score dropped to zero (100 - 15*10 = -50), causing the account selector to never pick the account again. Only a successful request could reset backoffLevel via clearAccountError, but the account was never selected — creating a deadlock. Now, during account selection, any non-terminal connection whose rateLimitedUntil has passed gets its backoffLevel reset to 0 and testStatus restored to active. The DB update is fire-and-forget to avoid blocking the hot path. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -368,6 +368,29 @@ export async function getProviderCredentials(
|
||||
return null;
|
||||
}
|
||||
|
||||
// Auto-decay backoffLevel for accounts whose rateLimitedUntil has passed.
|
||||
// Without this, high backoffLevel permanently deprioritizes accounts even
|
||||
// after the rate limit window expires, creating a deadlock where the account
|
||||
// needs a successful request to reset but never gets selected.
|
||||
for (const c of connections) {
|
||||
if (
|
||||
c.backoffLevel > 0 &&
|
||||
!isTerminalConnectionStatus(c) &&
|
||||
!isAccountUnavailable(c.rateLimitedUntil)
|
||||
) {
|
||||
c.backoffLevel = 0;
|
||||
updateProviderConnection(c.id, {
|
||||
backoffLevel: 0,
|
||||
testStatus: "active",
|
||||
lastError: null,
|
||||
lastErrorAt: null,
|
||||
lastErrorType: null,
|
||||
lastErrorSource: null,
|
||||
errorCode: null,
|
||||
}).catch(() => {});
|
||||
}
|
||||
}
|
||||
|
||||
// Filter out unavailable accounts and excluded connection
|
||||
const availableConnections = connections.filter((c) => {
|
||||
if (excludeConnectionId && c.id === excludeConnectionId) return false;
|
||||
|
||||
Reference in New Issue
Block a user