In der modernen KI-Anwendungsentwicklung ist die strukturierte Ausgabe von Sprachmodellen entscheidend für die Integration in produktive Systeme. Dieser Artikel bietet eine tiefgehende Analyse der JSON-Modus-Funktionen in LangChain, mit Fokus auf Architektur, Performance-Tuning und Kostenoptimierung. HolySheep AI (Jetzt registrieren) bietet hierbei mit einer Latenz von unter 50ms und einem Preis von nur $0.42 pro Million Token (DeepSeek V3.2) eine ideale Grundlage für produktive Deployments.

Grundkonzepte der strukturierten Ausgabe

Die Herausforderung bei der Arbeit mit Large Language Models (LLMs) besteht darin, dass die Ausgaben zunächst als unstrukturierter Text erscheinen. LangChain bietet jedoch leistungsstarke Mechanismen, um JSON-formatierte und typisierte Ausgaben zu erzwingen.

Warum strukturierte Ausgaben?

Installation und Setup

# Projektstruktur erstellen
mkdir langchain-structured-output && cd langchain-structured-output

Virtuelle Umgebung mit Python 3.11+

python3.11 -m venv venv source venv/bin/activate # Linux/Mac

venv\Scripts\activate # Windows

Abhängigkeiten installieren

pip install --upgrade pip pip install \ langchain>=0.3.0 \ langchain-core>=0.3.0 \ pydantic>=2.0.0 \ json-repair>=0.25.0 \ python-dotenv>=1.0.0 \ httpx>=0.27.0

Überprüfung der Installation

python -c "import langchain; print(f'LangChain Version: {langchain.__version__}')"

HolySheep AI API-Integration

Für die Produktion empfehle ich HolySheep AI als API-Provider. Mit einem Wechselkurs von ¥1=$1 und einer Ersparnis von über 85% gegenüber konventionellen Anbietern wie OpenAI ($8/MToken für GPT-4.1) bietet HolySheep eine wirtschaftliche Lösung. Die API erreicht Latenzen unter 50ms, was für interaktive Anwendungen ideal ist.

# .env Datei erstellen
cat > .env << 'EOF'
HOLYSHEEP_API_KEY="YOUR_HOLYSHEEP_API_KEY"
HOLYSHEEP_BASE_URL="https://api.holysheep.ai/v1"
EOF

API-Client Konfiguration

import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv() class HolySheepClient: """HolySheep AI API Client mit automatischer Retry-Logik""" def __init__( self, api_key: str = None, base_url: str = "https://api.holysheep.ai/v1", model: str = "deepseek-v3.2", temperature: float = 0.3, max_retries: int = 3, timeout: int = 30 ): self.api_key = api_key or os.getenv("HOLYSHEEP_API_KEY") self.base_url = base_url self.model = model self.temperature = temperature self.max_retries = max_retries self.timeout = timeout if not self.api_key: raise ValueError("API-Key erforderlich: .env Variable HOLYSHEEP_API_KEY setzen") # LLM-Instanz mit HolySheep-Konfiguration self.llm = ChatOpenAI( model=self.model, openai_api_key=self.api_key, openai_api_base=self.base_url, temperature=self.temperature, max_retries=max_retries, request_timeout=timeout ) print(f"✓ HolySheep Client initialisiert: {self.model}") print(f" └─ Base URL: {self.base_url}") print(f" └─ Timeout: {self.timeout}s | Max Retries: {max_retries}")

Client instantiieren

client = HolySheepClient()

Pydantic-basierte Ausgabeparsing

Die robusteste Methode für strukturierte Ausgaben in LangChain ist die Verwendung von Pydantic-Modellen. Dies garantiert Typsicherheit und automatische Validierung.

from typing import List, Optional
from pydantic import BaseModel, Field, field_validator
from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import PromptTemplate

============================================================

DEFINITION DER PYDANTIC-MODELLE

============================================================

