From 700a8a3b8982f7e83f4598f69d5cc53a3d36d0b3 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Fri, 2 May 2025 19:46:47 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20=C3=84nderungen=20commited?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 33 +++++++++++--- static/js/modules/chatgpt-assistant.js | 60 ++++++++++++++++++++------ 2 files changed, 73 insertions(+), 20 deletions(-) diff --git a/app.py b/app.py index e41c870..52c6a8c 100644 --- a/app.py +++ b/app.py @@ -1558,12 +1558,13 @@ def chat_with_assistant(): import time start_time = time.time() + # Erhöhtes Timeout für die API-Anfrage response = client.chat.completions.create( model="gpt-4o-mini", messages=api_messages, - max_tokens=1000, # Erhöht für ausführlichere Antworten und detaillierte Führungen + max_tokens=1000, temperature=0.7, - timeout=20 # 20 Sekunden Timeout + timeout=60 # Erhöht auf 60 Sekunden für bessere Zuverlässigkeit ) print(f"OpenAI API-Antwortzeit: {time.time() - start_time:.2f} Sekunden") @@ -1577,12 +1578,30 @@ def chat_with_assistant(): except Exception as e: import traceback - print(f"Fehler bei der OpenAI-Anfrage: {str(e)}") - print(traceback.format_exc()) + error_message = str(e) + stack_trace = traceback.format_exc() - return jsonify({ - 'error': f'Fehler bei der OpenAI-Anfrage: {str(e)}' - }), 500 + print(f"Fehler bei der OpenAI-Anfrage: {error_message}") + print(f"Stack Trace: {stack_trace}") + + # Überprüfen auf spezifische Fehlertypen + if "timeout" in error_message.lower(): + return jsonify({ + 'error': 'Die Anfrage hat zu lange gedauert. Bitte versuchen Sie es später erneut.' + }), 504 + elif "rate limit" in error_message.lower(): + return jsonify({ + 'error': 'API-Ratelimit erreicht. Bitte warten Sie einen Moment und versuchen Sie es erneut.' + }), 429 + elif "internal server error" in error_message.lower() or "500" in error_message: + return jsonify({ + 'error': 'Es ist ein Serverfehler aufgetreten. Unser Team wurde benachrichtigt.' + }), 500 + else: + # Allgemeine Fehlermeldung + return jsonify({ + 'error': 'Bei der Verarbeitung Ihrer Anfrage ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.' + }), 500 def check_database_query(user_message): """ diff --git a/static/js/modules/chatgpt-assistant.js b/static/js/modules/chatgpt-assistant.js index 0a7819c..3ec7965 100644 --- a/static/js/modules/chatgpt-assistant.js +++ b/static/js/modules/chatgpt-assistant.js @@ -342,14 +342,27 @@ class ChatGPTAssistant { messages: this.messages }), cache: 'no-cache', // Kein Cache verwenden - credentials: 'same-origin' // Cookies senden + credentials: 'same-origin', // Cookies senden + timeout: 60000 // 60 Sekunden Timeout }); // Ladeindikator entfernen this.removeLoadingIndicator(); if (!response.ok) { - throw new Error(`Serverfehler: ${response.status} ${response.statusText}`); + const errorText = await response.text(); + let errorMessage; + + try { + // Versuche, die Fehlermeldung zu parsen + const errorData = JSON.parse(errorText); + errorMessage = errorData.error || `Serverfehler: ${response.status} ${response.statusText}`; + } catch { + // Bei Parsing-Fehler verwende Standardfehlermeldung + errorMessage = `Serverfehler: ${response.status} ${response.statusText}`; + } + + throw new Error(errorMessage); } const data = await response.json(); @@ -375,24 +388,45 @@ class ChatGPTAssistant { // Ladeindikator entfernen, falls noch vorhanden this.removeLoadingIndicator(); + // Spezielle Fehlermeldungen für bestimmte Fehlertypen + const errorMessage = error.message || ''; + let userFriendlyMessage = 'Es gab ein Problem mit der Anfrage.'; + + if (errorMessage.includes('timeout') || errorMessage.includes('Zeitüberschreitung')) { + userFriendlyMessage = 'Die Antwort hat zu lange gedauert. Der Server ist möglicherweise überlastet.'; + } else if (errorMessage.includes('500') || errorMessage.includes('Internal Server Error')) { + userFriendlyMessage = 'Ein Serverfehler ist aufgetreten. Wir arbeiten an einer Lösung.'; + } else if (errorMessage.includes('429') || errorMessage.includes('rate limit')) { + userFriendlyMessage = 'Die API-Anfragelimits wurden erreicht. Bitte warte einen Moment.'; + } + // Fehlermeldung anzeigen oder Wiederholungsversuch starten if (this.retryCount < this.maxRetries) { this.retryCount++; - this.addMessage('assistant', 'Es gab ein Problem mit der Anfrage. Ich versuche es erneut...'); + this.addMessage('assistant', `${userFriendlyMessage} Ich versuche es erneut... (Versuch ${this.retryCount}/${this.maxRetries})`); - // Kurze Verzögerung vor dem erneuten Versuch - setTimeout(() => { - // Letzte Benutzernachricht aus dem Messages-Array entfernen - const lastUserMessage = this.messages[this.messages.length - 2].content; - this.messages = this.messages.slice(0, -2); // Entferne Benutzernachricht und Fehlermeldung + // Letzte Benutzernachricht speichern für den Wiederholungsversuch + const lastUserMessageIndex = this.messages.findLastIndex(msg => msg.role === 'user'); + if (lastUserMessageIndex >= 0) { + const lastUserMessage = this.messages[lastUserMessageIndex].content; - // Erneuter Versand mit gleicher Nachricht - this.inputField.value = lastUserMessage; - this.sendMessage(); - }, 1500); + // Kurze Verzögerung vor dem erneuten Versuch mit exponentieller Backoff-Strategie + const retryDelay = 1500 * Math.pow(2, this.retryCount - 1); // 1.5s, 3s, 6s, ... + + setTimeout(() => { + // Entferne Fehlermeldung aus dem Messages-Array, behalte aber die Benutzernachricht + this.messages = this.messages.filter(msg => + !(msg.role === 'assistant' && msg.content.includes('versuche es erneut')) + ); + + // Erneuter Versand mit gleicher Nachricht + this.inputField.value = lastUserMessage; + this.sendMessage(); + }, retryDelay); + } } else { // Maximale Anzahl an Wiederholungsversuchen erreicht - this.addMessage('assistant', 'Es tut mir leid, aber es gab ein Problem bei der Verarbeitung deiner Anfrage. Bitte versuche es später noch einmal.'); + this.addMessage('assistant', 'Es tut mir leid, aber es gab ein Problem bei der Verarbeitung deiner Anfrage. Bitte versuche es später noch einmal oder kontaktiere den Support, falls das Problem weiterhin besteht.'); this.retryCount = 0; // Zurücksetzen für die nächste Anfrage } } finally {