diff --git a/helpers.py b/helpers.py index 3519aca0..b393ed9f 100644 --- a/helpers.py +++ b/helpers.py @@ -1018,25 +1018,32 @@ def evaluate_branches_batch(companies_data): "\n--- DEINE AUFGABE ---", f"Analysiere jedes der {len(companies_data)} Unternehmen Schritt für Schritt.", "Vergleiche jedes Unternehmensprofil mit den Definitionen im ZIEL-BRANCHENSCHEMA.", - "Gib als Ergebnis eine JSON-Liste zurück, die exakt ein JSON-Objekt für jedes Unternehmen in der gleichen Reihenfolge enthält.", - "Jedes JSON-Objekt muss folgende Schlüssel haben: 'row_num', 'Branche', 'Konfidenz', 'Begruendung'.", + + # NEUE, EXPLIZITE ANWEISUNG + "Gib als Ergebnis ein EINZIGES JSON-Objekt zurück. Dieses Objekt muss einen einzigen Schlüssel namens 'results' haben. Der Wert dieses Schlüssels muss eine JSON-Liste sein, die exakt ein JSON-Objekt für jedes der oben genannten Unternehmen in der gleichen Reihenfolge enthält.", + + "Jedes Objekt in der Liste muss folgende Schlüssel haben: 'row_num', 'Branche', 'Konfidenz', 'Begruendung'.", "Die 'row_num' muss exakt der 'Original-Zeilennummer' aus dem Input entsprechen.", - "Beispiel-Format für die Antwort: \n" + "Wenn ein Unternehmen nicht zugeordnet werden kann, setze die Branche auf 'Sonstiger Service'.", + + "\nBeispiel-Format für die ANTWORT:", ''' -[ - { - "row_num": 123, - "Branche": "Maschinenbau", - "Konfidenz": "Hoch", - "Begruendung": "Das Unternehmen stellt komplexe Maschinen her, was der Definition entspricht." - }, - { - "row_num": 456, - "Branche": "Facility Management", - "Konfidenz": "Mittel", - "Begruendung": "Bietet Dienstleistungen rund um Immobilien an, passt zur Definition." - } -] +{ + "results": [ + { + "row_num": 123, + "Branche": "Maschinenbau", + "Konfidenz": "Hoch", + "Begruendung": "Das Unternehmen stellt komplexe Maschinen her, was der Definition entspricht." + }, + { + "row_num": 456, + "Branche": "Facility Management", + "Konfidenz": "Mittel", + "Begruendung": "Bietet Dienstleistungen rund um Immobilien an, passt zur Definition." + } + ] +} ''' ] prompt = "\n".join(prompt_parts) @@ -1049,22 +1056,11 @@ def evaluate_branches_batch(companies_data): response_json = json.loads(response_str) - # NEUE, INTELLIGENTE PARSING-LOGIK - results_list = None - if isinstance(response_json, list): - # Der Idealfall: Die KI hat eine Liste zurückgegeben - results_list = response_json - elif isinstance(response_json, dict): - # Der häufige Fall: Die KI hat ein Objekt zurückgegeben, das eine Liste enthält - # Wir durchsuchen das Dictionary nach dem ersten Wert, der eine Liste ist. - for key, value in response_json.items(): - if isinstance(value, list): - logger.debug(f"Antwort war ein Dictionary, aber eine Ergebnisliste unter dem Schlüssel '{key}' gefunden.") - results_list = value - break + # NEUER, KUGELSICHERER PARSER + results_list = response_json.get("results") - if results_list is None: - logger.error(f"Konnte keine Ergebnisliste in der KI-Antwort finden. Antworttyp: {type(response_json)}. Inhalt: {str(response_json)[:300]}...") + if results_list is None or not isinstance(results_list, list): + logger.error(f"Konnte keine Ergebnisliste unter dem Schlüssel 'results' in der KI-Antwort finden. Antwort: {str(response_json)[:300]}...") return None return results_list