class TechnologieStack(BaseModel): """Strukturierte Informationen über einen Tech-Stack""" sprachen: List[str] = Field( description="Liste der Programmiersprachen mit Versionsnummern" ) frameworks: List[str] = Field( description="Liste der verwendeten Frameworks" ) datenbank: List[str] = Field( description="Datenbanksysteme im Einsatz" ) cloud_provider: Optional[List[str]] = Field( default=None, description="Genutzte Cloud-Dienste" ) class ProjektAnalyse(BaseModel): """Vollständige Projektanalyse-Ergebnis""" projektname: str = Field(description="Name des analysierten Projekts") beschreibung: str = Field(description="Kurze Projektbeschreibung") tech_stack: TechnologieStack komplexitaets_score: float = Field( ge=1.0, le=10.0, description="Komplexitätsbewertung von 1-10" ) empfehlungen: List[str] = Field( description="Liste von Verbesserungsvorschlägen" ) risiken: List[str] = Field( description="Identifizierte Risiken" ) @field_validator('komplexitaets_score') @classmethod def validate_score(cls, v): if not 1.0 <= v <= 10.0: raise ValueError('Score muss zwischen 1.0 und 10.0 liegen') return v

Parser-Instanz erstellen

parser = PydanticOutputParser(pydantic_object=ProjektAnalyse) print("Parser-Instanz erfolgreich erstellt") print(f"Anweisungen:\n{parser.get_format_instructions()}")

JSON-Modus mit HolySheep AI

Der JSON-Modus ermöglicht die direkte Ausgabe von strukturierten JSON-Daten. HolySheep AI unterstützt diesen Modus vollständig mit einer garantierten Latenz von unter 50ms.

import json
import time
from typing import Dict, Any
from langchain.output_parsers import JsonOutputParser
from langchain.prompts import PromptTemplate
from langchain.schema import HumanMessage

class JSONModeProcessor:
    """JSON-Modus Processor für strukturierte Extraktion"""
    
    def __init__(self, llm_client: HolySheepClient):
        self.llm = llm_client.llm
        self.model = llm_client.model
        
    def analyze_architecture(self, code_description: str) -> Dict[str, Any]:
        """Analysiert eine Architektur-Beschreibung und extrahiert strukturierte Daten"""
        
        prompt = f"""Analysiere die folgende Software-Architektur-Beschreibung und 
extrahiere die strukturierten Informationen als JSON.

Beschreibung:
{code_description}

Erwartete JSON-Struktur:
{{
    "architektur_typ": " monolithisch | mikroservices | serverless | hybrid",
    "komponenten": [
        {{
            "name": "Komponentenname",
            "typ": "Frontend | Backend | Database | Cache | Queue",
            "technologie": "Verwendete Technologie",
            "verbindungen": ["verbundene Komponenten"]
        }}
    ],
    "skalierbarkeit": "hoch | mittel | niedrig",
    " Wartungsaufwand": "einfach | moderat | komplex",
    "geschätzte_kosten_monatlich": "geschätzte monatliche Kosten in USD"
}}

WICHTIG: Gib NUR gültiges JSON aus, ohne zusätzlichen Text."""

        start_time = time.perf_counter()
        
        try:
            response = self.llm.invoke([
                HumanMessage(content=prompt)
            ])
            
            latency_ms = (time.perf_counter() - start_time) * 1000
            
            # JSON-Parse mit Fehlerbehandlung
            result = json.loads(response.content)
            
            print(f"✓ Analyse erfolgreich abgeschlossen")
            print(f"  └─ Latenz: {latency_ms:.2f}ms")
            print(f"  └─ Modell: {self.model}")
            
            return {
                "data": result,
                "latency_ms": latency_ms,
                "model": self.model,
                "token_usage": getattr(response, 'usage', None)
            }
            
        except json.JSONDecodeError as e:
            print(f"✗ JSON-Parsing Fehler: {e}")
            # Fallback: JSON-Reparatur versuchen
            from json_repair import repair_json
            try:
                repaired = repair_json(response.content)
                return {
                    "data": json.loads(repaired),
                    "latency_ms": latency_ms,
                    "repaired": True
                }
            except Exception as repair_error:
                raise ValueError(f"Konnte JSON nicht reparieren: {repair_error}")

