From d45d857659131192699276c1b9ad28c5c7f6e526 Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 18 Aug 2025 09:15:33 +0000 Subject: [PATCH] helpers.py aktualisiert --- helpers.py | 49 ++++++++++++++++--------------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/helpers.py b/helpers.py index d94dd629..77107d32 100644 --- a/helpers.py +++ b/helpers.py @@ -37,7 +37,7 @@ import requests from bs4 import BeautifulSoup import pandas as pd 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) # Optionale Bibliotheken @@ -759,63 +759,46 @@ def initialize_target_schema(): @retry_on_failure def call_openai_chat(prompt, temperature=0.3, model=None, response_format_json=False): """ - Zentrale Funktion fuer OpenAI Chat API Aufrufe. - 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. + Zentrale Funktion fuer OpenAI Chat API Aufrufe (aktualisiert für openai>1.0). """ 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.") - 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(): logger.error("Fehler: Leerer Prompt fuer OpenAI.") raise ValueError("Leerer Prompt fuer OpenAI.") 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: - # Baue die Anfrage-Payload dynamisch auf request_payload = { "model": current_model, "messages": [{"role": "user", "content": prompt}], "temperature": temperature } - # Füge den response_format Parameter hinzu, wenn er benötigt wird if response_format_json: logger.debug("Fordere JSON-Output von der OpenAI API an.") 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 - response = openai.ChatCompletion.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 "" + # NEU: Der Aufruf erfolgt über das client-Objekt + response = client.chat.completions.create(**request_payload) + result = response.choices[0].message.content.strip() 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: - # Wird vom @retry_on_failure Decorator gefangen und behandelt. - # Wir heben die Exception erneut auf, damit der Decorator sie sehen kann. + logger.error(f"Unerwarteter Fehler beim OpenAI-Aufruf: {e}") raise e