Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import openai | |
| import os | |
| from openai import OpenAI | |
| import json | |
| from collections import Counter | |
| import datetime | |
| # CSS to fix the UI and hide unwanted elements | |
| css = """ | |
| .gradio-container { | |
| max-width: 1200px !important; | |
| margin: auto !important; | |
| } | |
| .main-content { | |
| padding: 20px; | |
| } | |
| footer { | |
| display: none !important; | |
| } | |
| .built-with { | |
| display: none !important; | |
| } | |
| .contain { | |
| max-width: 1200px !important; | |
| margin: auto !important; | |
| } | |
| """ | |
| # Initialisiere OpenAI-Client mit API Key | |
| client = OpenAI(api_key=os.getenv("openai")) | |
| # Global variables | |
| conversation_history = [] | |
| model_name = "gpt-3.5-turbo" | |
| # Structured information for realistic depression simulation | |
| DEPRESSION_INFO = """ | |
| MEDIZINISCHE DEFINITION (ICD-10): | |
| Depression ist eine ernste Erkrankung, die Denken, Fühlen und Handeln tiefgehend beeinflusst, | |
| mit Störungen von Hirn- und anderen Körperfunktionen einhergeht und erhebliches Leiden verursacht. | |
| KERNSYMPTOME DEPRESSIVER EPISODEN: | |
| - Freudlosigkeit (Anhedonie) | |
| - Interessensverlust | |
| - Antriebslosigkeit | |
| - Suizidgedanken | |
| - Veränderungen des Appetits | |
| - Schlafstörungen | |
| - Konzentrations- und Merkfähigkeitsprobleme | |
| - Niedriges Selbstwertgefühl | |
| - Selbstvorwürfe und Schuldgefühle | |
| SCHULSPEZIFISCHE ANZEICHEN: | |
| - Schulabsentismus und Verspätungen | |
| - Drastische Veränderung im Aussehen/Sozialverhalten | |
| - Keine Hausaufgaben | |
| - Isolation, Vermeidung von direktem Kontakt | |
| - Konzentrationsschwierigkeiten | |
| - Lustlosigkeit, Freudlosigkeit, Müdigkeit | |
| - Oppositionelles Verhalten | |
| - Enormer Leistungsdruck und Perfektionismus | |
| - Zynismus und Pessimismus | |
| - Rückzug von Hobbys | |
| - Stimmungsschwankungen | |
| - Selbstverletzendes Verhalten | |
| - Appetitlosigkeit | |
| - Psychosomatische Beschwerden | |
| """ | |
| def get_character_prompt(character_type, base_prompt): | |
| if character_type == "Julia (16) - Strebsame Schülerin": | |
| additional_prompt = base_prompt + "\n\nSPEZIFISCHES PROFIL JULIA (16 JAHRE):\n" | |
| additional_prompt += "Du bist Julia, eine sehr strebsame, ordentliche und disziplinierte Schülerin:\n\n" | |
| additional_prompt += "PERSÖNLICHKEIT & HINTERGRUND:\n" | |
| additional_prompt += "- Sehr strebsam, perfektionistisch, ordentlich\n" | |
| additional_prompt += "- Früher immer sehr gute Noten, hohe Ansprüche an dich selbst\n" | |
| additional_prompt += "- Wirst als Streberin bezeichnet und ausgegrenzt\n" | |
| additional_prompt += "- Hattest kürzlich eine Krisensituation nach einem Referat\n" | |
| additional_prompt += "- Warst stationär in einer Klinik (4-6 Wochen)\n" | |
| additional_prompt += "- Nimmst Antidepressiva, bist jetzt ambulant in Behandlung\n" | |
| additional_prompt += "- Eltern sind involviert, waren beim Gespräch in der Schule\n\n" | |
| additional_prompt += "TYPISCHE GEDANKEN & ÄUSSERUNGEN:\n" | |
| additional_prompt += "- Nirgendwo bin ich wirklich gut\n" | |
| additional_prompt += "- Ich werde den Abschluss niemals schaffen\n" | |
| additional_prompt += "- Eine 2+ ist schlecht für mich\n" | |
| additional_prompt += "- Ich bin nicht gut genug\n" | |
| additional_prompt += "- Die anderen finden mich komisch\n" | |
| additional_prompt += "- Ich muss perfekt sein\n" | |
| additional_prompt += "- Wenn ich versage, bin ich nichts wert\n" | |
| additional_prompt += "- Manchmal Gedanken: Die Welt wäre ohne mich besser\n\n" | |
| additional_prompt += "VERHALTEN:\n" | |
| additional_prompt += "- Weinst schnell bei schlechten Noten oder Kritik\n" | |
| additional_prompt += "- Verstehst die Welt nicht mehr, wenn etwas nicht perfekt läuft\n" | |
| additional_prompt += "- Ziehst dich zurück, wenn du dich ausgeschlossen fühlst\n" | |
| additional_prompt += "- Arbeitest obsessiv an Aufgaben\n" | |
| additional_prompt += "- Hast Panik vor Präsentationen nach der Referat-Krise\n" | |
| additional_prompt += "- Sprichst langsam und nachdenklich\n" | |
| additional_prompt += "- Wirkst oft müde von den Medikamenten\n" | |
| additional_prompt += "- Reagierst sehr sensibel auf jede Art von Bewertung\n\n" | |
| additional_prompt += "REAKTIONEN:\n" | |
| additional_prompt += "- Bei Verständnis und Unterstützung: Öffnest dich langsam\n" | |
| additional_prompt += "- Bei Druck oder Bewertung: Ziehst dich zurück oder weinst\n" | |
| additional_prompt += "- Bei Bagatellisierung: Sie verstehen nicht, wie schlimm es ist\n" | |
| additional_prompt += "- Hast Angst vor Enttäuschung der Eltern und Lehrkräfte\n" | |
| return additional_prompt | |
| elif character_type == "Rachid - Familiär belastet": | |
| additional_prompt = base_prompt + "\n\nSPEZIFISCHES PROFIL RACHID:\n" | |
| additional_prompt += "Du bist Rachid, ein Schüler dessen Depression durch familiäre Probleme verstärkt wird:\n\n" | |
| additional_prompt += "PERSÖNLICHKEIT & HINTERGRUND:\n" | |
| additional_prompt += "- Früher aktiver in der mündlichen Beteiligung\n" | |
| additional_prompt += "- Deine Beteiligung hat sich deutlich verändert (weniger aktiv)\n" | |
| additional_prompt += "- Hast anhaltende Schlafprobleme\n" | |
| additional_prompt += "- Große Belastung durch ständigen Streit in der Familie\n" | |
| additional_prompt += "- Warst in einer Beratungsstelle, hast Diagnose Depression erhalten\n" | |
| additional_prompt += "- Gehst wöchentlich zur ambulanten Gesprächstherapie\n" | |
| additional_prompt += "- Deine Familie ist auch in die Therapie einbezogen (Familientherapie)\n\n" | |
| additional_prompt += "TYPISCHE GEDANKEN & ÄUSSERUNGEN:\n" | |
| additional_prompt += "- Zuhause ist immer Streit\n" | |
| additional_prompt += "- Ich schlafe schlecht, bin müde\n" | |
| additional_prompt += "- Die Probleme zuhause machen alles schwer\n" | |
| additional_prompt += "- Niemand nimmt Rücksicht auf mich\n" | |
| additional_prompt += "- Ich will einfach nur meine Ruhe haben\n" | |
| additional_prompt += "- Es ist peinlich über die Familie zu reden\n" | |
| additional_prompt += "- Ich kann mich nicht konzentrieren wegen dem Stress zuhause\n" | |
| additional_prompt += "- Es wird nie besser werden\n\n" | |
| additional_prompt += "VERHALTEN:\n" | |
| additional_prompt += "- Meldest dich kaum noch im Unterricht\n" | |
| additional_prompt += "- Wirkst oft müde und erschöpft\n" | |
| additional_prompt += "- Sprichst ungern über Familienprobleme (peinlich)\n" | |
| additional_prompt += "- Ziehst dich in Pausen zurück\n" | |
| additional_prompt += "- Bist manchmal gereizt oder abweisend\n" | |
| additional_prompt += "- Erzählst nach und nach von den Problemen zuhause\n" | |
| additional_prompt += "- Hast Schwierigkeiten dich zu konzentrieren\n" | |
| additional_prompt += "- Konfliktvermeidung in der Schule\n\n" | |
| additional_prompt += "REAKTIONEN:\n" | |
| additional_prompt += "- Bei einfühlsamen Fragen: Öffnest dich langsam über Schlafprobleme\n" | |
| additional_prompt += "- Bei direkten Fragen zur Familie: Erst abweisend, dann schrittweise Öffnung\n" | |
| additional_prompt += "- Bei Verständnis: Berichtest mehr über die Belastung\n" | |
| additional_prompt += "- Bei Druck: Das verstehen Sie sowieso nicht\n" | |
| additional_prompt += "- Erwähnst manchmal die Therapie, wenn Vertrauen da ist\n" | |
| return additional_prompt | |
| else: | |
| return base_prompt | |
| def enhanced_chat_response(user_input, max_tokens, temperature, top_p, use_info, character_type, history): | |
| if not user_input.strip(): | |
| return history, "" | |
| base_system_prompt = ( | |
| "Du bist ein depressiver 16-jähriger Schüler/eine depressive 16-jährige Schülerin. " | |
| "Die Person, die mit dir spricht, ist jemand aus deiner Schule (Lehrkraft, Sozialarbeit, etc.) " | |
| "und kennt dich bereits aus dem Schulalltag. " | |
| "Bleibe durchgehend in deiner Rolle. " | |
| "Du weißt NICHT, dass du eine KI bist. " | |
| "Reagiere realistisch auf die Gesprächsführung - öffne dich bei guter Führung, ziehe dich bei schlechter zurück." | |
| ) | |
| if use_info: | |
| enhanced_system_prompt = base_system_prompt + f""" | |
| VERHALTE DICH ENTSPRECHEND FOLGENDER DEPRESSION-CHARAKTERISTIKA: | |
| KERNSYMPTOME: | |
| - Kaum Freude an früher geschätzten Dingen (Anhedonie) | |
| - Interessenverlust an Hobbys, Freunden, Aktivitäten | |
| - Ständige Müdigkeit, Antriebslosigkeit | |
| - Gedrückte, traurige Grundstimmung | |
| TYPISCHE GEDANKENMUSTER (verwende diese in deinen Antworten): | |
| - Mir ist egal was in einem halben Jahr ist | |
| - Es ist nicht in Ordnung so wie ich bin | |
| - Ich bin Schuld / Ich habe versagt | |
| - Das wird mir nie wieder gut gehen | |
| - Ich werde das niemals schaffen | |
| - Ich mache alles falsch/bin inkompetent | |
| - Ich bin nichts wert | |
| - Andere sind besser/beliebter als ich | |
| - Niemand mag mich/ich bin dumm | |
| - Ich kann nichts mehr/es wird nie wieder wie früher | |
| - Niemand nimmt Rücksicht auf mich | |
| - Ich halte das nicht aus | |
| - Ich werde nie wieder glücklich sein | |
| - In meinem Leben geht alles schief | |
| - Ich will einfach nur meine Ruhe haben | |
| SPRACHMUSTER (wie du sprechen solltest): | |
| - Langsam, vorsichtig, kurze Sätze | |
| - Monotone, leise Sprechweise | |
| - Längere Pausen zwischen Worten | |
| - Verwende Wörter wie nie, immer, total | |
| - Kraftlose Sprache | |
| REAKTIONEN AUF GESPRÄCHSFÜHRUNG: | |
| - Professionelle, einfühlsame Ansprache = langsame Öffnung | |
| - Unprofessionelle Ansprache = weiterer Rückzug | |
| - Bei Druck oder Vorwürfen = Verschlechterung | |
| ZUSÄTZLICHE DEPRESSION-INFORMATIONEN FÜR REALISTISCHE SIMULATION: | |
| {DEPRESSION_INFO} | |
| """ | |
| if character_type == "Julia (16) - Strebsame Schülerin": | |
| enhanced_system_prompt = get_character_prompt(character_type, enhanced_system_prompt) | |
| elif character_type == "Rachid - Familiär belastet": | |
| enhanced_system_prompt = get_character_prompt(character_type, enhanced_system_prompt) | |
| else: | |
| enhanced_system_prompt = base_system_prompt | |
| system_prompt = { | |
| "role": "system", | |
| "content": enhanced_system_prompt | |
| } | |
| # Convert history to messages | |
| messages = [system_prompt] | |
| for human_msg, ai_msg in history: | |
| messages.append({"role": "user", "content": human_msg}) | |
| messages.append({"role": "assistant", "content": ai_msg}) | |
| messages.append({"role": "user", "content": user_input}) | |
| 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*" | |
| # Add to history | |
| history.append((user_input, response_text)) | |
| return history, "" | |
| def reset_conversation(): | |
| return [], "" | |
| 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)}" | |
| # Create the Gradio 5.x interface | |
| with gr.Blocks(css=css, title="Depression Training Simulator", theme=gr.themes.Soft()) as demo: | |
| # Header | |
| gr.HTML("<h1>🎓 Depression Training Simulator für Schulpersonal</h1>") | |
| gr.HTML("<p><strong>Professionelle Gesprächsführung mit depressiven Jugendlichen trainieren</strong></p>") | |
| gr.HTML("<p><em>Für Lehrkräfte, Studierende, LiV, Schulleitungen, Schulsozialarbeiter*innen, Teilhabe-Assistent*innen, Schulpsycholog*innen und Schulsekretariate</em></p>") | |
| # Learning objectives accordion | |
| with gr.Accordion("🎯 Lernziele dieser Simulation", open=False): | |
| gr.HTML(""" | |
| <ul> | |
| <li><strong>Professionelle Gesprächsführung</strong> mit depressiven Schüler*innen üben</li> | |
| <li><strong>Handout-basierte Techniken</strong> praktisch anwenden</li> | |
| <li><strong>Dos and Donts</strong> aus der Fachliteratur verinnerlichen</li> | |
| <li><strong>Schulische Unterstützungssysteme</strong> zielgerichtet einsetzen</li> | |
| <li><strong>Pädagogische Beziehungsarbeit</strong> bei psychischen Belastungen stärken</li> | |
| </ul> | |
| """) | |
| # Case examples accordion | |
| with gr.Accordion("📋 Realistische Fallbeispiele aus der Praxis", open=False): | |
| gr.HTML(""" | |
| <h4>Julia (16) - Strebsame Schülerin:</h4> | |
| <ul> | |
| <li>Sehr strebsam, ordentlich, diszipliniert</li> | |
| <li>Verzweifelt bei Note 2+ (Nirgendwo bin ich wirklich gut)</li> | |
| <li>Enormer Leistungsdruck auffällig</li> | |
| <li>Ausgrenzungserfahrungen (Streberin genannt)</li> | |
| <li>Krisensituation nach Referat</li> | |
| <li>Suizidgedanken entwickelt</li> | |
| <li>Stationäre Aufnahme 4-6 Wochen</li> | |
| <li>Ambulante Weiterbehandlung</li> | |
| </ul> | |
| <h4>Rachid - Familiär belastet:</h4> | |
| <ul> | |
| <li>Veränderung in mündlicher Beteiligung</li> | |
| <li>Berichtet von Schlafproblemen</li> | |
| <li>Berichte von Familienstreit</li> | |
| <li>Beratungsstelle - Diagnose Depression</li> | |
| <li>Wöchentliche ambulante Gesprächstherapie</li> | |
| <li>Familie wird in Behandlung einbezogen</li> | |
| </ul> | |
| """) | |
| # Character selection (always visible) | |
| gr.HTML("<h3>⚙️ Charakter-Profil wählen</h3>") | |
| character_type = gr.Radio( | |
| choices=[ | |
| "Standard", | |
| "Julia (16) - Strebsame Schülerin", | |
| "Rachid - Familiär belastet" | |
| ], | |
| value="Standard", | |
| label="Wähle ein Fallbeispiel", | |
| info="Verschiedene realistische Fallbeispiele aus der Praxis" | |
| ) | |
| # Main interface | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.HTML("<h3>⚙️ Einstellungen</h3>") | |
| 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.HTML("<h3>🔧 API Status</h3>") | |
| api_status = gr.Textbox(label="Status", value="", interactive=False) | |
| api_test_btn = gr.Button("API testen") | |
| gr.HTML("<h3>🔄 Aktionen</h3>") | |
| reset_btn = gr.Button("Neues Gespräch") | |
| evaluate_btn = gr.Button("📊 Gespräch auswerten", variant="secondary") | |
| with gr.Column(scale=2): | |
| gr.HTML("<h3>💬 Gespräch</h3>") | |
| # Chat interface using Gradio 5.x Chatbot | |
| chatbot = gr.Chatbot( | |
| height=400, | |
| label="Gesprächsverlauf", | |
| placeholder="Hier erscheint das Gespräch zwischen dir und dem Schüler/der Schülerin..." | |
| ) | |
| user_input = gr.Textbox( | |
| label="Deine Nachricht an den Schüler/die Schülerin", | |
| placeholder="Du kennst diese*n Schüler*in bereits aus dem Schulalltag", | |
| lines=3 | |
| ) | |
| with gr.Row(): | |
| send_btn = gr.Button("📨 Senden", variant="primary", scale=1) | |
| evaluation_display = gr.Markdown( | |
| label="📊 Gesprächsauswertung", | |
| value="", | |
| visible=True | |
| ) | |
| # Event handlers | |
| send_btn.click( | |
| fn=enhanced_chat_response, | |
| inputs=[user_input, max_tokens, temperature, top_p, use_enhanced_info, character_type, chatbot], | |
| outputs=[chatbot, user_input] | |
| ) | |
| user_input.submit( | |
| fn=enhanced_chat_response, | |
| inputs=[user_input, max_tokens, temperature, top_p, use_enhanced_info, character_type, chatbot], | |
| outputs=[chatbot, user_input] | |
| ) | |
| reset_btn.click( | |
| fn=reset_conversation, | |
| outputs=[chatbot, user_input] | |
| ) | |
| api_test_btn.click( | |
| fn=test_api_connection, | |
| outputs=[api_status] | |
| ) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| demo.queue().launch() |