Instanz erstellen und testen

processor = JSONModeProcessor(client) test_architecture = """ Moderne E-Commerce-Plattform mit React-Frontend, Node.js/Express Backend, PostgreSQL Datenbank, Redis Cache, und AWS ECS für Container-Orchestrierung. """ result = processor.analyze_architecture(test_architecture) print(json.dumps(result['data'], indent=2, ensure_ascii=False))

Strukturierte Extraktion mit LangChain Chains

Für komplexe Extraktionsaufgaben bieten LangChain Chains eine elegante Lösung. Sie kombinieren Prompt-Templates, Parser und LLM-Aufrufe in wiederverwendbaren Komponenten.

from typing import List, Optional
from langchain.chains import LLMChain
from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import PromptTemplate
from pydantic import BaseModel, Field

============================================================

ERWEITERTE PYDANTIC-MODELLE FÜR CODE-ANALYSE

============================================================

class CodeSmell(BaseModel): """Erkannter Code-Smell""" typ: str = Field(description="Art des Code-Smells") datei: str = Field(description="Dateipfad") zeile: int = Field(description="Zeilennummer") beschreibung: str = Field(description="Beschreibung des Problems") schweregrad: str = Field( description="Kritisch | Hoch | Mittel | Niedrig" ) empfohlene_loesung: str = Field( description="Vorgeschlagene Behebungsmaßnahme" ) class CodeReview(BaseModel): """Vollständiges Code-Review-Ergebnis""" gesamtbewertung: float = Field( ge=0.0, le=10.0, description="Gesamtbewertung des Codes" ) staerken: List[str] = Field( description="Identifizierte Stärken" ) verbesserungspotential: List[str] = Field( description="Bereiche mit Verbesserungspotential" ) smells: List[CodeSmell] = Field( description="Gefundene Code-Smells" ) security_issues: List[str] = Field( description="Sicherheitsrelevante Probleme" ) test_coverage: str = Field( description="Bewertung der Testabdeckung" ) class HolySheepLLMChain: """HolySheep AI LLM Chain mit Retry und Caching""" def __init__(self, llm_client: HolySheepClient, cache_enabled: bool = True): self.llm = llm_client.llm self.cache = {} if cache_enabled else None def create_structured_chain( self, pydantic_model: BaseModel, system_prompt: str, user_template: str ) -> LLMChain: """Erstellt eine LLM Chain mit strukturierter Ausgabe""" parser = PydanticOutputParser(pydantic_object=pydantic_model) prompt = PromptTemplate( template=f"""{system_prompt} {parser.get_format_instructions()} Benutzeranfrage: {user_template}""", input_variables=["input"], partial_variables={"format_instructions": parser.get_format_instructions()} ) chain = LLMChain( llm=self.llm, prompt=prompt, verbose=True ) return chain, parser def extract_with_retry( self, chain: LLMChain, parser: PydanticOutputParser, input_text: str, max_retries: int = 3 ) -> BaseModel: """Führt Extraktion mit automatischer Wiederholung bei Fehlern durch""" for attempt in range(max_retries): try: response = chain.run(input=input_text) return parser.parse(response) except Exception as e: print(f"Versuch {attempt + 1}/{max_retries} fehlgeschlagen: {e}") if attempt == max_retries - 1: raise raise RuntimeError("Maximale Anzahl an Versuchen erreicht")

============================================================

PRAXISBEISPIEL: CODE-REVIEW CHAIN

============================================================

Modell und Chain erstellen

code_review_chain_wrapper = HolySheepLLMChain(client) code_review_chain, parser = code_review_chain_wrapper.create_structured_chain( pydantic_model=CodeReview, system_prompt="""Du bist ein erfahrener Software-Architekt und Code-Reviewer. Analysiere den vorgelegten Code sorgfältig und identifiziere: - Stärken in der Implementierung - Verbesserungspotential - Code-Smells und Anti-Patterns - Sicherheitslücken - Testabdeckung""", user_template="Analysiere folgenden Code:\n{input}" )

