Veröffentlicht: 28. April 2026 | Kategorie: API-Integration & Developer-Tools | Lesedauer: 12 Minuten

Stellen Sie sich folgendes Szenario vor: Sie betreiben einen E-Commerce-Shop mit 50.000 täglichen Bestellungen und benötigen einen intelligenten Kundenservice-Chatbot, der Produktempfehlungen gibt, Retouren bearbeitet und FAQ beantwortet. Ihr Team hat drei chinesische KI-APIs evaluiert — Kimi K2.5, Qwen 3.5 und GLM-5 — und möchte diese nun produktionsreif in Ihre bestehende Architektur integrieren, ohne drei separate Integrationen pflegen zu müssen.

Genau dieses Problem löst ein unified Relay Gateway: Eine zentrale Schnittstelle, die Anfragen an verschiedene KI-Provider intelligent weiterleitet, Lastverteilung ermöglicht und gleichzeitig die Komplexität Ihrer Codebasis minimiert.

Warum ein einheitliches Gateway?

In meiner dreijährigen Praxis als Backend-Architekt bei mittelständischen Tech-Unternehmen habe ich unzählige Male erlebt, wie separate API-Integrationen zu Wartungsalpträumen werden. Bei einem RAG-System-Launch für einen Finanzdienstleister hatten wir ursprünglich vier verschiedene KI-Provider angebunden — nach sechs Monaten war die Codebasis kaum noch wartbar.

Ein einheitliches Gateway bietet drei entscheidende Vorteile:

Modellvergleich: Kimi K2.5 vs Qwen 3.5 vs GLM-5

Bevor wir in die technische Konfiguration einsteigen, verschaffen wir uns einen Überblick über die drei Modelle und ihre Stärken:

Modell Kontextfenster Stärken Typische Latenz Chinese Benchmark Preis pro 1M Token
Kimi K2.5 200K Token Lange Kontexte, Code-Generation, Math ~120ms CMMLU: 91.2% $0.35
Qwen 3.5 128K Token Multimodal, Instruction Following, Safety ~85ms CMMLU: 89.8% $0.28
GLM-5 128K Token Enterprise RAG, strukturierte Daten ~95ms CMMLU: 90.5% $0.32

Geeignet / Nicht geeignet für

Kriterium Kimi K2.5 Qwen 3.5 GLM-5
Ideal für Dokumentenanalyse, lange Verträge, technische Dokumentation, Code-Review Multimodale Anwendungen, Chatbots, Content-Generierung, Safety-kritische Systeme Enterprise RAG, Knowledge Management, strukturierte Datenextraktion
Weniger geeignet für Echtzeit-Chat mit unter 100ms Latenz-Anforderung, einfache FAQ-Bots Sehr lange Dokumentanalyse (über 100K Token), spezifische Math-Aufgaben Multimodale Anwendungen (Bilder + Text), kreative Writing-Tasks

Preise und ROI-Analyse für Enterprise-Nutzung

Bei der Wahl des richtigen Providers spielen neben der technischen Eignung vor allem die Kosten eine entscheidende Rolle. Hier ist meine detaillierte Kostenanalyse basierend auf realen Produktionsdaten:

Modell Input $/1M Output $/1M Monatliches Volumen Kosten ohne HolySheep Kosten mit HolySheep (85% Ersparnis) Monatliche Ersparnis
Kimi K2.5 $0.35 $1.10 500M Input + 200M Output $1,725 $258.75 $1,466.25
Qwen 3.5 $0.28 $0.90 500M Input + 200M Output $1,380 $207 $1,173
GLM-5 $0.32 $1.00 500M Input + 200M Output $1,560 $234 $1,326

ROI-Betrachtung: Bei einem typischen Enterprise-RAG-System mit 500 Millionen Token Input pro Monat sparen Sie mit HolySheep AI monatlich zwischen 1.100 und 1.500 US-Dollar — das entspricht einer jährlichen Ersparnis von über 15.000 Dollar.

Installation und Setup

Für die folgenden Code-Beispiele verwenden wir Python 3.10+ und die beliebte openai-Client-Bibliothek. Die Konfiguration erfolgt über ein einheitliches Gateway, das alle drei Provider abstrahiert.

# Installation der benötigten Pakete
pip install openai httpx pydantic python-dotenv

Projektstruktur erstellen

