klausur-service (11 files): - cv_gutter_repair, ocr_pipeline_regression, upload_api - ocr_pipeline_sessions, smart_spell, nru_worksheet_generator - ocr_pipeline_overlays, mail/aggregator, zeugnis_api - cv_syllable_detect, self_rag backend-lehrer (17 files): - classroom_engine/suggestions, generators/quiz_generator - worksheets_api, llm_gateway/comparison, state_engine_api - classroom/models (→ 4 submodules), services/file_processor - alerts_agent/api/wizard+digests+routes, content_generators/pdf - classroom/routes/sessions, llm_gateway/inference - classroom_engine/analytics, auth/keycloak_auth - alerts_agent/processing/rule_engine, ai_processor/print_versions agent-core (5 files): - brain/memory_store, brain/knowledge_graph, brain/context_manager - orchestrator/supervisor, sessions/session_manager admin-lehrer (5 components): - GridOverlay, StepGridReview, DevOpsPipelineSidebar - DataFlowDiagram, sbom/wizard/page website (2 files): - DependencyMap, lehrer/abitur-archiv Other: nibis_ingestion, grid_detection_service, export-doclayout-onnx Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
104 lines
3.6 KiB
Python
104 lines
3.6 KiB
Python
"""
|
|
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(),
|
|
},
|
|
}
|