Test-Code für Analyse

test_code = """ async function fetchUserData(userId) { const response = await fetch(/api/users/${userId}); const data = await response.json(); return data; } async function saveUserPreferences(userId, prefs) { localStorage.setItem('prefs_' + userId, JSON.stringify(prefs)); const response = await fetch('/api/preferences', { method: 'POST', body: JSON.stringify({ userId, prefs }), headers: { 'Content-Type': 'application/json' } }); } """

Analyse durchführen

review = code_review_chain_wrapper.extract_with_retry( code_review_chain, parser, test_code ) print("\n" + "="*60) print("CODE REVIEW ERGEBNIS") print("="*60) print(f"Gesamtbewertung: {review.gesamtbewertung}/10") print(f"\nStärken:") for s in review.staerken: print(f" • {s}") print(f"\nVerbesserungspotential:") for v in review.verbesserungspotential: print(f" • {v}") print(f"\nTestabdeckung: {review.test_coverage}")

Concurrency Control und Performance-Optimierung

Für produktive Anwendungen mit hohem Durchsatz ist die gleichzeitige Verarbeitung mehrerer Anfragen essentiell. HolySheep AI's Latenz von unter 50ms ermöglicht effiziente Batch-Verarbeitung.

import asyncio
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from typing import List, Dict, Any
import httpx

class BatchProcessor:
    """Parallelverarbeitung für strukturierte Extraktion"""
    
    def __init__(
        self,
        api_key: str,
        base_url: str = "https://api.holysheep.ai/v1",
        max_concurrent: int = 10,
        semaphore_limit: int = 5
    ):
        self.api_key = api_key
        self.base_url = base_url
        self.max_concurrent = max_concurrent
        self.semaphore = asyncio.Semaphore(semaphore_limit)
        
    async def extract_single_async(
        self,
        client: httpx.AsyncClient,
        prompt: str,
        schema: Dict[str, Any]
    ) -> Dict[str, Any]:
        """Einzelne Extraktion asynchron ausführen"""
        
        async with self.semaphore:
            start_time = time.perf_counter()
            
            headers = {
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            }
            
            payload = {
                "model": "deepseek-v3.2",
                "messages": [
                    {"role": "system", "content": "Du extrahierst strukturierte Daten."},
                    {"role": "user", "content": f"{prompt}\n\nGib die Antwort als JSON aus."}
                ],
                "temperature": 0.3,
                "response_format": {"type": "json_object"}
            }
            
            try:
                response = await client.post(
                    f"{self.base_url}/chat/completions",
                    headers=headers,
                    json=payload,
                    timeout=30.0
                )
                response.raise_for_status()
                
                result = response.json()
                latency_ms = (time.perf_counter() - start_time) * 1000
                
                return {
                    "status": "success",
                    "data": result["choices"][0]["message"]["content"],
                    "latency_ms": latency_ms,
                    "tokens": result.get("usage", {})
                }
                
            except httpx.HTTPStatusError as e:
                return {
                    "status": "error",
                    "error": f"HTTP {e.response.status_code}",
                    "latency_ms": (time.perf_counter() - start_time) * 1000
                }
                
            except Exception as e:
                return {
                    "status": "error",
                    "error": str(e),
                    "latency_ms": (time.perf_counter() - start_time) * 1000
                }
    
    async def process_batch_async(
        self,
        prompts: List[Dict[str, str]],
        batch_name: str = "batch"
    ) -> List[Dict[str, Any]]:
        """Batch-Verarbeitung mit Concurrency Control"""
        
        print(f"\n🔄 Batch-Verarbeitung: {len(prompts)} Anfragen")
        print(f"   └─ Max. concurrent: {self.max_concurrent}")
        
        async with httpx.AsyncClient() as client:
            tasks = [
                self.extract_single_async(
                    client,
                    item["prompt"],
                    item.get("schema", {})
                )
                for item in prompts
            ]
            
            start_time = time.perf_counter()
            results = await asyncio.gather(*tasks)
            total_time = time.perf_counter() - start_time
            
        # Statistiken berechnen
        successful = [r for r in results if r["status"] == "success"]
        latencies = [r["latency_ms"] for r in successful]
        
        print(f"\n✅ Batch abgeschlossen in {total_time:.2f}s")
        print(f"   └─ Erfolgreich: {len(successful)}/{len(prompts)}")
        if latencies:
            print(f"   └─ Durchschn. Latenz: {sum(latencies)/len(latencies):.2f}ms")
            print(f"   └─ Min/Max Latenz: {min(latencies):.2f}ms / {max(latencies):.2f}ms")
        
        return results

