Fallback-Anbieter und Circuit Breaker
Erstellen Sie eine Anbieter-Kaskade, die bei einem langsamen oder nicht verfügbaren primären Anbieter automatisch von OpenAI über Anthropic auf ein lokales Modell ausweicht, und verwenden Sie dabei das Circuit-Breaker-Muster.
Fallback-Anbieter und Circuit Breaker ist eine kostenlose AI Engineering Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Engineering Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.
Risiko eines einzelnen Anbieters
Die Abhängigkeit von einem einzelnen LLM-Anbieter schafft einen Single Point of Failure. Bei OpenAI kam es bereits zu Ausfällen, deren Behebung Minuten bis Stunden dauerte. Wenn Ihre gesamte Anwendung davon abhängt, dass GPT-4o verfügbar ist, führt jeder Vorfall beim Anbieter unmittelbar zu für Benutzer sichtbaren Ausfallzeiten. Eine Fallback-Strategie für Anbieter erhält die Dienstkontinuität, indem sie bei einem Ausfall des primären Anbieters Anfragen an alternative Anbieter weiterleitet.
Eine Anbieter-Kaskade definieren
Eine Anbieter-Kaskade ist eine geordnete Liste von Anbietern und Modellen, die nacheinander ausprobiert werden. Wenn der primäre Anbieter ausfällt oder eine Zeitüberschreitung auftritt, versucht das System automatisch den nächsten Anbieter. Eine typische Kaskade könnte so aussehen: OpenAI GPT-4o → Anthropic Claude 3.5 Sonnet → ein lokal bereitgestelltes Llama-Modell. Jede Stufe dient als Fallback, wobei das lokale Modell als letzte, nicht ausfallende Option fungiert.
from dataclasses import dataclass
from typing import Optional
@dataclass
class Provider:
name: str
base_url: Optional[str]
api_key_env: str
model: str
priority: int # lower = higher priority
CASCADE = [
Provider('openai', None, 'OPENAI_API_KEY', 'gpt-4o', 1),
Provider('anthropic', 'https://api.anthropic.com/v1', 'ANTHROPIC_API_KEY', 'claude-3-5-sonnet', 2),
Provider('local', 'http://localhost:8000/v1', 'LOCAL_KEY', 'llama-3.1-8b-inst', 3),
]Die Fallback-Schleife implementieren
Implementieren Sie die Fallback-Schleife als einfache try/except-Struktur, die die Kaskade durchläuft. Fangen Sie vorübergehende Fehler (Zeitüberschreitungen, 500er-, 503er-Fehler) ab und wechseln Sie zum nächsten Anbieter. Fangen Sie keine Authentifizierungsfehler (401) oder Fehler aufgrund ungültiger Anfragen (400) ab – dabei handelt es sich um Programmierfehler, die sofort sichtbar werden sollten, anstatt einen Failover zu einem anderen Anbieter auszulösen.
import openai
import os
TRANSIENT_ERRORS = (openai.APITimeoutError, openai.InternalServerError, openai.APIConnectionError)
async def call_with_fallback(messages: list, **kwargs) -> str:
for provider in CASCADE:
try:
client = openai.AsyncOpenAI(
api_key=os.environ[provider.api_key_env],
base_url=provider.base_url
)
resp = await client.chat.completions.create(
model=provider.model,
messages=messages,
timeout=10.0,
**kwargs
)
return resp.choices[0].message.content
except TRANSIENT_ERRORS as e:
print(f'Provider {provider.name} failed: {e}, trying next...')
raise RuntimeError('All providers failed')Was ist ein Circuit Breaker?
Ein Circuit Breaker verhindert, dass ein fehlerhafter Dienst während eines Ausfalls mit Anfragen überlastet wird. Benannt nach elektrischen Schutzschaltern, hat er drei Zustände: Closed (Anfragen werden normal weitergeleitet), Open (Anfragen werden sofort abgelehnt) und Half-Open (eine einzelne Testanfrage wird durchgelassen, um zu prüfen, ob sich der Dienst erholt hat). Dies schützt sowohl den nachgelagerten Dienst als auch Ihre eigene Anwendung während Vorfällen.
# Circuit breaker state machine:
#
# CLOSED --> (failure_count >= threshold) --> OPEN
# ^ |
# | (test_request succeeds) | (timeout expires)
# +------------ HALF_OPEN <-----------------+
#
# In OPEN state: immediately return fallback/error
# In HALF_OPEN: allow one request through to test recovery
# In CLOSED: normal operation, count failuresEinen Circuit Breaker implementieren
Hier ist eine minimale Implementierung eines Circuit Breakers. Verfolgen Sie die Anzahl der Fehler und den Zeitpunkt, zu dem der Circuit geöffnet wurde. Wenn die Fehleranzahl den Schwellenwert überschreitet, öffnen Sie den Circuit. Lassen Sie nach einem konfigurierbaren Zurücksetzungs-Timeout eine Prüfanforderung zu. Wenn die Prüfung erfolgreich ist, schließen Sie den Circuit. Wenn sie fehlschlägt, lassen Sie den Circuit geöffnet und setzen Sie das Timeout zurück.
import time
from enum import Enum
class State(Enum):
CLOSED = 'closed'
OPEN = 'open'
HALF_OPEN = 'half_open'
class CircuitBreaker:
def __init__(self, failure_threshold=5, reset_timeout=60):
self.state = State.CLOSED
self.failure_count = 0
self.failure_threshold = failure_threshold
self.reset_timeout = reset_timeout
self.opened_at = None
def record_success(self):
self.failure_count = 0
self.state = State.CLOSED
def record_failure(self):
self.failure_count += 1
if self.failure_count >= self.failure_threshold:
self.state = State.OPEN
self.opened_at = time.time()
def can_attempt(self) -> bool:
if self.state == State.CLOSED:
return True
if self.state == State.OPEN:
if time.time() - self.opened_at > self.reset_timeout:
self.state = State.HALF_OPEN
return True # allow one probe
return False
return True # HALF_OPEN: allow probeCircuit Breaker in Anbieter integrieren
Verwalten Sie einen Circuit Breaker pro Anbieter. Prüfen Sie vor dem Aufruf eines Anbieters, ob dessen Circuit Breaker den Versuch zulässt. Erfassen Sie nach jedem Aufruf Erfolg oder Fehlschlag. Wenn der Circuit eines Anbieters geöffnet wird, überspringt die Fallback-Schleife ihn automatisch und versucht den nächsten Anbieter in der Kaskade, ohne bei jedem einzelnen Aufruf auf eine Zeitüberschreitung zu warten.
breakers = {p.name: CircuitBreaker(failure_threshold=5, reset_timeout=60) for p in CASCADE}
async def call_with_circuit_breaker(messages: list) -> str:
for provider in CASCADE:
breaker = breakers[provider.name]
if not breaker.can_attempt():
continue # skip this provider, circuit is open
try:
result = await call_provider(provider, messages)
breaker.record_success()
return result
except TRANSIENT_ERRORS as e:
breaker.record_failure()
print(f'{provider.name} failed ({breaker.failure_count}/{breaker.failure_threshold})')
raise RuntimeError('All providers exhausted')Langsame Aufrufe als Fehler erkennen
Ein Provider, der erst nach 30 Sekunden antwortet, ist aus Sicht der Benutzererfahrung fast so schlecht wie ein vollständig ausgefallener. Konfigurieren Sie für jeden Provider-Aufruf ein Timeout mit einer kurzen Dauer und behandeln Sie Timeout-Ausnahmen im Circuit Breaker als Fehler. Ein Timeout von 10 Sekunden sorgt dafür, dass der Fallback schnell genug greift und der Benutzer nur eine kurze Verzögerung statt eines eingefrorenen Bildschirms sieht.
async def call_provider(provider: Provider, messages: list) -> str:
client = openai.AsyncOpenAI(
api_key=os.environ[provider.api_key_env],
base_url=provider.base_url
)
try:
resp = await asyncio.wait_for(
client.chat.completions.create(model=provider.model, messages=messages),
timeout=10.0 # fail fast, let circuit breaker count it
)
return resp.choices[0].message.content
except asyncio.TimeoutError:
raise openai.APITimeoutError('Provider timed out')Dashboard zur Provider-Gesundheit
Stellen Sie einen Endpunkt /health/providers bereit, der für jeden Provider den aktuellen Zustand des Circuit Breakers anzeigt, einschließlich Fehleranzahl, Zustand (closed/open/half-open) und verbleibender Zeit bis zum Zurücksetzen. So können Sie während eines Vorfalls auf einen Blick erkennen, welche Provider gesund sind, und entscheiden, ob Sie manuell einen Reset erzwingen oder auf die automatische Wiederherstellung warten sollten.
from fastapi import FastAPI
app = FastAPI()
@app.get('/health/providers')
def provider_health():
return {
name: {
'state': cb.state.value,
'failure_count': cb.failure_count,
'seconds_until_reset': (
max(0, cb.reset_timeout - (time.time() - cb.opened_at))
if cb.state == State.OPEN else None
)
}
for name, cb in breakers.items()
}Provider-Ausgaben aufeinander abstimmen
Verschiedene Provider verwenden unterschiedliche Antwortformate, Sicherheitsfilter und Fähigkeiten. Beim Wechsel von GPT-4o zu Claude kann das Modell bestimmte Anfragen ablehnen, die GPT-4o beantworten würde. Verwenden Sie provider-spezifische Prompt-Wrapper, die Ihre Prompts an die Konventionen des jeweiligen Providers anpassen. Testen Sie jeden Fallback-Provider unabhängig, um sicherzustellen, dass er für Ihren Anwendungsfall akzeptable Ausgaben erzeugt.
def adapt_messages_for_provider(provider: Provider, messages: list) -> list:
if provider.name == 'anthropic':
# Claude prefers explicit task descriptions
system = next((m['content'] for m in messages if m['role'] == 'system'), '')
if 'JSON' not in system:
messages = [{'role': 'system', 'content': system + ' Respond in JSON.'}] + [
m for m in messages if m['role'] != 'system'
]
return messagesFallback-Verhalten testen
Schreiben Sie einen Test, der den primären Provider absichtlich fehlschlagen lässt (etwa durch einen ungültigen API-Schlüssel oder einen Mock, der Fehler auslöst), und überprüfen Sie, ob der Fallback greift und eine gültige Antwort zurückgibt. Testen Sie außerdem, ob der Circuit Breaker nach der konfigurierten Anzahl von Fehlern korrekt geöffnet wird und sich nach Ablauf des Reset-Timeouts wieder erholt. Eine Fallback-Logik, die nie getestet wird, ist bei einem echten Ausfall unzuverlässig.
import pytest
from unittest.mock import AsyncMock, patch
@pytest.mark.asyncio
async def test_fallback_on_primary_timeout():
# Primary provider times out
with patch('your_module.call_provider', side_effect=[
openai.APITimeoutError('Timeout'), # primary fails
'Claude response' # fallback succeeds
]):
result = await call_with_circuit_breaker([{'role': 'user', 'content': 'Hello'}])
assert result == 'Claude response'Kostenaspekte bei Provider-Kaskaden
Fallback-Provider haben häufig eine andere Preisstruktur als Ihr primärer Provider. Anthropic Claude kann je nach Modellstufe mehr oder weniger kosten als OpenAI GPT-4o. Erfassen Sie, welcher Provider jede Anfrage verarbeitet hat, und berechnen Sie die Kostenzuordnung getrennt. Wenn der Fallback dauerhaft teurer ist, prüfen Sie, ob der primäre Provider zu knapp dimensioniert ist und ob ein Upgrade auf eine höhere Rate-Limit-Stufe kostengünstiger wäre als die häufige Nutzung des Fallbacks.
# Approximate costs per 1M tokens (2026):
PROVIDER_COSTS = {
'openai/gpt-4o': {'input': 2.50, 'output': 10.00},
'anthropic/claude-3.5-sonnet': {'input': 3.00, 'output': 15.00},
'openai/gpt-4o-mini': {'input': 0.15, 'output': 0.60},
'local/llama-3.1-8b': {'input': 0.00, 'output': 0.00}, # infra cost only
}
# If fallback adds $0.50/day and a Tier 2 upgrade costs $100/month:
# Tier 2 pays off if you use fallback > 200 requests/dayKurze Überprüfung
Testen Sie Ihr Verständnis von Circuit Breakers und Fallback-Providern.
Zusammenfassung der Lektion
In dieser Lektion haben Sie gelernt: Provider-Kaskaden definieren eine geordnete Fallback-Abfolge vom primären zu den ersatzweise verwendeten LLM-Providern, Circuit Breakers verhindern eine Überlastung eines fehlerhaften Providers, indem sie nach einem Schwellenwert von Fehlern schnell den Aufruf kurzschließen, und Provider-spezifische Timeouts sorgen dafür, dass langsame Aufrufe schnell den Fallback auslösen, statt Benutzer zu blockieren. Als Nächstes legen wir Timeout-Budgets fest und implementieren eine kontrollierte Verschlechterung.
Häufig gestellte Fragen
Ist die Lektion „Fallback-Anbieter und Circuit Breaker“ kostenlos?
Ja — der vollständige Text von „Fallback-Anbieter und Circuit Breaker“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Engineering Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Engineering Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Fallback-Anbieter und Circuit Breaker“?
Erstellen Sie eine Anbieter-Kaskade, die bei einem langsamen oder nicht verfügbaren primären Anbieter automatisch von OpenAI über Anthropic auf ein lokales Modell ausweicht, und verwenden Sie dabei d… Du übst AI Engineering Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Engineering Academy zu starten?
Keine Vorkenntnisse erforderlich. AI Engineering Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Fallback-Anbieter und Circuit Breaker“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Engineering Academy-Lektion Code schreiben und ausführen?
Ja. Jede AI Engineering Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- LLM-Latenz messen: TTFT und TPOT
- Lastverteilung und Strategien mit mehreren Schlüsseln
- Fallback-Anbieter und Circuit Breaker
- Timeout-Budgets und sanfte Verschlechterung