From b7310e666fb65fa9974ef27cd7fd2037aee11894 Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 30 Jun 2025 12:03:36 +0000 Subject: [PATCH] =?UTF-8?q?Fix=20Schema=20hartcodiert=20&=20Finale=20Stabi?= =?UTF-8?q?lit=C3=A4t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FIX: Kritischer Ladefehler endgültig behoben, indem das Branchenschema direkt in `config.py` hartcodiert wurde. - REFACTOR: `load_target_schema` in `helpers.py` zu `initialize_target_schema` umbenannt; liest nun aus der Config, nicht aus einer Datei. - CLEANUP: CSV-bezogene Initialisierungslogik entfernt, um das Skript robuster und portabler zu machen. --- helpers.py | 180 +++++++---------------------------------------------- 1 file changed, 22 insertions(+), 158 deletions(-) diff --git a/helpers.py b/helpers.py index 040d0fe0..99eaee8a 100644 --- a/helpers.py +++ b/helpers.py @@ -669,130 +669,43 @@ def get_email_address(firstname, lastname, website): # 7. SCHEMA LOADING UTILITY # ============================================================================== -def load_target_schema(csv_filepath=BRANCH_MAPPING_FILE): +def initialize_target_schema(): """ - Lädt das Ziel-Branchenschema aus der definierten CSV-Datei. + Initialisiert das Ziel-Branchenschema aus der hartcodierten Liste in config.py. Gibt True bei Erfolg zurück, False bei einem Fehler. """ logger = logging.getLogger(__name__) - from config import TARGET_SCHEMA_STRING, ALLOWED_TARGET_BRANCHES, FOCUS_TARGET_BRANCHES, FOCUS_BRANCHES_PROMPT_PART + # Importiere die Config-Daten und die globalen Variablen, die wir befüllen + from config import ZIEL_BRANCHENSCHEMA_DATA, TARGET_SCHEMA_STRING, ALLOWED_TARGET_BRANCHES, FOCUS_TARGET_BRANCHES, FOCUS_BRANCHES_PROMPT_PART - allowed_branches_set = set() - focus_branches_set = set() - line_count = 0 + logger.info("Initialisiere Ziel-Schema aus hartcodierter Liste in config.py...") - logger.info(f"Lade Ziel-Schema und Fokus-Branchen aus '{csv_filepath}'...") - - try: - with open(csv_filepath, "r", encoding="utf-8-sig") as f: - reader = csv.reader(f, delimiter=';') - try: - header_row = next(reader) - # +++ START DEBUG-CODE +++ - logger.critical(f"DEBUG: Gelesene Header-Zeile: {header_row}") - logger.critical(f"DEBUG: Anzahl der Spalten im Header: {len(header_row)}") - # +++ ENDE DEBUG-CODE +++ - logger.debug(f"Ueberspringe Header-Zeile im Schema: {header_row}") - except StopIteration: - logger.warning(f"Schema-Datei '{csv_filepath}' ist leer oder hat keinen Header.") - globals()['TARGET_SCHEMA_STRING'] = "Ziel-Branchenschema nicht verfuegbar (Datei leer)." - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" - globals()['ALLOWED_TARGET_BRANCHES'] = [] - return False - - # +++ START DEBUG-CODE +++ - first_row = None - try: - first_row = next(reader) - logger.critical(f"DEBUG: Gelesene ERSTE DATENZEILE: {first_row}") - logger.critical(f"DEBUG: Anzahl der Spalten in der ersten Datenzeile: {len(first_row)}") - except StopIteration: - logger.warning("DEBUG: Keine Datenzeilen nach dem Header gefunden.") - # WICHTIG: Datei neu öffnen, um von vorne zu lesen für die eigentliche Logik - f.seek(0) - next(reader) # Header wieder überspringen - # +++ ENDE DEBUG-CODE +++ - - for row_num, row in enumerate(reader, 1): - line_count = row_num - if not row or len(row) < 2: continue - - target_branch = row[1].strip() - if target_branch: - allowed_branches_set.add(target_branch) - if len(row) >= 3 and row[2].strip().upper() in ["X", "FOKUS", "JA", "TRUE", "1"]: - focus_branches_set.add(target_branch) - logger.debug(f" -> Fokusbranche gefunden: '{target_branch}'") - except FileNotFoundError:def load_target_schema(csv_filepath=BRANCH_MAPPING_FILE): #-Zeile 726 - """ - Lädt das Ziel-Branchenschema aus der definierten CSV-Datei. - Gibt True bei Erfolg zurück, False bei einem Fehler. - """ - logger = logging.getLogger(__name__) - from config import TARGET_SCHEMA_STRING, ALLOWED_TARGET_BRANCHES, FOCUS_TARGET_BRANCHES, FOCUS_BRANCHES_PROMPT_PART - - allowed_branches_set = set() - focus_branches_set = set() - line_count = 0 - - logger.info(f"Lade Ziel-Schema und Fokus-Branchen aus '{csv_filepath}'...") - - try: - with open(csv_filepath, "r", encoding="utf-8-sig") as f: - reader = csv.reader(f, delimiter=';') - try: - # Header lesen und überspringen - header_row = next(reader) - logger.debug(f"Ueberspringe Header-Zeile im Schema: {header_row}") - except StopIteration: - logger.warning(f"Schema-Datei '{csv_filepath}' ist leer oder hat keinen Header.") - globals()['TARGET_SCHEMA_STRING'] = "Ziel-Branchenschema nicht verfuegbar (Datei leer)." - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" - globals()['ALLOWED_TARGET_BRANCHES'] = [] - return False - - # Iteriere über die verbleibenden Zeilen im Reader - for row_num, row in enumerate(reader, 1): - line_count = row_num - # Überspringe leere Zeilen oder Zeilen mit zu wenigen Spalten - if not row or len(row) < 2: - logger.debug(f"Zeile {row_num} im Schema wird übersprungen (leer oder zu wenige Spalten).") - continue - - # Lese die Zielbranche aus der ZWEITEN Spalte (Index 1) - target_branch = row[1].strip() - if target_branch: - allowed_branches_set.add(target_branch) - # Prüfe optional die DRITTE Spalte (Index 2) für Fokus-Marker - if len(row) >= 3 and row[2].strip().upper() in ["X", "FOKUS", "JA", "TRUE", "1"]: - focus_branches_set.add(target_branch) - logger.debug(f" -> Fokusbranche gefunden: '{target_branch}'") - except FileNotFoundError: - logger.critical(f"FEHLER: Schema-Datei '{csv_filepath}' nicht gefunden.") - globals()['TARGET_SCHEMA_STRING'] = "Ziel-Branchenschema nicht verfuegbar (Datei nicht gefunden)." - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" - globals()['ALLOWED_TARGET_BRANCHES'] = [] - return False - except Exception as e: - logger.critical(f"FEHLER beim Laden des Ziel-Schemas aus '{csv_filepath}' (Zeile {line_count}): {e}") - globals()['TARGET_SCHEMA_STRING'] = "Ziel-Branchenschema nicht verfuegbar (Fehler beim Lesen)." - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" + if not ZIEL_BRANCHENSCHEMA_DATA or not isinstance(ZIEL_BRANCHENSCHEMA_DATA, list): + logger.critical("FEHLER: ZIEL_BRANCHENSCHEMA_DATA in config.py ist nicht vorhanden oder keine Liste.") globals()['ALLOWED_TARGET_BRANCHES'] = [] return False + allowed_branches_set = set() + + for item in ZIEL_BRANCHENSCHEMA_DATA: + parts = item.split(';') + if len(parts) >= 2: + target_branch = parts[1].strip() + if target_branch: + allowed_branches_set.add(target_branch) + # Update der globalen Variablen globals()['ALLOWED_TARGET_BRANCHES'] = sorted(list(allowed_branches_set), key=str.lower) - globals()['FOCUS_TARGET_BRANCHES'] = sorted(list(focus_branches_set), key=str.lower) + globals()['FOCUS_TARGET_BRANCHES'] = [] # Fokus-Branchen werden derzeit nicht aus der Liste geladen if not ALLOWED_TARGET_BRANCHES: - logger.warning("Keine gueltigen Zielbranchen im Schema gefunden. Branchenbewertung ist nicht moeglich.") - globals()['TARGET_SCHEMA_STRING'] = "Ziel-Branchenschema nicht verfuegbar (Keine gueltigen Branchen in Datei gefunden)." - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" + logger.warning("Keine gültigen Zielbranchen aus der Config-Liste extrahiert.") + globals()['TARGET_SCHEMA_STRING'] = "Ziel-Branchenschema nicht verfügbar (Config-Liste leer)." return False - logger.info(f"Ziel-Schema geladen: {len(ALLOWED_TARGET_BRANCHES)} eindeutige Zielbranchen, davon {len(FOCUS_TARGET_BRANCHES)} Fokusbranchen.") + logger.info(f"Ziel-Schema initialisiert: {len(ALLOWED_TARGET_BRANCHES)} eindeutige Zielbranchen gefunden.") - # Der Rest der Funktion, der den Prompt-String zusammenbaut, bleibt unverändert... + # Baue den Prompt-String zusammen schema_lines = ["Ziel-Branchenschema: Folgende Branchenbereiche sind gueltig (Kurzformen):"] schema_lines.extend(f"- {branch}" for branch in ALLOWED_TARGET_BRANCHES) schema_lines.append("\nBitte ordne das Unternehmen ausschliesslich in einen dieser Bereiche ein. Gib NUR den exakten Kurznamen der Branche zurueck (keine Praefixe oder zusaetzliche Erklaerungen ausser im 'Begruendung'-Feld).") @@ -802,58 +715,9 @@ def load_target_schema(csv_filepath=BRANCH_MAPPING_FILE): schema_lines.append("Uebereinstimmung: ") schema_lines.append("Begruendung: ") globals()['TARGET_SCHEMA_STRING'] = "\n".join(schema_lines) - - if FOCUS_TARGET_BRANCHES: - focus_prompt_lines = ["\nZusätzlicher Hinweis: Wenn die Wahl zwischen mehreren passenden Branchen besteht, priorisiere bitte, wenn möglich, eine der folgenden Fokusbranchen:"] - focus_prompt_lines.extend(f"- {branch}" for branch in FOCUS_TARGET_BRANCHES) - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "\n".join(focus_prompt_lines) - else: - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" - logger.info("Keine Fokusbranchen im Schema definiert.") + globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" # Zurücksetzen, da wir es nicht mehr aus der Datei lesen return True - logger.critical(f"FEHLER: Schema-Datei '{csv_filepath}' nicht gefunden.") - globals()['TARGET_SCHEMA_STRING'] = "Ziel-Branchenschema nicht verfuegbar (Datei nicht gefunden)." - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" - globals()['ALLOWED_TARGET_BRANCHES'] = [] - return False # WICHTIG: Rückgabe bei Fehler - except Exception as e: - logger.critical(f"FEHLER beim Laden des Ziel-Schemas aus '{csv_filepath}' (Zeile {line_count}): {e}") - globals()['TARGET_SCHEMA_STRING'] = "Ziel-Branchenschema nicht verfuegbar (Fehler beim Lesen)." - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" - globals()['ALLOWED_TARGET_BRANCHES'] = [] - return False # WICHTIG: Rückgabe bei Fehler - - globals()['ALLOWED_TARGET_BRANCHES'] = sorted(list(allowed_branches_set), key=str.lower) - globals()['FOCUS_TARGET_BRANCHES'] = sorted(list(focus_branches_set), key=str.lower) - - if not ALLOWED_TARGET_BRANCHES: - logger.warning("Keine gueltigen Zielbranchen im Schema gefunden. Branchenbewertung ist nicht moeglich.") - globals()['TARGET_SCHEMA_STRING'] = "Ziel-Branchenschema nicht verfuegbar (Keine gueltigen Branchen in Datei gefunden)." - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" - return False # WICHTIG: Rückgabe bei Fehler - - logger.info(f"Ziel-Schema geladen: {len(ALLOWED_TARGET_BRANCHES)} eindeutige Zielbranchen, davon {len(FOCUS_TARGET_BRANCHES)} Fokusbranchen.") - - schema_lines = ["Ziel-Branchenschema: Folgende Branchenbereiche sind gueltig (Kurzformen):"] - schema_lines.extend(f"- {branch}" for branch in ALLOWED_TARGET_BRANCHES) - schema_lines.append("\nBitte ordne das Unternehmen ausschliesslich in einen dieser Bereiche ein. Gib NUR den exakten Kurznamen der Branche zurueck (keine Praefixe oder zusaetzliche Erklaerungen ausser im 'Begruendung'-Feld).") - schema_lines.append("Antworte ausschliesslich im folgenden Format (keine Einleitung, kein Schlusssatz):") - schema_lines.append("Branche: ") - schema_lines.append("Konfidenz: ") - schema_lines.append("Uebereinstimmung: ") - schema_lines.append("Begruendung: ") - globals()['TARGET_SCHEMA_STRING'] = "\n".join(schema_lines) - - if FOCUS_TARGET_BRANCHES: - focus_prompt_lines = ["\nZusätzlicher Hinweis: Wenn die Wahl zwischen mehreren passenden Branchen besteht, priorisiere bitte, wenn möglich, eine der folgenden Fokusbranchen:"] - focus_prompt_lines.extend(f"- {branch}" for branch in FOCUS_TARGET_BRANCHES) - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "\n".join(focus_prompt_lines) - else: - globals()['FOCUS_BRANCHES_PROMPT_PART'] = "" - logger.info("Keine Fokusbranchen im Schema definiert.") - - return True # WICHTIG: Rückgabe bei Erfolg # ============================================================================== # 8. OPENAI API WRAPPERS (CHAT & SUMMARY)