============================================================

BENCHMARK: PARALLELE VS SEQUENTIELLE VERARBEITUNG

============================================================

async def run_benchmark(): """Performance-Vergleich: Parallel vs. Sequential""" processor = BatchProcessor( api_key=os.getenv("HOLYSHEEP_API_KEY"), max_concurrent=10, semaphore_limit=5 ) # Test-Datensätze generieren test_prompts = [ {"prompt": f"Extrahiere Informationen aus Text #{i}: Technologie-Stack"} for i in range(20) ] # Sequentiell print("\n" + "="*50) print("BENCHMARK: SEQUENTIELLE VERARBEITUNG") print("="*50) start_seq = time.perf_counter() for prompt in test_prompts[:5]: # Nur 5 für fairen Vergleich await processor.extract_single_async( httpx.AsyncClient(), prompt["prompt"], {} ) seq_time = time.perf_counter() - start_seq # Parallel print("\n" + "="*50) print("BENCHMARK: PARALLELE VERARBEITUNG") print("="*50) start_par = time.perf_counter() await processor.process_batch_async(test_prompts[:5], "benchmark") par_time = time.perf_counter() - start_par print(f"\n📊 ERGEBNISSE:") print(f" Sequentiell: {seq_time:.2f}s") print(f" Parallel: {par_time:.2f}s") print(f" Speedup: {seq_time/par_time:.2f}x")

Benchmark ausführen

asyncio.run(run_benchmark())

Kostenoptimierung mit HolySheep AI

Ein entscheidender Vorteil von HolySheep AI ist die Kostenstruktur. Während GPT-4.1 $8 und Claude Sonnet 4.5 $15 pro Million Token kosten, bietet HolySheep mit DeepSeek V3.2 nur $0.42 – eine Ersparnis von über 95%.

from dataclasses import dataclass
from typing import Dict, List, Optional
from datetime import datetime
import json

@dataclass
class Kostenanalyse:
    """Kostenanalyse für API-Nutzung"""
    
    anbieter: str
    modell: str
    preis_per_million: float
    input_tokens: int
    output_tokens: int
    
    @property
    def kosten_input(self) -> float:
        return (self.input_tokens / 1_000_000) * self.preis_per_million
    
    @property
    def kosten_output(self) -> float:
        return (self.output_tokens / 1_000_000) * self.preis_per_million
    
    @property
    def kosten_gesamt(self) -> float:
        return self.kosten_input + self.kosten_output
    
    def ersparnis_vs(self, other: 'Kostenanalyse') -> float:
        """Berechnet Ersparnis gegenüber einem anderen Anbieter"""
        if other.kosten_gesamt == 0:
            return 0
        return ((other.kosten_gesamt - self.kosten_gesamt) / other.kosten_gesamt) * 100

