Spaces:
Runtime error
Runtime error
| def format_final_evaluation(total_evaluations, message_count): | |
| """Formatiert die finale Gesamtauswertung in professionellem Format""" | |
| # Durchschnittsscore berechnen | |
| avg_score = sum(total_evaluations["scores"]) / len(total_evaluations["scores"]) if total_evaluations["scores"] else 0 | |
| final_score = max(0, min(5, avg_score + 3)) # Normalisierung auf 0-5 | |
| # Häufigkeiten zählen | |
| from collections import Counter | |
| positive_counts = Counter(total_evaluations["positive"]) | |
| improvement_counts = Counter(total_evaluations["improvement"]) | |
| # Professionelle Formatierung | |
| feedback = f"""# PROFESSIONELLE GESPRÄCHSFÜHRUNGSANALYSE | |
| ## EXECUTIVE SUMMARY | |
| **Analysierte Gesprächseinheiten:** {message_count} | |
| **Gesamtbewertung:** {final_score:.1f}/5.0 Punkten | |
| **Bewertungsverfahren:** KI-gestützte Analyse nach evidenzbasierten Kriterien | |
| **Analysedatum:** {__import__('datetime').datetime.now().strftime('%d.%m.%Y %H:%M')} | |
| --- | |
| ## GESAMTBEURTEILUNG | |
| """ | |
| # Professionelle Gesamteinschätzung | |
| if final_score >= 4.5: | |
| feedback += """**KOMPETENZLEVEL: EXPERTE (4.5-5.0)** | |
| Die Analyse zeigt eine hochprofessionelle Gesprächsführung, die evidenzbasierte Prinzipien der therapeutischen Kommunikation konsequent umsetzt. Die Interaktion entspricht aktuellen Standards der Krisenintervention im Bildungskontext.""" | |
| elif final_score >= 3.5: | |
| feedback += """**KOMPETENZLEVEL: FORTGESCHRITTEN (3.5-4.4)** | |
| Solide professionelle Gesprächsführung mit deutlichen Stärken in der empathischen Kommunikation. Die Grundprinzipien werden überwiegend korrekt angewendet, einzelne Optimierungsbereiche wurden identifiziert.""" | |
| elif final_score >= 2.5: | |
| feedback += """**KOMPETENZLEVEL: GRUNDLAGEN VORHANDEN (2.5-3.4)** | |
| Wesentliche Grundlagen der professionellen Gesprächsführung sind erkennbar. Zur Erreichung des Fachstandards sind jedoch signifikante Verbesserungen in mehreren Kompetenzbereichen erforderlich.""" | |
| else: | |
| feedback += """**KOMPETENZLEVEL: ENTWICKLUNGSBEDARF (0-2.4)** | |
| Die Analyse zeigt erheblichen Entwicklungsbedarf in den Grundlagen der professionellen Gesprächsführung. Eine systematische Fortbildung gemäß aktueller Fachstandards wird dringend empfohlen.""" | |
| feedback += "\n\n---\n\n" | |
| # Kompetenzprofil | |
| if positive_counts: | |
| feedback += "## KOMPETENZPROFIL - STÄRKEN\n\n" | |
| professional_descriptions = { | |
| "Sorimport 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): | |
| if not user_input.strip(): | |
| return "", "*Bitte gib eine Nachricht ein.*", "" | |
| # Erweiterte System-Prompts basierend auf Handout - angepasst für Schulkontext | |
| 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: | |
| # Füge Hintergrundinfos direkt in den Prompt ein | |
| enhanced_system_prompt = base_system_prompt + f""" | |
| VERHALTE DICH ENTSPRECHEND FOLGENDER DEPRESSION-CHARAKTERISTIKA: | |
| - Du kommst oft zu spät zur Schule oder fehlst ganz | |
| - Du machst selten Hausaufgaben, obwohl du früher zuverlässig warst | |
| - Du ziehst dich von Mitschüler*innen zurück | |
| - Du vermeidest Augenkontakt mit Erwachsenen | |
| - Du fühlst dich oft müde und lustlos | |
| - Du hast Konzentrationsschwierigkeiten im Unterricht | |
| - Du machst dir oft Vorwürfe und fühlst dich wertlos | |
| - Du hast Schlafprobleme | |
| - Du denkst pessimistisch über die Zukunft | |
| - Du möchtest andere nicht mit deinen Problemen belasten | |
| - Du hast manchmal körperliche Beschwerden wie Kopf- oder Bauchschmerzen | |
| - Du kannst dich manchmal zynisch oder oppositionell verhalten | |
| - Du reagierst sensibel auf Druck bezüglich Noten oder Leistung | |
| - Bei professioneller, einfühlsamer Ansprache öffnest du dich langsam | |
| - Bei unprofessioneller Ansprache ziehst du dich weiter zurück | |
| ZUSÄTZLICHE DEPRESSION-INFORMATIONEN FÜR REALISTISCHE SIMULATION: | |
| {DEPRESSION_INFO} | |
| """ | |
| 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 (Schulpersonal):**" if msg["role"] == "user" else "**Schüler*in:**" | |
| chat_display += f"{role} {msg['content']}\n\n" | |
| return "", response_text, chat_display | |
| def reset_conversation(): | |
| global conversation_history | |
| conversation_history = [] | |
| return "Neues Gespräch gestartet.", "" | |
| 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_conversation(): | |
| """Evaluiert das gesamte Gespräch mit LLM-basierter Analyse""" | |
| if not conversation_history: | |
| return "🤔 **Noch kein Gespräch geführt**\n\nBitte führe erst ein Gespräch, bevor du eine Auswertung anforderst." | |
| # Nur User-Nachrichten analysieren | |
| user_messages = [msg["content"] for msg in conversation_history if msg["role"] == "user"] | |
| if not user_messages: | |
| return "🤔 **Keine Nachrichten zu bewerten**\n\nEs wurden noch keine Nachrichten von dir gesendet." | |
| # Sammle alle LLM-Bewertungen | |
| total_evaluations = {"positive": [], "improvement": [], "scores": [], "explanations": []} | |
| for message in user_messages: | |
| evaluation = analyze_single_message(message) | |
| total_evaluations["positive"].extend(evaluation["positive"]) | |
| total_evaluations["improvement"].extend(evaluation["improvement"]) | |
| total_evaluations["scores"].append(evaluation["score"]) | |
| total_evaluations["explanations"].append(evaluation.get("explanation", "")) | |
| return format_final_evaluation(total_evaluations, len(user_messages)) | |
| def analyze_single_message(user_message): | |
| """Analysiert eine einzelne Nachricht mit LLM-basierter Evaluation""" | |
| if not user_message.strip(): | |
| return {"positive": [], "improvement": [], "score": 0} | |
| evaluation_prompt = f"""Du bist ein Experte für professionelle Gesprächsführung im Schulkontext mit depressiven Jugendlichen. | |
| Bewerte diese Nachricht einer Lehrkraft/Schulperson an einen 16-jährigen depressiven Schüler: | |
| NACHRICHT: "{user_message}" | |
| Bewerte die Nachricht nach folgenden Kriterien und gib für jedes Kriterium "ja" oder "nein" an: | |
| POSITIVE ASPEKTE: | |
| 1. Sorge/Interesse zeigen: Zeigt die Nachricht echte Sorge und Interesse für das Wohlbefinden? | |
| 2. Offene Fragen stellen: Werden offene, einladende Fragen gestellt, die zum Erzählen ermutigen? | |
| 3. Unterstützung anbieten: Wird konkrete, praktische Unterstützung angeboten? | |
| 4. Wahrnehmung ansprechen: Werden spezifische Beobachtungen professionell angesprochen? | |
| 5. Empathie zeigen: Wird Verständnis und emotionale Validierung gezeigt? | |
| 6. Wertschätzung ausdrücken: Werden positive Eigenschaften oder Stärken betont? | |
| 7. Professionellen Rahmen nutzen: Werden schulische Hilfssysteme erwähnt oder angeboten? | |
| 8. Kontinuität zeigen: Wird eine verlässliche, fortlaufende Beziehung signalisiert? | |
| PROBLEMATISCHE ASPEKTE: | |
| 1. Verharmlosen: Werden Gefühle oder Probleme bagatellisiert oder heruntergespielt? | |
| 2. Einfache Ratschläge: Werden oberflächliche "Lösungen" oder Plattitüden angeboten? | |
| 3. Vergleichen: Werden Vergleiche mit anderen Personen oder Situationen gezogen? | |
| 4. Druck ausüben: Wird Leistungs- oder Erwartungsdruck aufgebaut? | |
| 5. Fokus nur auf Leistung: Geht es hauptsächlich um Noten, Hausaufgaben oder Schulleistung? | |
| 6. Unprofessionell: Wird unprofessionell reagiert (Drohungen, Bestrafung, etc.)? | |
| 7. Persönlich nehmen: Wird die Situation auf sich selbst bezogen oder persönlich genommen? | |
| Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen): | |
| {{ | |
| "positive": ["Liste der zutreffenden positiven Aspekte"], | |
| "improvement": ["Liste der zutreffenden problematischen Aspekte"], | |
| "score_explanation": "Kurze Begründung der Gesamtbewertung" | |
| }}""" | |
| try: | |
| response = client.chat.completions.create( | |
| model=model_name, | |
| messages=[{"role": "user", "content": evaluation_prompt}], | |
| max_tokens=300, | |
| temperature=0.1, # Niedrige Temperatur für konsistente Bewertungen | |
| top_p=0.9 | |
| ) | |
| response_text = response.choices[0].message.content.strip() | |
| # JSON parsen | |
| import json | |
| try: | |
| evaluation_data = json.loads(response_text) | |
| # Score basierend auf positiven vs. negativen Aspekten berechnen | |
| positive_count = len(evaluation_data.get("positive", [])) | |
| negative_count = len(evaluation_data.get("improvement", [])) | |
| score = positive_count - negative_count | |
| return { | |
| "positive": evaluation_data.get("positive", []), | |
| "improvement": evaluation_data.get("improvement", []), | |
| "score": score, | |
| "explanation": evaluation_data.get("score_explanation", "") | |
| } | |
| except json.JSONDecodeError: | |
| print(f"JSON Parse Error: {response_text}") | |
| # Fallback: Einfache Bewertung basierend auf Textlänge und Tonfall | |
| return fallback_evaluation(user_message) | |
| except Exception as e: | |
| print(f"LLM Evaluation Error: {e}") | |
| return fallback_evaluation(user_message) | |
| def fallback_evaluation(user_message): | |
| """Einfache Fallback-Bewertung wenn LLM-Evaluation fehlschlägt""" | |
| score = 0 | |
| positive = [] | |
| improvement = [] | |
| # Sehr einfache Heuristiken als Backup | |
| if "?" in user_message: | |
| positive.append("Offene Fragen stellen") | |
| score += 1 | |
| if any(word in user_message.lower() for word in ["helfen", "unterstützen", "da sein"]): | |
| positive.append("Unterstützung anbieten") | |
| score += 1 | |
| if any(word in user_message.lower() for word in ["wird schon", "ist normal", "übertreibst"]): | |
| improvement.append("Verharmlosen") | |
| score -= 1 | |
| if any(word in user_message.lower() for word in ["musst", "sollst", "erwarte"]): | |
| improvement.append("Druck ausüben") | |
| score -= 1 | |
| return { | |
| "positive": positive, | |
| "improvement": improvement, | |
| "score": score, | |
| "explanation": "Automatische Fallback-Bewertung (LLM nicht verfügbar)" | |
| } | |
| def format_final_evaluation(total_evaluations, message_count): | |
| """Formatiert die finale Gesamtauswertung in professionellem Format ohne Scores""" | |
| # Häufigkeiten zählen | |
| from collections import Counter | |
| positive_counts = Counter(total_evaluations["positive"]) | |
| improvement_counts = Counter(total_evaluations["improvement"]) | |
| # Qualitative Bewertung basierend auf Verhältnis | |
| total_positive = sum(positive_counts.values()) | |
| total_negative = sum(improvement_counts.values()) | |
| # Professionelle Formatierung ohne Scores | |
| feedback = f"""# PROFESSIONELLE GESPRÄCHSFÜHRUNGSANALYSE | |
| ## EXECUTIVE SUMMARY | |
| **Analysierte Gesprächseinheiten:** {message_count} | |
| **Bewertungsverfahren:** Qualitative Analyse nach evidenzbasierten Kriterien der Gesprächsführung | |
| **Analysedatum:** {__import__('datetime').datetime.now().strftime('%d.%m.%Y, %H:%M Uhr')} | |
| **Bewertungsgrundlage:** Handlungsempfehlungen für den Umgang mit Depression bei Jugendlichen | |
| --- | |
| ## GESAMTBEURTEILUNG | |
| """ | |
| # Qualitative Gesamteinschätzung ohne Scores | |
| if total_positive > total_negative * 2: | |
| feedback += """**KOMPETENZLEVEL: PROFESSIONELL** | |
| Die Analyse zeigt eine hochkompetente Gesprächsführung, die evidenzbasierte Prinzipien der therapeutischen Kommunikation konsequent umsetzt. Die Interaktion entspricht aktuellen Fachstandards der Krisenintervention im Bildungskontext und zeigt eine professionelle Haltung gegenüber Jugendlichen mit depressiven Symptomen.""" | |
| elif total_positive > total_negative: | |
| feedback += """**KOMPETENZLEVEL: KOMPETENT** | |
| Solide professionelle Gesprächsführung mit deutlichen Stärken in der empathischen Kommunikation. Die Grundprinzipien der ressourcenorientierten Beratung werden überwiegend korrekt angewendet. Die Interaktion zeigt Verständnis für die Komplexität depressiver Erkrankungen bei Jugendlichen.""" | |
| elif total_positive == total_negative or abs(total_positive - total_negative) <= 1: | |
| feedback += """**KOMPETENZLEVEL: ENTWICKLUNGSFÄHIG** | |
| Die Analyse zeigt sowohl professionelle Ansätze als auch Bereiche mit Optimierungspotential. Wesentliche Grundlagen der Gesprächsführung sind vorhanden, jedoch ist eine gezielte Weiterentwicklung der Kompetenzen zur Erreichung des Fachstandards empfehlenswert.""" | |
| else: | |
| feedback += """**KOMPETENZLEVEL: FORTBILDUNGSBEDARF** | |
| Die Analyse identifiziert erheblichen Entwicklungsbedarf in den Grundlagen der professionellen Gesprächsführung mit Jugendlichen in psychischen Krisen. Eine systematische Fortbildung gemäß aktueller Fachstandards und Supervision wird empfohlen.""" | |
| feedback += "\n\n---\n\n" | |
| # Kompetenzprofil | |
| if positive_counts: | |
| feedback += "## KOMPETENZPROFIL - PROFESSIONELLE STÄRKEN\n\n" | |
| professional_descriptions = { | |
| "Sorge/Interesse zeigen": "Empathische Grundhaltung und genuine Anteilnahme", | |
| "Offene Fragen stellen": "Gesprächsführungstechnik zur Förderung der Selbstreflexion", | |
| "Unterstützung anbieten": "Ressourcenorientierte Beratungsansätze", | |
| "Wahrnehmung ansprechen": "Professionelle Beobachtungskompetenz und Feedback-Kultur", | |
| "Empathie zeigen": "Emotionale Validierung und therapeutische Grundhaltung", | |
| "Wertschätzung ausdrücken": "Stärkenorientierte Kommunikation und Ressourcenaktivierung", | |
| "Professionellen Rahmen nutzen": "Systemische Beratungsansätze und Netzwerkarbeit", | |
| "Kontinuität zeigen": "Verlässliche Beziehungsgestaltung und Bindungsförderung" | |
| } | |
| for skill, count in positive_counts.most_common(): | |
| description = professional_descriptions.get(skill, skill) | |
| percentage = (count / message_count) * 100 | |
| feedback += f"**{skill}** \n{description} \n*Angewandt in {count} von {message_count} Gesprächseinheiten ({percentage:.1f}%)*\n\n" | |
| # Entwicklungsbereiche | |
| if improvement_counts: | |
| feedback += "## ENTWICKLUNGSBEREICHE\n\n" | |
| professional_recommendations = { | |
| "Verharmlosen": "**Empfehlung:** Validierung statt Bagatellisierung - Gefühle und Erfahrungen des Jugendlichen ernst nehmen und als realistische Wahrnehmung anerkennen.", | |
| "Einfache Ratschläge": "**Empfehlung:** Ressourcenorientierte Beratung entwickeln - Statt schneller Lösungsvorschläge den Jugendlichen bei der Entwicklung eigener Bewältigungsstrategien unterstützen.", | |
| "Vergleichen": "**Empfehlung:** Individuelle Situation würdigen - Vermeidung von Vergleichen mit anderen Personen oder Situationen, Fokus auf die einzigartige Lebenssituation des Jugendlichen.", | |
| "Druck ausüben": "**Empfehlung:** Empowerment-Ansatz entwickeln - Statt Erwartungsdruck aufzubauen, Selbstwirksamkeit und Autonomie des Jugendlichen fördern.", | |
| "Fokus nur auf Leistung": "**Empfehlung:** Ganzheitliche Sichtweise entwickeln - Den Menschen hinter dem Schüler sehen und psychosoziale Faktoren in die Betrachtung einbeziehen.", | |
| "Unprofessionell": "**Empfehlung:** Professionelle Distanz wahren - Klare Rollenabgrenzung und Einhaltung professioneller Standards in der Kommunikation.", | |
| "Persönlich nehmen": "**Empfehlung:** Symptomverständnis entwickeln - Abweisung und Widerstand als Teil der Symptomatik verstehen, nicht als persönlichen Angriff interpretieren." | |
| } | |
| for issue, count in improvement_counts.most_common(): | |
| recommendation = professional_recommendations.get(issue, f"Entwicklungsbereich: {issue}") | |
| percentage = (count / message_count) * 100 | |
| feedback += f"**{issue}** \n{recommendation} \n*Identifiziert in {count} von {message_count} Gesprächseinheiten ({percentage:.1f}%)*\n\n" | |
| # Professionelle Handlungsempfehlungen | |
| feedback += "## PROFESSIONELLE HANDLUNGSEMPFEHLUNGEN\n\n" | |
| if total_positive > total_negative * 2: | |
| feedback += """### Für Fortgeschrittene | |
| - **Supervision:** Regelmäßige Fallbesprechungen zur Reflexion komplexer Gesprächssituationen | |
| - **Weiterbildung:** Vertiefung in spezifischen Methoden der Krisenintervention | |
| - **Mentoring:** Weitergabe von Expertise an Kolleg*innen und Nachwuchskräfte | |
| - **Dokumentation:** Entwicklung von Best-Practice-Beispielen für das Team""" | |
| elif total_positive > total_negative: | |
| feedback += """### Für Kompetente Praktiker*innen | |
| - **Reflexion:** Systematische Analyse der eigenen Gesprächsführung und Kommunikationsmuster | |
| - **Fortbildung:** Teilnahme an spezialisierten Schulungen zu Gesprächsführung in Krisensituationen | |
| - **Supervision:** Regelmäßiger fachlicher Austausch mit erfahrenen Kolleg*innen | |
| - **Praxisvertiefung:** Weitere Simulationen und Rollenspiele zur Festigung der Kompetenzen""" | |
| else: | |
| feedback += """### Für Entwicklungsorientierte | |
| - **Grundlagentraining:** Systematische Schulung in Gesprächsführungsgrundlagen | |
| - **Supervision:** Intensive fachliche Begleitung durch erfahrene Supervisor*innen | |
| - **Literaturstudium:** Vertiefung der theoretischen Grundlagen zu Depression bei Jugendlichen | |
| - **Mentoring:** Begleitung durch erfahrene Kolleg*innen im Arbeitsalltag""" | |
| feedback += f"\n\n---\n\n" | |
| # Methodische Hinweise | |
| feedback += f"""## METHODISCHE HINWEISE | |
| **Analyseverfahren:** Die vorliegende Analyse basiert auf einer KI-gestützten Auswertung der Gesprächsführung unter Verwendung evidenzbasierter Kriterien für die professionelle Kommunikation mit Jugendlichen in psychischen Krisen. | |
| **Bewertungsgrundlage:** Aktuelle Fachliteratur und Handlungsempfehlungen für den Umgang mit Depression bei Jugendlichen im schulischen Kontext. | |
| **Limitation:** Diese Analyse stellt eine Momentaufnahme dar und ersetzt nicht die kontinuierliche Reflexion und Supervision der professionellen Praxis. | |
| **Empfehlung:** Verwendung dieser Analyse als Grundlage für Entwicklungsgespräche und Fortbildungsplanung.""" | |
| return feedback | |
| def format_evaluation(evaluation): | |
| """Formatiert die Evaluation für die Anzeige - wird nicht mehr verwendet""" | |
| pass | |
| # Globale Variable für Gesprächshistorie | |
| conversation_history = [] | |
| # UI | |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 🎓 Depression Training Simulator für Schulpersonal") | |
| gr.Markdown("**Professionelle Gesprächsführung mit depressiven Jugendlichen trainieren**") | |
| gr.Markdown("*Für Lehrkräfte, Studierende, LiV, Schulleitungen, Schulsozialarbeiter*innen, Teilhabe-Assistent*innen, Schulpsycholog*innen und Schulsekretariate*") | |
| with gr.Accordion("🎯 Lernziele dieser Simulation", open=False): | |
| gr.Markdown(""" | |
| - **Professionelle Gesprächsführung** mit depressiven Schüler*innen üben | |
| - **Handout-basierte Techniken** praktisch anwenden | |
| - **Dos and Don'ts** aus der Fachliteratur verinnerlichen | |
| - **Schulische Unterstützungssysteme** zielgerichtet einsetzen | |
| - **Pädagogische Beziehungsarbeit** bei psychischen Belastungen stärken | |
| """) | |
| 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") | |
| evaluate_btn = gr.Button("📊 Gespräch auswerten", variant="secondary") | |
| with gr.Column(scale=2): | |
| gr.Markdown("### 💬 Gespräch") | |
| user_input = gr.Textbox( | |
| label="Deine Nachricht an den Schüler/die Schülerin", | |
| placeholder="Mir ist aufgefallen, dass du in letzter Zeit oft müde wirkst...", | |
| lines=3, | |
| info="Du kennst diese*n Schüler*in bereits aus dem Schulalltag" | |
| ) | |
| send_btn = gr.Button("📨 Senden", variant="primary") | |
| bot_response = gr.Textbox( | |
| label="Reaktion des Schülers/der Schülerin", | |
| value="", | |
| lines=4 | |
| ) | |
| chat_history = gr.Textbox( | |
| label="Gesprächsverlauf", | |
| value="", | |
| lines=10 | |
| ) | |
| # Auswertungs-Panel | |
| evaluation_display = gr.Markdown( | |
| label="📊 Gesprächsauswertung", | |
| value="", | |
| visible=True | |
| ) | |
| # 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] | |
| ) | |
| 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] | |
| ) | |
| reset_btn.click( | |
| fn=reset_conversation, | |
| outputs=[bot_response, chat_history] | |
| ) | |
| api_test_btn.click( | |
| fn=test_api_connection, | |
| outputs=[api_status] | |
| ) | |
| # Auswertung des Gesprächs | |
| evaluate_btn.click( | |
| fn=evaluate_conversation, | |
| outputs=[evaluation_display] | |
| ) | |
| 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) |