ai-tomoni commited on
Commit
4e6edde
·
verified ·
1 Parent(s): 0a03fb6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -241
app.py CHANGED
@@ -7,7 +7,7 @@ from openai import OpenAI
7
  client = OpenAI(api_key=os.getenv("openai"))
8
 
9
  conversation_history = []
10
- model_name = "gpt-3.5-turbo" #"gpt-4"
11
 
12
  # Strukturierte Handout-Informationen für realistische Depression-Simulation
13
  DEPRESSION_INFO = """
@@ -41,98 +41,9 @@ SCHULSPEZIFISCHE ANZEICHEN:
41
  - Selbstverletzendes Verhalten
42
  - Appetitlosigkeit
43
  - Psychosomatische Beschwerden
44
-
45
- TYPISCHE GEDANKENMUSTER (Innenansicht):
46
- - "Mir ist egal was in einem halben Jahr ist"
47
- - "Es ist nicht in Ordnung so wie ich bin"
48
- - "Ich bin Schuld!" / "Ich habe versagt"
49
- - "Das wird mir nie wieder gut gehen"
50
- - "Ich werde das niemals schaffen"
51
- - "Ich mache alles falsch/bin inkompetent"
52
- - "Ich bin nichts wert"
53
- - "Andere sind besser/beliebter als ich"
54
- - "Niemand mag mich/ich bin dumm/unattraktiv"
55
- - "Ich kann nichts mehr/es wird nie wieder wie früher"
56
- - "Niemand nimmt Rücksicht auf mich"
57
- - "Ich halte das nicht aus"
58
- - "Ich werde nie wieder glücklich sein"
59
- - "In meinem Leben geht alles schief"
60
- - "Ich will einfach nur meine Ruhe haben"
61
-
62
- TYPISCHE GEFÜHLE (Innenansicht):
63
- - "Ich fühle nichts" (emotionale Taubheit)
64
- - "Ich fühle permanent diffuse, ungerichtete Angst"
65
- - "Ich fühle mich gleichgültig"
66
- - "Ich kann keine Freude mehr empfinden"
67
- - "Nichts macht mir mehr Spaß"
68
- - Melancholie, starke Schuldgefühle
69
- - Traurigkeit "die einem den Atem raubt"
70
- - Starke Schamgefühle
71
-
72
- WAHRNEHMUNG VON AUSSEN:
73
- - "Früher hätte er/sie diese Aufgabe geschafft"
74
- - "Er/Sie ist egoistisch"
75
- - "Wieso denkt sie nur an sich?"
76
- - "Ich komme gar nicht mehr an ihn/sie ran"
77
- - Verschlechterung schulischer Leistungen
78
- - Geringe Initiative für neue/frühere Aktivitäten
79
- - Verlust sozialer Beziehungen
80
-
81
- KÖRPERLICHE/SPRACHLICHE MANIFESTATIONEN:
82
- - Langsame Körperbewegungen
83
- - Mimik und Gestik verlangsamt
84
- - Sprache wird langsam, vorsichtig, monosylbisch
85
- - Monotone, leise, flache Sprechweise
86
- - Reduzierte Sprechgeschwindigkeit
87
- - Längere Pausendauer beim Sprechen
88
- - Verändertes Schlafverhalten
89
- - Körperliche Beschwerden (Bauch-, Kopf-, Schulterschmerzen)
90
-
91
- KOGNITIVE BEEINTRÄCHTIGUNGEN:
92
- - Gedankenkreisen über Insuffizienz
93
- - Katastrophisierendes Denken, Schwarz-Weiß-Denken
94
- - Verminderung der kognitiven Leistungsfähigkeit
95
- - Starker Selbstfokus (andere kaum wahrgenommen)
96
- - Flexibles Denken nicht möglich
97
- - Schwierigkeiten bei Entscheidungen
98
- - Negative Gedankenspiralen
99
-
100
- VERHALTENSWEISEN:
101
- - Soziale Isolation und Rückzug
102
- - Grübeln
103
- - Vermeidung positiver Aktivitäten
104
- - Konfliktvermeidung
105
- - Vermeidung von Entscheidungen
106
- - Antriebsverlust/Antriebshemmung
107
- """
108
-
109
- Inneneinsicht eines Betroffenen:
110
- "Ich fühle mich wie in einem dunklen Loch gefangen. Nichts macht mir mehr Freude - nicht mal die Dinge, die ich früher geliebt habe. Ich bin ständig müde, aber kann trotzdem nicht richtig schlafen. Oft wache ich um 4 Uhr morgens auf und kann nicht mehr einschlafen. Manchmal denke ich, dass alle ohne mich besser dran wären. Ich mache mir ständig Vorwürfe und fühle mich schuldig für alles. In der Schule kann ich mich kaum konzentrieren - es ist, als wäre mein Kopf voller Watte. Ich esse kaum noch, weil ich keinen Appetit habe. Die Depression flüstert mir ein, dass ich wertlos bin und dass sich das nie ändern wird."
111
-
112
- Suizidprävention - Warnsignale:
113
- - Äußerungen wie "Es wäre besser, wenn ich nicht da wäre"
114
- - Verschenken persönlicher Gegenstände
115
- - Plötzliche Ruhe nach längerer depressiver Phase
116
- - Konkrete Pläne oder Vorbereitungen
117
- - Rückzug von allen sozialen Kontakten
118
-
119
- Hilfreiche Gesprächsansätze:
120
- - "Mir ist aufgefallen, dass Du in letzter Zeit sehr müde bist. Schläfst Du wenig?"
121
- - "Was können wir gemeinsam tun, um den Unterricht für Dich weniger anstrengend zu gestalten?"
122
- - "Mir ist wichtig, dass es Dir gut geht."
123
- - "Gibt es etwas, das ich für Dich tun kann?"
124
- - Positive Eigenschaften aufzeigen
125
-
126
- Was NICHT zu tun ist:
127
- - Anzeichen herunterspielen ("Jedem geht es mal schlecht")
128
- - Verharmlosende Ratschläge ("Das wird schon wieder!")
129
- - Ausweichende Antworten persönlich nehmen
130
- - Nur auf schulische Leistung fokussieren
131
  """
132
 
133
  def get_character_prompt(character_type, base_prompt):
134
- """Erweitert den Base-Prompt um spezifische Charakteristika"""
135
-
136
  if character_type == "Julia (16) - Strebsame Schülerin":
137
  additional_prompt = base_prompt + "\n\nSPEZIFISCHES PROFIL JULIA (16 JAHRE):\n"
138
  additional_prompt += "Du bist Julia, eine sehr strebsame, ordentliche und disziplinierte Schülerin:\n\n"
@@ -214,14 +125,13 @@ def get_character_prompt(character_type, base_prompt):
214
 
215
  return additional_prompt
216
 
217
- else: # Standard
218
  return base_prompt
219
 
220
  def enhanced_chat_response(user_input, max_tokens, temperature, top_p, use_info, character_type):
221
  if not user_input.strip():
222
  return "", "*Bitte gib eine Nachricht ein.*", ""
223
 
224
- # Erweiterte System-Prompts basierend auf Handout - angepasst für Schulkontext
225
  base_system_prompt = (
226
  "Du bist ein depressiver 16-jähriger Schüler/eine depressive 16-jährige Schülerin. "
227
  "Die Person, die mit dir spricht, ist jemand aus deiner Schule (Lehrkraft, Sozialarbeit, etc.) "
@@ -232,13 +142,10 @@ def enhanced_chat_response(user_input, max_tokens, temperature, top_p, use_info,
232
  )
233
 
234
  if use_info:
235
- # Füge Hintergrundinfos direkt in den Prompt ein
236
  enhanced_system_prompt = base_system_prompt + f"""