class KostenOptimierer:
    """Optimiert die API-Nutzung für minimale Kosten"""
    
    # Preise 2026 (USD pro Million Token)
    PREISE = {
        "holy_sheep_deepseek": 0.42,
        "holy_sheep_gpt4": 5.50,      # Ermäßigt gegenüber OpenAI
        "google_gemini_flash": 2.50,
        "openai_gpt4_1": 8.00,
        "anthropic_sonnet": 15.00,
    }
    
    def __init__(self, threshold_gross_projekt: float = 1000):
        self.threshold = threshold_gross_projekt
        self.verlauf = []
        
    def berechne_kosten_szenarien(
        self,
        input_tokens: int,
        output_tokens: int,
        szenarien: List[str] = None
    ) -> List[Kostenanalyse]:
        """Berechnet Kosten für verschiedene Anbieter-Szenarien"""
        
        if szenarien is None:
            szenarien = list(self.PREISE.keys())
            
        ergebnisse = []
        
        for szenario in szenarien:
            preis = self.PREISE.get(szenario, 0)
            analyse = Kostenanalyse(
                anbieter=szenario.split("_")[0].upper(),
                modell=szenario.split("_", 1)[1] if "_" in szenario else szenario,
                preis_per_million=preis,
                input_tokens=input_tokens,
                output_tokens=output_tokens
            )
            ergebnisse.append(analyse)
            
        return sorted(ergebnisse, key=lambda x: x.kosten_gesamt)
    
    def empfehlung(self, monatliche_anfragen: int, avg_input: int, avg_output: int) -> Dict:
        """Generiert Kostenempfehlung basierend auf Nutzung"""
        
        gesamt_input = monatliche_anfragen * avg_input
        gesamt_output = monatliche_anfragen * avg_output
        
        szenarien = self.berechne_kosten_szenarien(gesamt_input, gesamt_output)
        empfohlen = szenarien[0]  # Günstigste Option
        
        benchmark = Kostenanalyse(
            anbieter="OPENAI",
            modell="gpt-4.1",
            preis_per_million=self.PREISE["openai_gpt4_1"],
            input_tokens=gesamt_input,
            output_tokens=gesamt_output
        )
        
        return {
            "nutzungsstatistik": {
                "monatliche_anfragen": monatliche_anfragen,
                "durchschnitt_input_tokens": avg_input,
                "durchschnitt_output_tokens": avg_output,
                "gesamt_input_mt": gesamt_input / 1_000_000,
                "gesamt_output_mt": gesamt_output / 1_000_000
            },
            "empfehlung": {
                "anbieter": empfohlen.anbieter,
                "modell": empfohlen.modell,
                "monatliche_kosten": empfohlen.kosten_gesamt,
                "jahreskosten": empfohlen.kosten_gesamt * 12
            },
            "alternativen": [
                {
                    "anbieter": s.anbieter,
                    "modell": s.modell,
                    "kosten": s.kosten_gesamt
                }
                for s in szenarien[1:4]
            ],
            "ersparnis": {
                "vs_openai": empfohlen.ersparnis_vs(benchmark),
                "vs_anthropic": empfohlen.kosten_gesamt - 
                    (gesamt_input + gesamt_output) / 1_000_000 * self.PREISE["anthropic_sonnet"],
                "monatlich_in_usd": benchmark.kosten_gesamt - empfohlen.kosten_gesamt
            }
        }

============================================================

PRAXISBEISPIEL: KOSTENOPTIMIERUNG

============================================================

optimierer = KostenOptimierer()

Szenario: Mittelständisches Unternehmen

