This commit is contained in:
team3
2026-06-14 14:55:44 +02:00
parent 2b89e21cd3
commit 143e6d6f7c
7 changed files with 108 additions and 41 deletions

View File

@@ -19,13 +19,29 @@ from textkit import _norm_titel
log = logging.getLogger("creator.lernen")
NOETIG = 3 # gute Antworten bis "absolviert"
NOETIG = 3 # gute Antworten bis "absolviert" (Tier 1)
MASTERY = 10 # Score bis "verstanden" (Tier 2)
VERTIEFUNG_TIMEOUT = 600
CHAT_TIMEOUT = 240
PRUEFUNG_TIMEOUT = 120 # kurze JSON-Turns; deckelt die Serien-Latenz pro Prüfungs-Schritt
KRITIK_MAX_RUNDEN = 2 # Generator → Kritiker → ggf. Neu, höchstens so oft
def score_berechnen(score_vor_frage: int, gut: bool, tier2: bool, absolviert: bool) -> int:
"""Neuer Score nach einer Antwort · driftfrei (immer aus dem Basis-Score gerechnet).
Tier 1 (tier2=False): +1 bei richtig, KEINE Strafe bei falsch, Deckel NOETIG (3).
Tier 2 (tier2=True): +1 bei richtig (Deckel MASTERY=10), 1 bei falsch.
Boden ist NOETIG, sobald der Baustein absolviert ist — sonst 0 (kann nicht
unter 3 fallen, absolviert bleibt erhalten). Re-Bewertung nutzt denselben
Basis-Score und ersetzt so das vorige Ergebnis (kein Doppelzählen).
"""
delta = 1 if gut else (-1 if tier2 else 0)
floor = NOETIG if absolviert else 0
cap = MASTERY if tier2 else NOETIG
return max(floor, min(cap, score_vor_frage + delta))
def _transcript(messages: list[dict]) -> str:
return "\n".join(
f"{'Nutzer' if m.get('role') == 'user' else 'Assistent'}: {m.get('content', '')}"