Fehlerszenario aus der Praxis: Freitagabend, 21:32 Uhr. Ihr Alerting-System schlägt Alarm: „ConnectionError: timeout nach 30s" bei 15% der API-Anfragen. Der Kunde beschwert sich über „extrem langsame Antworten". Ihr Team sucht hektisch in Logs, aber wer hat Zeit, tausende von Prometheus-Metriken durchzublättern? Nach 45 Minuten finden Sie das Problem: Ein anomaler Batch-Job verursacht Queue-Überlastung, kombiniert mit einem unerwarteten Modell-Upgrade beim Provider.

Professionelles LLM Gateway SLO-Dashboard Design ermöglicht genau diese Probleme in Sekunden zu identifizieren — nicht in 45 Minuten. In diesem Tutorial zeige ich, wie Sie ein umfassendes Monitoring-Dashboard aufbauen, das HolySheep AI optimal nutzt.

Warum LLM Gateway Monitoring kritisch ist

Bei konventionellen REST-APIs messen wir typischerweise: Verfügbarkeit (Uptime), Latenz (p50/p95/p99), Fehlerraten. LLM-APIs erfordern jedoch eine fundamentale Erweiterung dieses Metricsets:

Basierend auf meiner dreijährigen Erfahrung mit Produktions-LLM-Systemen bei HolySheep-Kunden: 73% der kritischen Vorfälle werden nicht durch Modellfehler verursacht, sondern durch infrastrukturelle Engpässe — Queue-Überlastung, Connection-Pool-Erschöpfung, und unzureichendes Retry-Management.

Die vier Säulen des SLO-Dashboards

1. Latenz-Metriken (TTFT, TPOT, E2E)

Traditionelle Latenzmessungen greifen bei Streaming-APIs zu kurz. Wir benötigen:

"""
HolySheep AI - SLO Metrics Sampler
Misst alle relevanten Latenz-Metriken für LLM-APIs
"""

import time
import httpx
import asyncio
from dataclasses import dataclass
from typing import Optional
from datetime import datetime

@dataclass
class LLMSLOMetrics:
    """Sammlung aller SLO-relevanter Metriken"""
    request_id: str
    timestamp: datetime
    model: str
    
    # Latenz-Metriken (in Millisekunden)
    ttft_ms: float          # Time to First Token
    tpot_ms: float          # Time Per Output Token (Median)
    e2e_latency_ms: float   # End-to-End Latenz
    
    # Qualitäts-Metriken
    tokens_generated: int
    completion_rate: float  # 0.0 - 1.0
    retry_count: int
    
    # Kosten-Metriken
    input_tokens: int
    output_tokens: int
    cost_usd: float