empfehlung = optimierer.empfehlung( monatliche_anfragen=100_000, avg_input=500, # 500 Token pro Anfrage avg_output=200 # 200 Token pro Antwort ) print("\n" + "="*60) print("KOSTENOPTIMIERUNGS-ANALYSE") print("="*60) print(f"\n📊 Nutzungsstatistik:") print(f" Anfragen/Monat: {empfehlung['nutzungsstatistik']['monatliche_anfragen']:,}") print(f" Input-Token/Monat: {empfehlung['nutzungsstatistik']['gesamt_input_mt']:.3f}M") print(f" Output-Token/Monat: {empfehlung['nutzungsstatistik']['gesamt_output_mt']:.3f}M") print(f"\n💡 EMPFEHLUNG: {empfehlung['empfehlung']['anbieter']} {empfehlung['empfehlung']['modell']}") print(f" Monatliche Kosten: ${empfehlung['empfehlung']['monatliche_kosten']:.2f}") print(f" Jahreskosten: ${empfehlung['empfehlung']['jahreskosten']:.2f}") print(f"\n💰 ERSPARNIS:") print(f" vs. OpenAI GPT-4.1: {empfehlung['ersparnis']['vs_openai']:.1f}%") print(f" Monatlich: ${empfehlung['ersparnis']['monatlich_in_usd']:.2f}")

Praxiserfahrung: Produktions-Deployment

Basierend auf meiner Erfahrung beim Deployment strukturierter LLM-Pipelines für Finanzdienstleister möchte ich einige kritische Erkenntnisse teilen:

Häufige Fehler und Lösungen

Fehler 1: JSONDecodeError bei Modellantworten

# PROBLEM: Modell gibt ungültiges JSON zurück

LÖSUNG: JSON-Reparatur mit json-repair Bibliothek

from json_repair import repair_json from typing import Optional import json class RobustJSONParser: """Parser mit automatischer JSON-Reparatur""" def __init__(self, schema: dict = None): self.schema = schema def parse_with_fallback(self, response_text: str) -> Optional[dict]: """Versucht Parsing, repariert bei Bedarf""" # Versuch 1: Direktes Parsing try: return json.loads(response_text) except json.JSONDecodeError: pass # Versuch 2: Markdown-Code-Block entfernen cleaned = response_text.strip() if cleaned.startswith("```json"): cleaned = cleaned[7:] if cleaned.startswith("```"): cleaned = cleaned[3:] if cleaned.endswith("```"): cleaned = cleaned[:-3] try: return json.loads(cleaned.strip()) except json.JSONDecodeError: pass # Versuch 3: JSON-Reparatur try: repaired = repair_json(response_text) result = json.loads(repaired) # Optional: Schema-Validierung if self.schema: self._validate_schema(result) return result except Exception as e: raise ValueError(f"Konnte JSON nicht parsen nach Reparatur: {e}") def _validate_schema(self, data: dict): """Validiert Daten gegen Schema""" if not isinstance(data, dict): raise ValueError("Erwartete Daten vom Typ dict") # Hier können Schema-spezifische Validierungen hinzugefügt werden

Anwendung

parser = RobustJSONParser() test_responses = [ '{"name": "Test", "wert": 42}', '``json\n{"name": "Test"}\n``', '{"name": "Test", unvollständig...}' ] for resp in test_responses: try: result = parser.parse_with_fallback(resp) print(f"✓ Erfolgreich geparst: {result}") except ValueError as e: print(f"✗ Fehler: {e}")

Fehler 2: Timeout bei langsamen Antworten

# PROBLEM: Request-Timeout bei komplexen Anfragen

LÖSUNG: Konfigurierbares Timeout mit Graceful Degradation

import httpx import asyncio from typing import Optional, Dict, Any from functools import wraps class TimeoutConfig: """Timeout-Konfiguration für verschiedene Szenarien""" DEFAULT = 30.0 COMPLEX = 60.0 STREAMING = 120.0 BATCH = 180.0 class TimeoutHandler: """Behandelt Timeouts mit Retry-Logik""" def __init__( self, base_url: str, api_key: str, default_timeout: float = TimeoutConfig.DEFAULT ): self.base_url = base_url self.api_key = api_key self.default_timeout = default_timeout self.retry_config = { "max_retries": 3, "backoff_factor": 1.5, "retry_on_timeout": True } async def request_with_timeout( self, payload: Dict[str, Any], timeout: Optional[float] = None, retry_count: int = 0 ) -> Dict[str, Any]: """Führt Request mit Timeout und Retry aus""" timeout = timeout or self.default_timeout headers = { "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" } try: async with httpx.AsyncClient() as client: response = await client.post( f"{self.base_url}/chat/completions", headers=headers, json=payload, timeout=timeout ) response.raise_for_status() return response.json() except httpx.TimeoutException as e: if retry_count < self.retry_config["max_retries"]: # Exponentieller Backoff wait_time = self.retry_config["backoff_factor"] ** retry_count print(f"Timeout nach {timeout}s. Retry {retry_count + 1} in {wait_time:.1f}s...") await asyncio.sleep(wait_time)