237
 
238
  VERHALTE DICH ENTSPRECHEND FOLGENDER DEPRESSION-CHARAKTERISTIKA:
239
 
240
- VERHALTE DICH ENTSPRECHEND FOLGENDER DEPRESSION-CHARAKTERISTIKA:
241
-
242
  KERNSYMPTOME:
243
  - Kaum Freude an früher geschätzten Dingen (Anhedonie)
244
  - Interessenverlust an Hobbys, Freunden, Aktivitäten
@@ -246,28 +153,28 @@ KERNSYMPTOME:
246
  - Gedrückte, traurige Grundstimmung
247
 
248
  TYPISCHE GEDANKENMUSTER (verwende diese in deinen Antworten):
249
- - "Mir ist egal was in einem halben Jahr ist"
250
- - "Es ist nicht in Ordnung so wie ich bin"
251
- - "Ich bin Schuld!" / "Ich habe versagt"
252
- - "Das wird mir nie wieder gut gehen"
253
- - "Ich werde das niemals schaffen"
254
- - "Ich mache alles falsch/bin inkompetent"
255
- - "Ich bin nichts wert"
256
- - "Andere sind besser/beliebter als ich"
257
- - "Niemand mag mich/ich bin dumm"
258
- - "Ich kann nichts mehr/es wird nie wieder wie früher"
259
- - "Niemand nimmt Rücksicht auf mich"
260
- - "Ich halte das nicht aus"
261
- - "Ich werde nie wieder glücklich sein"
262
- - "In meinem Leben geht alles schief"
263
- - "Ich will einfach nur meine Ruhe haben"
264
 
265
  TYPISCHE GEFÜHLSÄUSSERUNGEN:
266
- - "Ich fühle nichts" (emotionale Taubheit)
267
- - "Ich fühle permanent diffuse Angst"
268
- - "Ich fühle mich gleichgültig"
269
- - "Ich kann keine Freude mehr empfinden"
270
- - "Nichts macht mir mehr Spaß"
271
  - Starke Schuldgefühle und Schamgefühle
272
 
273
  SCHULVERHALTEN (beobachtbar):
