diff --git a/backend/routes.py b/backend/routes.py index c83f44a..6235b7c 100644 --- a/backend/routes.py +++ b/backend/routes.py @@ -415,33 +415,19 @@ async def baustein_pruefung_route(req: BausteinPruefungRequest): return {"feedback": data["feedback"], "punkte": punkte, "bewertung": _farbe(punkte), "gute_antworten": gute, "cap": cap} - # aktion "antwort_pruefen" (Agent 2 genau): verbindlich, persistiert. Serialisiert je Baustein, - # Basis driftfrei über den offene_frage-Anker. NUR hier ändert sich der Score. - async with _pruef_lock(req.topic, req.baustein): - stand = await get_baustein_progress(req.topic, req.baustein) - war_stufe = stand["absolviert"] is not None # Element-Guard - basis, re_bewertung = _basis(stand, req.frage) - if not re_bewertung: - await set_offene_frage(req.topic, req.baustein, req.frage, basis, 0) - - data = await pruefung_bewertung( - req.topic, req.baustein, req.section, kompakt, req.frage, msgs, provider=req.provider, - role="guide" if req.gruendlich else "judge", begruendung=req.begruendung, - ) - if data is None: - raise HTTPException(502, "Bewertung fehlgeschlagen — bitte erneut versuchen") - - floor = floor_aus_score(basis, cap) - roh = _erklaeren_delta(data["niveau"], req.nachgefragt) - d = progressiver_malus(basis, cap) if roh < 0 else roh - score = score_berechnen(basis, d, floor, cap) - punkte = score - basis - gute = await set_baustein_score(req.topic, req.baustein, score) - if not war_stufe and stufe_aus_score(score, cap) is not None: - if await set_baustein_absolviert(req.topic, req.baustein): - asyncio.create_task(baustein_element_anlegen(req.topic, req.baustein, req.section, req.provider)) - return {"feedback": data["feedback"], "punkte": punkte, "bewertung": _farbe(punkte), - "gute_antworten": gute, "cap": cap} + # aktion "antwort_pruefen" (Agent 2 genau): verbindlich, persistiert. NUR hier ändert sich der Score. + # LLM läuft OHNE Lock; gebucht wird kurz über _buche (Anker + Score), wie bei Quiz/Lück. + # So blockiert die lange KI-Bewertung keine folgende (deterministische) Antwort desselben Bausteins. + data = await pruefung_bewertung( + req.topic, req.baustein, req.section, kompakt, req.frage, msgs, provider=req.provider, + role="guide" if req.gruendlich else "judge", begruendung=req.begruendung, + ) + if data is None: + raise HTTPException(502, "Bewertung fehlgeschlagen — bitte erneut versuchen") + roh = _erklaeren_delta(data["niveau"], req.nachgefragt) + res = await _buche(req, req.frage, roh, cap) # kurzer Lock: Basis driftfrei über offene_frage-Anker + res["feedback"] = data["feedback"] + return res # --- Guides ---