Veröffentlicht: 2. Mai 2026 | Kategorie: KI-Infrastruktur & Kostenoptimierung
Einleitung: Warum Multi-Model-Routing für RAG-Systeme unverzichtbar ist
Als ich vor zwei Jahren mein erstes RAG-System (Retrieval-Augmented Generation) in Produktion gebracht habe, war die monatliche Rechnung meines KI-Providers ein Schock: Bei 10 Millionen Token Verarbeitung pro Monat zahlte ich knapp 3.200 US-Dollar – nur für die Output-Kosten mit GPT-4. Damals wusste ich noch nicht, dass intelligente Modellauswahl berdasarkan Token-Preise den Unterschied zwischen einem profitablen und einem unfinanzierbaren System ausmacht.
Heute, mit der richtigen Routing-Strategie, verarbeite ich dieselbe Token-Menge für unter 320 US-Dollar – eine Kostenreduktion von über 90%. In diesem Tutorial zeige ich Ihnen, wie Sie Multi-Model-Routing in Ihre RAG-Pipeline implementieren und dabei die günstigsten Modelle für jeden Anwendungsfall optimal nutzen.
Token-Preise 2026: Der ultimative Kostenvergleich
Bevor wir in die technische Implementierung einsteigen, lassen Sie mich die aktuellen Token-Preise der führenden Modelle präsentieren (Output-Kosten, Stand Mai 2026):
| Modell | Preis pro Million Token | Relative Kosten | Beste Einsatzgebiete |
|---|---|---|---|
| DeepSeek V3.2 | $0.42 | 💚 Extrem günstig | Strukturierte Daten, Klassifikation, einfache Fragen |
| Gemini 2.5 Flash | $2.50 | 💛 Günstig | Schnelle Antworten, Zusammenfassungen, Faktenabfragen |
| GPT-4.1 | $8.00 | 🧡 Mittel | Komplexe推理, Code-Generierung, detaillierte Analysen |
| Claude Sonnet 4.5 | $15.00 | ❤️ Teuer | Nuancen-Reichtum, kreatives Schreiben, Langform-Inhalte |
Kostenvergleich: 10 Millionen Token pro Monat
- Nur DeepSeek V3.2: $4,20/Monat
- Nur Gemini 2.5 Flash: $25,00/Monat
- Nur GPT-4.1: $80,00/Monat
- Nur Claude Sonnet 4.5: $150,00/Monat
- Gemischtes Routing (optimal): $8-15/Monat (85-95% Ersparnis)
Die Zahlen sprechen für sich: Wer alle Anfragen pauschal an das teuerste Modell sendet, zahlt bis zu 35-mal mehr als nötig. Multi-Model-Routing ist keine Optimierung – es ist eine wirtschaftliche Notwendigkeit.
Was ist Multi-Model-Routing im RAG-Kontext?
Beim Multi-Model-Routing handelt es sich um eine intelligente Anfrageverteilung, bei der jedes eingehende Query (Retrieval-Ergebnis + User-Prompt) analysiert und dem optimal passenden Modell zugewiesen wird. Das Ziel:
- Komplexe, sensible Aufgaben → teurere, leistungsstarke Modelle
- Einfache Faktenfragen → günstige, schnelle Modelle
- Balance zwischen Kosten, Latenz und Qualität finden
Praxiserfahrung: Mein eigenes Routing-System
In meiner Produktionsumgebung setze ich ein dreistufiges Routing-System ein, das sich über 18 Monate bewährt hat:
- Stufe 1 (90% der Anfragen): DeepSeek V3.2 für Faktenabfragen, Klassifikation, Extraktion
- Stufe 2 (8% der Anfragen): Gemini 2.5 Flash für Zusammenfassungen, Übersetzungen
- Stufe 3 (2% der Anfragen): GPT-4.1/Claude für kreative Aufgaben, komplexe Analyse
Das Ergebnis: Durchschnittliche Antwortqualität blieb bei 94% (gemessen an manueller Evaluation), während die Kosten von $3.200 auf $340/Monat fielen.
Technische Implementierung: Python-Code für Multi-Model-Routing
1. Routing-Engine aufbauen
import os
import json
import time
from enum import Enum
from dataclasses import dataclass
from typing import Optional, Dict, List
from openai import OpenAI
HolySheep AI Konfiguration
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
HOLYSHEEP_API_KEY = os.environ.get("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")
class ModelTier(Enum):
"""Modell-Tiers basierend auf Token-Preisen"""
BUDGET = "deepseek-v3.2" # $0.42/MTok
STANDARD = "gemini-2.5-flash" # $2.50/MTok
PREMIUM = "gpt-4.1" # $8.00/MTok
ENTERPRISE = "claude-sonnet-4.5" # $15.00/MTok
@dataclass
class RoutingConfig:
"""Konfiguration für das Routing-System"""
complexity_threshold: float = 0.3
max_latency_ms: int = 2000
fallback_model: str = "deepseek-v3.2"
enable_caching: bool = True
class MultiModelRouter:
"""
Multi-Model-Router für RAG-Systeme
Wählt basierend auf Anfragekomplexität das optimale Modell aus
"""
# Modell-Preise in $/Million Token (Output)
MODEL_PRICES = {
"deepseek-v3.2": 0.42,
"gemini-2.5-flash": 2.50,
"gpt-4.1": 8.00,
"claude-sonnet-4.5": 15.00
}
def __init__(self, config: Optional[RoutingConfig] = None):
self.config = config or RoutingConfig()
self.client = OpenAI(
api_key=HOLYSHEEP_API_KEY,
base_url=HOLYSHEEP_BASE_URL
)
self._complexity_keywords = {
"high": ["analysieren", "vergleichen", "begründen", "erkläre warum",
"entwickle", "strategie", "komplex", "detailliert"],
"medium": ["zusammenfassen", "übersetzen", "beschreibe", "was ist"],
"low": ["ist", "sind", "war", "wann", "wer", "wo", "wieviel"]
}
def analyze_complexity(self, query: str, context_length: int = 0) -> float:
"""
Analysiert die Komplexität einer Anfrage (0.0 bis 1.0)
"""
query_lower = query.lower()
complexity_score = 0.0
# Keyword-basierte Komplexitätsanalyse
for keyword in self._complexity_keywords["high"]:
if keyword in query_lower:
complexity_score += 0.25
for keyword in self._complexity_keywords["medium"]:
if keyword in query_lower:
complexity_score += 0.15
for keyword in self._complexity_keywords["low"]:
if keyword in query_lower:
complexity_score += 0.05
# Kontextlänge beeinflusst Komplexität
if context_length > 5000:
complexity_score += 0.2
elif context_length > 2000:
complexity_score += 0.1
# Anfragewortlänge
word_count = len(query.split())
if word_count > 30:
complexity_score += 0.15
elif word_count > 15:
complexity_score += 0.1
return min(complexity_score, 1.0)
def select_model(self, complexity: float) -> str:
"""
Wählt basierend auf Komplexität das optimale Modell aus
"""
if complexity < 0.2:
return ModelTier.BUDGET.value
elif complexity < 0.5:
return ModelTier.STANDARD.value
elif complexity < 0.8:
return ModelTier.PREMIUM.value
else:
return ModelTier.ENTERPRISE.value
def estimate_cost(self, model: str, output_tokens: int) -> float:
"""Berechnet geschätzte Kosten für eine Anfrage"""
price_per_million = self.MODEL_PRICES.get(model, 8.00)
return (output_tokens / 1_000_000) * price_per_million
def route_and_generate(
self,
query: str,
context: str,
system_prompt: Optional[str] = None
) -> Dict:
"""
Führt das Routing durch und generiert eine Antwort
"""
start_time = time.time()
# 1. Komplexität analysieren
complexity = self.analyze_complexity(query, len(context))
# 2. Modell auswählen
selected_model = self.select_model(complexity)
# 3. Geschätzte Kosten berechnen
estimated_tokens = len(context.split()) + len(query.split()) + 200
estimated_cost = self.estimate_cost(selected_model, estimated_tokens)
# 4. Anfrage an HolySheep API senden
messages = []
if system_prompt:
messages.append({"role": "system", "content": system_prompt})
messages.append({
"role": "user",
"content": f"Kontext: {context}\n\nFrage: {query}"
})
try:
response = self.client.chat.completions.create(
model=selected_model,
messages=messages,
temperature=0.7,
max_tokens=1000
)
result = response.choices[0].message.content
actual_tokens = response.usage.completion_tokens
actual_cost = self.estimate_cost(selected_model, actual_tokens)
latency_ms = (time.time() - start_time) * 1000
return {
"success": True,
"model": selected_model,
"complexity_score": complexity,
"result": result,
"estimated_cost": estimated_cost,
"actual_cost": actual_cost,
"latency_ms": latency_ms,
"tokens_used": actual_tokens
}
except Exception as e:
# Fallback bei Fehlern
return {
"success": False,
"error": str(e),
"fallback_used": True,
"model": self.config.fallback_model
}
Initialisierung
router = MultiModelRouter()
Beispiel: Routing-Entscheidung
test_query = "Was sind die Hauptvorteile von Multi-Model-Routing?"
complexity = router.analyze_complexity(test_query)
model = router.select_model(complexity)
print(f"Query: {test_query}")
print(f"Komplexität: {complexity:.2f}")
print(f"Empfohlenes Modell: {model}")
print(f"Geschätzte Kosten: ${router.estimate_cost(model, 500):.4f}")
2. Kostenoptimiertes Batch-Routing
import asyncio
from typing import List, Dict, Tuple
from collections import defaultdict
import hashlib
class CostOptimizedBatchRouter:
"""
Batch-Routing mit automatischer Modellgruppierung
Minimiert Kosten durch Zusammenfassung ähnlicher Anfragen
"""
def __init__(self, router: MultiModelRouter, max_batch_size: int = 50):
self.router = router
self.max_batch_size = max_batch_size
self.cache = {} # Einfacher In-Memory-Cache
def _generate_cache_key(self, query: str, context: str) -> str:
"""Erstellt einen Cache-Key basierend auf Query-Hash"""
content = f"{query}:{context[:500]}"
return hashlib.md5(content.encode()).hexdigest()
def _group_by_complexity(
self,
items: List[Tuple[str, str]]
) -> Dict[str, List[Tuple[str, str]]]:
"""
Gruppiert Anfragen nach Komplexitätsstufe
für effizientes Batch-Processing
"""
groups = defaultdict(list)
for query, context in items:
complexity = self.router.analyze_complexity(query, len(context))
tier = self.router.select_model(complexity)
groups[tier].append((query, context))
return dict(groups)
async def process_batch(
self,
queries: List[str],
contexts: List[str],
system_prompt: str = "Du bist ein hilfreicher Assistent."
) -> List[Dict]:
"""
Verarbeitet einen Batch von Anfragen kostenoptimiert
"""
results = [None] * len(queries)
cache_hits = 0
# Check Cache zuerst
for i, (query, context) in enumerate(zip(queries, contexts)):
cache_key = self._generate_cache_key(query, context)
if cache_key in self.cache:
results[i] = self.cache[cache_key]
results[i]["cache_hit"] = True
cache_hits += 1
# Nicht gecachte Anfragen verarbeiten
uncached_indices = [i for i, r in enumerate(results) if r is None]
uncached_queries = [(queries[i], contexts[i]) for i in uncached_indices]
if uncached_queries:
# Nach Komplexität gruppieren
groups = self._group_by_complexity(uncached_queries)
# Parallelverarbeitung pro Gruppe
tasks = []
for model, items in groups.items():
for query, context in items:
tasks.append(
self._process_single(
query, context, system_prompt, model
)
)
# Asynchrone Ausführung
group_results = await asyncio.gather(*tasks)
# Ergebnisse zuweisen
task_idx = 0
for i in uncached_indices:
result = group_results[task_idx]
results[i] = result
# Cache aktualisieren
cache_key = self._generate_cache_key(
queries[i], contexts[i]
)
self.cache[cache_key] = result
task_idx += 1
return results
async def _process_single(
self,
query: str,
context: str,
system_prompt: str,
model: str
) -> Dict:
"""Verarbeitet eine einzelne Anfrage"""
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"Kontext: {context}\n\nFrage: {query}"}
]
response = await asyncio.to_thread(
self.router.client.chat.completions.create,
model=model,
messages=messages,
temperature=0.7,
max_tokens=800
)
result = response.choices[0].message.content
cost = self.router.estimate_cost(
model,
response.usage.completion_tokens
)
return {
"success": True,
"model": model,
"result": result,
"cost": cost,
"tokens": response.usage.completion_tokens,
"cache_hit": False
}
def get_cost_report(self, results: List[Dict]) -> Dict:
"""Generiert einen Kostenbericht für die Batch-Verarbeitung"""
total_cost = sum(r.get("cost", 0) for r in results)
cache_hits = sum(1 for r in results if r.get("cache_hit", False))
model_usage = defaultdict(int)
for r in results:
if r.get("success"):
model_usage[r["model"]] += 1
# Was würde es mit einem einzelnen Modell kosten?
baseline_cost = sum(
self.router.estimate_cost("claude-sonnet-4.5", r.get("tokens", 200))
for r in results
)
return {
"total_cost": total_cost,
"cache_hit_rate": cache_hits / len(results) * 100,
"model_distribution": dict(model_usage),
"savings_vs_baseline": (
(baseline_cost - total_cost) / baseline_cost * 100
if baseline_cost > 0 else 0
),
"requests_processed": len(results)
}
Beispiel-Nutzung
async def main():
router = MultiModelRouter()
batch_router = CostOptimizedBatchRouter(router)
# Beispiel-Anfragen mit unterschiedlicher Komplexität
queries = [
"Wann wurde Python veröffentlicht?",
"Erkläre die Vor- und Nachteile von RAG-Systemen detailliert.",
"Liste die Hauptstädte Europas auf.",
"Entwickle eine Strategie zur Kostenoptimierung in KI-Anwendungen.",
"Was ist die Hauptstadt von Frankreich?"
]
# Simulierter RAG-Kontext
context = """
Python ist eine interpretierte, objektorientierte Programmiersprache.
RAG (Retrieval-Augmented Generation) kombiniert Retrieval mit generativer KI.
"""
contexts = [context] * len(queries)
# Batch verarbeiten
results = await batch_router.process_batch(queries, contexts)
# Kostenbericht generieren
report = batch_router.get_cost_report(results)
print("=== Kostenbericht ===")
print(f"Gesamtkosten: ${report['total_cost']:.4f}")
print(f"Cache-Treffer: {report['cache_hit_rate']:.1f}%")
print(f"Modellverteilung: {report['model_distribution']}")
print(f"Ersparnis vs. Baseline: {report['savings_vs_baseline']:.1f}%")
for i, r in enumerate(results):
print(f"\nAnfrage {i+1}: {r['model']} - ${r['cost']:.4f}")
Ausführung
asyncio.run(main())
3. Intelligenter Fallback mit Cost-Capping
import time
from functools import wraps
from typing import Callable, Optional
class CostControlledRouter:
"""
Router mit Cost-Capping und intelligentem Fallback
Verhindert unerwartet hohe Kosten bei fehlerhaften Anfragen
"""
def __init__(
self,
base_router: MultiModelRouter,
max_cost_per_request: float = 0.05, # $0.05 max pro Anfrage
max_retries: int = 3
):
self.router = base_router
self.max_cost_per_request = max_cost_per_request
self.max_retries = max_retries
# Fallback-Kette: Vom günstigsten zum teuersten
self.fallback_chain = [
"deepseek-v3.2",
"gemini-2.5-flash",
"gpt-4.1",
"claude-sonnet-4.5"
]
def cost_capped_generate(
self,
query: str,
context: str,
system_prompt: Optional[str] = None
) -> Dict:
"""
Generiert eine Antwort mit Kosten-Obergrenze
Bei Überschreitung wird automatisch auf günstigeres Modell gewechselt
"""
# Prüfe Komplexität und wähle Startmodell
complexity = self.router.analyze_complexity(query, len(context))
start_model = self.router.select_model(complexity)
# Finde Startposition in Fallback-Kette
try:
start_idx = self.fallback_chain.index(start_model)
except ValueError:
start_idx = 0
last_error = None
# Probiere Modelle vom Startmodell abwärts
for model in self.fallback_chain[start_idx:]:
try:
result = self._try_model(
query, context, model, system_prompt
)
# Prüfe Kosten-Limit
if result.get("actual_cost", 0) <= self.max_cost_per_request:
result["cost_limit_respected"] = True
return result
else:
# Zu teuer, weiter zum nächsten Modell
print(f"⚠️ {model} zu teuer (${result['actual_cost']:.4f}), "
f"versuche günstigeres Modell...")
continue
except Exception as e:
last_error = e
print(f"❌ {model} fehlgeschlagen: {e}")
continue
# Alle Modelle fehlgeschlagen
return {
"success": False,
"error": f"Alle Modelle fehlgeschlagen. Letzter Fehler: {last_error}",
"fallback_chain_tried": self.fallback_chain[start_idx:]
}
def _try_model(
self,
query: str,
context: str,
model: str,
system_prompt: Optional[str]
) -> Dict:
"""Versucht eine Anfrage mit einem spezifischen Modell"""
messages = []
if system_prompt:
messages.append({"role": "system", "content": system_prompt})
messages.append({
"role": "user",
"content": f"Kontext: {context}\n\nFrage: {query}"
})
response = self.router.client.chat.completions.create(
model=model,
messages=messages,
temperature=0.7,
max_tokens=500 # Hartes Limit für Kostenkontrolle
)
result = response.choices[0].message.content
cost = self.router.estimate_cost(
model,
response.usage.completion_tokens
)
return {
"success": True,
"model": model,
"result": result,
"actual_cost": cost,
"tokens_used": response.usage.completion_tokens,
"latency_ms": response.response_ms if hasattr(response, 'response_ms') else 0
}
def cost_capped_batch(
self,
queries: List[str],
contexts: List[str],
system_prompt: Optional[str] = None
) -> List[Dict]:
"""
Batch-Verarbeitung mit Cost-Capping
"""
results = []
total_cost = 0.0
for query, context in zip(queries, contexts):
result = self.cost_capped_generate(query, context, system_prompt)
results.append(result)
if result.get("success"):
total_cost += result.get("actual_cost", 0)
# Rate limiting
time.sleep(0.1)
return results
Decorator für automatische Kostenkontrolle
def with_cost_control(max_cost: float = 0.05):
"""Decorator für kostenkontrollierte Funktionsausführung"""
def decorator(func: Callable) -> Callable:
@wraps(func)
def wrapper(*args, **kwargs):
router = CostControlledRouter(
MultiModelRouter(),
max_cost_per_request=max_cost
)
# Funktion aufrufen und Kosten tracken
result = func(*args, **kwargs)
return result
return wrapper
return decorator
Beispiel-Nutzung
if __name__ == "__main__":
router = MultiModelRouter()
cost_router = CostControlledRouter(
router,
max_cost_per_request=0.02 # Max $0.02 pro Anfrage
)
# Test mit verschiedenen Komplexitäten
test_cases = [
("Was ist Python?", "Python ist eine Programmiersprache."),
("Erkläre komplexe Softwarearchitektur-Muster mit Beispielen.",
"Architekturmuster..."),
("Liste 5 Programmiersprachen auf.", "Programmiersprachen: Python, Java...")
]
print("=== Cost-Capped Routing Test ===\n")
for query, context in test_cases:
result = cost_router.cost_capped_generate(query, context)
if result.get("success"):
print(f"✅ Anfrage: '{query[:40]}...'")
print(f" Modell: {result['model']}")
print(f" Kosten: ${result['actual_cost']:.4f}")
print(f" Kostenlimit eingehalten: {result.get('cost_limit_respected', False)}")
else:
print(f"❌ Anfrage fehlgeschlagen: {result.get('error')}")
print()
Häufige Fehler und Lösungen
Fehler 1: Fehlende Fehlerbehandlung bei API-Timeouts
# PROBLEM: Bei Timeout wird keine Alternative versucht
BAD CODE:
response = self.client.chat.completions.create(
model=model,
messages=messages,
timeout=30 # Bei Timeout: komplett fehlgeschlagen
)
LÖSUNG: Automatischer Fallback implementieren
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=2, max=10)
)
def resilient_generate(self, query: str, context: str) -> Dict:
"""Generiert mit automatischen Retries und Fallback"""
for model in self.fallback_chain:
try:
response = self.client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": f"{context}\n\n{query}"}],
timeout=30
)
return {"success": True, "model": model, "response": response}
except TimeoutError:
print(f"⏱️ Timeout bei {model}, versuche alternatives Modell...")
continue
except Exception as e:
print(f"❌ Fehler bei {model}: {e}")
continue
return {"success": False, "error": "Alle Modelle nicht erreichbar"}
Fehler 2: Ignorieren der Input-Token-Kosten
# PROBLEM: Nur Output-Kosten betrachtet
BAD CODE:
cost = output_tokens * 0.000008 # Nur Output!
LÖSUNG: Input + Output berücksichtigen
def calculate_full_cost(
input_tokens: int,
output_tokens: int,
model: str
) -> float:
"""Berechnet Gesamtkosten (Input + Output)"""
# Input/Output Ratio typischerweise 1:3
prices = {
"deepseek-v3.2": {"input": 0.14, "output": 0.42}, # $/MTok
"gemini-2.5-flash": {"input": 0.35, "output": 2.50},
"gpt-4.1": {"input": 2.00, "output": 8.00},
"claude-sonnet-4.5": {"input": 3.00, "output": 15.00}
}
model_prices = prices.get(model, prices["gpt-4.1"])
input_cost = (input_tokens / 1_000_000) * model_prices["input"]
output_cost = (output_tokens / 1_000_000) * model_prices["output"]
return input_cost + output_cost
Bei langen Kontexten: Kosten steigen drastisch!
Beispiel: 10K Input + 500 Output mit Claude
input_cost: $0.03 + output_cost: $0.0075 = $0.0375
vs. GPT-4.1: $0.02 + $0.004 = $0.024
Fehler 3: Keine Caching-Strategie für wiederholte Queries
# PROBLEM: Gleiche Anfragen werden mehrfach teuer verarbeitet
BAD CODE:
def answer_question(query, context):
return call_model(query, context) # Jedes Mal neu!
LÖSUNG: Redis-basiertes Caching mit TTL
import redis
import json
import hashlib
class CachedRAGRouter:
def __init__(self, router: MultiModelRouter, redis_url: str = None):
self.router = router
self.redis = redis.from_url(redis_url) if redis_url else None
self.cache_ttl = 3600 # 1 Stunde
def _get_cache_key(self, query: str, context: str, model: str) -> str:
"""Generiert einen eindeutigen Cache-Key"""
content = f"{model}:{query}:{hashlib.md5(context.encode()).hexdigest()}"
return f"rag:response:{hashlib.sha256(content.encode()).hexdigest()}"
def cached_answer(self, query: str, context: str) -> Dict:
"""Antwort mit Caching für wiederholte Queries"""
# Erst Modell bestimmen
complexity = self.router.analyze_complexity(query, len(context))
model = self.router.select_model(complexity)
# Cache prüfen
cache_key = self._get_cache_key(query, context, model)
if self.redis:
cached = self.redis.get(cache_key)
if cached:
result = json.loads(cached)
result["cache_hit"] = True
result["cost"] = 0 # Keine Kosten bei Cache-Treffer!
return result
# Cache miss: Anfrage senden
result = self.router.route_and_generate(query, context)
result["cache_hit"] = False
# Im Cache speichern
if self.redis:
self.redis.setex(
cache_key,
self.cache_ttl,
json.dumps(result)
)
return result
Typischer Cache-Treffer: 30-60% bei produktiven RAG-Systemen
Bei 50% Treffern: weitere 15-30% Kostenreduktion!
Fehler 4: Falsche Modellpriorisierung bei niedrigem Budget
# PROBLEM: Premium-Modell für alles, wenn Budget hoch erscheint
BAD CODE:
if budget > 100:
model = "claude-sonnet-4.5" # Zu teuer für einfache Aufgaben!
LÖSUNG: Tatsächliche Komplexität priorisieren
class BudgetAwareRouter:
def __init__(self, monthly_budget: float, router: MultiModelRouter):
self.monthly_budget = monthly_budget
self.router = router
self.daily_spend = 0
self.daily_limit = monthly_budget / 30
def select_model(
self,
query: str,
context: str,
force_premium: bool = False
) -> str:
"""Wählt Modell basierend auf Komplexität UND Budget"""
complexity = self.router.analyze_complexity(query, len(context))
# Budget-Tracking
if self.daily_spend >= self.daily_limit:
# Budget erschöpft: Nur noch Budget-Modelle
return "deepseek-v3.2"
# Premium nur bei echter Notwendigkeit
if force_premium or complexity > 0.8:
return "claude-sonnet-4.5"
# Ansonsten: Kosten-Nutzen-optimal
return self.router.select_model(complexity)
def update_spend(self, amount: float):
"""Aktualisiert Tagesausgaben"""
self.daily_spend += amount
if self.daily_spend > self.daily_limit:
print(f"⚠️ Tageslimit erreicht: ${self.daily_spend:.2f} / ${self.daily_limit:.2f}")
Geeignet / Nicht geeignet für
| Geeignet für | Nicht geeignet für |
|---|---|
| ✅ RAG-Systeme mit hohem Anfragevolumen (10.000+/Tag) | ❌ Systeme mit extrem kritischen Antworten (Medizin, Recht) |