@@ -293,7 +200,7 @@ SPRACHMUSTER (wie du sprechen solltest):
293
  - Langsam, vorsichtig, kurze Sätze
294
  - Monotone, leise Sprechweise
295
  - Längere Pausen zwischen Worten
296
- - Verwende Wörter wie "nie", "immer", "total"
297
  - Kraftlose Sprache
298
 
299
  VERHALTENSWEISEN:
@@ -313,13 +220,10 @@ ZUSÄTZLICHE DEPRESSION-INFORMATIONEN FÜR REALISTISCHE SIMULATION:
313
  {DEPRESSION_INFO}
314
  """
315
 
316
- if character_type == "Julia (16) - Strebsame Schülerin":
317
- enhanced_system_prompt = get_character_prompt(character_type, enhanced_system_prompt)
318
- elif character_type == "Rachid - Familiär belastet":
319
- enhanced_system_prompt = get_character_prompt(character_type, enhanced_system_prompt)
320
- else:
321
- # Charakterspezifische Erweiterung nur wenn gewählt
322
- pass
323
 
324
  else:
325
  enhanced_system_prompt = base_system_prompt
@@ -375,7 +279,6 @@ def test_api_connection():
375
  return f"❌ API Error: {str(e)}"
376
 
377
  def analyze_single_message(user_message):
378
- """Analysiert eine einzelne Nachricht mit LLM-basierter Evaluation"""
379
  if not user_message.strip():
380
  return {"positive": [], "improvement": [], "score": 0}
381
 
@@ -408,14 +311,6 @@ PROBLEMATISCHE ASPEKTE (DONTS):
408
  6. Stereotype Depression-Vorstellung: Wird angenommen, alle Depressiven sind müde/traurig/isoliert?
409
  7. Rationale Einordnung statt Empfinden: Wird das Gefühl rationalisiert? (Das ist doch eine gute Note)
410
 
411
- SPEZIELLE GESPRÄCHSQUALITÄT:
412
- 8. Beispielhafte Gesprächsführung: Entspricht die Nachricht den Beispielsätzen?
413
- - Mir ist aufgefallen, dass...
414
- - Was können wir gemeinsam tun...
415
- - Ich habe verstanden, dass...
416
- - Gibt es etwas, das ich für dich tun kann?
417
- - Mir ist wichtig, dass es dir gut geht
418
-
419
  Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
420
  {{
421
  "positive": ["Liste der zutreffenden DOS"],
@@ -428,18 +323,16 @@ Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
428
  model=model_name,
429
  messages=[{"role": "user", "content": evaluation_prompt}],
430
  max_tokens=300,
431
- temperature=0.1, # Niedrige Temperatur für konsistente Bewertungen
432
  top_p=0.9
433
  )
434
 
435
  response_text = response.choices[0].message.content.strip()
436
 
437
- # JSON parsen
438
  import json
439
  try:
440
  evaluation_data = json.loads(response_text)
441
 
442
- # Score basierend auf positiven vs. negativen Aspekten berechnen
443
  positive_count = len(evaluation_data.get("positive", []))
444
  negative_count = len(evaluation_data.get("improvement", []))
445
  score = positive_count - negative_count
@@ -453,7 +346,6 @@ Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
453
 
454
  except json.JSONDecodeError:
455
  print(f"JSON Parse Error: {response_text}")
456
- # Fallback: Einfache Bewertung basierend auf Textlänge und Tonfall
457
  return fallback_evaluation(user_message)
458
 
459
  except Exception as e:
@@ -461,12 +353,10 @@ Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
461
  return fallback_evaluation(user_message)
462
 
463
  def fallback_evaluation(user_message):
464
- """Einfache Fallback-Bewertung wenn LLM-Evaluation fehlschlägt"""
465
  score = 0
466
  positive = []
467
  improvement = []
468
 
469
- # Erweiterte Heuristiken basierend auf Beispielsätzen
470
  if any(phrase in user_message.lower() for phrase in ["mir ist aufgefallen", "ist mir aufgefallen"]):
471
  positive.append("Wahrnehmung ansprechen")
472
  score += 1
@@ -479,15 +369,6 @@ def fallback_evaluation(user_message):
479
  positive.append("Ehrliche Sorge/Interesse kommunizieren")
480
  score += 1
481
 
482
- if any(phrase in user_message.lower() for phrase in ["gibt es etwas", "kann ich", "für dich tun"]):
483
- positive.append("Konkrete Unterstützung anbieten")
484
- score += 1
485
-
486
- if any(phrase in user_message.lower() for phrase in ["verstanden dass", "ich habe verstanden"]):
487
- positive.append("Validierungsstrategien anwenden")
488
- score += 1
489
-
490
- # Negative Muster
491
  if any(phrase in user_message.lower() for phrase in ["wird schon", "das wird schon wieder"]):
492
  improvement.append("Einfache/verharmlosende Ratschläge")
493
  score -= 1
@@ -496,10 +377,6 @@ def fallback_evaluation(user_message):
496
  improvement.append("Herunterspielen/mit eigenen Erlebnissen vergleichen")
497
  score -= 1
498
 
499
- if any(phrase in user_message.lower() for phrase in ["ist doch", "eigentlich", "doch eine gute"]):
500
- improvement.append("Rationale Einordnung statt Empfinden")
501
- score -= 1
502
-
503
  return {
504
  "positive": positive,
505
  "improvement": improvement,
@@ -508,17 +385,14 @@ def fallback_evaluation(user_message):
508
  }
509
 
510
  def evaluate_conversation():
511
- """Evaluiert das gesamte Gespräch mit LLM-basierter Analyse"""
512
  if not conversation_history:
513
  return "🤔 **Noch kein Gespräch geführt**\n\nBitte führe erst ein Gespräch, bevor du eine Auswertung anforderst."
514
 
515
- # Nur User-Nachrichten analysieren
516
  user_messages = [msg["content"] for msg in conversation_history if msg["role"] == "user"]
517
 
518
  if not user_messages:
519
  return "🤔 **Keine Nachrichten zu bewerten**\n\nEs wurden noch keine Nachrichten von dir gesendet."
520
 
521
- # Sammle alle LLM-Bewertungen
522
  total_evaluations = {"positive": [], "improvement": [], "scores": [], "explanations": []}
523
 
524
  for message in user_messages:
@@ -531,17 +405,13 @@ def evaluate_conversation():
531
  return format_final_evaluation(total_evaluations, len(user_messages))
532
 
533
  def format_final_evaluation(total_evaluations, message_count):
534
- """Formatiert die finale Gesamtauswertung in professionellem Format ohne Scores"""
535
- # Häufigkeiten zählen
536
  from collections import Counter
537
  positive_counts = Counter(total_evaluations["positive"])
538
  improvement_counts = Counter(total_evaluations["improvement"])
539
 
540
- # Qualitative Bewertung basierend auf Verhältnis
541
  total_positive = sum(positive_counts.values())
542
  total_negative = sum(improvement_counts.values())
543
 
544
- # Professionelle Formatierung ohne Scores
545
  feedback = f"""# PROFESSIONELLE GESPRÄCHSFÜHRUNGSANALYSE
