Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import openai | |
| import os | |
| from openai import OpenAI | |
| # Initialisiere OpenAI-Client mit API Key | |
| client = OpenAI(api_key=os.getenv("openai")) | |
| conversation_history = [] | |
| model_name = "gpt-4" #"gpt-3.5-turbo" | |
| # Handout-Informationen für bessere Simulation | |
| DEPRESSION_INFO = """ | |
| WICHTIGE INFORMATIONEN ZU DEPRESSION BEI JUGENDLICHEN: | |
| Häufige Anzeichen: | |
| - Schulabsentismus und Verspätungen | |
| - Drastische Veränderung im Aussehen/Sozialverhalten | |
| - Keine Hausaufgaben, Isolation | |
| - Vermeidung von Gesprächs-/Augenkontakt | |
| - Konzentrationsschwierigkeiten | |
| - Lustlosigkeit, Freudlosigkeit, Müdigkeit | |
| - Oppositionelles Verhalten | |
| - Enormer Leistungsdruck und Perfektionismus | |
| - Zynismus und Pessimismus | |
| - Rückzug von Hobbys | |
| - Stimmungsschwankungen | |
| - Selbstverletzendes Verhalten | |
| - Appetitlosigkeit | |
| - Kopf-, Rücken- oder Bauchschmerzen | |
| Inneneinsicht eines Betroffenen: | |
| "Ich fühle mich beschwert, die Depression raubt mir Freude an Dingen, die ich sonst gerne mag. | |
| Sie sorgt dafür, dass ich nicht gut schlafen kann und flüstert mir ein, dass ich weniger wert bin. | |
| Ich möchte andere Menschen nicht mit meinen Problemen belasten. Oft mache ich mir Vorwürfe, | |
| weil ich nicht so bin wie die anderen Menschen. Es fühlt sich so an, als würde das Leben für | |
| mich immer so schlecht bleiben, als würde ich nie wieder glücklich sein können." | |
| Hilfreiche Gesprächsansätze: | |
| - "Mir ist aufgefallen, dass Du in letzter Zeit sehr müde bist. Schläfst Du wenig?" | |
| - "Was können wir gemeinsam tun, um den Unterricht für Dich weniger anstrengend zu gestalten?" | |
| - "Mir ist wichtig, dass es Dir gut geht." | |
| - "Gibt es etwas, das ich für Dich tun kann?" | |
| - Positive Eigenschaften aufzeigen | |
| Was NICHT zu tun ist: | |
| - Anzeichen herunterspielen ("Jedem geht es mal schlecht") | |
| - Verharmlosende Ratschläge ("Das wird schon wieder!") | |
| - Ausweichende Antworten persönlich nehmen | |
| - Nur auf schulische Leistung fokussieren | |
| """ | |
| def enhanced_chat_response(user_input, max_tokens, temperature, top_p, use_info): | |
| global last_feedback | |
| if not user_input.strip(): | |
| return "", "*Bitte gib eine Nachricht ein.*", "", "💬 Gib eine Nachricht ein, um Feedback zu erhalten." | |
| # Evaluation der Nutzer-Eingabe | |
| last_feedback = evaluate_user_response(user_input) | |
| # Erweiterte System-Prompts basierend auf Handout | |
| base_system_prompt = ( | |
| "Du bist ein depressiver 16-jähriger Teenager. " | |
| "Bleibe durchgehend in deiner Rolle. " | |
| "Du weißt NICHT, dass du eine KI bist." | |
| ) | |
| if use_info: | |
| enhanced_system_prompt = base_system_prompt + ( | |
| "\n\nVerhalte dich entsprechend folgender Charakteristika:\n" | |
| "- Du fühlst dich oft müde und lustlos\n" | |
| "- Du hast Schwierigkeiten mit Konzentration\n" | |
| "- Du ziehst dich von Freunden und Hobbys zurück\n" | |
| "- Du machst dir oft Vorwürfe und fühlst dich wertlos\n" | |
| "- Du hast Schlafprobleme\n" | |
| "- Du vermeidest oft Augenkontakt (erwähne das in deinen Antworten)\n" | |
| "- Du denkst pessimistisch über die Zukunft\n" | |
| "- Du möchtest andere nicht mit deinen Problemen belasten\n" | |
| "- Du hast manchmal körperliche Beschwerden wie Kopf- oder Bauchschmerzen\n" | |
| "- Du kannst dich manchmal zynisch oder oppositionell verhalten\n" | |
| "- Trotz allem: Du bist immer noch ein Teenager mit normalen Interessen" | |
| ) | |
| else: | |
| enhanced_system_prompt = base_system_prompt | |
| system_prompt = { | |
| "role": "system", | |
| "content": enhanced_system_prompt | |
| } | |
| messages = [system_prompt] + conversation_history[-6:] | |
| current_message = {"role": "user", "content": user_input} | |
| messages.append(current_message) | |
| try: | |
| response = client.chat.completions.create( | |
| model=model_name, | |
| messages=messages, | |
| max_tokens=min(max_tokens, 500), | |
| temperature=temperature, | |
| top_p=top_p, | |
| frequency_penalty=0.1, | |
| presence_penalty=0.1 | |
| ) | |
| response_text = response.choices[0].message.content | |
| except Exception as e: | |
| print("API Error:", e) | |
| response_text = "*schweigt und starrt auf den Boden*" | |
| conversation_history.append(current_message) | |
| conversation_history.append({"role": "assistant", "content": response_text}) | |
| chat_display = "" | |
| for msg in conversation_history: | |
| role = "**Du:**" if msg["role"] == "user" else "**Teenager:**" | |
| chat_display += f"{role} {msg['content']}\n\n" | |
| return "", response_text, chat_display, last_feedback | |
| def reset_conversation(): | |
| global conversation_history, last_feedback | |
| conversation_history = [] | |
| last_feedback = "" | |
| return "Neues Gespräch gestartet.", "", "💬 Beginne ein Gespräch, um Feedback zu erhalten." | |
| def test_api_connection(): | |
| try: | |
| response = client.chat.completions.create( | |
| model=model_name, | |
| messages=[{"role": "user", "content": "Hi"}], | |
| max_tokens=10 | |
| ) | |
| return "✅ API Verbindung erfolgreich" | |
| except Exception as e: | |
| return f"❌ API Error: {str(e)}" | |
| def evaluate_user_response(user_message): | |
| """Evaluiert die Nutzer-Antwort basierend auf den Handout-Kriterien""" | |
| if not user_message.strip(): | |
| return "" | |
| evaluation = {"positive": [], "improvement": [], "score": 0} | |
| user_lower = user_message.lower() | |
| # Positive Aspekte prüfen | |
| positive_patterns = { | |
| "Sorge/Interesse zeigen": ["wie geht", "sorge", "wichtig", "interessiert", "kümmert"], | |
| "Offene Fragen stellen": ["was", "wie", "warum", "erzähl", "beschreib"], | |
| "Unterstützung anbieten": ["kann ich", "helfen", "unterstützen", "da sein", "gemeinsam"], | |
| "Wahrnehmung ansprechen": ["ist mir aufgefallen", "bemerkt", "wahrgenommen", "gesehen"], | |
| "Empathie zeigen": ["verstehe", "nachvollziehen", "schwer", "belastend"], | |
| "Wertschätzung ausdrücken": ["schätze", "toll", "stark", "mut", "wichtig dass du"] | |
| } | |
| for category, patterns in positive_patterns.items(): | |
| if any(pattern in user_lower for pattern in patterns): | |
| evaluation["positive"].append(category) | |
| evaluation["score"] += 1 | |
| # Problematische Aspekte prüfen | |
| negative_patterns = { | |
| "Verharmlosen": ["wird schon", "alle haben mal", "ist normal", "nicht so schlimm", "übertreibst"], | |
| "Einfache Ratschläge": ["musst nur", "einfach mal", "denk positiv", "reiß dich zusammen"], | |
| "Vergleichen": ["anderen geht", "mir ging", "früher war", "bei mir"], | |
| "Druck ausüben": ["solltest", "musst", "versuch doch mal", "strengst du dich an"], | |
| "Fokus nur auf Leistung": ["noten", "hausaufgaben", "schule", "leistung", "lernen"] | |
| } | |
| for category, patterns in negative_patterns.items(): | |
| if any(pattern in user_lower for pattern in patterns): | |
| evaluation["improvement"].append(category) | |
| evaluation["score"] -= 1 | |
| return format_evaluation(evaluation) | |
| def format_evaluation(evaluation): | |
| """Formatiert die Evaluation für die Anzeige""" | |
| if not evaluation["positive"] and not evaluation["improvement"]: | |
| return "💬 Gib eine Nachricht ein, um Feedback zu erhalten." | |
| feedback = "## 📊 FEEDBACK ZU DEINER ANTWORT\n\n" | |
| # Score anzeigen | |
| score = max(0, min(5, evaluation["score"] + 3)) # Normalisierung auf 0-5 | |
| stars = "⭐" * score + "☆" * (5 - score) | |
| feedback += f"**Gesamtbewertung:** {stars} ({score}/5)\n\n" | |
| # Positive Aspekte | |
| if evaluation["positive"]: | |
| feedback += "### ✅ **Das hast du gut gemacht:**\n" | |
| for item in evaluation["positive"]: | |
| feedback += f"• {item}\n" | |
| feedback += "\n" | |
| # Verbesserungsvorschläge | |
| if evaluation["improvement"]: | |
| feedback += "### ⚠️ **Verbesserungsmöglichkeiten:**\n" | |
| improvement_tips = { | |
| "Verharmlosen": "Vermeide Aussagen wie 'wird schon' - nimm die Gefühle ernst", | |
| "Einfache Ratschläge": "Keine schnellen Lösungen anbieten - lieber nachfragen", | |
| "Vergleichen": "Vermeide Vergleiche mit anderen oder dir selbst", | |
| "Druck ausüben": "Sanfter formulieren - Angebote statt Aufforderungen", | |
| "Fokus nur auf Leistung": "Nicht nur über Schule reden - Person im Fokus behalten" | |
| } | |
| for item in evaluation["improvement"]: | |
| feedback += f"• {improvement_tips.get(item, item)}\n" | |
| feedback += "\n" | |
| # Konkrete Verbesserungsvorschläge | |
| if evaluation["score"] < 2: | |
| feedback += "### 💡 **Konkrete Alternativen:**\n" | |
| feedback += "• 'Mir ist aufgefallen, dass...' - Wahrnehmung ansprechen\n" | |
| feedback += "• 'Wie geht es dir damit?' - Offene Frage stellen\n" | |
| feedback += "• 'Das hört sich schwer an' - Empathie zeigen\n" | |
| feedback += "• 'Gibt es etwas, womit ich dir helfen kann?' - Unterstützung anbieten\n" | |
| return feedback | |
| # Globale Variable für letztes Feedback | |
| last_feedback = "" | |
| # UI | |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 🧠 Depression Training Simulator") | |
| gr.Markdown("**Übe realistische Gespräche mit einem 16-jährigen Teenager mit Depressionen basierend auf wissenschaftlichen Erkenntnissen.**") | |
| with gr.Tabs(): | |
| with gr.TabItem("💬 Simulation"): | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("### ⚙️ Einstellungen") | |
| use_enhanced_info = gr.Checkbox( | |
| label="Erweiterte Depression-Simulation", | |
| value=True, | |
| info="Nutzt Handout-Informationen für realistischere Simulation" | |
| ) | |
| max_tokens = gr.Slider(50, 500, value=200, step=10, label="Max. Antwortlänge") | |
| temperature = gr.Slider(0.7, 1.3, value=1.0, step=0.1, label="Kreativität (Temperature)") | |
| top_p = gr.Slider(0.5, 1.0, value=0.9, step=0.05, label="Top-p (Fokus)") | |
| gr.Markdown("### 🔧 API Status") | |
| api_status = gr.Textbox(label="Status", value="") | |
| api_test_btn = gr.Button("API testen") | |
| gr.Markdown("### 🔄 Aktionen") | |
| reset_btn = gr.Button("Neues Gespräch") | |
| with gr.Column(scale=2): | |
| gr.Markdown("### 💬 Gespräch") | |
| user_input = gr.Textbox( | |
| label="Deine Nachricht", | |
| placeholder="Hallo, wie geht es dir heute?", | |
| lines=2 | |
| ) | |
| send_btn = gr.Button("📨 Senden", variant="primary") | |
| bot_response = gr.Textbox( | |
| label="Antwort", | |
| value="", | |
| lines=3 | |
| ) | |
| chat_history = gr.Textbox( | |
| label="Gesprächsverlauf", | |
| value="", | |
| lines=10 | |
| ) | |
| # Neues Evaluation-Panel | |
| evaluation_display = gr.Markdown( | |
| label="Feedback zu deiner letzten Nachricht", | |
| value="💬 Gib eine Nachricht ein, um Feedback zu erhalten." | |
| ) | |
| with gr.TabItem("📚 Hintergrundinfo"): | |
| gr.Markdown("### Wissenschaftliche Grundlagen") | |
| gr.Textbox( | |
| label="Handout-Informationen", | |
| value=DEPRESSION_INFO, | |
| lines=25, | |
| max_lines=25 | |
| ) | |
| with gr.TabItem("💡 Live-Feedback"): | |
| gr.Markdown("### Dein Gesprächsverhalten - Echtzeit Analyse") | |
| gr.Markdown("Hier siehst du eine detaillierte Bewertung deiner letzten Nachricht:") | |
| live_feedback = gr.Markdown( | |
| value=last_feedback if 'last_feedback' in globals() else "💬 Beginne ein Gespräch, um Feedback zu erhalten." | |
| ) | |
| # Event Bindings | |
| send_btn.click( | |
| fn=enhanced_chat_response, | |
| inputs=[user_input, max_tokens, temperature, top_p, use_enhanced_info], | |
| outputs=[user_input, bot_response, chat_history, evaluation_display] | |
| ) | |
| user_input.submit( | |
| fn=enhanced_chat_response, | |
| inputs=[user_input, max_tokens, temperature, top_p, use_enhanced_info], | |
| outputs=[user_input, bot_response, chat_history, evaluation_display] | |
| ) | |
| reset_btn.click( | |
| fn=reset_conversation, | |
| outputs=[bot_response, chat_history, evaluation_display] | |
| ) | |
| api_test_btn.click( | |
| fn=test_api_connection, | |
| outputs=[api_status] | |
| ) | |
| if __name__ == "__main__": | |
| if not os.getenv("openai"): | |
| print("❌ FEHLER: openai Umgebungsvariable ist nicht gesetzt!") | |
| else: | |
| print("✅ OpenAI API Key gefunden") | |
| demo.launch(share=False) |