helpers.py aktualisiert
This commit is contained in:
49
helpers.py
49
helpers.py
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user