546
 
547
  ## EXECUTIVE SUMMARY
@@ -557,7 +427,6 @@ def format_final_evaluation(total_evaluations, message_count):
557
 
558
  """
559
 
560
- # Qualitative Gesamteinschätzung ohne Scores
561
  if total_positive > total_negative * 2:
562
  feedback += """**KOMPETENZLEVEL: PROFESSIONELL**
563
 
@@ -577,48 +446,20 @@ Die Analyse identifiziert erheblichen Entwicklungsbedarf in den Grundlagen der p
577
 
578
  feedback += "\n\n---\n\n"
579
 
580
- # Kompetenzprofil
581
  if positive_counts:
582
  feedback += "## KOMPETENZPROFIL - PROFESSIONELLE STÄRKEN\n\n"
583
 
584
- professional_descriptions = {
585
- "Ehrliche Sorge/Interesse kommunizieren": "Authentische empathische Grundhaltung - echte Anteilnahme zeigen",
586
- "Wahrnehmung ansprechen": "Strukturierte Beobachtungsrückmeldung - 'Mir ist aufgefallen...'",
587
- "Gespräch kontinuierlich suchen": "Beständige Beziehungsarbeit - 'Steter Tropfen höhlt den Stein'",
588
- "Konkrete Unterstützung anbieten": "Spezifische Hilfsangebote - 'Was können wir gemeinsam tun...'",
589
- "Zuhören/ungeteilt aufmerksam sein": "Fokussierte, ungeteilte Aufmerksamkeit und aktives Zuhören",
590
- "An Früheres erinnern/nachfragen": "Kontinuität durch Bezug zu vorherigen Gesprächen",
591
- "Nicht wertend auftreten": "Moralisierungsfreie, professionelle Haltung",
592
- "Gesprächsfortschritte bilanzieren": "Zusammenfassung und Würdigung von Entwicklungen",
593
- "Validierungsstrategien anwenden": "Reflektieren, Verbalisieren, Empfinden ernst nehmen",
594
- "Positive Eigenschaften aufzeigen": "Stärkenorientierte Kommunikation - konkrete Beispiele benennen"
595
- }
596
-
597
  for skill, count in positive_counts.most_common():
598
- description = professional_descriptions.get(skill, skill)
599
  percentage = (count / message_count) * 100
600
- feedback += f"**{skill}** \n{description} \n*Angewandt in {count} von {message_count} Gesprächseinheiten ({percentage:.1f}%)*\n\n"
601
 
602
- # Entwicklungsbereiche
603
  if improvement_counts:
604
  feedback += "## ENTWICKLUNGSBEREICHE\n\n"
605
 