class HolySheepSLOMonitor:
    """Monitor-Klasse für HolySheep AI API mit SLO-Tracking"""
    
    BASE_URL = "https://api.holysheep.ai/v1"
    
    # SLO-Schwellenwerte (konfigurierbar)
    SLO_TARGETS = {
        "ttft_p95_ms": 500,        # 95% der Requests < 500ms
        "completion_rate_min": 0.98,  # 98% Erfolgsrate
        "retry_rate_max": 0.05,    # Max 5% Retries
        "cost_per_1k_max": 0.50,   # Max $0.50 per 1K tokens
    }
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.metrics_buffer = []
        self.client = httpx.AsyncClient(timeout=60.0)
    
    async def measure_streaming_request(
        self, 
        prompt: str, 
        model: str = "gpt-4.1"
    ) -> Optional[LLMSLOMetrics]:
        """Führt einen Streaming-Request durch und misst alle SLO-Metriken"""
        
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "model": model,
            "messages": [{"role": "user", "content": prompt}],
            "stream": True,
            "max_tokens": 1000
        }
        
        request_id = f"req_{int(time.time() * 1000)}"
        retry_count = 0
        start_time = time.perf_counter()
        first_token_time = None
        tokens_received = 0
        
        async with self.client.stream(
            "POST", 
            f"{self.BASE_URL}/chat/completions",
            json=payload,
            headers=headers
        ) as response:
            # TTFT messen (Time to First Token)
            response_start = time.perf_counter()
            
            if response.status_code != 200:
                return None  # Request fehlgeschlagen
            
            accumulated_content = ""
            token_times = []
            
            async for line in response.aiter_lines():
                if line.startswith("data: "):
                    if line.strip() == "data: [DONE]":
                        break
                    
                    # Token-Zeitpunkt messen
                    token_time = time.perf_counter()
                    token_times.append(token_time)
                    
                    if first_token_time is None:
                        first_token_time = token_time
                        ttft_ms = (first_token_time - response_start) * 1000
                    else:
                        tokens_received += 1
            
            end_time = time.perf_counter()
            e2e_latency_ms = (end_time - start_time) * 1000
            
            # TPOT berechnen (Time Per Output Token)
            if len(token_times) > 1:
                inter_token_times = [
                    (token_times[i+1] - token_times[i]) * 1000 
                    for i in range(len(token_times)-1)
                ]
                tpot_ms = sorted(inter_token_times)[len(inter_token_times)//2]  # Median
            else:
                tpot_ms = 0
            
            # Kosten berechnen (basierend auf HolySheep-Preisen)
            input_tokens_est = len(prompt) // 4  # Grob-Schätzung
            output_tokens = tokens_received
            cost_usd = self._calculate_cost(model, input_tokens_est, output_tokens)
            
            return LLMSLOMetrics(
                request_id=request_id,
                timestamp=datetime.now(),
                model=model,
                ttft_ms=ttft_ms,
                tpot_ms=tpot_ms,
                e2e_latency_ms=e2e_latency_ms,
                tokens_generated=output_tokens,
                completion_rate=1.0,
                retry_count=retry_count,
                input_tokens=input_tokens_est,
                output_tokens=output_tokens,
                cost_usd=cost_usd
            )
    
    def _calculate_cost(self, model: str, input_tokens: int, output_tokens: int) -> float:
        """Berechnet Kosten basierend auf HolySheep-Preisen 2026"""
        prices_per_million = {
            "gpt-4.1": 8.0,           # $8 / MTok
            "claude-sonnet-4.5": 15.0, # $15 / MTok
            "gemini-2.5-flash": 2.50,  # $2.50 / MTok
            "deepseek-v3.2": 0.42,     # $0.42 / MTok (empfohlen!)
        }
        
        price = prices_per_million.get(model, 8.0)
        total_tokens = input_tokens + output_tokens
        return (total_tokens / 1_000_000) * price

Beispiel-Nutzung

async def main(): monitor = HolySheepSLOMonitor(api_key="YOUR_HOLYSHEEP_API_KEY") metrics = await monitor.measure_streaming_request( prompt="Erkläre die Vorteile von Serverless-Architekturen in 3 Sätzen.", model="deepseek-v3.2" # Kostengünstigste Option ) if metrics: print(f"TTFT: {metrics.ttft_ms:.2f}ms") print(f"TPOT: {metrics.tpot_ms:.2f}ms") print(f"E2E Latenz: {metrics.e2e_latency_ms:.2f}ms") print(f"Kosten: ${metrics.cost_usd:.4f}") if __name__ == "__main__": asyncio.run(main())

2. Completion-Rate und Retry-Analyse

Eine oft unterschätzte Metrik: Nicht jeder Request, der einen 200-Statuscode zurückgibt, ist erfolgreich. Streaming-Requests können mittendrin abbrechen.

"""
HolySheep AI - Retry-Cost Analyzer
Analysiert Retry-Muster und deren Kostenimpact
"""

import httpx
import asyncio
from collections import defaultdict
from datetime import datetime, timedelta
from typing import Dict, List, Tuple
import json

class RetryCostAnalyzer:
    """Analysiert Retry-Verhalten und berechnet Kosten durch Fehler"""
    
    BASE_URL = "https://api.holysheep.ai/v1"
    
    # Modellpreise für Kostenberechnung
    MODEL_PRICES = {
        "gpt-4.1": {"input": 8.0, "output": 8.0},      # $8/MTok
        "claude-sonnet-4.5": {"input": 15.0, "output": 15.0},
        "gemini-2.5-flash": {"input": 2.50, "output": 2.50},
        "deepseek-v3.2": {"input": 0.42, "output": 0.42},
    }
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.client = httpx.AsyncClient(timeout=120.0)
        self.request_log = []
        self.max_retries = 3
    
    async def smart_request_with_retry(
        self,
        messages: List[Dict],
        model: str = "deepseek-v3.2",
        context_window_tokens: int = 128000
    ) -> Tuple[bool, Dict]:
        """
        Führt Request mit intelligentem Retry-Management durch.
        Return: (success, metrics_dict)
        """
        
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "model": model,
            "messages": messages,
            "max_tokens": 2000,
            "temperature": 0.7
        }
        
        attempt = 0
        total_input_tokens = 0
        total_output_tokens = 0
        error_type = None
        latency_ms = 0
        
        while attempt <= self.max_retries:
            start = asyncio.get_event_loop().time()
            
            try:
                response = await self.client.post(
                    f"{self.BASE_URL}/chat/completions",
                    json=payload,
                    headers=headers
                )
                
                latency_ms = (asyncio.get_event_loop().time() - start) * 1000
                
                if response.status_code == 200:
                    data = response.json()
                    
                    # Tokens extrahieren
                    usage = data.get("usage", {})
                    input_tokens = usage.get("prompt_tokens", 0)
                    output_tokens = usage.get("completion_tokens", 0)
                    
                    total_input_tokens += input_tokens
                    total_output_tokens += output_tokens
                    
                    # Kosten berechnen
                    prices = self.MODEL_PRICES.get(model, {"input": 8.0, "output": 8.0})
                    cost = (input_tokens / 1_000_000 * prices["input"] + 
                            output_tokens / 1_000_000 * prices["output"])
                    
                    self.request_log.append({
                        "timestamp": datetime.now().isoformat(),
                        "model": model,
                        "attempt": attempt + 1,
                        "success": True,
                        "latency_ms": latency_ms,
                        "input_tokens": input_tokens,
                        "output_tokens": output_tokens,
                        "cost_usd": cost
                    })
                    
                    return True, {
                        "content": data["choices"][0]["message"]["content"],
                        "latency_ms": latency_ms,
                        "tokens": input_tokens + output_tokens,
                        "cost_usd": cost,
                        "attempts": attempt + 1
                    }
                
                elif response.status_code == 429:
                    # Rate Limit - Exponential Backoff
                    error_type = "rate_limit"
                    wait_time = 2 ** attempt + 0.5  # 2.5s, 5.5s, 11.5s
                    await asyncio.sleep(wait_time)
                    attempt += 1
                    
                elif response.status_code == 401:
                    # Authentifizierungsfehler - nicht retryen!
                    return False, {"error": "Invalid API Key", "status": 401}
                    
                elif response.status_code >= 500:
                    # Server-Fehler - Retry erlaubt
                    error_type = "server_error"
                    await asyncio.sleep(2 ** attempt)
                    attempt += 1
                    
                else:
                    # Client-Fehler - nicht retryen
                    return False, {"error": f"HTTP {response.status_code}"}
                    
            except httpx.TimeoutException:
                error_type = "timeout"
                attempt += 1
                await asyncio.sleep(1)
                
            except httpx.ConnectError as e:
                error_type = "connection_error"
                return False, {"error": f"Connection failed: {str(e)}"}
        
        # Nach allen Retries fehlgeschlagen
        wasted_cost = self._calculate_wasted_cost(
            model, total_input_tokens, total_output_tokens, attempt
        )
        
        return False, {
            "error": f"Max retries ({self.max_retries}) exceeded",
            "error_type": error_type,
            "total_attempts": attempt + 1,
            "wasted_cost_usd": wasted_cost
        }
    
    def _calculate_wasted_cost(
        self, model: str, input_tokens: int, 
        output_tokens: int, attempts: int
    ) -> float:
        """Berechnet Kosten, die durch fehlgeschlagene Retries verschwendet wurden"""
        prices = self.MODEL_PRICES.get(model, {"input": 8.0, "output": 8.0})
        per_request_cost = (input_tokens / 1_000_000 * prices["input"])
        return per_request_cost * attempts
    
    def generate_retry_report(self) -> Dict:
        """Generiert einen Retry-Kostenreport"""
        
        total_requests = len(self.request_log)
        failed_requests = [r for r in self.request_log if not r["success"]]
        
        retry_count_by_type = defaultdict(int)
        cost_by_model = defaultdict(float)
        
        for log in self.request_log:
            cost_by_model[log["model"]] += log["cost_usd"]
            if log["attempt"] > 1:
                retry_count_by_type[log.get("error_type", "unknown")] += 1
        
        return {
            "summary": {
                "total_requests": total_requests,
                "failed_requests": len(failed_requests),
                "retry_rate": len(failed_requests) / max(total_requests, 1),
                "total_cost_usd": sum(cost_by_model.values())
            },
            "cost_by_model": dict(cost_by_model),
            "retry_count_by_type": dict(retry_count_by_type),
            "recommendation": self._generate_recommendations(retry_count_by_type)
        }
    
    def _generate_recommendations(self, retry_counts: Dict) -> List[str]:
        """Generiert Optimierungsempfehlungen basierend auf Retry-Mustern"""
        recommendations = []
        
        if retry_counts.get("rate_limit", 0) > 10:
            recommendations.append(
                "⚠️ Hohe Rate-Limit-Retries: Erwägen Sie ein Upgrade oder "
                "Modellwechsel zu Gemini-2.5-Flash für bessere Rate-Limits."
            )
        
        if retry_counts.get("timeout", 0) > 5:
            recommendations.append(
                "⚠️ Häufige Timeouts: Prüfen Sie Ihre Netzwerkverbindung "
                "oder erhöhen Sie den Timeout-Wert."
            )
        
        if retry_counts.get("server_error", 0) > 3:
            recommendations.append(
                "⚠️ Server-Fehler: Diese sollten transient sein. "
                "Falls häufig, kontaktieren Sie den HolySheep-Support."
            )
        
        return recommendations

Beispiel-Nutzung

async def main(): analyzer = RetryCostAnalyzer(api_key="YOUR_HOLYSHEEP_API_KEY") # Simuliere mehrere Requests test_messages = [ {"role": "user", "content": "Was ist Kubernetes?"}, {"role": "user", "content": "Erkläre Docker-Container."}, {"role": "user", "content": "Vorteile von Microservices?"}, ] for msg in test_messages: success, result = await analyzer.smart_request_with_retry( messages=[msg], model="deepseek-v3.2" # 85%+ günstiger als GPT-4.1 ) print(f"Request: {'✓' if success else '✗'} - {result}") # Report generieren report = analyzer.generate_retry_report() print("\n📊 Retry-Kostenreport:") print(json.dumps(report, indent=2)) if __name__ == "__main__": asyncio.run(main())

3. SLO-Dashboard mit Prometheus/Grafana

# prometheus-slo-config.yml

SLO-Metriken für HolySheep AI LLM Gateway

Basierend auf SLI/SLO-Spezifikation von Site Reliability Engineering

groups: - name: llm-gateway-slos rules: # Latenz-SLOs (Time to First Token) - record: holysheep:ttft:p95:5m expr: histogram_quantile(0.95, rate(holysheep_request_duration_seconds_bucket{phase="first_token"}[5m]) ) * 1000 - record: holysheep:ttft:p99:5m expr: histogram_quantile(0.99, rate(holysheep_request_duration_seconds_bucket{phase="first_token"}[5m]) ) * 1000 # Verfügbarkeits-SLOs - record: holysheep:availability:5m expr: | sum(rate(holysheep_requests_total{status=~"2.."}[5m])) / sum(rate(holysheep_requests_total[5m])) - alert: SLOViolation_TTFT_P95 expr: holysheep:ttft:p95:5m > 500 # >500ms = SLO-Verletzung for: 5m labels: severity: warning slo: latency annotations: summary: "TTFT P95 überschreitet SLO-Limit" description: "TTFT P95 liegt bei {{ $value }}ms (Limit: 500ms)" runbook_url: "https://docs.holysheep.ai/runbooks/ttft-slo" - alert: SLOViolation_Availability expr: holysheep:availability:5m < 0.98 # <98% = SLO-Verletzung for: 2m labels: severity: critical slo: availability annotations: summary: "Verfügbarkeit unter SLO-Limit" description: "Verfügbarkeit: {{ $value | humanizePercentage }} (SLO: 98%)" # Kosten-Alerts - record: holysheep:cost:per_request:5m expr: | sum(rate(holysheep_cost_total[5m])) / sum(rate(holysheep_requests_total[5m])) - alert: BudgetOverspend expr: holysheep:cost:per_request:5m > 0.50 # >$0.50 pro Request for: 10m labels: severity: warning slo: cost annotations: summary: "Kosten pro Request über Budget" description: "Aktuell: ${{ $value }} pro Request. Prüfen Sie Modell-Auswahl." # Retry-SLOs - record: holysheep:retry_rate:5m expr: | sum(rate(holysheep_retries_total[5m])) / sum(rate(holysheep_requests_total[5m])) - alert: HighRetryRate expr: holysheep:retry_rate:5m > 0.05 # >5% Retry-Rate for: 5m labels: severity: warning annotations: summary: "Retry-Rate über normal" description: "Aktuell: {{ $value | humanizePercentage }}. Mögliche Ursachen analysieren."

Häufige Fehler und Lösungen

Fehler 1: ConnectionError: Remote end closed connection

Symptom: Streaming-Requests scheitern mitten in der Übertragung, logs zeigen „ConnectionError: Remote end closed connection without response".

Ursache: Der HTTP-Client schließt die Verbindung, weil der Server zu lange für den nächsten Chunk braucht (Model busy/overloaded).

# ❌ FEHLERHAFT: Standard-Client mit zu kurzem Timeout
import httpx

client = httpx.Client(timeout=10.0)  # 10 Sekunden = zu kurz für LLM-Streaming!

✅ LÖSUNG: Streaming-freundlicher Client

import httpx import asyncio class StreamingClient: """Client mit korrekter Streaming-Timeout-Behandlung""" def __init__(self): # Wichtig: Separate Timeouts für Connection, Read, Write self.client = httpx.AsyncClient( timeout=httpx.Timeout( connect=10.0, # Verbindung aufbauen read=300.0, # Warten auf Daten (lang für LLM!) write=10.0, # Request senden pool=30.0 # Auf Pool-Slot warten ), limits=httpx.Limits( max_keepalive_connections=20, max_connections=100, keepalive_expiry=120.0 ) ) async def stream_with_recovery(self, prompt: str): """Streaming mit automatischer Wiederholung bei Verbindungsabbrüchen""" max_attempts = 3 for attempt in range(max_attempts): try: async with self.client.stream( "POST", "https://api.holysheep.ai/v1/chat/completions", json={ "model": "deepseek-v3.2", "messages": [{"role": "user", "content": prompt}], "stream": True }, headers={"Authorization": f"Bearer {self.api_key}"} ) as response: async for line in response.aiter_lines(): if line: yield line return # Erfolgreich abgeschlossen except httpx.RemoteStreamClosed as e: if attempt < max_attempts - 1: wait = 2 ** attempt await asyncio.sleep(wait) # Exponential Backoff continue raise

Fehler 2: 401 Unauthorized nach Modellwechsel

Symptom: Request mit Claude-Sonnet-4.5 funktioniert, aber nach Wechsel zu GPT-4.1 kommt „401 Unauthorized".

Ursache: Falscher Modellname oder fehlende Berechtigung für bestimmte Modelle.

# ❌ FEHLERHAFT: Modell-Namen nicht korrekt
MODEL_MAP = {
    "gpt4": "gpt-4",           # Falsch! Muss "gpt-4.1" sein
    "claude": "claude-3.5",    # Veraltet
    "gemini": "gemini-pro"     # Nicht kompatibel mit v1 API
}

✅ LÖSUNG: Korrekte Modellnamen und Validierung

MODEL_CONFIG = { "gpt-4.1": { "display_name": "GPT-4.1", "context_window": 128000, "price_per_mtok": 8.0, "requires_tier": "pro" # Erfordert Pro-Account }, "claude-sonnet-4.5": { "display_name": "Claude Sonnet 4.5", "context_window": 200000, "price_per_mtok": 15.0, "requires_tier": "pro" }, "gemini-2.5-flash": { "display_name": "Gemini 2.5 Flash", "context_window": 1000000, "price_per_mtok": 2.50, "requires_tier": "free" # Auch für Free-Tier verfügbar! }, "deepseek-v3.2": { "display_name": "DeepSeek V3.2", "context_window": 64000, "price_per_mtok": 0.42, "requires_tier": "free", "recommended": True # Bestes Preis-Leistungs-Verhältnis } } def validate_model_access(model: str, user_tier: str) -> bool: """Validiert, ob Benutzer Zugriff auf Modell hat""" config = MODEL_CONFIG.get(model) if not config: raise ValueError(f"Unbekanntes Modell: {model}") tier_hierarchy = {"free": 0, "pro": 1, "enterprise": 2} required = tier_hierarchy.get(config["requires_tier"], 0) actual = tier_hierarchy.get(user_tier, 0) if actual < required: raise PermissionError( f"Modell {config['display_name']} erfordert {config['requires_tier']}-Tier. " f"Aktuelles Tier: {user_tier}" ) return True

Fehler 3: Rate Limit 429 ohne Exponential Backoff

Symptom: Bei hohem Request-Volumen erhalten alle Requests 429-Fehler, das System wird langsam, Retries verschlimmern das Problem.

# ❌ FEHLERHAFT: Linearer Retry ohne Backoff
for i in range(5):
    response = requests.post(url, ...)
    if response.status_code == 429:
        time.sleep(1)  # Bringt nichts, verschlimmert Überlastung!

✅ LÖSUNG: Smartes Rate-Limit-Management

import asyncio import httpx from datetime import datetime, timedelta class RateLimitHandler: """Intelligentes Rate-Limit-Management mit Token Bucket""" def __init__(self, requests_per_minute: int = 60): self.rpm = requests_per_minute self.tokens = requests_per_minute self.last_refill = datetime.now() self.refill_rate = requests_per_minute / 60 # tokens pro Sekunde # Retry-Tracking self.retry_history = [] self.max_retry_per_minute = 10 async def acquire(self) -> bool: """Acquired ein Token (wartet falls nötig)""" while self.tokens < 1: self._refill() await asyncio.sleep(0.1) self.tokens -= 1 return True def _refill(self): """Refill Token basierend auf vergangener Zeit""" now = datetime.now() elapsed = (now - self.last_refill).total_seconds() new_tokens = elapsed * self.refill_rate self.tokens = min(self.rpm, self.tokens + new_tokens) self.last_refill = now async def handle_429(self, response: httpx.Response) -> int: """Behandelt 429-Fehler mit korrektem Retry-After""" # Retry-After Header parsen retry_after = response.headers.get("Retry-After", "60") try: wait_seconds = int(retry_after) except ValueError: wait_seconds = 60 # Rate-Limit-Tracking self.retry_history.append(datetime.now()) self.retry_history = [ t for t in self.retry_history if t > datetime.now() - timedelta(minutes=1) ] # Warnung bei zu vielen Retries if len(self.retry_history) > self.max_retry_per_minute: raise RuntimeError( f"Zu viele Rate-Limit-Retries ({len(self.retry_history)}/min). " "Erwägen Sie: 1) Modell wechseln, 2) Batch-Requests nutzen, " "3) Rate-Limit-Upgrade bei HolySheep" ) return wait_seconds async def execute_with_rate_limit( self, func, *args, **kwargs ): """Führt Funktion mit Rate-Limit-Schutz aus""" await self.acquire() for attempt in range(3): try: return await func(*args, **kwargs) except httpx.HTTPStatusError as e: if e.response.status_code == 429: wait = await self.handle_429(e.response) await asyncio.sleep(wait) else: raise raise RuntimeError("Max retries exceeded")

HolySheep AI vs. Alternativen: Vergleich der Monitoring-Fähigkeiten

Verwandte Ressourcen

Verwandte Artikel

🔥 HolySheep AI ausprobieren

Direktes KI-API-Gateway. Claude, GPT-5, Gemini, DeepSeek — ein Schlüssel, kein VPN.

👉 Kostenlos registrieren →

Feature HolySheep AI OpenRouter PortKey Cloudflare AI Gateway
Eingebautes SLO-Dashboard ✓ Inklusive Begrenzt ✓ Umfassend Nur Basis
TTFT-Messung ✓ Native Unterstützung Manuell ✓ Custom Metrics ✗ Nicht verfügbar
Token-Genauigkeit ✓ 100% (API-Usage) Schätzung Variiert N/A
Cost-per-Request Tracking ✓ Automatisch Manuell ✓ Inklusive ✗ Nicht verfügbar
Modell-Routing ✓ Multi-Provider ✓ Multi-Provider ✓ Multi-Provider ✗ Nur CF Workers
Retry-Management ✓ Intelligent Manuell ✓ Konfigurierbar Begrenzt
Prometheus/Grafana Export ✓ Out-of-the-box ✗ Nicht verfügbar ✓ Verfügbar ✗ Proprietär
Latenz (P95)