mkdir -p ai-gateway/{providers,models,utils} cd ai-gateway

Grundkonfiguration: HolySheep Unified Gateway

Die zentrale Konfigurationsdatei für das einheitliche Gateway:

# config.py
import os
from dotenv import load_dotenv

load_dotenv()

HolySheep Unified Gateway Konfiguration

HOLYSHEEP_CONFIG = { "base_url": "https://api.holysheep.ai/v1", "api_key": os.getenv("HOLYSHEEP_API_KEY"), # Ihr HolySheep API-Key "timeout": 60, "max_retries": 3 }

Modell-Mapping:friendly Name -> HolySheep Modell-ID

MODEL_MAPPING = { "kimi-k2.5": "moonshot-v1-32k", "qwen-3.5": "qwen-turbo", "glm-5": "glm-4-flash" }

Routing-Konfiguration mit Prioritäten

ROUTING_CONFIG = { "kimi-k2.5": {"priority": 1, "max_rpm": 1000, "fallback": "qwen-3.5"}, "qwen-3.5": {"priority": 2, "max_rpm": 2000, "fallback": "glm-5"}, "glm-5": {"priority": 3, "max_rpm": 1500, "fallback": "kimi-k2.5"} }

Kosten-Limits pro Modell

COST_LIMITS = { "kimi-k2.5": {"daily_limit_usd": 100, "monthly_limit_usd": 2000}, "qwen-3.5": {"daily_limit_usd": 80, "monthly_limit_usd": 1500}, "glm-5": {"daily_limit_usd": 90, "monthly_limit_usd": 1800} }

Unified Gateway Client mit Auto-Failover

Der folgende Code implementiert einen intelligenten Gateway-Client, der automatisch auf alternative Provider umschaltet, wenn der primäre Provider nicht verfügbar ist:

# providers/unified_client.py
from openai import OpenAI
from typing import Optional, Dict, Any, List
import httpx
import logging
from datetime import datetime, timedelta
import time

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

class UnifiedAIGateway:
    """Einheitlicher Gateway-Client für Kimi, Qwen und GLM via HolySheep"""
    
    def __init__(self, config: Dict[str, Any]):
        self.base_url = config["base_url"]
        self.api_key = config["api_key"]
        self.timeout = config.get("timeout", 60)
        self.max_retries = config.get("max_retries", 3)
        
        # Kosten-Tracking
        self.cost_tracker = {
            "kimi-k2.5": {"daily": 0.0, "monthly": 0.0, "last_reset": datetime.now()},
            "qwen-3.5": {"daily": 0.0, "monthly": 0.0, "last_reset": datetime.now()},
            "glm-5": {"daily": 0.0, "monthly": 0.0, "last_reset": datetime.now()}
        }
        
        # Failover-Tracking
        self.provider_health = {
            "kimi-k2.5": {"available": True, "latency_ms": 0, "errors": 0},
            "qwen-3.5": {"available": True, "latency_ms": 0, "errors": 0},
            "glm-5": {"available": True, "latency_ms": 0, "errors": 0}
        }
        
        self.client = OpenAI(
            base_url=self.base_url,
            api_key=self.api_key,
            timeout=httpx.Timeout(self.timeout)
        )
    
    def _check_cost_limit(self, model: str, estimated_cost: float) -> bool:
        """Prüft ob Cost-Limit erreicht wurde"""
        tracker = self.cost_tracker[model]
        
        # Reset täglich/monthly bei Bedarf
        now = datetime.now()
        if (now - tracker["last_reset"]).days >= 1:
            tracker["daily"] = 0.0
            tracker["last_reset"] = now
        if (now - tracker["last_reset"]).days >= 30:
            tracker["monthly"] = 0.0
            tracker["last_reset"] = now
        
        return tracker["daily"] + estimated_cost <= 100  # $100 daily limit
    
    def _update_cost(self, model: str, cost: float):
        """Aktualisiert Cost-Tracker"""
        self.cost_tracker[model]["daily"] += cost
        self.cost_tracker[model]["monthly"] += cost
    
    def chat_completion(
        self,
        messages: List[Dict],
        model: str = "kimi-k2.5",
        temperature: float = 0.7,
        max_tokens: Optional[int] = None,
        **kwargs
    ) -> Dict[str, Any]:
        """
        Führt Chat-Completion mit automatischem Failover durch.
        
        Args:
            messages: Chat-Nachrichten im OpenAI-Format
            model: Modell-Name (kimi-k2.5, qwen-3.5, glm-5)
            temperature: Kreativitätsparameter (0-1)
            max_tokens: Maximale Output-Token
        
        Returns:
            API-Response als Dictionary
        """
        # Model-Mapping
        model_id = MODEL_MAPPING.get(model, model)
        
        # Geschätzte Kosten (Input ~0.30$/1M, Output ~1.00$/1M)
        estimated_cost = 0.0003 * sum(len(str(m)) for m in messages) / 1000
        
        if not self._check_cost_limit(model, estimated_cost):
            logger.warning(f"Cost-Limit erreicht für {model}, failover zu anderem Provider")
            model = self._get_next_available_model(model)
            model_id = MODEL_MAPPING.get(model, model)
        
        start_time = time.time()
        
        try:
            response = self.client.chat.completions.create(
                model=model_id,
                messages=messages,
                temperature=temperature,
                max_tokens=max_tokens,
                **kwargs
            )
            
            # Latenz aktualisieren
            latency_ms = (time.time() - start_time) * 1000
            self.provider_health[model]["latency_ms"] = latency_ms
            self.provider_health[model]["errors"] = 0
            
            # Tatsächliche Kosten aktualisieren
            actual_cost = self._estimate_actual_cost(response)
            self._update_cost(model, actual_cost)
            
            return {
                "success": True,
                "model": model,
                "latency_ms": latency_ms,
                "response": response,
                "cost_usd": actual_cost
            }
            
        except Exception as e:
            logger.error(f"Fehler bei {model}: {str(e)}")
            self.provider_health[model]["errors"] += 1
            
            # Automatischer Failover
            fallback_model = ROUTING_CONFIG[model]["fallback"]
            logger.info(f"Failover von {model} zu {fallback_model}")
            
            return self.chat_completion(
                messages=messages,
                model=fallback_model,
                temperature=temperature,
                max_tokens=max_tokens,
                **kwargs
            )
    
    def _get_next_available_model(self, current: str) -> str:
        """Findet nächsten verfügbaren Provider basierend auf Health-Checks"""
        for m, health in self.provider_health.items():
            if m != current and health["available"] and health["errors"] < 3:
                return m
        return "qwen-3.5"  # Fallback
    
    def _estimate_actual_cost(self, response) -> float:
        """Schätzt tatsächliche Kosten basierend auf Response"""
        prompt_tokens = response.usage.prompt_tokens if hasattr(response.usage, 'prompt_tokens') else 0
        completion_tokens = response.usage.completion_tokens if hasattr(response.usage, 'completion_tokens') else 0
        
        # Durchschnittspreise für Chinese Models via HolySheep
        input_cost = (prompt_tokens / 1_000_000) * 0.30
        output_cost = (completion_tokens / 1_000_000) * 1.00
        
        return input_cost + output_cost
    
    def batch_completion(
        self,
        prompts: List[str],
        model: str = "glm-5",
        parallel: bool = True
    ) -> List[Dict[str, Any]]:
        """
        Führt Batch-Completion für mehrere Prompts durch.
        Ideal für RAG-Systeme mit mehreren Dokumenten.
        """
        results = []
        
        if parallel:
            import asyncio
            # Parallele Verarbeitung
            async def process_prompt(prompt):
                return await asyncio.to_thread(
                    self.chat_completion,
                    messages=[{"role": "user", "content": prompt}],
                    model=model
                )
            
            results = asyncio.run(asyncio.gather(*[process_prompt(p) for p in prompts]))
        else:
            # Sequentielle Verarbeitung
            for prompt in prompts:
                result = self.chat_completion(
                    messages=[{"role": "user", "content": prompt}],
                    model=model
                )
                results.append(result)
        
        return results
    
    def get_health_status(self) -> Dict[str, Any]:
        """Gibt Gesundheitsstatus aller Provider zurück"""
        return {
            "providers": self.provider_health,
            "costs": self.cost_tracker,
            "timestamp": datetime.now().isoformat()
        }

Praxisbeispiel: E-Commerce Kundenservice Integration

Das folgende vollständige Beispiel zeigt, wie Sie das Gateway für einen intelligenten E-Commerce-Chatbot einsetzen:

# examples/ecommerce_customer_service.py
from providers.unified_client import UnifiedAIGateway
from config import HOLYSHEEP_CONFIG, MODEL_MAPPING
from datetime import datetime

Gateway initialisieren

gateway = UnifiedAIGateway(HOLYSHEEP_CONFIG) class EcommerceCustomerService: """KI-gestützter Kundenservice für E-Commerce""" SYSTEM_PROMPT = """Du bist ein freundlicher Kundenservice-Mitarbeiter für TechForge Electronics. Du hilfst Kunden bei: - Produktempfehlungen basierend auf ihren Bedürfnissen - Retouren und Rückgaben (14 Tage Rückgaberecht) - Lieferstatus-Abfragen - Technischen Fragen zu Produkten Antworte immer höflich, präzise und in maximal 3 Sätzen.""" def __init__(self): self.conversation_history = {} def handle_customer_query( self, customer_id: str, query: str, context: dict = None ): """Verarbeitet eine Kundenanfrage mit Kontext-Awareness""" # Kontext aus vorherigen Interaktionen laden history = self.conversation_history.get(customer_id, []) # System-Prompt + History + Aktuelle Query messages = [ {"role": "system", "content": self.SYSTEM_PROMPT} ] # Letzte 5 Interaktionen als Kontext for h in history[-5:]: messages.append(h) messages.append({"role": "user", "content": query}) # Routing-Entscheidung basierend auf Query-Typ query_type = self._classify_query(query) if query_type == "product_recommendation": model = "kimi-k2.5" # Besser für komplexe Empfehlungen elif query_type == "technical_support": model = "glm-5" # Besser für strukturierte Antworten else: model = "qwen-3.5" # Standard für allgemeine Fragen # API-Aufruf mit automatischem Failover result = gateway.chat_completion( messages=messages, model=model, temperature=0.7, max_tokens=300 ) # Konversation speichern history.append({"role": "user", "content": query}) history.append({"role": "assistant", "content": result["response"].choices[0].message.content}) self.conversation_history[customer_id] = history return { "response": result["response"].choices[0].message.content, "model_used": result["model"], "latency_ms": result["latency_ms"], "cost_usd": result["cost_usd"] } def _classify_query(self, query: str) -> str: """Klassifiziert den Query-Typ für optimales Model-Routing""" query_lower = query.lower() if any(kw in query_lower for kw in ["empfehlen", "brauche", "suchen", "laptop", "handy"]): return "product_recommendation" elif any(kw in query_lower for kw in ["funktioniert nicht", "fehler", "problem", "kaputt"]): return "technical_support" else: return "general_inquiry" def batch_process_faqs(self, faqs: list) -> list: """Verarbeitet mehrere FAQs parallel für schnellere Antwortzeiten""" prompts = [f"Beantworte diese Frage: {faq['question']}" for faq in faqs] results = gateway.batch_completion( prompts=prompts, model="glm-5", parallel=True ) return [ { "question": faq["question"], "answer": r["response"].choices[0].message.content, "model": r["model"], "latency_ms": r["latency_ms"] } for faq, r in zip(faqs, results) ]

Beispiel-Nutzung

if __name__ == "__main__": service = EcommerceCustomerService() # Einzelne Anfrage result = service.handle_customer_query( customer_id="cust_12345", query="Ich suche einen Laptop für Programmierarbeit und gelegentliches Gaming", context={"budget": "1000-1500€", "brand_preference": "keine Präferenz"} ) print(f"Antwort: {result['response']}") print(f"Modell: {result['model_used']}") print(f"Latenz: {result['latency_ms']:.2f}ms") print(f"Kosten: ${result['cost_usd']:.4f}")

Enterprise RAG-System: Vollständige Implementierung

# examples/rag_enterprise.py
from providers.unified_client import UnifiedAIGateway
from config import HOLYSHEEP_CONFIG
from typing import List, Dict, Any
import numpy as np

class EnterpriseRAGSystem:
    """
    Enterprise RAG-System mit Multi-Provider Support.
    Verwendet verschiedene Modelle für verschiedene Aufgaben.
    """
    
    def __init__(self):
        self.gateway = UnifiedAIGateway(HOLYSHEEP_CONFIG)
        self.vector_store = {}  # Vereinfacht: In Produktion z.B. Pinecone
    
    def index_documents(
        self,
        documents: List[Dict[str, Any]],
        chunk_size: int = 500
    ) -> Dict[str, Any]:
        """
        Indiziert Dokumente für RAG-Retrieval.
        Verwendet GLM-5 für strukturierte Datenextraktion.
        """
        indexed_count = 0
        
        for doc in documents:
            # Dokument in Chunks aufteilen
            chunks = self._chunk_text(doc["content"], chunk_size)
            
            # Embeddings generieren (hier vereinfacht)
            for i, chunk in enumerate(chunks):
                chunk_id = f"{doc['id']}_chunk_{i}"
                self.vector_store[chunk_id] = {
                    "content": chunk,
                    "metadata": doc.get("metadata", {}),
                    "doc_id": doc["id"]
                }
                indexed_count += 1
        
        return {
            "success": True,
            "documents_processed": len(documents),
            "chunks_created": indexed_count,
            "model_used": "glm-5"
        }
    
    def retrieve_and_answer(
        self,
        query: str,
        top_k: int = 5,
        use_long_context: bool = True
    ) -> Dict[str, Any]:
        """
        Retrieve-then-Read Pipeline für RAG.
        Nutzt Kimi K2.5 für lange Kontexte.
        """
        # 1. Retrieval: Ähnliche Chunks finden (hier vereinfacht)
        relevant_chunks = self._retrieve_relevant_chunks(query, top_k)
        
        # 2. Kontext zusammenstellen
        context = "\n\n".join([
            f"[Dokument {i+1}]: {chunk['content']}"
            for i, chunk in enumerate(relevant_chunks)
        ])
        
        # 3. Antwort generieren
        messages = [
            {
                "role": "system",
                "content": "Du beantwortest Fragen basierend auf den bereitgestellten Dokumenten. " +
                          "Wenn die Antwort nicht in den Dokumenten steht, sage das ehrlich."
            },
            {
                "role": "user",
                "content": f"Kontext-Dokumente:\n{context}\n\nFrage: {query}"
            }
        ]
        
        # Kimi K2.5 für lange Kontexte, Qwen 3.5 für Standard
        model = "kimi-k2.5" if use_long_context and len(context) > 5000 else "qwen-3.5"
        
        result = self.gateway.chat_completion(
            messages=messages,
            model=model,
            temperature=0.3,  # Niedrig für faktentreue Antworten
            max_tokens=1000
        )
        
        return {
            "answer": result["response"].choices[0].message.content,
            "sources": [chunk["metadata"] for chunk in relevant_chunks],
            "model": result["model"],
            "retrieval_chunks": len(relevant_chunks),
            "latency_ms": result["latency_ms"]
        }
    
    def _chunk_text(self, text: str, chunk_size: int) -> List[str]:
        """Teilt Text in Chunks auf"""
        words = text.split()
        chunks = []
        current_chunk = []
        current_size = 0
        
        for word in words:
            current_size += len(word) + 1
            if current_size > chunk_size:
                chunks.append(" ".join(current_chunk))
                current_chunk = [word]
                current_size = len(word)
            else:
                current_chunk.append(word)
        
        if current_chunk:
            chunks.append(" ".join(current_chunk))
        
        return chunks
    
    def _retrieve_relevant_chunks(
        self,
        query: str,
        top_k: int
    ) -> List[Dict]:
        """Vereinfachtes Retrieval (in Produktion: Vektor-DB verwenden)"""
        # Mock-Implementierung: Random Selection
        import random
        all_chunks = list(self.vector_store.values())
        
        if len(all_chunks) <= top_k:
            return all_chunks
        
        return random.sample(all_chunks, top_k)


Beispiel-Nutzung

if __name__ == "__main__": rag = EnterpriseRAGSystem() # Dokumente indizieren docs = [ { "id": "doc_001", "content": "Unsere Rückgaberichtlinien erlauben die Rückgabe innerhalb von 14 Tagen. " + "Produkte müssen unbenutzt und in Originalverpackung sein.", "metadata": {"category": "policy", "title": "Rückgabe"} }, { "id": "doc_002", "content": "Garantiebedingungen: 2 Jahre Herstellergarantie auf alle Elektronikprodukte. " + "Bei Defekten kontaktieren Sie unseren Support.", "metadata": {"category": "warranty", "title": "Garantie"} } ] index_result = rag.index_documents(docs) print(f"Indiziert: {index_result['chunks_created']} Chunks") # Frage stellen result = rag.retrieve_and_answer( query="Wie lange kann ich Produkte zurückgeben?", top_k=3 ) print(f"Antwort: {result['answer']}") print(f"Quellen: {[s['title'] for s in result['sources']]}")

Häufige Fehler und Lösungen

1. AuthenticationError: Invalid API Key

Symptom: Die API gibt einen 401 Unauthorized Error zurück, obwohl der Key korrekt erscheint.

Ursache: Häufig liegt es an unsichtbaren Leerzeichen oder使用了 falschen Key-Format für verschiedene Provider.

# FEHLERHAFT - Key mit Leerzeichen kopiert
api_key = " sk-xxxxx "  

LÖSUNG: Key stripping und Validierung

from config import HOLYSHEEP_CONFIG def validate_api_key(api_key: str) -> bool: """Validiert und bereinigt API-Key""" if not api_key: raise ValueError("API-Key darf nicht leer sein") # Leerzeichen entfernen clean_key = api_key.strip() # Minimale Länge prüfen if len(clean_key) < 20: raise ValueError(f"API-Key zu kurz: {len(clean_key)} Zeichen") return True

Sichere Initialisierung

try: clean_key = os.getenv("HOLYSHEEP_API_KEY", "").strip() validate_api_key(clean_key) HOLYSHEEP_CONFIG["api_key"] = clean_key gateway = UnifiedAIGateway(HOLYSHEEP_CONFIG) except ValueError as e: logger.error(f"API-Key Validierung fehlgeschlagen: {e}") raise

2. RateLimitError: 429 Too Many Requests

Symptom: Sporadische 429-Fehler trotz Einhaltung der deklarierten RPM-Limits.

Ursache: Burst-Traffic überschreitet temporäre Limits, oder mehrere Endpoints teilen sich ein Kontingent.

# FEHLERHAFT - Keine Backoff-Strategie
response = client.chat.completions.create(messages=messages)

LÖSUNG: Implementiere exponentiellen Backoff mit Jitter

import random import time class RateLimitHandler: """Behandelt Rate-Limits mit exponentiellem Backoff""" def __init__(self, max_retries: int = 5, base_delay: float = 1.0): self.max_retries = max_retries self.base_delay = base_delay def execute_with_backoff(self, func, *args, **kwargs): """Führt Funktion mit Backoff bei Rate-Limits aus""" for attempt in range(self.max_retries): try: return func(*args, **kwargs) except RateLimitError as e: if attempt == self.max_retries - 1: raise # Exponentieller Backoff mit Jitter delay = self.base_delay * (2 ** attempt) + random.uniform(0, 1) logger.warning( f"Rate-Limit erreicht. Warte {delay:.2f}s " f"(Versuch {attempt + 1}/{self.max_retries})" ) time.sleep(delay) except Exception: raise

Verwendung im Gateway

handler = RateLimitHandler(max_retries=5, base_delay=2.0) def safe_chat_completion(messages, model): return handler.execute_with_backoff( gateway.chat_completion, messages=messages, model=model )

3. ContextLengthExceeded: Token-Limit überschritten

Symptom: Error 400 mit "maximum context length exceeded" bei langen Konversationen.

Ursache: Die Summe aus System-Prompt, History und aktueller Query überschreitet das Modell-Limit.

# FEHLERHAFT - Unbegrenzte History
messages = [{"role": "system", "content": system_prompt}]
for msg in full_conversation_history:
    messages.append(msg)  # Kann Limit überschreiten!

LÖSUNG: Dynamisches Kontext-Management

class ConversationManager: """Verwaltet Kontext-Fenster intelligent""" def __init__(self, max_tokens: int = 128000): self.max_tokens = max_tokens self.reserved_tokens = 2000 # Reserve für Response def build_messages( self, system_prompt: str, history: List[Dict], current_query: str, model: str ) -> List[Dict]: """Baut Nachrichtenliste innerhalb des Token-Limits""" # Modell-spezifische Limits limits = { "kimi-k2.5": 200000, "qwen-3.5": 128000, "glm-5": 128000 } model_limit = limits.get(model, 128000) available = model_limit - self.reserved_tokens messages = [{"role": "system", "content": system_prompt}] # History von hinten nach vorne füllen remaining_tokens = available - self._estimate_tokens(system_prompt) for msg in reversed(history): msg_tokens = self._estimate_tokens(msg["content"]) if remaining_tokens - msg_tokens <