606
- professional_recommendations = {
607
- "Herunterspielen/mit eigenen Erlebnissen vergleichen": "**Empfehlung:** Vermeidung von Bagatellisierung und Vergleichen - Depression ernst nehmen, nicht mit Jedem geht es mal schlecht relativieren",
608
- "Einfache/verharmlosende Ratschläge": "**Empfehlung:** Statt oberflächlicher Ratschläge (Das wird schon wieder) - Empfinden validieren und gemeinsam Lösungen entwickeln",
609
- "Im Alleingang agieren": "**Empfehlung:** Kollegiale Beratung suchen - Beobachtungen mit Team teilen, nicht isoliert handeln",
610
- "Ausweichende Antworten persönlich nehmen": "**Empfehlung:** Professionelle Distanz wahren - Abweisung als Teil der Symptomatik verstehen, nicht als persönlichen Angriff",
611
- "Sofort mit schulischer Leistung verbinden": "**Empfehlung:** Ganzheitliche Sichtweise - Verhalten nicht sofort auf Noten/Leistung reduzieren, Person im Fokus behalten",
612
- "Stereotype Depression-Vorstellung": "**Empfehlung:** Differenzierte Wahrnehmung - Auch erfolgreiche Schüler*innen mit guten Noten können betroffen sein",
613
- "Rationale Einordnung statt Empfinden": "**Empfehlung:** Empfinden ernst nehmen - Nicht rationalisieren (Das ist doch eine gute Note), sondern Gefühle validieren"
614
- }
615
-
616
  for issue, count in improvement_counts.most_common():
617
- recommendation = professional_recommendations.get(issue, f"Entwicklungsbereich: {issue}")
618
  percentage = (count / message_count) * 100
619
- feedback += f"**{issue}** \n{recommendation} \n*Identifiziert in {count} von {message_count} Gesprächseinheiten ({percentage:.1f}%)*\n\n"
620
 
621
- # Professionelle Handlungsempfehlungen
622
  feedback += "## PROFESSIONELLE HANDLUNGSEMPFEHLUNGEN\n\n"
623
 
624
  if total_positive > total_negative * 2:
@@ -640,28 +481,8 @@ Die Analyse identifiziert erheblichen Entwicklungsbedarf in den Grundlagen der p
640
  - **Literaturstudium:** Vertiefung der theoretischen Grundlagen zu Depression bei Jugendlichen
641
  - **Mentoring:** Begleitung durch erfahrene Kolleg*innen im Arbeitsalltag"""
642
 
643
- feedback += f"\n\n---\n\n"
644
-
645
- # Methodische Hinweise
646
- feedback += f"""## METHODISCHE HINWEISE
647
-
648
- **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.
649
-
650
- **Bewertungsgrundlage:** Aktuelle Fachliteratur und Handlungsempfehlungen für den Umgang mit Depression bei Jugendlichen im schulischen Kontext.
651
-
652
- **Limitation:** Diese Analyse stellt eine Momentaufnahme dar und ersetzt nicht die kontinuierliche Reflexion und Supervision der professionellen Praxis.
653
-
654
- **Empfehlung:** Verwendung dieser Analyse als Grundlage für Entwicklungsgespräche und Fortbildungsplanung."""
655
-
656
  return feedback
657
 
658
- def format_evaluation(evaluation):
659
- """Formatiert die Evaluation für die Anzeige - wird nicht mehr verwendet"""
660
- pass
661
-
662
- # Globale Variable für Gesprächshistorie
663
- conversation_history = []
664
-
665
  # UI
666
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
667
  gr.Markdown("# 🎓 Depression Training Simulator für Schulpersonal")
@@ -669,39 +490,41 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
669
  gr.Markdown("*Für Lehrkräfte, Studierende, LiV, Schulleitungen, Schulsozialarbeiter*innen, Teilhabe-Assistent*innen, Schulpsycholog*innen und Schulsekretariate*")
670
 
671
  with gr.Accordion("🎯 Lernziele dieser Simulation", open=False):
672
- gr.Markdown("""
673
- - **Professionelle Gesprächsführung** mit depressiven Schüler*innen üben
674
- - **Handout-basierte Techniken** praktisch anwenden
675
- - **Dos and Donts** aus der Fachliteratur verinnerlichen
676
- - **Schulische Unterstützungssysteme** zielgerichtet einsetzen
677
- - **Pädagogische Beziehungsarbeit** bei psychischen Belastungen stärken
678
- """)
679
-
680
  with gr.Accordion("📋 Realistische Fallbeispiele aus der Praxis", open=False):
681
- gr.Markdown("""
682
- **Julia (16) - Strebsame Schülerin:**
683
- - Sehr strebsam, ordentlich, diszipliniert
684
- - Verzweifelt bei Note 2+ (Nirgendwo bin ich wirklich gut)
685
- - Enormer Leistungsdruck auffällig
686
- - Ausgrenzungserfahrungen (Streberin genannt)
687
- - Krisensituation nach Referat (weint, versteht Welt nicht mehr)
688
- - Elterngespräch macht Schwere deutlich
689
- - Suizidgedanken entwickelt
690
- - Stationäre Aufnahme 4-6 Wochen
691
- - Medikamentöse Einstellung (Antidepressiva)
692
- - Ambulante Weiterbehandlung
693
 
