diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 9a1005a8..dfd8079e 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -373,6 +373,87 @@ def retry_on_failure(func): # Ende Retry Decorator Block # ============================================================================== +# ============================================================================== +# 3. GLOBALE HELPER FUNCTIONS (PART 2: Logging & Token Count) +# (Teil von logisch 'utils.py') +# ============================================================================== + +# --- Token Count Funktion --- +# Zaehlt Tokens via tiktoken oder schaetzt ueber Leerzeichen. +# Der retry_on_failure Decorator ist hier nicht sinnvoll, da es eine lokale Berechnung ist. +def token_count(text, model=None): + """Zaehlt Tokens via tiktoken oder schaetzt ueber Leerzeichen.""" + # Verwenden Sie logger, da das Logging jetzt konfiguriert ist (im Root Logger) + if not text or not isinstance(text, str): return 0 + + current_model = model if model else getattr(Config, 'TOKEN_MODEL', 'gpt-3.5-turbo') + + if tiktoken: + try: + # Cache encoding object per model + if not hasattr(token_count, 'enc_cache'): + token_count.enc_cache = {} + if current_model not in token_count.enc_cache: + token_count.enc_cache[current_model] = tiktoken.encoding_for_model(current_model) + enc = token_count.enc_cache[current_model] + return len(enc.encode(text)) + except Exception as e: + # Logge Fehler auf Debug, da dies ein Fallback ist + logger.debug(f"Fehler beim Token-Counting mit tiktoken fuer Modell '{current_model}': {e} - Fallback zur Schaetzung.") + # Fallback zur Schaetzung + return len(str(text).split()) # Sicherstellen, dass text ein String ist + else: + # Fallback Schaetzung + return len(str(text).split()) # Sicherstellen, dass text ein String ist + + +# --- Logging Helpers --- +# Erstellt den Logdateinamen. +# LOG_FILE ist global definiert und wird in main() gesetzt (Block 34) +LOG_FILE = None # Initialisierung, falls noch nicht geschehen + +def create_log_filename(mode): + """Erstellt einen zeitgestempelten Logdateinamen im LOG_DIR.""" + # Verwenden Sie logger, da das Logging jetzt konfiguriert ist (print am Anfang von main) + log_dir_path = LOG_DIR # Nutzt die globale Konstante (Block 1) + + # Erstelle das Log-Verzeichnis, falls es nicht existiert + if not os.path.exists(log_dir_path): + try: + # exist_ok=True verhindert Fehler, wenn das Verzeichnis bereits existiert + os.makedirs(log_dir_path, exist_ok=True) + # Logge die Erstellung des Verzeichnisses + logger.info(f"Log-Verzeichnis '{log_dir_path}' erstellt.") + except Exception as e: + # Logge Fehler auf Error-Level + logger.error(f"FEHLER: Konnte Log-Verzeichnis '{log_dir_path}' nicht erstellen: {e}") + # Versuche, die Datei im aktuellen Verzeichnis zu erstellen, wenn LOG_DIR fehlschlaegt + log_dir_path = "." # Fallback Verzeichnis + logger.warning(f"Versuche, Logdatei im aktuellen Verzeichnis '{log_dir_path}' zu erstellen.") + + # Erstelle den Dateinamen mit Zeitstempel und Version + try: + now = datetime.now().strftime("%d-%m-%Y_%H-%M") + # Sicherstellen, dass Config.VERSION verfuegbar ist (Block 1), Fallback falls nicht + ver_short = getattr(Config, 'VERSION', 'unknown').replace(".", "") + filename = f"{now}_{ver_short}_Modus{mode}.txt" + # Gebe den vollstaendigen Pfad zurueck + return os.path.join(log_dir_path, filename) + except Exception as e_fallback: + # Logge Fehler bei der Dateinamen-Erstellung + logger.error(f"FEHLER: Konnte Logdateinamen auch im Fallback-Verzeichnis '{log_dir_path}' nicht erstellen: {e_fallback}") + # Signalisiere Fehler durch Rueckgabe von None + return None + + +# debug_print ist nicht mehr notwendig, da wir das Standard-Logging nutzen. +# Alle bisherigen Aufrufe von debug_print werden durch logger.debug, logger.info, logger.warning, logger.error, logger.critical ersetzt. + + +# ============================================================================== +# Ende Grundlegende Helfer Block +# ============================================================================== + # ============================================================================== # GLOBALE HELPER FUNCTIONS (PART 2: Text, String & URL Utilities) # ==============================================================================