Modell-Failover
OpenClaw behandelt Fehler in zwei Stufen:- Auth-Profilrotation innerhalb des aktuellen Providers.
- Modell-Fallback auf das nächste Modell in
agents.defaults.model.fallbacks.
Laufzeitablauf
Für einen normalen Textlauf wertet OpenClaw Kandidaten in dieser Reihenfolge aus:- Das aktuell ausgewählte Sitzungsmodell.
- Konfigurierte
agents.defaults.model.fallbacksin Reihenfolge. - Das konfigurierte primäre Modell am Ende, wenn der Lauf von einer Überschreibung gestartet wurde.
- Aktives Sitzungsmodell und Auth-Profil-Präferenz auflösen.
- Die Modell-Kandidatenkette erstellen.
- Den aktuellen Provider mit Auth-Profilrotation-/Cooldown-Regeln versuchen.
- Wenn dieser Provider mit einem failover-würdigen Fehler ausgeschöpft ist, zum nächsten Modellkandidaten wechseln.
- Die ausgewählte Fallback-Überschreibung speichern, bevor der Retry startet, damit andere Sitzungsleser denselben Provider/dasselbe Modell sehen, den bzw. das der Runner gleich verwenden wird.
- Wenn der Fallback-Kandidat fehlschlägt, nur die sitzungseigenen Override-Felder des Fallbacks zurücksetzen, sofern sie noch mit diesem fehlgeschlagenen Kandidaten übereinstimmen.
- Wenn jeder Kandidat fehlschlägt, einen
FallbackSummaryErrormit Details pro Versuch und dem frühesten Cooldown-Ablauf werfen, sofern einer bekannt ist.
providerOverridemodelOverrideauthProfileOverrideauthProfileOverrideSourceauthProfileOverrideCompactionCount
/model-Änderungen oder Sitzungsrotations-Updates, die
während des Versuchs erfolgt sind.
Auth-Speicher (Schlüssel + OAuth)
OpenClaw verwendet Auth-Profile sowohl für API-Schlüssel als auch für OAuth-Token.- Secrets liegen in
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(Legacy:~/.openclaw/agent/auth-profiles.json). - Konfiguration
auth.profiles/auth.orderist nur Metadaten + Routing (keine Secrets). - Legacy-Datei nur für OAuth-Importe:
~/.openclaw/credentials/oauth.json(wird bei erster Verwendung inauth-profiles.jsonimportiert).
type: "api_key"→{ provider, key }type: "oauth"→{ provider, access, refresh, expires, email? }(+projectId/enterpriseUrlfür einige Provider)
Profil-IDs
OAuth-Logins erstellen eigene Profile, damit mehrere Accounts nebeneinander existieren können.- Standard:
provider:default, wenn keine E-Mail verfügbar ist. - OAuth mit E-Mail:
provider:<email>(zum Beispielgoogle-antigravity:user@gmail.com).
~/.openclaw/agents/<agentId>/agent/auth-profiles.json unter profiles.
Rotationsreihenfolge
Wenn ein Provider mehrere Profile hat, wählt OpenClaw eine Reihenfolge wie folgt:- Explizite Konfiguration:
auth.order[provider](falls gesetzt). - Konfigurierte Profile:
auth.profiles, nach Provider gefiltert. - Gespeicherte Profile: Einträge in
auth-profiles.jsonfür den Provider.
- Primärschlüssel: Profiltyp (OAuth vor API-Schlüsseln).
- Sekundärschlüssel:
usageStats.lastUsed(älteste zuerst, innerhalb jedes Typs). - Cooldown-/deaktivierte Profile werden ans Ende verschoben und nach dem frühesten Ablauf sortiert.
Sitzungs-Stickiness (cache-freundlich)
OpenClaw pinnt das gewählte Auth-Profil pro Sitzung, um Provider-Caches warm zu halten. Es rotiert nicht bei jeder Anfrage. Das gepinnte Profil wird wiederverwendet, bis:- die Sitzung zurückgesetzt wird (
/new//reset) - eine Kompaktierung abgeschlossen ist (der Kompaktierungszähler erhöht sich)
- das Profil im Cooldown/deaktiviert ist
/model …@<profileId> setzt eine Benutzerüberschreibung für diese Sitzung
und wird nicht automatisch rotiert, bis eine neue Sitzung startet.
Automatisch gepinnte Profile (durch den Sitzungsrouter ausgewählt) werden als Präferenz behandelt:
Sie werden zuerst versucht, aber OpenClaw kann bei Rate Limits/Timeouts zu einem anderen Profil rotieren.
Vom Benutzer gepinnte Profile bleiben an dieses Profil gebunden; wenn es fehlschlägt und Modell-Fallbacks
konfiguriert sind, wechselt OpenClaw zum nächsten Modell, statt Profile zu wechseln.
Warum OAuth „verloren“ aussehen kann
Wenn Sie sowohl ein OAuth-Profil als auch ein API-Schlüssel-Profil für denselben Provider haben, kann Round-Robin zwischen ihnen über Nachrichten hinweg wechseln, sofern nichts gepinnt ist. Um ein einzelnes Profil zu erzwingen:- Mit
auth.order[provider] = ["provider:profileId"]pinnen, oder - Eine Überschreibung pro Sitzung per
/model …mit einer Profilüberschreibung verwenden (falls von Ihrer UI/Chat-Oberfläche unterstützt).
Cooldowns
Wenn ein Profil aufgrund von Auth-/Rate-Limit-Fehlern fehlschlägt (oder eines Timeouts, das wie Rate Limiting aussieht), markiert OpenClaw es als im Cooldown und wechselt zum nächsten Profil. Dieser Rate-Limit-Bucket ist breiter als nur429: Er umfasst auch Provider-
Meldungen wie Too many concurrent requests, ThrottlingException,
concurrency limit reached, workers_ai ... quota limit exceeded,
throttled, resource exhausted und periodische Limits für Nutzungsfenster wie
weekly/monthly limit reached.
Format-/Invalid-Request-Fehler (zum Beispiel Cloud Code Assist Tool-Call-ID-
Validierungsfehler) werden als failover-würdig behandelt und verwenden dieselben Cooldowns.
OpenAI-kompatible Stop-Reason-Fehler wie Unhandled stop reason: error,
stop reason: error und reason: error werden als Timeout-/Failover-
Signale klassifiziert.
Allgemeiner serverseitiger Text mit Provider-Scope kann ebenfalls in diesen Timeout-Bucket fallen, wenn
die Quelle einem bekannten transienten Muster entspricht. Zum Beispiel werden bei Anthropic
ein schlichtes An unknown error occurred und JSON-api_error-Payloads mit transientem Server-
Text wie internal server error, unknown error, 520, upstream error
oder backend error als failover-würdige Timeouts behandelt. OpenRouter-spezifischer
allgemeiner Upstream-Text wie ein schlichtes Provider returned error wird ebenfalls nur dann als
Timeout behandelt, wenn der Provider-Kontext tatsächlich OpenRouter ist. Allgemeiner interner Fallback-
Text wie LLM request failed with an unknown error. bleibt konservativ und löst
allein kein Failover aus.
Rate-Limit-Cooldowns können außerdem modellbezogen sein:
- OpenClaw zeichnet
cooldownModelfür Rate-Limit-Fehler auf, wenn die fehlschlagende Modell-ID bekannt ist. - Ein Schwester-Modell desselben Providers kann weiterhin versucht werden, wenn der Cooldown auf ein anderes Modell begrenzt ist.
- Billing-/Deaktivierungsfenster blockieren das gesamte Profil weiterhin modellübergreifend.
- 1 Minute
- 5 Minuten
- 25 Minuten
- 1 Stunde (Obergrenze)
auth-profiles.json unter usageStats gespeichert:
Billing-Deaktivierungen
Billing-/Guthabenfehler (zum Beispiel „insufficient credits“ / „credit balance too low“) werden als failover-würdig behandelt, sind aber normalerweise nicht transient. Statt eines kurzen Cooldowns markiert OpenClaw das Profil als deaktiviert (mit längerem Backoff) und rotiert zum nächsten Profil/Provider. Nicht jede Billing-ähnliche Antwort ist402, und nicht jede HTTP-402 landet
hier. OpenClaw behält expliziten Billing-Text auch dann in der Billing-Schiene, wenn ein
Provider stattdessen 401 oder 403 zurückgibt, aber providerspezifische Matcher bleiben
auf den Provider begrenzt, zu dem sie gehören (zum Beispiel OpenRouter 403 Key limit exceeded). Gleichzeitig werden temporäre 402-Nutzungsfenster- und
Spending-Limit-Fehler für Organization/Workspace als rate_limit klassifiziert, wenn
die Nachricht retrybar aussieht (zum Beispiel weekly usage limit exhausted, daily limit reached, resets tomorrow oder organization spending limit exceeded).
Diese bleiben auf dem Pfad für kurze Cooldowns/Failover statt auf dem langen
Pfad für Billing-Deaktivierung.
Der Status wird in auth-profiles.json gespeichert:
- Billing-Backoff beginnt bei 5 Stunden, verdoppelt sich pro Billing-Fehler und ist auf 24 Stunden begrenzt.
- Backoff-Zähler werden zurückgesetzt, wenn das Profil 24 Stunden lang nicht fehlgeschlagen ist (konfigurierbar).
- Überlastete Retries erlauben 1 Rotation desselben Provider-Profils, bevor auf Modell-Fallback umgeschaltet wird.
- Überlastete Retries verwenden standardmäßig 0 ms Backoff.
Modell-Fallback
Wenn alle Profile für einen Provider fehlschlagen, wechselt OpenClaw zum nächsten Modell inagents.defaults.model.fallbacks. Dies gilt für Auth-Fehler, Rate Limits und
Timeouts, bei denen die Profilrotation ausgeschöpft ist (andere Fehler führen nicht zu weiterem Fallback).
Überlastete und Rate-Limit-Fehler werden aggressiver behandelt als Billing-
Cooldowns. Standardmäßig erlaubt OpenClaw einen Auth-Profil-Retry mit demselben Provider
und wechselt dann ohne Warten zum nächsten konfigurierten Modell-Fallback.
Provider-Busy-Signale wie ModelNotReadyException fallen in diesen Überlastungs-Bucket.
Passen Sie dies mit auth.cooldowns.overloadedProfileRotations,
auth.cooldowns.overloadedBackoffMs und
auth.cooldowns.rateLimitedProfileRotations an.
Wenn ein Lauf mit einer Modellüberschreibung startet (Hooks oder CLI), enden Fallbacks nach
dem Versuch aller konfigurierten Fallbacks trotzdem bei agents.defaults.model.primary.
Regeln für Kandidatenketten
OpenClaw erstellt die Kandidatenliste aus dem aktuell angefordertenprovider/model
plus konfigurierten Fallbacks.
Regeln:
- Das angeforderte Modell ist immer zuerst.
- Explizit konfigurierte Fallbacks werden dedupliziert, aber nicht durch die Modell- Allowlist gefiltert. Sie gelten als explizite Operator-Absicht.
- Wenn der aktuelle Lauf bereits auf einem konfigurierten Fallback derselben Provider- Familie läuft, verwendet OpenClaw weiterhin die vollständige konfigurierte Kette.
- Wenn der aktuelle Lauf auf einem anderen Provider als in der Konfiguration läuft und dieses aktuelle Modell noch nicht Teil der konfigurierten Fallback-Kette ist, hängt OpenClaw keine nicht zusammenhängenden konfigurierten Fallbacks eines anderen Providers an.
- Wenn der Lauf von einer Überschreibung gestartet wurde, wird das konfigurierte primäre Modell am Ende angehängt, damit sich die Kette wieder auf den normalen Standard einpendeln kann, sobald frühere Kandidaten ausgeschöpft sind.
Welche Fehler Fallback voranbringen
Modell-Fallback setzt fort bei:- Auth-Fehlern
- Rate Limits und erschöpftem Cooldown
- überlasteten/Provider-busy-Fehlern
- timeoutförmigen Failover-Fehlern
- Billing-Deaktivierungen
LiveSessionModelSwitchError, das in einen Failover-Pfad normalisiert wird, damit ein veraltetes persistiertes Modell keine äußere Retry-Schleife erzeugt- anderen nicht erkannten Fehlern, wenn noch Kandidaten übrig sind
- expliziten Abbrüchen, die nicht timeout-/failover-förmig sind
- Kontextüberlauf-Fehlern, die innerhalb der Kompaktierungs-/Retry-Logik bleiben sollen
(zum Beispiel
request_too_large,INVALID_ARGUMENT: input exceeds the maximum number of tokens,input token count exceeds the maximum number of input tokens,The input is too long for the modeloderollama error: context length exceeded) - einem letzten unbekannten Fehler, wenn keine Kandidaten mehr übrig sind
Cooldown-Skip vs. Probe-Verhalten
Wenn sich bereits alle Auth-Profile für einen Provider im Cooldown befinden, überspringt OpenClaw diesen Provider nicht automatisch für immer. Es trifft eine Entscheidung pro Kandidat:- Persistente Auth-Fehler überspringen sofort den gesamten Provider.
- Billing-Deaktivierungen führen normalerweise zum Überspringen, aber der primäre Kandidat kann weiterhin gedrosselt geprobt werden, damit eine Wiederherstellung ohne Neustart möglich ist.
- Der primäre Kandidat kann nahe am Cooldown-Ablauf geprobt werden, mit einer Drossel pro Provider.
- Schwester-Fallbacks desselben Providers können trotz Cooldown versucht werden, wenn der
Fehler transient aussieht (
rate_limit,overloadedoder unbekannt). Das ist besonders relevant, wenn ein Rate Limit auf ein Modell begrenzt ist und ein Schwester-Modell sich möglicherweise sofort wieder erholt. - Transiente Cooldown-Probes sind auf eine pro Provider und Fallback-Lauf begrenzt, damit ein einzelner Provider nicht providerübergreifendes Fallback blockiert.
Sitzungsüberschreibungen und Live-Modellwechsel
Änderungen des Sitzungsmodells sind geteilter Status. Der aktive Runner, der/model-Befehl,
Kompaktierungs-/Sitzungs-Updates und Live-Session-Reconciliation lesen oder schreiben
Teile desselben Sitzungseintrags.
Das bedeutet, dass Fallback-Retries mit Live-Modellwechseln koordiniert werden müssen:
- Nur explizite benutzergesteuerte Modelländerungen markieren einen ausstehenden Live-Switch. Das
umfasst
/model,session_status(model=...)undsessions.patch. - Systemgesteuerte Modelländerungen wie Fallback-Rotation, Heartbeat-Überschreibungen oder Kompaktierung markieren niemals selbst einen ausstehenden Live-Switch.
- Bevor ein Fallback-Retry startet, speichert der Reply-Runner die ausgewählten Fallback-Override-Felder im Sitzungseintrag.
- Live-Session-Reconciliation bevorzugt persistierte Sitzungsüberschreibungen gegenüber veralteten Laufzeit-Modellfeldern.
- Wenn der Fallback-Versuch fehlschlägt, setzt der Runner nur die Override-Felder zurück, die er geschrieben hat, und auch nur dann, wenn sie noch mit diesem fehlgeschlagenen Kandidaten übereinstimmen.
- Primäres Modell schlägt fehl.
- Fallback-Kandidat wird im Speicher ausgewählt.
- Der Sitzungsspeicher sagt weiterhin das alte primäre Modell.
- Live-Session-Reconciliation liest den veralteten Sitzungsstatus.
- Der Retry wird zurück auf das alte Modell gezogen, bevor der Fallback-Versuch startet.
Beobachtbarkeit und Fehlerzusammenfassungen
runWithModelFallback(...) zeichnet Details pro Versuch auf, die in Logs und
benutzerseitige Cooldown-Meldungen einfließen:
- versuchter Provider/versuchtes Modell
- Grund (
rate_limit,overloaded,billing,auth,model_not_foundund ähnliche Failover-Gründe) - optionaler Status/Code
- menschenlesbare Fehlerzusammenfassung
FallbackSummaryError. Der äußere
Reply-Runner kann dies verwenden, um eine spezifischere Nachricht zu erstellen, etwa „alle Modelle
sind vorübergehend rate-limited“, und den frühesten Cooldown-Ablauf einzuschließen, sofern einer
bekannt ist.
Diese Cooldown-Zusammenfassung ist modellbewusst:
- nicht zusammenhängende modellbezogene Rate Limits werden für die versuchte Provider-/Modellkette ignoriert
- wenn der verbleibende Block ein passendes modellbezogenes Rate Limit ist, meldet OpenClaw den letzten passenden Ablauf, der dieses Modell weiterhin blockiert
Verwandte Konfiguration
Siehe Gateway-Konfiguration für:auth.profiles/auth.orderauth.cooldowns.billingBackoffHours/auth.cooldowns.billingBackoffHoursByProviderauth.cooldowns.billingMaxHours/auth.cooldowns.failureWindowHoursauth.cooldowns.overloadedProfileRotations/auth.cooldowns.overloadedBackoffMsauth.cooldowns.rateLimitedProfileRotationsagents.defaults.model.primary/agents.defaults.model.fallbacksagents.defaults.imageModel-Routing