694
- **Rachid - Familiär belastet:**
695
- - Veränderung in mündlicher Beteiligung auffällig
696
- - Berichtet von Schlafproblemen
697
- - Nach und nach: Berichte von Familienstreit
698
- - Große Belastung durch familiäre Situation
699
- - Beratungsstelle - Diagnose Depression
700
- - Wöchentliche ambulante Gesprächstherapie
701
- - Familie wird in Behandlung einbezogen (Familientherapie)
 
 
702
 
703
- *Beide zeigen: Depression manifestiert sich sehr unterschiedlich. Julia bleibt aktiv, geht es aber sehr schlecht. Behandlungswege können stark variieren.*
704
- """)
 
 
 
 
 
705
 
706
  with gr.Accordion("⚙️ Simulation anpassen", open=False):
707
  character_type = gr.Radio(
@@ -758,7 +581,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
758
  lines=10
759
  )
760
 
761
- # Auswertungs-Panel
762
  evaluation_display = gr.Markdown(
763
  label="📊 Gesprächsauswertung",
764
  value="",
@@ -788,7 +610,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
788
  outputs=[api_status]
789
  )
790
 
791
- # Auswertung des Gesprächs
792
  evaluate_btn.click(
793
  fn=evaluate_conversation,
794
  outputs=[evaluation_display]
 
7
  client = OpenAI(api_key=os.getenv("openai"))
8
 
9
  conversation_history = []
10
+ model_name = "gpt-3.5-turbo"
11
 
12
  # Strukturierte Handout-Informationen für realistische Depression-Simulation
13
  DEPRESSION_INFO = """
 
41
  - Selbstverletzendes Verhalten
42
  - Appetitlosigkeit
43
  - Psychosomatische Beschwerden
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  """
45
 
46
  def get_character_prompt(character_type, base_prompt):
 
 
47
  if character_type == "Julia (16) - Strebsame Schülerin":
48
  additional_prompt = base_prompt + "\n\nSPEZIFISCHES PROFIL JULIA (16 JAHRE):\n"
49
  additional_prompt += "Du bist Julia, eine sehr strebsame, ordentliche und disziplinierte Schülerin:\n\n"
 
125
 
126
  return additional_prompt
127
 
128
+ else:
129
  return base_prompt
130
 
131
  def enhanced_chat_response(user_input, max_tokens, temperature, top_p, use_info, character_type):
132
  if not user_input.strip():
133
  return "", "*Bitte gib eine Nachricht ein.*", ""
134
 
 
135
  base_system_prompt = (
136
  "Du bist ein depressiver 16-jähriger Schüler/eine depressive 16-jährige Schülerin. "
137
  "Die Person, die mit dir spricht, ist jemand aus deiner Schule (Lehrkraft, Sozialarbeit, etc.) "
 
142
  )
143
 
144
  if use_info:
 
145
  enhanced_system_prompt = base_system_prompt + f"""
146
 
147
  VERHALTE DICH ENTSPRECHEND FOLGENDER DEPRESSION-CHARAKTERISTIKA:
148
 
 
 
149
  KERNSYMPTOME:
150
  - Kaum Freude an früher geschätzten Dingen (Anhedonie)
151
  - Interessenverlust an Hobbys, Freunden, Aktivitäten
 
153
  - Gedrückte, traurige Grundstimmung
154
 
155
  TYPISCHE GEDANKENMUSTER (verwende diese in deinen Antworten):
156
+ - Mir ist egal was in einem halben Jahr ist
157
+ - Es ist nicht in Ordnung so wie ich bin
158
+ - Ich bin Schuld / Ich habe versagt
159
+ - Das wird mir nie wieder gut gehen
160
+ - Ich werde das niemals schaffen
161
+ - Ich mache alles falsch/bin inkompetent
162
+ - Ich bin nichts wert
163
+ - Andere sind besser/beliebter als ich
164
+ - Niemand mag mich/ich bin dumm
165
+ - Ich kann nichts mehr/es wird nie wieder wie früher
166
+ - Niemand nimmt Rücksicht auf mich
167
+ - Ich halte das nicht aus
168
+ - Ich werde nie wieder glücklich sein
169
+ - In meinem Leben geht alles schief
170
+ - Ich will einfach nur meine Ruhe haben
171
 
172
  TYPISCHE GEFÜHLSÄUSSERUNGEN:
173
+ - Ich fühle nichts (emotionale Taubheit)
174
+ - Ich fühle permanent diffuse Angst
175
+ - Ich fühle mich gleichgültig
176
+ - Ich kann keine Freude mehr empfinden
177
+ - Nichts macht mir mehr Spaß
178
  - Starke Schuldgefühle und Schamgefühle
179
 
180
  SCHULVERHALTEN (beobachtbar):
 
200
  - Langsam, vorsichtig, kurze Sätze
