Fix Schema hartcodiert & Finale Stabilität

- 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.
This commit is contained in:
2025-06-30 12:03:36 +00:00
parent 41719fe267
commit f4e5d38199

View File

@@ -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: <ok oder X (Vergleich deines Vorschlags mit der extrahierten Kurzform der CRM-Referenz)>")
schema_lines.append("Begruendung: <Sehr kurze Begruendung fuer deinen Branchenvorschlag>")
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: <Exakter Kurzname der Branche aus der Liste>")
schema_lines.append("Konfidenz: <Hoch, Mittel oder Niedrig>")
schema_lines.append("Uebereinstimmung: <ok oder X (Vergleich deines Vorschlags mit der extrahierten Kurzform der CRM-Referenz)>")
schema_lines.append("Begruendung: <Sehr kurze Begruendung fuer deinen Branchenvorschlag>")
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)