This commit is contained in:
team3
2026-06-18 16:45:33 +02:00
parent 9c0f622e0c
commit d067cb8b54
27 changed files with 329 additions and 327 deletions

View File

@@ -13,12 +13,11 @@ from database import (
create_topic, list_topics as db_list_topics, delete_topic,
list_progress, set_progress, delete_progress,
create_element, list_elements, get_element, update_element, delete_element,
get_vertiefung, set_vertiefung, list_vertiefungen,
list_baustein_progress, set_baustein_score, set_baustein_streak, set_baustein_absolviert, set_baustein_verstanden, set_baustein_gemeistert, delete_baustein_daten,
)
from bausteine import generate_bausteine, cancel_bausteine, bausteine_status, active_bausteine, reset_bausteine, lade_quelle, lade_uebersicht
from elements import generate_element, chat_with_guide, chat_with_element, check_element, style_element, refine_suggestion
from lernen import NOETIG, MASTERY, MEISTERN, baustein_chat, baustein_diskussion, baustein_element_anlegen, pruefung_bewertung, pruefung_bewertung_schnell, pruefung_frage, score_berechnen, streak_berechnen, vertiefung_generieren
from lernen import NOETIG, MASTERY, MEISTERN, baustein_chat, baustein_diskussion, baustein_element_anlegen, pruefung_bewertung, pruefung_bewertung_schnell, pruefung_frage, score_berechnen, streak_berechnen
from guide import generate_guide, guide_slot_dateien
from pipeline import cancel_guide
from regeln import FORMATE, formate_stats, guide_lock, ist_absolviert, lade_lernstand, thema_abgeschlossen
@@ -32,7 +31,6 @@ from models import (
ElementRefineRequest, ElementRefineResponse,
ProgressUpdate, ProgressResponse, ProjectResponse, ProviderInfo,
FolderResponse, BausteineQuelleUpdate, BausteineQuelleResponse, BausteinUebersicht,
VertiefungRequest, VertiefungResponse,
BausteinChatRequest, BausteinChatResponse,
BausteinPruefungRequest, BausteinPruefungResponse, BausteinLernstandResponse,
)
@@ -207,18 +205,12 @@ async def get_bausteine_uebersicht(topic: str):
return lade_uebersicht(topic)
# --- Baustein-Lernen: Vertiefung, Chat, Prüfung ---
async def _bester_text(topic: str, baustein: str) -> str | None:
"""Kontext für Chat/Prüfung: Amateur-Fassung (art 'deepdive') bevorzugt, sonst Vertiefung."""
return await get_vertiefung(topic, baustein, "deepdive") or await get_vertiefung(topic, baustein, "vertiefung")
# --- Baustein-Lernen: Chat, Prüfung ---
@router.get("/bausteine/lernstand", response_model=BausteinLernstandResponse)
async def baustein_lernstand(topic: str):
"""Prüfungs-Stand + Vertiefungs-/Deepdive-Existenz pro Baustein (roher Titel als Key)."""
"""Prüfungs-Stand pro Baustein (roher Titel als Key)."""
progress = await list_baustein_progress(topic)
texte = await list_vertiefungen(topic)
bausteine = {
p["baustein"]: {
"gute_antworten": p["gute_antworten"],
@@ -226,44 +218,16 @@ async def baustein_lernstand(topic: str):
"absolviert": p["absolviert"] is not None,
"verstanden": p["verstanden"] is not None,
"gemeistert": p["gemeistert"] is not None,
"vertiefung": "vertiefung" in texte.get(p["baustein"], set()),
"deepdive": "deepdive" in texte.get(p["baustein"], set()),
}
for p in progress
}
for b, arten in texte.items():
if b not in bausteine:
bausteine[b] = {
"gute_antworten": 0, "streak": 0, "absolviert": False, "verstanden": False, "gemeistert": False,
"vertiefung": "vertiefung" in arten, "deepdive": "deepdive" in arten,
}
return {"bausteine": bausteine}
@router.get("/bausteine/vertiefung", response_model=VertiefungResponse)
async def get_baustein_vertiefung(topic: str, baustein: str, art: str = "vertiefung"):
if art not in ("vertiefung", "deepdive"):
raise HTTPException(400, "Unbekannte Art")
md = await get_vertiefung(topic, baustein, art)
if md is None:
raise HTTPException(404, "Kein Text vorhanden")
return {"md": md}
@router.post("/bausteine/vertiefung", response_model=VertiefungResponse)
async def create_baustein_vertiefung(req: VertiefungRequest):
md = await vertiefung_generieren(req.topic, req.baustein, req.section, art=req.art, provider=req.provider)
if md is None:
raise HTTPException(502, "Generierung fehlgeschlagen — bitte erneut versuchen")
await set_vertiefung(req.topic, req.baustein, req.art, md)
return {"md": md}
@router.post("/bausteine/chat", response_model=BausteinChatResponse)
async def baustein_chat_route(req: BausteinChatRequest):
vertiefung = await _bester_text(req.topic, req.baustein)
reply = await baustein_chat(
req.topic, req.baustein, req.section, vertiefung,
req.topic, req.baustein, req.section, req.section_kompakt,
[m.model_dump() for m in req.messages], provider=req.provider,
)
return {"reply": reply}
@@ -279,11 +243,11 @@ async def baustein_pruefung_route(req: BausteinPruefungRequest):
absolviert = stand["absolviert"] is not None
verstanden = stand["verstanden"] is not None
gemeistert = stand["gemeistert"] is not None
vertiefung = await _bester_text(req.topic, req.baustein)
kompakt = req.section_kompakt
msgs = [m.model_dump() for m in req.messages]
if req.aktion == "frage":
frage = await pruefung_frage(req.topic, req.baustein, req.section, vertiefung, msgs, provider=req.provider)
frage = await pruefung_frage(req.topic, req.baustein, req.section, kompakt, msgs, provider=req.provider)
if frage is None:
raise HTTPException(502, "Frage fehlgeschlagen — bitte erneut versuchen")
return {"frage": frage, "gute_antworten": gute, "absolviert": absolviert, "verstanden": verstanden, "gemeistert": gemeistert}
@@ -292,7 +256,7 @@ async def baustein_pruefung_route(req: BausteinPruefungRequest):
if not req.frage.strip():
raise HTTPException(400, "Diskussion braucht eine laufende Frage")
reply = await baustein_diskussion(
req.topic, req.baustein, req.section, vertiefung,
req.topic, req.baustein, req.section, kompakt,
req.frage, req.letzte_bewertung or None, msgs, provider=req.provider,
)
if reply is None:
@@ -309,7 +273,7 @@ async def baustein_pruefung_route(req: BausteinPruefungRequest):
if req.aktion == "antwort":
# Vorschau: nur Bewerter, kein Kritiker, KEIN Persist, KEINE Meilensteine.
data = await pruefung_bewertung_schnell(
req.topic, req.baustein, req.section, vertiefung, req.frage, msgs, gute, provider=req.provider,
req.topic, req.baustein, req.section, kompakt, req.frage, msgs, gute, provider=req.provider,
)
if data is None:
raise HTTPException(502, "Bewertung fehlgeschlagen — bitte erneut versuchen")
@@ -319,7 +283,7 @@ async def baustein_pruefung_route(req: BausteinPruefungRequest):
# aktion == "antwort_pruefen": verbindlich (Bewerter + Kritiker), persistiert Score + Meilensteine.
data = await pruefung_bewertung(
req.topic, req.baustein, req.section, vertiefung, req.frage, msgs, gute, provider=req.provider,
req.topic, req.baustein, req.section, kompakt, req.frage, msgs, gute, provider=req.provider,
role="guide" if req.gruendlich else "judge",
)
if data is None: