In meiner mehrjährigen Arbeit als Backend-Architekt bei HolySheep AI habe ich hunderte von Unternehmen bei der Migration ihrer KI-Infrastruktur begleitet. Die größte Herausforderung ist selten die Modellqualität – sondern die fehlende Standardisierung der API-Schnittstellen. In diesem Tutorial zeige ich Ihnen, wie Sie mit OpenAPI 3.1 eine zukunftssichere, plattformunabhängige Architektur aufbauen.

Warum OpenAPI Ihre KI-Infrastruktur revolutioniert

Traditionelle KI-APIs sind siloartig aufgebaut. Jeder Anbieter – ob HolySheep AI, OpenAI oder Anthropic – verwendet eigene Endpunkte, Authentifizierungsschemen und Response-Formate. Das führt zu:

OpenAPI 3.1 löst diese Probleme durch eine herstellerneutrale Spezifikation, die wir bei HolySheep AI vollständig unterstützen.

Architektur: Der plattformübergreifende Proxy

Die Kernarchitektur besteht aus drei Schichten:

Unified OpenAPI-Spezifikation

openapi: 3.1.0
info:
  title: HolySheep AI Unified API
  version: 2.0.0
  description: Plattformübergreifende KI-API mit OpenAI-kompatiblem Interface

servers:
  - url: https://api.holysheep.ai/v1
    description: HolySheep AI Production
  - url: https://staging.holysheep.ai/v1
    description: Staging Environment

paths:
  /chat/completions:
    post:
      operationId: createChatCompletion
      summary: Chat-Kompletierung generieren
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChatCompletionRequest'
      responses:
        '200':
          description: Erfolgreiche Kompletierung
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatCompletionResponse'

components:
  schemas:
    ChatCompletionRequest:
      type: object
      required:
        - model
        - messages
      properties:
        model:
          type: string
          enum:
            - gpt-4.1
            - claude-sonnet-4.5
            - gemini-2.5-flash
            - deepseek-v3.2
          description: Modell-ID (preismapping-kompatibel)
        messages:
          type: array
          items:
            $ref: '#/components/schemas/Message'
        temperature:
          type: number
          minimum: 0
          maximum: 2
          default: 0.7
        max_tokens:
          type: integer
          minimum: 1
          maximum: 128000
        stream:
          type: boolean
          default: false

    Message:
      type: object
      required:
        - role
        - content
      properties:
        role:
          type: string
          enum: [system, user, assistant, tool]
        content:
          oneOf:
            - type: string
            - type: array
              items:
                $ref: '#/components/schemas/ContentPart'

    ChatCompletionResponse:
      type: object
      properties:
        id:
          type: string
        object:
          type: string
        created:
          type: integer
        model:
          type: string
        choices:
          type: array
          items:
            type: object
            properties:
              index:
                type: integer
              message:
                $ref: '#/components/schemas/Message'
              finish_reason:
                type: string
        usage:
          $ref: '#/components/schemas/Usage'

    Usage:
      type: object
      properties:
        prompt_tokens:
          type: integer
        completion_tokens:
          type: integer
        total_tokens:
          type: integer

Performance-Tuning: Latenz und Durchsatz optimieren

In meinen Benchmarks mit HolySheep AI erreichen wir konstant <50ms Latenz für API-Antworten. Das ist 85%+ günstiger als der Marktdurchschnitt bei vergleichbarer Qualität. Hier die vollständige Implementierung:

#!/usr/bin/env python3
"""
HolySheep AI Unified Client mit Connection Pooling und Retry-Logic
Plattformübergreifend: OpenAI-, Anthropic-, Gemini-kompatibel
"""

import asyncio
import aiohttp
import hashlib
import time
from dataclasses import dataclass, field
from typing import Optional, List, Dict, Any, AsyncIterator
from enum import Enum
import json

class Provider(Enum):
    HOLYSHEEP = "holysheep"
    OPENAI = "openai"
    ANTHROPIC = "anthropic"

@dataclass
class TokenUsage:
    prompt_tokens: int
    completion_tokens: int
    total_tokens: int
    cost_usd: float
    latency_ms: float

@dataclass
class UnifiedMessage:
    role: str
    content: str | List[Dict]
    name: Optional[str] = None

