""" LLM Comparison - Pydantic Models und In-Memory Storage. """ from datetime import datetime, timezone from typing import Optional from pydantic import BaseModel, Field class ComparisonRequest(BaseModel): """Request fuer LLM-Vergleich.""" prompt: str = Field(..., description="User prompt (z.B. Lehrer-Frage)") system_prompt: Optional[str] = Field(None, description="Optionaler System Prompt") enable_openai: bool = Field(True, description="OpenAI/ChatGPT aktivieren") enable_claude: bool = Field(True, description="Claude aktivieren") enable_selfhosted_tavily: bool = Field(True, description="Self-hosted + Tavily aktivieren") enable_selfhosted_edusearch: bool = Field(True, description="Self-hosted + EduSearch aktivieren") # Parameter fuer Self-hosted Modelle selfhosted_model: str = Field("llama3.2:3b", description="Self-hosted Modell") temperature: float = Field(0.7, ge=0.0, le=2.0, description="Temperature") top_p: float = Field(0.9, ge=0.0, le=1.0, description="Top-p Sampling") max_tokens: int = Field(2048, ge=1, le=8192, description="Max Tokens") # Search Parameter search_results_count: int = Field(5, ge=1, le=20, description="Anzahl Suchergebnisse") edu_search_filters: Optional[dict] = Field(None, description="Filter fuer EduSearch") class LLMResponse(BaseModel): """Antwort eines einzelnen LLM.""" provider: str model: str response: str latency_ms: int tokens_used: Optional[int] = None search_results: Optional[list] = None error: Optional[str] = None timestamp: datetime = Field(default_factory=datetime.utcnow) class ComparisonResponse(BaseModel): """Gesamt-Antwort des Vergleichs.""" comparison_id: str prompt: str system_prompt: Optional[str] responses: list[LLMResponse] created_at: datetime = Field(default_factory=datetime.utcnow) class SavedComparison(BaseModel): """Gespeicherter Vergleich fuer QA.""" comparison_id: str prompt: str system_prompt: Optional[str] responses: list[LLMResponse] notes: Optional[str] = None rating: Optional[dict] = None # {"openai": 4, "claude": 5, ...} created_at: datetime created_by: Optional[str] = None # In-Memory Storage (in Production: Database) _comparisons_store: dict[str, SavedComparison] = {} _system_prompts_store: dict[str, dict] = { "default": { "id": "default", "name": "Standard Lehrer-Assistent", "prompt": """Du bist ein hilfreicher Assistent fuer Lehrkraefte in Deutschland. Deine Aufgaben: - Hilfe bei der Unterrichtsplanung - Erklaerung von Fachinhalten - Erstellung von Arbeitsblaettern und Pruefungen - Beratung zu paedagogischen Methoden Antworte immer auf Deutsch und beachte den deutschen Lehrplankontext.""", "created_at": datetime.now(timezone.utc).isoformat(), }, "curriculum": { "id": "curriculum", "name": "Lehrplan-Experte", "prompt": """Du bist ein Experte fuer deutsche Lehrplaene und Bildungsstandards. Du kennst: - Lehrplaene aller 16 Bundeslaender - KMK Bildungsstandards - Kompetenzorientierung im deutschen Bildungssystem Beziehe dich immer auf konkrete Lehrplanvorgaben wenn moeglich.""", "created_at": datetime.now(timezone.utc).isoformat(), }, "worksheet": { "id": "worksheet", "name": "Arbeitsblatt-Generator", "prompt": """Du bist ein spezialisierter Assistent fuer die Erstellung von Arbeitsblaettern. Erstelle didaktisch sinnvolle Aufgaben mit: - Klaren Arbeitsanweisungen - Differenzierungsmoeglichkeiten - Loesungshinweisen Format: Markdown mit klarer Struktur.""", "created_at": datetime.now(timezone.utc).isoformat(), }, }