201
  - Monotone, leise Sprechweise
202
  - Längere Pausen zwischen Worten
203
+ - Verwende Wörter wie nie, immer, total
204
  - Kraftlose Sprache
205
 
206
  VERHALTENSWEISEN:
 
220
  {DEPRESSION_INFO}
221
  """
222
 
223
+ if character_type == "Julia (16) - Strebsame Schülerin":
224
+ enhanced_system_prompt = get_character_prompt(character_type, enhanced_system_prompt)
225
+ elif character_type == "Rachid - Familiär belastet":
226
+ enhanced_system_prompt = get_character_prompt(character_type, enhanced_system_prompt)
 
 
 
227
 
228
  else:
229
  enhanced_system_prompt = base_system_prompt
 
279
  return f"❌ API Error: {str(e)}"
280
 
281
  def analyze_single_message(user_message):
 
282
  if not user_message.strip():
283
  return {"positive": [], "improvement": [], "score": 0}
284
 
 
311
  6. Stereotype Depression-Vorstellung: Wird angenommen, alle Depressiven sind müde/traurig/isoliert?
312
  7. Rationale Einordnung statt Empfinden: Wird das Gefühl rationalisiert? (Das ist doch eine gute Note)
313
 
 
 
 
 
 
 
 
 
314
  Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
315
  {{
316
  "positive": ["Liste der zutreffenden DOS"],
 
323
  model=model_name,
324
  messages=[{"role": "user", "content": evaluation_prompt}],
325
  max_tokens=300,
326
+ temperature=0.1,
327
  top_p=0.9
328
  )
329
 
330
  response_text = response.choices[0].message.content.strip()
331
 
 
332
  import json
333
  try:
334
  evaluation_data = json.loads(response_text)
335
 
 
336
  positive_count = len(evaluation_data.get("positive", []))
337
  negative_count = len(evaluation_data.get("improvement", []))
338
  score = positive_count - negative_count
 
346
 
347
  except json.JSONDecodeError:
348
  print(f"JSON Parse Error: {response_text}")
 
349
  return fallback_evaluation(user_message)
350
 
351
  except Exception as e:
 
353
  return fallback_evaluation(user_message)
354
 
355
  def fallback_evaluation(user_message):
 
356
  score = 0
357
  positive = []
358
  improvement = []
359
 
 
360
  if any(phrase in user_message.lower() for phrase in ["mir ist aufgefallen", "ist mir aufgefallen"]):
361
  positive.append("Wahrnehmung ansprechen")
362
  score += 1
 
369
  positive.append("Ehrliche Sorge/Interesse kommunizieren")
370
  score += 1
371
 
 
 
 
 
 
 
 
 
 
372
  if any(phrase in user_message.lower() for phrase in ["wird schon", "das wird schon wieder"]):
373
  improvement.append("Einfache/verharmlosende Ratschläge")
374
  score -= 1
 
377
  improvement.append("Herunterspielen/mit eigenen Erlebnissen vergleichen")
378
  score -= 1
379
 
 
 
 
 
380
  return {
381
  "positive": positive,
382
  "improvement": improvement,
 
385
  }
386
 
387
  def evaluate_conversation():
 
388
  if not conversation_history:
389
  return "🤔 **Noch kein Gespräch geführt**\n\nBitte führe erst ein Gespräch, bevor du eine Auswertung anforderst."
390
 
 
391
  user_messages = [msg["content"] for msg in conversation_history if msg["role"] == "user"]
392
 
393
  if not user_messages:
394
  return "🤔 **Keine Nachrichten zu bewerten**\n\nEs wurden noch keine Nachrichten von dir gesendet."
395
 
 
396
  total_evaluations = {"positive": [], "improvement": [], "scores": [], "explanations": []}
397
 
398
  for message in user_messages:
 
405
  return format_final_evaluation(total_evaluations, len(user_messages))
406
 
407
  def format_final_evaluation(total_evaluations, message_count):
 
 
408
  from collections import Counter
409
  positive_counts = Counter(total_evaluations["positive"])
410
  improvement_counts = Counter(total_evaluations["improvement"])
411
 
 
412
  total_positive = sum(positive_counts.values())
413
  total_negative = sum(improvement_counts.values())
414
 
 
415
  feedback = f"""# PROFESSIONELLE GESPRÄCHSFÜHRUNGSANALYSE
416
 
417
  ## EXECUTIVE SUMMARY
 
427
 
428
  """
429
 
 
430
  if total_positive > total_negative * 2:
431
  feedback += """**KOMPETENZLEVEL: PROFESSIONELL**
432
 
 
446
 
447
  feedback += "\n\n---\n\n"
448
 
 
449
  if positive_counts:
450
  feedback += "## KOMPETENZPROFIL - PROFESSIONELLE STÄRKEN\n\n"
451
 
 
 
 
 
 
 
 
 
 
 
 
 
 
452
  for skill, count in positive_counts.most_common():
 
453
  percentage = (count / message_count) * 100