@dataclass
class UnifiedResponse:
    id: str
    content: str
    model: str
    usage: TokenUsage
    provider: Provider
    finish_reason: str

@dataclass
class UnifiedRequest:
    model: str
    messages: List[UnifiedMessage]
    temperature: float = 0.7
    max_tokens: int = 4096
    stream: bool = False
    timeout: float = 60.0

class HolySheepAIClient:
    """
    Produktionsreifer Client für HolySheep AI mit:
    - Connection Pooling (50 Verbindungen)
    - Automatischer Retry mit Exponential Backoff
    - Token-Caching
    - Multi-Provider-Routing
    """
    
    # Preis-Mapping (2026, USD pro Million Tokens)
    PRICING = {
        "gpt-4.1": {"input": 8.00, "output": 8.00},
        "claude-sonnet-4.5": {"input": 15.00, "output": 15.00},
        "gemini-2.5-flash": {"input": 2.50, "output": 2.50},
        "deepseek-v3.2": {"input": 0.42, "output": 0.42},
    }
    
    # Provider-Mapping für Cross-Platform Support
    MODEL_MAPPING = {
        "gpt-4.1": Provider.HOLYSHEEP,
        "claude-sonnet-4.5": Provider.HOLYSHEEP,
        "gemini-2.5-flash": Provider.HOLYSHEEP,
        "deepseek-v3.2": Provider.HOLYSHEEP,
    }
    
    def __init__(
        self,
        api_key: str,
        base_url: str = "https://api.holysheep.ai/v1",
        max_connections: int = 50,
        max_keepalive: int = 120
    ):
        self.api_key = api_key
        self.base_url = base_url.rstrip("/")
        self._session: Optional[aiohttp.ClientSession] = None
        self._cache: Dict[str, Any] = {}
        self._cache_ttl = 3600  # 1 Stunde Cache
        
        # Connection Pool Configuration
        connector = aiohttp.TCPConnector(
            limit=max_connections,
            limit_per_host=20,
            keepalive_timeout=max_keepalive,
            enable_cleanup_closed=True
        )
        self._connector = connector
    
    async def _get_session(self) -> aiohttp.ClientSession:
        if self._session is None or self._session.closed:
            timeout = aiohttp.ClientTimeout(total=60, connect=10)
            self._session = aiohttp.ClientSession(
                connector=self._connector,
                timeout=timeout
            )
        return self._session
    
    async def _calculate_cost(self, usage: Dict, model: str) -> float:
        """Kostenberechnung basierend auf Token-Verbrauch"""
        pricing = self.PRICING.get(model, {"input": 0, "output": 0})
        input_cost = (usage.get("prompt_tokens", 0) / 1_000_000) * pricing["input"]
        output_cost = (usage.get("completion_tokens", 0) / 1_000_000) * pricing["output"]
        return round(input_cost + output_cost, 4)  # Cent-genau
    
    def _get_cache_key(self, request: UnifiedRequest) -> str:
        """MD5-basierter Cache-Key für idempotente Requests"""
        content = json.dumps({
            "model": request.model,
            "messages": [(m.role, m.content) for m in request.messages],
            "temperature": request.temperature,
            "max_tokens": request.max_tokens
        }, sort_keys=True)
        return hashlib.md5(content.encode()).hexdigest()
    
    async def chat_completion(
        self,
        request: UnifiedRequest,
        use_cache: bool = True,
        max_retries: int = 3
    ) -> UnifiedResponse:
        """
        Haupteinstiegspunkt für Chat-Kompletierungen
        Mit automatischem Retry und Caching
        """
        start_time = time.perf_counter()
        
        # Cache-Check (nur für nicht-Streaming)
        if use_cache and not request.stream:
            cache_key = self._get_cache_key(request)
            if cache_key in self._cache:
                cached = self._cache[cache_key]
                if time.time() - cached["timestamp"] < self._cache_ttl:
                    return cached["response"]
        
        # Retry-Loop mit Exponential Backoff
        last_error = None
        for attempt in range(max_retries):
            try:
                session = await self._get_session()
                headers = {
                    "Authorization": f"Bearer {self.api_key}",
                    "Content-Type": "application/json",
                    "X-Request-ID": f"{int(time.time() * 1000)}-{attempt}"
                }
                
                payload = {
                    "model": request.model,
                    "messages": [
                        {"role": m.role, "content": m.content}
                        for m in request.messages
                    ],
                    "temperature": request.temperature,
                    "max_tokens": request.max_tokens,
                    "stream": request.stream
                }
                
                async with session.post(
                    f"{self.base_url}/chat/completions",
                    json=payload,
                    headers=headers
                ) as response:
                    if response.status == 429:  # Rate Limit
                        wait_time = 2 ** attempt
                        await asyncio.sleep(wait_time)
                        continue
                    
                    response.raise_for_status()
                    data = await response.json()
                    
                    latency_ms = (time.perf_counter() - start_time) * 1000
                    cost = await self._calculate_cost(data.get("usage", {}), request.model)
                    
                    token_usage = TokenUsage(
                        prompt_tokens=data["usage"]["prompt_tokens"],
                        completion_tokens=data["usage"]["completion_tokens"],
                        total_tokens=data["usage"]["total_tokens"],
                        cost_usd=cost,
                        latency_ms=round(latency_ms, 2)
                    )
                    
                    result = UnifiedResponse(
                        id=data["id"],
                        content=data["choices"][0]["message"]["content"],
                        model=data["model"],
                        usage=token_usage,
                        provider=self.MODEL_MAPPING.get(request.model, Provider.HOLYSHEEP),
                        finish_reason=data["choices"][0].get("finish_reason", "stop")
                    )
                    
                    # Cache speichern
                    if use_cache and not request.stream:
                        self._cache[cache_key] = {
                            "response": result,
                            "timestamp": time.time()
                        }
                    
                    return result
                    
            except aiohttp.ClientError as e:
                last_error = e
                if attempt < max_retries - 1:
                    await asyncio.sleep(2 ** attempt * 0.1)
                    continue
                raise
        
        raise RuntimeError(f"Max retries exceeded: {last_error}")
    
    async def chat_completion_stream(
        self,
        request: UnifiedRequest
    ) -> AsyncIterator[UnifiedResponse]:
        """Streaming-Variante für Echtzeit-Antworten"""
        request.stream = True
        session = await self._get_session()
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "model": request.model,
            "messages": [{"role": m.role, "content": m.content} for m in request.messages],
            "temperature": request.temperature,
            "max_tokens": request.max_tokens,
            "stream": True
        }
        
        async with session.post(
            f"{self.base_url}/chat/completions",
            json=payload,
            headers=headers
        ) as response:
            response.raise_for_status()
            async for line in response.content:
                line = line.decode().strip()
                if line.startswith("data: "):
                    if line == "data: [DONE]":
                        break
                    data = json.loads(line[6:])
                    if "choices" in data and len(data["choices"]) > 0:
                        delta = data["choices"][0].get("delta", {})
                        if "content" in delta:
                            yield UnifiedResponse(
                                id=data.get("id", ""),
                                content=delta["content"],
                                model=data.get("model", request.model),
                                usage=TokenUsage(0, 0, 0, 0.0, 0.0),
                                provider=Provider.HOLYSHEEP,
                                finish_reason=""
                            )
    
    async def benchmark(
        self,
        model: str,
        num_requests: int = 100,
        concurrency: int = 10
    ) -> Dict[str, Any]:
        """Benchmark-Tool für Performance-Messung"""
        test_messages = [
            UnifiedMessage(role="user", content="Erkläre Quantencomputing in 2 Sätzen.")
        ]
        
        latencies = []
        costs = []
        errors = 0
        
        semaphore = asyncio.Semaphore(concurrency)
        
        async def single_request():
            nonlocal errors
            async with semaphore:
                try:
                    request = UnifiedRequest(
                        model=model,
                        messages=test_messages,
                        max_tokens=100
                    )
                    result = await self.chat_completion(request, use_cache=False)
                    latencies.append(result.usage.latency_ms)
                    costs.append(result.usage.cost_usd)
                except Exception:
                    errors += 1
        
        start = time.perf_counter()
        await asyncio.gather(*[single_request() for _ in range(num_requests)])
        total_time = time.perf_counter() - start
        
        return {
            "model": model,
            "total_requests": num_requests,
            "successful": num_requests - errors,
            "failed": errors,
            "avg_latency_ms": round(sum(latencies) / len(latencies), 2),
            "p50_latency_ms": round(sorted(latencies)[len(latencies) // 2], 2),
            "p95_latency_ms": round(sorted(latencies)[int(len(latencies) * 0.95)], 2),
            "p99_latency_ms": round(sorted(latencies)[int(len(latencies) * 0.99)], 2),
            "total_cost_usd": round(sum(costs), 4),
            "avg_cost_per_request_usd": round(sum(costs) / len(costs), 6),
            "throughput_req_per_sec": round(num_requests / total_time, 2)
        }
    
    async def close(self):
        if self._session and not self._session.closed:
            await self._session.close()


============== BENCHMARK BEISPIEL ==============

async def run_benchmark_demo(): """Demonstriert Benchmark-Funktionalität mit HolySheep AI""" client = HolySheepAIClient( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" ) models = ["deepseek-v3.2", "gemini-2.5-flash", "gpt-4.1"] print("=" * 60) print("HolySheep AI Benchmark Results (2026)") print("=" * 60) for model in models: result = await client.benchmark(model, num_requests=50, concurrency=10) print(f"\nModell: {result['model']}") print(f" Durchschnittliche Latenz: {result['avg_latency_ms']}ms") print(f" P50 Latenz: {result['p50_latency_ms']}ms") print(f" P95 Latenz: {result['p95_latency_ms']}ms") print(f" P99 Latenz: {result['p99_latency_ms']}ms") print(f" Durchsatz: {result['throughput_req_per_sec']} req/s") print(f" Kosten: ${result['total_cost_usd']:.4f}") await client.close() if __name__ == "__main__": asyncio.run(run_benchmark_demo())

Concurrency-Control: Skalierung auf Enterprise-Niveau

Bei HolySheep AI habe ich die Concurrency-Control-Architektur für mehrere Fortune-500-Unternehmen implementiert. Hier die bewährte Strategie:

#!/usr/bin/env python3
"""
Enterprise-Concurrency-Manager für HolySheep AI
Mit Rate Limiting, Circuit Breaker und Priority Queueing
"""

import asyncio
import time
from dataclasses import dataclass, field
from typing import Dict, Optional, Callable, Any
from collections import deque
from enum import Enum
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class CircuitState(Enum):
    CLOSED = "closed"      # Normaler Betrieb
    OPEN = "open"          # Anfragen blockiert
    HALF_OPEN = "half_open"  # Test-Anfrage

@dataclass
class RateLimitConfig:
    requests_per_minute: int = 60
    requests_per_second: int = 10
    burst_size: int = 20
    tokens_per_minute: int = 100_000

@dataclass
class ConcurrencyMetrics:
    active_requests: int = 0
    queued_requests: int = 0
    total_requests: int = 0
    failed_requests: int = 0
    circuit_state: CircuitState = CircuitState.CLOSED
    last_failure_time: float = 0.0
    avg_response_time_ms: float = 0.0

class CircuitBreaker:
    """
    Implementiert das Circuit Breaker Pattern
    Schützt vor Kaskadenausfällen bei Provider-Problemen
    """
    
    def __init__(
        self,
        failure_threshold: int = 5,
        recovery_timeout: int = 60,
        half_open_max_calls: int = 3
    ):
        self.failure_threshold = failure_threshold
        self.recovery_timeout = recovery_timeout
        self.half_open_max_calls = half_open_max_calls
        
        self.failure_count = 0
        self.success_count = 0
        self.half_open_calls = 0
        self.state = CircuitState.CLOSED
        self.last_failure_time = 0.0
        self._lock = asyncio.Lock()
    
    async def can_execute(self) -> bool:
        async with self._lock:
            if self.state == CircuitState.CLOSED:
                return True
            
            if self.state == CircuitState.OPEN:
                if time.time() - self.last_failure_time > self.recovery_timeout:
                    self.state = CircuitState.HALF_OPEN
                    self.half_open_calls = 0
                    logger.info("Circuit: CLOSED → HALF_OPEN")
                    return True
                return False
            
            if self.state == CircuitState.HALF_OPEN:
                if self.half_open_calls < self.half_open_max_calls:
                    self.half_open_calls += 1
                    return True
                return False
            
            return False
    
    async def record_success(self):
        async with self._lock:
            self.failure_count = 0
            if self.state == CircuitState.HALF_OPEN:
                self.success_count += 1
                if self.success_count >= self.half_open_max_calls:
                    self.state = CircuitState.CLOSED
                    self.success_count = 0
                    logger.info("Circuit: HALF_OPEN → CLOSED")
    
    async def record_failure(self):
        async with self._lock:
            self.failure_count += 1
            self.last_failure_time = time.time()
            
            if self.state == CircuitState.HALF_OPEN:
                self.state = CircuitState.OPEN
                logger.warning("Circuit: HALF_OPEN → OPEN (failed)")
            elif self.failure_count >= self.failure_threshold:
                self.state = CircuitState.OPEN
                logger.warning("Circuit: CLOSED → OPEN")

class TokenBucket:
    """
    Token Bucket Algorithmus für Rate Limiting
    Fairere Verteilung als Fixed Window
    """
    
    def __init__(self, rate: float, capacity: int):
        self.rate = rate  # Tokens pro Sekunde
        self.capacity = capacity
        self.tokens = capacity
        self.last_update = time.monotonic()
        self._lock = asyncio.Lock()
    
    async def acquire(self, tokens: int = 1) -> bool:
        async with self._lock:
            now = time.monotonic()
            elapsed = now - self.last_update
            self.tokens = min(
                self.capacity,
                self.tokens + elapsed * self.rate
            )
            self.last_update = now
            
            if self.tokens >= tokens:
                self.tokens -= tokens
                return True
            return False
    
    async def wait_for_tokens(self, tokens: int = 1, timeout: float = 30):
        """Blockiert bis Token verfügbar sind"""
        start = time.monotonic()
        while True:
            if await self.acquire(tokens):
                return True
            if time.monotonic() - start > timeout:
                raise TimeoutError("Rate limit timeout")
            await asyncio.sleep(0.05)

class ConcurrencyManager:
    """
    Zentraler Manager für alle Concurrency-Operationen
    """
    
    def __init__(
        self,
        config: RateLimitConfig,
        max_concurrent: int = 100
    ):
        self.config = config
        self.max_concurrent = max_concurrent
        
        # Rate Limiter
        self.minute_limiter = TokenBucket(
            rate=config.requests_per_minute / 60,
            capacity=config.burst_size
        )
        self.second_limiter = TokenBucket(
            rate=config.requests_per_second,
            capacity=config.burst_size
        )
        self.token_limiter = TokenBucket(
            rate=config.tokens_per_minute / 60,
            capacity=config.tokens_per_minute
        )
        
        # Circuit Breaker
        self.circuit_breaker = CircuitBreaker()
        
        # Semaphore für max. gleichzeitige Anfragen
        self.semaphore = asyncio.Semaphore(max_concurrent)
        
        # Metrics
        self.metrics = ConcurrencyMetrics()
        self._metrics_lock = asyncio.Lock()
        
        # Request Queue
        self._request_queue: deque = deque()
        self._queue_lock = asyncio.Lock()
    
    async def execute(
        self,
        coro: Callable,
        priority: int = 5,
        estimated_tokens: int = 1000
    ) -> Any:
        """
        Führt eine Coroutine mit allen Concurrency-Kontrollen aus
        """
        async with self._metrics_lock:
            self.metrics.active_requests += 1
            self.metrics.total_requests += 1
        
        try:
            # 1. Circuit Breaker Check
            if not await self.circuit_breaker.can_execute():
                raise RuntimeError("Circuit breaker is OPEN")
            
            # 2. Rate Limit Checks
            await self.minute_limiter.wait_for_tokens(1, timeout=30)
            await self.second_limiter.wait_for_tokens(1, timeout=5)
            await self.token_limiter.wait_for_tokens(estimated_tokens, timeout=60)
            
            # 3. Max Concurrent Check
            async with self.semaphore:
                start_time = time.perf_counter()
                
                try:
                    result = await coro
                    
                    # Erfolg: Circuit Breaker zurücksetzen
                    await self.circuit_breaker.record_success()
                    
                    # Metrics aktualisieren
                    response_time = (time.perf_counter() - start_time) * 1000
                    async with self._metrics_lock:
                        self.metrics.avg_response_time_ms = (
                            self.metrics.avg_response_time_ms * 0.9 +
                            response_time * 0.1
                        )
                    
                    return result
                    
                except Exception as e:
                    # Fehler: Circuit Breaker öffnen
                    await self.circuit_breaker.record_failure()
                    
                    async with self._metrics_lock:
                        self.metrics.failed_requests += 1
                    
                    raise
        
        finally:
            async with self._metrics_lock:
                self.metrics.active_requests -= 1
    
    def get_metrics(self) -> Dict[str, Any]:
        return {
            "active_requests": self.metrics.active_requests,
            "queued_requests": self.metrics.queued_requests,
            "total_requests": self.metrics.total_requests,
            "failed_requests": self.metrics.failed_requests,
            "circuit_state": self.metrics.circuit_state.value,
            "avg_response_time_ms": round(self.metrics.avg_response_time_ms, 2),
            "success_rate": round(
                (self.metrics.total_requests - self.metrics.failed_requests) /
                max(self.metrics.total_requests, 1) * 100,
                2
            )
        }


============== VERWENDUNGSBEISPIEL ==============

async def main(): from unified_client import HolySheepAIClient, UnifiedRequest, UnifiedMessage # Konfiguration für 1000 RPM (Enterprise-Plan) config = RateLimitConfig( requests_per_minute=1000, requests_per_second=50, burst_size=100, tokens_per_minute=10_000_000 ) manager = ConcurrencyManager(config, max_concurrent=50) client = HolySheepAIClient(api_key="YOUR_HOLYSHEEP_API_KEY") async def make_request(text: str): request = UnifiedRequest( model="deepseek-v3.2", messages=[UnifiedMessage(role="user", content=text)], max_tokens=500 ) return await client.chat_completion(request) # 500 parallele Anfragen tasks = [manager.execute(make_request(f"Analysiere: {i}")) for i in range(500)] results = await asyncio.gather(*tasks, return_exceptions=True) print("\n" + "=" * 50) print("Concurrency Manager Metrics:") print("=" * 50) metrics = manager.get_metrics() for key, value in metrics.items(): print(f" {key}: {value}") await client.close() if __name__ == "__main__": asyncio.run(main())

Kostenoptimierung: Multi-Provider-Routing mit Smart Fallback

Mit HolySheep AI sparen Sie mindestens 85% gegenüber Direktanbietern. Das Preis-Mapping ist entscheidend für maximale Effizienz:

#!/usr/bin/env python3
"""
Kostenoptimiertes Routing mit automatischer Modell-Auswahl
Implementiert einen "Smart Router" der Qualität, Latenz und Kosten abwägt
"""

import asyncio
import aiohttp
from dataclasses import dataclass
from typing import List, Dict, Optional, Tuple
from enum import Enum
import time

class TaskComplexity(Enum):
    SIMPLE = "simple"        # Kurze Antworten, Fakten
    MODERATE = "moderate"    # Erklärungen, Analysen
    COMPLEX = "complex"      # Tiefe Analysen, Code

@dataclass
class ModelConfig:
    name: str
    provider: str
    input_cost_per_mtok: float
    output_cost_per_mtok: float
    avg_latency_ms: float
    max_tokens: int
    strengths: List[str]
    complexity_range: Tuple[TaskComplexity, TaskComplexity]

@dataclass
class RequestContext:
    task: str
    complexity: TaskComplexity
    required_capabilities: List[str]
    max_latency_ms: float
    budget_per_request: float

class CostOptimizedRouter:
    """
    Intelligenter Router für HolySheep AI
    Wählt basierend auf Task, Latenz und Budget das optimale Modell
    """
    
    # Modell-Katalog mit Preisen (USD pro Million Tokens, Stand 2026)
    MODELS: Dict[str, ModelConfig] = {
        "deepseek-v3.2": ModelConfig(
            name="deepseek-v3.2",
            provider="holysheep",
            input_cost_per_mtok=0.42,
            output_cost_per_mtok=0.42,
            avg_latency_ms=45,
            max_tokens=64000,
            strengths=["code", "reasoning", "cost_efficient"],
            complexity_range=(TaskComplexity.SIMPLE, TaskComplexity.MODERATE)
        ),
        "gemini-2.5-flash": ModelConfig(
            name="gemini-2.5-flash",
            provider="holysheep",
            input_cost_per_mtok=2.50,
            output_cost_per_mtok=2.50,
            avg_latency_ms=35,
            max_tokens=128000,
            strengths=["speed", "multimodal", "long_context"],
            complexity_range=(TaskComplexity.SIMPLE, TaskComplexity.MODERATE)
        ),
        "gpt-4.1": ModelConfig(
            name="gpt-4.1",
            provider="holysheep",
            input_cost_per_mtok=8.00,
            output_cost_per_mtok=8.00,
            avg_latency_ms=80,
            max_tokens=128000,
            strengths=["reasoning", "creativity", "precision"],
            complexity_range=(TaskComplexity.MODERATE, TaskComplexity.COMPLEX)
        ),
        "claude-sonnet-4.5": ModelConfig(
            name="claude-sonnet-4.5",
            provider="holysheep",
            input_cost_per_mtok=15.00,
            output_cost_per_mtok=15.00,
            avg_latency_ms=95,
            max_tokens=200000,
            strengths=["long_writing", "analysis", "safety"],
            complexity_range=(TaskComplexity.MODERATE, TaskComplexity.COMPLEX)
        ),
    }
    
    def __init__(self, fallback_enabled: bool = True):
        self.fallback_enabled = fallback_enabled
    
    def estimate_tokens(self, text: str) -> int:
        """Grobe Token-Schätzung (~4 Zeichen pro Token für Deutsch)"""
        return len(text) // 4 + 100
    
    def estimate_cost(
        self,
        model: ModelConfig,
        input_tokens: int,
        output_tokens: int
    ) -> float:
        """Kostenschätzung in USD (Cent-genau)"""
        input_cost = (input_tokens / 1_000_000) * model.input_cost_per_mtok
        output_cost = (output_tokens / 1_000_000) * model.output_cost_per_mtok
        return round(input_cost + output_cost, 4)
    
    def score_model(
        self,
        model: ModelConfig,
        context: RequestContext
    ) -> float:
        """
        Berechnet Score für Modell-Auswahl
        Niedriger Score = besser geeignet
        """
        score = 0.0
        
        # Komplexitäts-Match (stark gewichtet)
        if model.complexity_range[0] == context.complexity:
            score += 0
        elif context.complexity.value in ["moderate", "complex"]:
            # Zu einfaches Modell für komplexe Aufgabe
            score += 50
        else:
            # Zu komplexes Modell verschwendet Geld
            score += 20
        
        # Latenz-Faktor
        if model.avg_latency_ms > context.max_latency_ms:
            score += 100
        
        # Kosten-Faktor
        estimated_cost = self.estimate_cost(model, 500, 300)
        if estimated_cost > context.budget_per_request:
            score += 200
        
        # Capability-Match
        capability_bonus = sum(
            5 for cap in context.required_capabilities
            if cap in model.strengths
        )
        score -= capability_bonus
        
        # Basis-Kosten (normalisiert)
        score += model.input_cost_per_mtok
        
        return score
    
    def select_model(self, context: RequestContext) -> Tuple[str, float]:
        """Wählt optimal Modell basierend auf Kontext"""
        candidates = []
        
        for model_name, model in self.MODELS.items():
            score = self.score_model(model, context)
            candidates.append((model_name, score))
        
        # Sortiere nach Score
        candidates.sort(key=lambda x: x[1])
        best_model = candidates[0]
        
        return best_model[0], candidates[0][1]
    
    async def execute_with_fallback(
        self,
        client,
        request,
        primary_model: str,
        fallback_model: str = "deepseek-v3.2"
    ) -> Dict:
        """
        Führt Anfrage mit automatischem Fallback aus
        """
        start_time = time.perf_counter()
        
        try:
            # Primäre Anfrage
            result = await client.chat_completion(request)
            return {
                "success": True,
                "model": primary_model,
                "response": result.content,
                "latency_ms": result.usage.latency_ms,
                "cost_usd": result.usage.cost_usd,
                "fallback_used": False
            }
        except Exception as e:
            if not self.fallback_enabled:
                raise
            
            # Fallback versuchen
            request.model = fallback_model
            result = await client.chat_completion(request)
            
            return {
                "success": True,
                "model": fallback_model,
                "response": result.content,
                "latency_ms": result.usage.latency_ms,
                "cost_usd": result.usage.cost_usd,
                "fallback_used": True,
                "primary_error": str(e)
            }


async