This commit is contained in:
2025-05-07 10:42:37 +00:00
parent 384f8050cb
commit df43639a21

View File

@@ -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)
# ==============================================================================