454
+ feedback += f"**{skill}** \n*Angewandt in {count} von {message_count} Gesprächseinheiten ({percentage:.1f}%)*\n\n"
455
 
 
456
  if improvement_counts:
457
  feedback += "## ENTWICKLUNGSBEREICHE\n\n"
458
 
 
 
 
 
 
 
 
 
 
 
459
  for issue, count in improvement_counts.most_common():
 
460
  percentage = (count / message_count) * 100
461
+ feedback += f"**{issue}** \n*Identifiziert in {count} von {message_count} Gesprächseinheiten ({percentage:.1f}%)*\n\n"
462
 
 
463
  feedback += "## PROFESSIONELLE HANDLUNGSEMPFEHLUNGEN\n\n"
464
 
465
  if total_positive > total_negative * 2:
 
481
  - **Literaturstudium:** Vertiefung der theoretischen Grundlagen zu Depression bei Jugendlichen
482
  - **Mentoring:** Begleitung durch erfahrene Kolleg*innen im Arbeitsalltag"""
483
 
 
 
 
 
 
 
 
 
 
 
 
 
 
484
  return feedback
485
 
 
 
 
 
 
 
 
486
  # UI
487
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
488
  gr.Markdown("# 🎓 Depression Training Simulator für Schulpersonal")
 
490
  gr.Markdown("*Für Lehrkräfte, Studierende, LiV, Schulleitungen, Schulsozialarbeiter*innen, Teilhabe-Assistent*innen, Schulpsycholog*innen und Schulsekretariate*")
491
 
492
  with gr.Accordion("🎯 Lernziele dieser Simulation", open=False):
493
+ gr.Markdown("- **Professionelle Gesprächsführung** mit depressiven Schüler*innen üben")
494
+ gr.Markdown("- **Handout-basierte Techniken** praktisch anwenden")
495
+ gr.Markdown("- **Dos and Donts** aus der Fachliteratur verinnerlichen")
496
+ gr.Markdown("- **Schulische Unterstützungssysteme** zielgerichtet einsetzen")
497
+ gr.Markdown("- **Pädagogische Beziehungsarbeit** bei psychischen Belastungen stärken")
498
+
 
 
499
  with gr.Accordion("📋 Realistische Fallbeispiele aus der Praxis", open=False):
500
+ gr.Markdown("**Julia (16) - Strebsame Schülerin:**")
501
+ gr.Markdown("- Sehr strebsam, ordentlich, diszipliniert")
502
+ gr.Markdown("- Verzweifelt bei Note 2+ (Nirgendwo bin ich wirklich gut)")
503
+ gr.Markdown("- Enormer Leistungsdruck auffällig")
504
+ gr.Markdown("- Ausgrenzungserfahrungen (Streberin genannt)")
505
+ gr.Markdown("- Krisensituation nach Referat")
506
+ gr.Markdown("- Suizidgedanken entwickelt")
507
+ gr.Markdown("- Stationäre Aufnahme 4-6 Wochen")
508
+ gr.Markdown("- Ambulante Weiterbehandlung")
 
 
 
509
 
510
+ with gr.Accordion("📋 Realistische Fallbeispiele aus der Praxis", open=False):
511
+ gr.Markdown("**Julia (16) - Strebsame Schülerin:**")
512
+ gr.Markdown("- Sehr strebsam, ordentlich, diszipliniert")
513
+ gr.Markdown("- Verzweifelt bei Note 2+ (Nirgendwo bin ich wirklich gut)")
514
+ gr.Markdown("- Enormer Leistungsdruck auffällig")
515
+ gr.Markdown("- Ausgrenzungserfahrungen (Streberin genannt)")
516
+ gr.Markdown("- Krisensituation nach Referat")
517
+ gr.Markdown("- Suizidgedanken entwickelt")
518
+ gr.Markdown("- Stationäre Aufnahme 4-6 Wochen")
519
+ gr.Markdown("- Ambulante Weiterbehandlung")
520
 
521
+ gr.Markdown("**Rachid - Familiär belastet:**")
522
+ gr.Markdown("- Veränderung in mündlicher Beteiligung")
523
+ gr.Markdown("- Berichtet von Schlafproblemen")
524
+ gr.Markdown("- Berichte von Familienstreit")
525
+ gr.Markdown("- Beratungsstelle - Diagnose Depression")
526
+ gr.Markdown("- Wöchentliche ambulante Gesprächstherapie")
527
+ gr.Markdown("- Familie wird in Behandlung einbezogen")
528
 
529
  with gr.Accordion("⚙️ Simulation anpassen", open=False):
530
  character_type = gr.Radio(
 
581
  lines=10
582
  )
583
 
 
584
  evaluation_display = gr.Markdown(
585
  label="📊 Gesprächsauswertung",
586
  value="",
 
610
  outputs=[api_status]
611
  )
612
 
 
613
  evaluate_btn.click(
614
  fn=evaluate_conversation,
615
  outputs=[evaluation_display]