This commit is contained in:
team3
2026-06-14 22:43:54 +02:00
parent 6e5d673ca7
commit 08dd0ccd69
6 changed files with 107 additions and 39 deletions

View File

@@ -19,26 +19,36 @@ from textkit import _norm_titel
log = logging.getLogger("creator.lernen")
NOETIG = 3 # gute Antworten bis "absolviert" (Tier 1)
NOETIG = 3 # gute Antworten bis "absolviert" (Tier 1)
MASTERY = 10 # Score bis "verstanden" (Tier 2)
MEISTERN = 25 # Score bis "gemeistert" (Tier 3, Maximum)
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:
def score_berechnen(
score_vor_frage: int, gut: bool, tier2: bool, tier3: bool, absolviert: bool, gemeistert: 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).
Drei Stufen, freigeschaltet über Guide-Flags:
- Tier 1 (tier2=False): +1 bei richtig, KEINE Strafe, Deckel NOETIG (3).
- Tier 2 (tier2, nicht tier3): +1 / 1, Boden 3, Deckel MASTERY (10).
- Tier 3 (tier3, Meisterpfad): +1 / 2, Boden 10, Deckel MEISTERN (25).
Boden vor dem Absolvieren ist 0 (sonst NOETIG — absolviert bleibt erhalten).
Ist der Baustein gemeistert, friert der Score bei MEISTERN ein (keine Punkte mehr).
Re-Bewertung nutzt denselben Basis-Score und ersetzt das vorige Ergebnis.
"""
delta = 1 if gut else (-1 if tier2 else 0)
floor = NOETIG if absolviert else 0
cap = MASTERY if tier2 else NOETIG
if gemeistert:
return MEISTERN
if not tier2:
delta, floor, cap = (1 if gut else 0), (NOETIG if absolviert else 0), NOETIG
elif not tier3:
delta, floor, cap = (1 if gut else -1), NOETIG, MASTERY
else:
delta, floor, cap = (1 if gut else -2), MASTERY, MEISTERN
return max(floor, min(cap, score_vor_frage + delta))