Übersicht
Failover ist Teil der virtuellen Modelle. Jede Weiterleitung mit zwei oder mehr Zielen wechselt per Failover zwischen ihnen: Liefert das Ziel, an das ein Request gesendet wurde, einen Fehler, der für Failover infrage kommt, wiederholt GoModel den Request bei den übrigen verfügbaren Zielen der Weiterleitung in der angegebenen Reihenfolge und hört beim ersten Erfolg auf. Die Load-Balancing-Strategie der Weiterleitung entscheidet nur darüber, welches Ziel zuerst versucht wird:
Wählen Sie Failover, wenn die Zielliste eine Prioritätsreihenfolge ist –
immer das beste Modell verwenden, außer es ist ausgefallen, und erst dann auf
die Backups ausweichen.
Bei den anderen Strategien zeigt der Editor ein Kontrollkästchen Failover
an, das standardmäßig aktiviert ist. Deaktivieren Sie es (oder setzen Sie im
Code
failover: false), wenn eine Weiterleitung nur verteilen und ein
fehlgeschlagener Request seinen Fehler zurückgeben soll, etwa wenn die Ziele
nicht austauschbar sind und ein Client Retries selbst übernimmt. Die
Failover-Strategie wechselt immer per Failover, daher wird das Kontrollkästchen
dort nicht angeboten.
Eine Failover-Kette konfigurieren
Öffnen Sie im Dashboard Models und bearbeiten Sie das Modell, das Sie absichern möchten: Das Modell ist bereits als erstes Ziel festgelegt. Fügen Sie die Fallbacks darunter in Prioritätsreihenfolge hinzu und speichern Sie – die Strategie ist standardmäßig Failover. Soll das Failover stattdessen unter einem neuen Namen laufen, erstellen Sie ein virtuelles Modell, listen Sie die Ziele in Prioritätsreihenfolge auf und wählen Sie im Dropdown Load-balancing strategy die Option Failover. Gewichte und Session-Bindung gelten für diese Strategie nicht, daher blendet der Editor sie aus. Wenn Sie die festgelegte Zeile entfernen, wird der Eintrag zu einer einfachen Redirect: Requests für das Modell gehen dann an die übrigen Ziele. Als Code (config.yaml oder die Umgebungsvariable VIRTUAL_MODELS):
gpt-4o auf claude-sonnet-4-6 ausweichen, während
claude-sonnet-4-6 auf gpt-4o ausweicht. Jede andere Weiterleitung (ein
Alias, ein virtuelles Modell unter neuem Namen), die ein abgesichertes Modell
aufführt, durchläuft dagegen auch dessen Fallbacks.
Bei Requests ohne Streaming laufen Provider-Retries vor dem Failover. Um
Cloudflare-Responses mit 522/524 zu wiederholen und anschließend beim selben
Provider das Modell zu wechseln, verwenden Sie
Ausfallsicherheits-Einstellungen mit Circuit Breakern pro Modell.
Failover reagiert auf fehlgeschlagene Versuche, nicht auf langsame. Um Traffic
von einem Provider abzuziehen, der zwar noch antwortet, aber zu lange braucht,
setzen Sie einen
Schwellenwert für langsame Aufrufe
für seinen Circuit Breaker.
Wann es greift
Failover wird nur versucht, nachdem ein Versuch Folgendes zurückgegeben hat:5xx429, einschließlich eines Rate-Limits, das GoModel selbst für das Ziel durchsetzt – ein ausgelastetes Ziel wird übersprungen, solange ein anderes Ziel Kapazität hat- Fehler der Art „Modell nicht verfügbar“, „nicht unterstützt“ oder „nicht gefunden“
- Upstream-Fehlermeldungen, die mit einem
4xx-Status weitergereicht werden (Aggregator-Provider wie OpenCode Zen können einen vorübergehenden Fehler ihres eigenen Upstreams als400 "Upstream request failed"melden)
/v1/chat/completions, /v1/responses und
/v1/messages. Das Request-Log zeigt jeden Versuch, sodass ein ausgeliefertes
Failover im Audit-Trail sichtbar ist und zum Preis des Modells abgerechnet
wird, das geantwortet hat.
Ein Zielmodell, das deaktiviert ist oder das der API-Key oder user_path des
Requests nicht verwenden darf, wird nie versucht: Es wird sowohl bei der Wahl
des ersten Ziels als auch in der Failover-Kette übersprungen, ohne als Versuch
zu zählen.
Ein Request, der seinen Provider im Feld provider nennt, umgeht virtuelle
Modelle und erreicht das konkrete Modell direkt. Er erhält trotzdem die Kette
eines virtuellen Modells, das genau dieses Modell überlagert und es als Ziel
aufführt (die Form, die die Seite Models für ein reales Modell anlegt), da
dieses virtuelle Modell dem Modell Failover hinzufügt, statt es zu ersetzen.
Eine Response, die von einem Failover-Ziel stammt, wird nicht in den
Response-Cache
geschrieben: Der Cache-Key wird aus der Auflösung vor dem Failover gehasht,
sonst würde die Antwort des Backups unter dem Key des primären Ziels erneut
ausgeliefert. Solange ein erstes Ziel ausgefallen ist, legt die Kette daher
keine neuen Cache-Einträge an; vor dem Ausfall geschriebene Einträge werden
weiterhin ausgeliefert, bis ihre TTL abläuft.
FAILOVER_ENABLED=false (oder failover.enabled: false), um den
Durchlauf global abzuschalten; auch ein Workflow kann
ihn für seinen Geltungsbereich abschalten. Das gewählte Ziel wird weiterhin
bedient, jedoch ohne Retries.
Die Failover-Richtlinie anpassen
Die oben beschriebenen Standardwerte passen für die meisten Deployments. Drei Einstellungen unterfailover (oder die entsprechenden Umgebungsvariablen)
passen sie an:
Eine nicht leere Liste ersetzt ihren Standardwert. Wiederholen Sie daher
die Standardwerte, die Sie behalten möchten; eine leere oder weggelassene
Liste behält den Standardwert bei (verwenden Sie
enabled: false, um Failover
abzuschalten). In Umgebungsvariablen trennen Sie Einträge durch Kommas.
Eine Phrase in retry_on_errors trifft zu, wenn jedes ihrer Wörter im
Fehlercode oder in der Fehlermeldung vorkommt (Groß-/Kleinschreibung wird
ignoriert, Teilstring-Abgleich): model not found trifft auf
The model 'gpt-9' was not found zu. Ein numerisches Wort – 404 oder 4xx –
schränkt stattdessen den HTTP-Status ein, nicht den Text. 404 deprecated
trifft also auf einen 404 zu, dessen Meldung „deprecated“ erwähnt, und auf
nichts anderes. Die Standardliste lautet:
200 mit einem leeren
choices-Array zurückgibt, wird als 502 (provider returned no choices)
behandelt und löst daher nach der Standardregel für 5xx ein Failover aus.
Jeder solche Versuch wird außerdem protokolliert und in
gomodel_empty_responses_total gezählt.
Streaming-Requests werden auf dieselbe Weise geprüft, bevor Bytes den Client
erreichen. Ein 200-Stream, der ohne Event endet, wird als 502
(provider returned an empty stream) behandelt, und ein Stream, dessen erstes
Event ein {"error": ...}-Payload ist, schlägt mit dem Status fehl, den dieser
Payload enthält (zum Beispiel ein In-Band-429), oder mit 502, wenn er
keinen enthält. Beide lösen nach den Standardregeln ein Failover aus. Die
Response-Header warten auf dieses erste Event.
Fehlermodi von Providern listet alle
diese Fälle auf und zeigt, welche davon ein Failover auslösen.
Beispiel: höchstens ein Backup versuchen, Timeouts als Failover-Grund
behandeln, 429-Responses aber weiterhin an den Client ausliefern und eine
providerspezifische Überlastungsmeldung ergänzen:
max_attempts: 1 meldet ein Request, der sein Limit ausschöpft, also den
Fehler des Backups, nicht den des primären Ziels.
Migration von Failover-Regeln
Frühere Releases verwalteten Failover als separate Zuordnungen pro Modell (das Shuffle-Symbol auf der Seite Models und die Konfigurationfailover.rules). Beide werden automatisch umgewandelt:
- Im Dashboard verwaltete Zuordnungen werden zu virtuellen Modellen mit der
Failover-Strategie, die ihr primäres Modell überdecken. Die Umwandlung läuft
einmalig beim Start und entfernt anschließend den alten
failover_rules-Speicher (in jeder seiner historischen Formen). Hat das primäre Modell bereits eine einfache Einstellung pro Modell (eine Verlangsamung oder Beschreibung, die über die Seite Models gesetzt wurde), wird die Zuordnung darin zusammengeführt und die Einstellung beibehalten. Ein primäres Modell, das bereits eine Weiterleitung oder eine pfadbezogene Einstellung hat oder deaktiviert ist, wird protokolliert und übersprungen, und der Speicher bleibt erhalten, bis dies aufgelöst ist – fügen Sie seine Fallbacks als Ziele dieses virtuellen Modells mit der Failover-Strategie hinzu und löschen Sie dann die Zeile. Eine Zuordnung, deren Fallback ein virtuelles Modell nennt, das zurück zu ihrem primären Modell routet, bleibt ebenso erhalten, da ihre Umwandlung einen Kettenzyklus erzeugen würde – passen Sie dieses virtuelle Modell an oder entfernen Sie es, und starten Sie dann neu. Ein primäres Modell, das indisabled_modelsaufgeführt ist, wird als deaktiviertes virtuelles Modell umgewandelt: Seine Fallbacks bleiben erhalten, aber inaktiv, bis Sie es auf der Seite Models aktivieren. failover.rules,manual_rules_path,FAILOVER_RULES_JSONunddisabled_modelswerden weiterhin geladen und bei jedem Start mit einer Deprecation-Warnung in konfigurationsverwaltete virtuelle Modelle übersetzt. Eine Regel, deren primäres Modell im Dashboard ein virtuelles Modell hat, wird mit einer Warnung übersprungen, sodass sie das Routing dieses virtuellen Modells nie ersetzt. Verschieben Sie die Regeln bei Gelegenheit untervirtual_models.