diff --git a/backend/database.py b/backend/database.py index 8e4ad40..dfb4e20 100644 --- a/backend/database.py +++ b/backend/database.py @@ -917,6 +917,7 @@ def _migrate(conn_factory): ("vorkommen_de", "TEXT"), ("wikipedia_url_de","TEXT"), ("ki_enriched", "INTEGER DEFAULT 0"), + ("ki_model", "TEXT"), ]: try: conn.execute(f"ALTER TABLE wiki_rassen ADD COLUMN {col} {typedef}") diff --git a/backend/ki.py b/backend/ki.py index a5d9d15..dd3b426 100644 --- a/backend/ki.py +++ b/backend/ki.py @@ -69,6 +69,7 @@ async def complete( requires_premium: bool = False, user_is_premium: bool = False, json_mode: bool = False, + return_model: bool = False, ) -> str: """ KI-Completion. Wählt automatisch den richtigen Backend. @@ -99,18 +100,21 @@ async def complete( # Cloud-Aufruf: nur wenn Premium UND cloud-Modus if requires_premium and user_is_premium and KI_MODE == "cloud": - return await _cloud_complete(prompt, system, max_tokens, json_mode) + text = await _cloud_complete(prompt, system, max_tokens, json_mode) + return (text, CLOUD_MODEL) if return_model else text # Lokaler Aufruf: Entwicklung + Free-User if KI_MODE in ("local", "cloud"): try: - return await _local_complete(prompt, system, max_tokens, json_mode) + text = await _local_complete(prompt, system, max_tokens, json_mode) + return (text, LOCAL_MODEL) if return_model else text except Exception as e: logger.warning(f"Lokales KI-Modell nicht erreichbar: {e}") # Cloud-Fallback: im cloud-Modus immer, sonst nur für Premium-User if ANTHROPIC_KEY and (KI_MODE == "cloud" or (requires_premium and user_is_premium)): logger.info("Fallback auf Cloud-KI.") - return await _cloud_complete(prompt, system, max_tokens, json_mode) + text = await _cloud_complete(prompt, system, max_tokens, json_mode) + return (text, CLOUD_MODEL) if return_model else text raise KIUnavailableError( "KI-Modell momentan nicht erreichbar. Bitte später erneut versuchen." ) from e diff --git a/backend/scraper/breed_enricher.py b/backend/scraper/breed_enricher.py index f08ae65..b6fd93b 100644 --- a/backend/scraper/breed_enricher.py +++ b/backend/scraper/breed_enricher.py @@ -228,11 +228,12 @@ async def enrich_breeds(limit: int = 10) -> int: prompt = _PROMPT_TEMPLATE.format(name=name, herkunft=herkunft) try: - raw = await complete( + raw, used_model = await complete( prompt, system=_SYSTEM, max_tokens=600, requires_premium=False, + return_model=True, ) except KIUnavailableError as e: logger.warning("KI nicht verfügbar, Anreicherung abgebrochen: %s", e) @@ -258,6 +259,7 @@ async def enrich_breeds(limit: int = 10) -> int: if "temperament" in updates: updates["temperament"] = translate_temperament(updates["temperament"]) updates["ki_enriched"] = 1 + updates["ki_model"] = used_model cols = ", ".join(f"{k}=?" for k in updates) values = list(updates.values()) + [rasse_id] diff --git a/backend/scraper/breed_evaluator.py b/backend/scraper/breed_evaluator.py index af655f7..c78bbfd 100644 --- a/backend/scraper/breed_evaluator.py +++ b/backend/scraper/breed_evaluator.py @@ -62,9 +62,11 @@ async def evaluate_enrichment(sample_size: int = 20) -> dict: """SELECT name, beschreibung, vorkommen_de, groesse, gewicht_min_kg, gewicht_max_kg, lebensdauer, aktivitaet, erfahrung, kinder_geeignet, - wohnung_geeignet, temperament + wohnung_geeignet, temperament, ki_model FROM wiki_rassen WHERE ki_enriched = 1 + AND ki_model IS NOT NULL + AND ki_model NOT LIKE 'claude%' ORDER BY RANDOM() LIMIT ?""", (sample_size,),