helpers.py aktualisiert

This commit is contained in:
2025-08-18 09:15:33 +00:00
parent 7d76a38cae
commit d45d857659

View File

@@ -37,7 +37,7 @@ import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import pandas as pd import pandas as pd
import openai import openai
from openai.error import AuthenticationError, OpenAIError, RateLimitError, APIError, Timeout, InvalidRequestError, ServiceUnavailableError #from openai.error import AuthenticationError, OpenAIError, RateLimitError, APIError, Timeout, InvalidRequestError, ServiceUnavailableError
from config import (Config, BRANCH_MAPPING_FILE, URL_CHECK_MARKER, USER_AGENTS, LOG_DIR) from config import (Config, BRANCH_MAPPING_FILE, URL_CHECK_MARKER, USER_AGENTS, LOG_DIR)
# Optionale Bibliotheken # Optionale Bibliotheken
@@ -759,24 +759,13 @@ def initialize_target_schema():
@retry_on_failure @retry_on_failure
def call_openai_chat(prompt, temperature=0.3, model=None, response_format_json=False): def call_openai_chat(prompt, temperature=0.3, model=None, response_format_json=False):
""" """
Zentrale Funktion fuer OpenAI Chat API Aufrufe. Zentrale Funktion fuer OpenAI Chat API Aufrufe (aktualisiert für openai>1.0).
Wird von anderen globalen Helfern oder DataProcessor Methoden aufgerufen.
NEU: Unterstützt explizite Anforderung des JSON-Formats.
Args:
prompt (str): Der Prompt-Text an die API.
temperature (float, optional): Die Temperatur fuer die Textgenerierung. Defaults to 0.3.
model (str, optional): Das zu verwendende OpenAI Modell. Defaults to Config.TOKEN_MODEL.
response_format_json (bool, optional): Wenn True, wird die API um eine JSON-Antwort gebeten. Defaults to False.
Returns:
str: Der bereinigte Antwortstring von der API.
Wirft Exception bei API-Fehlern nach Retries.
""" """
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
if not Config.API_KEYS.get('openai'): api_key = Config.API_KEYS.get('openai')
if not api_key:
logger.error("Fehler: OpenAI API Key nicht konfiguriert.") logger.error("Fehler: OpenAI API Key nicht konfiguriert.")
raise openai.error.AuthenticationError("OpenAI API Key nicht konfiguriert.") raise openai.AuthenticationError("OpenAI API Key nicht konfiguriert.")
if not prompt or not isinstance(prompt, str) or not prompt.strip(): if not prompt or not isinstance(prompt, str) or not prompt.strip():
logger.error("Fehler: Leerer Prompt fuer OpenAI.") logger.error("Fehler: Leerer Prompt fuer OpenAI.")
@@ -784,38 +773,32 @@ def call_openai_chat(prompt, temperature=0.3, model=None, response_format_json=F
current_model = model if model else getattr(Config, 'TOKEN_MODEL', 'gpt-4o') current_model = model if model else getattr(Config, 'TOKEN_MODEL', 'gpt-4o')
# NEU: Der Client muss instanziiert werden
client = openai.OpenAI(api_key=api_key)
try: try:
# Baue die Anfrage-Payload dynamisch auf
request_payload = { request_payload = {
"model": current_model, "model": current_model,
"messages": [{"role": "user", "content": prompt}], "messages": [{"role": "user", "content": prompt}],
"temperature": temperature "temperature": temperature
} }
# Füge den response_format Parameter hinzu, wenn er benötigt wird
if response_format_json: if response_format_json:
logger.debug("Fordere JSON-Output von der OpenAI API an.") logger.debug("Fordere JSON-Output von der OpenAI API an.")
request_payload["response_format"] = {"type": "json_object"} request_payload["response_format"] = {"type": "json_object"}
# Hinweis: GPT-4o, GPT-4-Turbo und GPT-3.5-Turbo-Modelle unterstützen diesen Modus.
# Führe den API-Call mit dem dynamischen Payload aus # NEU: Der Aufruf erfolgt über das client-Objekt
response = openai.ChatCompletion.create(**request_payload) response = client.chat.completions.create(**request_payload)
if not response or not hasattr(response, 'choices') or not response.choices:
logger.error(f"OpenAI Call erfolgreich, aber keine Choices in der Antwort erhalten. Response: {str(response)[:200]}...")
raise openai.error.APIError("Keine Choices in OpenAI Antwort erhalten.")
result = response.choices[0].message.content.strip() if hasattr(response.choices[0], 'message') and hasattr(response.choices[0].message, 'content') else ""
if not result:
logger.warning(f"OpenAI Call erfolgreich, erhielt aber leeren Inhalt in der Antwort. Prompt Anfang: {prompt[:100]}...")
return ""
result = response.choices[0].message.content.strip()
return result return result
# NEU: Angepasste Fehlerbehandlung für die neue Bibliothek
except openai.APIError as e:
logger.error(f"OpenAI API Fehler: {e}")
raise e # Erneut auslösen für den @retry_on_failure Decorator
except Exception as e: except Exception as e:
# Wird vom @retry_on_failure Decorator gefangen und behandelt. logger.error(f"Unerwarteter Fehler beim OpenAI-Aufruf: {e}")
# Wir heben die Exception erneut auf, damit der Decorator sie sehen kann.
raise e raise e