diff --git a/backend/src/tracker/api/models.py b/backend/src/tracker/api/models.py index 086b674..1fc5fa8 100644 --- a/backend/src/tracker/api/models.py +++ b/backend/src/tracker/api/models.py @@ -124,6 +124,7 @@ class KetteDetail(BaseModel): strang: str | None = None ampel: dict | None = None umsetzung: dict | None = None + umsetzung_versionen: list[dict] | None = None class PaginatedVorlagen(BaseModel): diff --git a/backend/src/tracker/api/routes/bewertung.py b/backend/src/tracker/api/routes/bewertung.py index 9b7a561..4293261 100644 --- a/backend/src/tracker/api/routes/bewertung.py +++ b/backend/src/tracker/api/routes/bewertung.py @@ -273,12 +273,13 @@ def _run_ketten_bewertung(kette_id: int, anmerkung: str, job_id: str): _jobs[job_id] = {"status": "error", "error": str(result)} return - # Keep old versions, insert new + # Keep old versions, insert new (linked to kette, not vorlage) conn.execute( - """INSERT INTO ki_bewertungen (vorlage_id, typ, score, begruendung, anmerkungen, modell, prompt_version, erstellt_at) - VALUES (?, 'umsetzung_match', ?, ?, ?, 'qwen-plus-latest', 'v2-reeval', ?)""", + """INSERT INTO ki_bewertungen (vorlage_id, kette_id, typ, score, begruendung, anmerkungen, modell, prompt_version, erstellt_at) + VALUES (?, ?, 'umsetzung_match', ?, ?, ?, 'qwen-plus-latest', 'v2-reeval', ?)""", ( kette["ursprung_id"], + kette_id, result.get("score"), result.get("begruendung"), json.dumps(result, ensure_ascii=False), diff --git a/backend/src/tracker/api/routes/ketten.py b/backend/src/tracker/api/routes/ketten.py index 8817c6d..c7867b1 100644 --- a/backend/src/tracker/api/routes/ketten.py +++ b/backend/src/tracker/api/routes/ketten.py @@ -191,32 +191,37 @@ def get_kette(kette_id: int, conn=Depends(_db)): # Graph/Perlenschnur data graph = get_kette_graph(conn, kette_id) - # Umsetzungsbewertung (neueste KI-Bewertung für Ursprungsvorlage) + # Umsetzungsbewertung (alle Versionen für diese Kette, neueste zuerst) umsetzung = None - if row["ursprung_id"]: - ub_row = conn.execute( - """SELECT score, begruendung, anmerkungen, erstellt_at, prompt_version - FROM ki_bewertungen - WHERE vorlage_id = ? AND typ = 'umsetzung_match' - ORDER BY id DESC LIMIT 1""", - (row["ursprung_id"],), - ).fetchone() - if ub_row: - import json as _json - details = {} - if ub_row["anmerkungen"]: - try: - details = _json.loads(ub_row["anmerkungen"]) - except Exception: - pass - umsetzung = { - "score": ub_row["score"], - "bewertung": details.get("bewertung", ""), - "begruendung": ub_row["begruendung"], - "kernpunkt_erfuellt": details.get("kernpunkt_erfuellt"), - "details": details.get("details", ""), - "erstellt_at": ub_row["erstellt_at"], - } + umsetzung_versionen = [] + import json as _json + ub_rows = conn.execute( + """SELECT score, begruendung, anmerkungen, erstellt_at, prompt_version + FROM ki_bewertungen + WHERE kette_id = ? AND typ = 'umsetzung_match' + ORDER BY id DESC""", + (kette_id,), + ).fetchall() + for i, ub_row in enumerate(ub_rows): + details = {} + if ub_row["anmerkungen"]: + try: + details = _json.loads(ub_row["anmerkungen"]) + except Exception: + pass + entry = { + "score": ub_row["score"], + "bewertung": details.get("bewertung", ""), + "begruendung": ub_row["begruendung"], + "kernpunkt_erfuellt": details.get("kernpunkt_erfuellt"), + "details": details.get("details", ""), + "erstellt_at": ub_row["erstellt_at"], + "prompt_version": ub_row["prompt_version"], + } + if i == 0: + umsetzung = entry + else: + umsetzung_versionen.append(entry) strang = row["strang"] ampel_data = get_ampel(strang or "", row["status"] or "") @@ -244,4 +249,5 @@ def get_kette(kette_id: int, conn=Depends(_db)): strang=strang, ampel=ampel_data, umsetzung=umsetzung, + umsetzung_versionen=umsetzung_versionen if umsetzung_versionen else None, ) diff --git a/frontend/src/routes/explorer/+page.svelte b/frontend/src/routes/explorer/+page.svelte index e6b2ec3..4ba7908 100644 --- a/frontend/src/routes/explorer/+page.svelte +++ b/frontend/src/routes/explorer/+page.svelte @@ -31,6 +31,7 @@ let mobileTab = $state<'liste' | 'kette' | 'detail'>('liste'); let showVolltext = $state(false); let showVersionen = $state(false); + let showUmsetzungVersionen = $state(false); let showReeval = $state(false); let reevalAnmerkung = $state(''); let reevalStatus = $state<'idle' | 'running' | 'done' | 'error'>('idle'); @@ -364,6 +365,28 @@ {#if u.details}
{u.details}
{/if} + {#if selectedKette.umsetzung_versionen?.length} + + {#if showUmsetzungVersionen} +{v.begruendung}
+{ub.begruendung}
- {/if} -