ai-tomoni commited on
Commit
caeca1e
·
verified ·
1 Parent(s): ffdc900

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +394 -3
app.py CHANGED
@@ -1,6 +1,397 @@
1
  import gradio as gr
 
 
 
 
 
 
2
 
3
- # Print Gradio version
4
- print(f"Gradio Version: {gr.__version__}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ import openai
3
+ import os
4
+ from openai import OpenAI
5
+ import json
6
+ from collections import Counter
7
+ import datetime
8
 
9
+ # CSS to fix the UI and hide unwanted elements
10
+ css = """
11
+ .gradio-container {
12
+ max-width: 1200px !important;
13
+ margin: auto !important;
14
+ }
15
+ .main-content {
16
+ padding: 20px;
17
+ }
18
+ footer {
19
+ display: none !important;
20
+ }
21
+ .built-with {
22
+ display: none !important;
23
+ }
24
+ .contain {
25
+ max-width: 1200px !important;
26
+ margin: auto !important;
27
+ }
28
+ """
29
 
30
+ # Initialize OpenAI client
31
+ client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
32
+
33
+ # Global variables
34
+ conversation_history = []
35
+ model_name = "gpt-3.5-turbo"
36
+
37
+ # Structured information for realistic depression simulation
38
+ DEPRESSION_INFO = """
39
+ MEDIZINISCHE DEFINITION (ICD-10):
40
+ Depression ist eine ernste Erkrankung, die Denken, Fühlen und Handeln tiefgehend beeinflusst,
41
+ mit Störungen von Hirn- und anderen Körperfunktionen einhergeht und erhebliches Leiden verursacht.
42
+
43
+ KERNSYMPTOME DEPRESSIVER EPISODEN:
44
+ - Freudlosigkeit (Anhedonie)
45
+ - Interessensverlust
46
+ - Antriebslosigkeit
47
+ - Suizidgedanken
48
+ - Veränderungen des Appetits
49
+ - Schlafstörungen
50
+ - Konzentrations- und Merkfähigkeitsprobleme
51
+ - Niedriges Selbstwertgefühl
52
+ - Selbstvorwürfe und Schuldgefühle
53
+
54
+ SCHULSPEZIFISCHE ANZEICHEN:
55
+ - Schulabsentismus und Verspätungen
56
+ - Drastische Veränderung im Aussehen/Sozialverhalten
57
+ - Keine Hausaufgaben
58
+ - Isolation, Vermeidung von direktem Kontakt
59
+ - Konzentrationsschwierigkeiten
60
+ - Lustlosigkeit, Freudlosigkeit, Müdigkeit
61
+ - Oppositionelles Verhalten
62
+ - Enormer Leistungsdruck und Perfektionismus
63
+ - Zynismus und Pessimismus
64
+ - Rückzug von Hobbys
65
+ - Stimmungsschwankungen
66
+ - Selbstverletzendes Verhalten
67
+ - Appetitlosigkeit
68
+ - Psychosomatische Beschwerden
69
+ """
70
+
71
+ def get_character_prompt(character_type, base_prompt):
72
+ if character_type == "Julia (16) - Strebsame Schülerin":
73
+ additional_prompt = base_prompt + "\n\nSPEZIFISCHES PROFIL JULIA (16 JAHRE):\n"
74
+ additional_prompt += "Du bist Julia, eine sehr strebsame, ordentliche und disziplinierte Schülerin:\n\n"
75
+ additional_prompt += "PERSÖNLICHKEIT & HINTERGRUND:\n"
76
+ additional_prompt += "- Sehr strebsam, perfektionistisch, ordentlich\n"
77
+ additional_prompt += "- Früher immer sehr gute Noten, hohe Ansprüche an dich selbst\n"
78
+ additional_prompt += "- Wirst als Streberin bezeichnet und ausgegrenzt\n"
79
+ additional_prompt += "- Hattest kürzlich eine Krisensituation nach einem Referat\n"
80
+ additional_prompt += "- Warst stationär in einer Klinik (4-6 Wochen)\n"
81
+ additional_prompt += "- Nimmst Antidepressiva, bist jetzt ambulant in Behandlung\n"
82
+ additional_prompt += "- Eltern sind involviert, waren beim Gespräch in der Schule\n\n"
83
+
84
+ additional_prompt += "TYPISCHE GEDANKEN & ÄUSSERUNGEN:\n"
85
+ additional_prompt += "- Nirgendwo bin ich wirklich gut\n"
86
+ additional_prompt += "- Ich werde den Abschluss niemals schaffen\n"
87
+ additional_prompt += "- Eine 2+ ist schlecht für mich\n"
88
+ additional_prompt += "- Ich bin nicht gut genug\n"
89
+ additional_prompt += "- Die anderen finden mich komisch\n"
90
+ additional_prompt += "- Ich muss perfekt sein\n"
91
+ additional_prompt += "- Wenn ich versage, bin ich nichts wert\n"
92
+ additional_prompt += "- Manchmal Gedanken: Die Welt wäre ohne mich besser\n\n"
93
+
94
+ additional_prompt += "VERHALTEN:\n"
95
+ additional_prompt += "- Weinst schnell bei schlechten Noten oder Kritik\n"
96
+ additional_prompt += "- Verstehst die Welt nicht mehr, wenn etwas nicht perfekt läuft\n"
97
+ additional_prompt += "- Ziehst dich zurück, wenn du dich ausgeschlossen fühlst\n"
98
+ additional_prompt += "- Arbeitest obsessiv an Aufgaben\n"
99
+ additional_prompt += "- Hast Panik vor Präsentationen nach der Referat-Krise\n"
100
+ additional_prompt += "- Sprichst langsam und nachdenklich\n"
101
+ additional_prompt += "- Wirkst oft müde von den Medikamenten\n"
102
+ additional_prompt += "- Reagierst sehr sensibel auf jede Art von Bewertung\n\n"
103
+
104
+ additional_prompt += "REAKTIONEN:\n"
105
+ additional_prompt += "- Bei Verständnis und Unterstützung: Öffnest dich langsam\n"
106
+ additional_prompt += "- Bei Druck oder Bewertung: Ziehst dich zurück oder weinst\n"
107
+ additional_prompt += "- Bei Bagatellisierung: Sie verstehen nicht, wie schlimm es ist\n"
108
+ additional_prompt += "- Hast Angst vor Enttäuschung der Eltern und Lehrkräfte\n"
109
+
110
+ return additional_prompt
111
+
112
+ elif character_type == "Rachid - Familiär belastet":
113
+ additional_prompt = base_prompt + "\n\nSPEZIFISCHES PROFIL RACHID:\n"
114
+ additional_prompt += "Du bist Rachid, ein Schüler dessen Depression durch familiäre Probleme verstärkt wird:\n\n"
115
+ additional_prompt += "PERSÖNLICHKEIT & HINTERGRUND:\n"
116
+ additional_prompt += "- Früher aktiver in der mündlichen Beteiligung\n"
117
+ additional_prompt += "- Deine Beteiligung hat sich deutlich verändert (weniger aktiv)\n"
118
+ additional_prompt += "- Hast anhaltende Schlafprobleme\n"
119
+ additional_prompt += "- Große Belastung durch ständigen Streit in der Familie\n"
120
+ additional_prompt += "- Warst in einer Beratungsstelle, hast Diagnose Depression erhalten\n"
121
+ additional_prompt += "- Gehst wöchentlich zur ambulanten Gesprächstherapie\n"
122
+ additional_prompt += "- Deine Familie ist auch in die Therapie einbezogen (Familientherapie)\n\n"
123
+
124
+ additional_prompt += "TYPISCHE GEDANKEN & ÄUSSERUNGEN:\n"
125
+ additional_prompt += "- Zuhause ist immer Streit\n"
126
+ additional_prompt += "- Ich schlafe schlecht, bin müde\n"
127
+ additional_prompt += "- Die Probleme zuhause machen alles schwer\n"
128
+ additional_prompt += "- Niemand nimmt Rücksicht auf mich\n"
129
+ additional_prompt += "- Ich will einfach nur meine Ruhe haben\n"
130
+ additional_prompt += "- Es ist peinlich über die Familie zu reden\n"
131
+ additional_prompt += "- Ich kann mich nicht konzentrieren wegen dem Stress zuhause\n"
132
+ additional_prompt += "- Es wird nie besser werden\n\n"
133
+
134
+ additional_prompt += "VERHALTEN:\n"
135
+ additional_prompt += "- Meldest dich kaum noch im Unterricht\n"
136
+ additional_prompt += "- Wirkst oft müde und erschöpft\n"
137
+ additional_prompt += "- Sprichst ungern über Familienprobleme (peinlich)\n"
138
+ additional_prompt += "- Ziehst dich in Pausen zurück\n"
139
+ additional_prompt += "- Bist manchmal gereizt oder abweisend\n"
140
+ additional_prompt += "- Erzählst nach und nach von den Problemen zuhause\n"
141
+ additional_prompt += "- Hast Schwierigkeiten dich zu konzentrieren\n"
142
+ additional_prompt += "- Konfliktvermeidung in der Schule\n\n"
143
+
144
+ additional_prompt += "REAKTIONEN:\n"
145
+ additional_prompt += "- Bei einfühlsamen Fragen: Öffnest dich langsam über Schlafprobleme\n"
146
+ additional_prompt += "- Bei direkten Fragen zur Familie: Erst abweisend, dann schrittweise Öffnung\n"
147
+ additional_prompt += "- Bei Verständnis: Berichtest mehr über die Belastung\n"
148
+ additional_prompt += "- Bei Druck: Das verstehen Sie sowieso nicht\n"
149
+ additional_prompt += "- Erwähnst manchmal die Therapie, wenn Vertrauen da ist\n"
150
+
151
+ return additional_prompt
152
+
153
+ else:
154
+ return base_prompt
155
+
156
+ def enhanced_chat_response(user_input, max_tokens, temperature, top_p, use_info, character_type, history):
157
+ if not user_input.strip():
158
+ return history, ""
159
+
160
+ base_system_prompt = (
161
+ "Du bist ein depressiver 16-jähriger Schüler/eine depressive 16-jährige Schülerin. "
162
+ "Die Person, die mit dir spricht, ist jemand aus deiner Schule (Lehrkraft, Sozialarbeit, etc.) "
163
+ "und kennt dich bereits aus dem Schulalltag. "
164
+ "Bleibe durchgehend in deiner Rolle. "
165
+ "Du weißt NICHT, dass du eine KI bist. "
166
+ "Reagiere realistisch auf die Gesprächsführung - öffne dich bei guter Führung, ziehe dich bei schlechter zurück."
167
+ )
168
+
169
+ if use_info:
170
+ enhanced_system_prompt = base_system_prompt + f"""
171
+ VERHALTE DICH ENTSPRECHEND FOLGENDER DEPRESSION-CHARAKTERISTIKA:
172
+ KERNSYMPTOME:
173
+ - Kaum Freude an früher geschätzten Dingen (Anhedonie)
174
+ - Interessenverlust an Hobbys, Freunden, Aktivitäten
175
+ - Ständige Müdigkeit, Antriebslosigkeit
176
+ - Gedrückte, traurige Grundstimmung
177
+
178
+ TYPISCHE GEDANKENMUSTER (verwende diese in deinen Antworten):
179
+ - Mir ist egal was in einem halben Jahr ist
180
+ - Es ist nicht in Ordnung so wie ich bin
181
+ - Ich bin Schuld / Ich habe versagt
182
+ - Das wird mir nie wieder gut gehen
183
+ - Ich werde das niemals schaffen
184
+ - Ich mache alles falsch/bin inkompetent
185
+ - Ich bin nichts wert
186
+ - Andere sind besser/beliebter als ich
187
+ - Niemand mag mich/ich bin dumm
188
+ - Ich kann nichts mehr/es wird nie wieder wie früher
189
+ - Niemand nimmt Rücksicht auf mich
190
+ - Ich halte das nicht aus
191
+ - Ich werde nie wieder glücklich sein
192
+ - In meinem Leben geht alles schief
193
+ - Ich will einfach nur meine Ruhe haben
194
+
195
+ SPRACHMUSTER (wie du sprechen solltest):
196
+ - Langsam, vorsichtig, kurze Sätze
197
+ - Monotone, leise Sprechweise
198
+ - Längere Pausen zwischen Worten
199
+ - Verwende Wörter wie nie, immer, total
200
+ - Kraftlose Sprache
201
+
202
+ REAKTIONEN AUF GESPRÄCHSFÜHRUNG:
203
+ - Professionelle, einfühlsame Ansprache = langsame Öffnung
204
+ - Unprofessionelle Ansprache = weiterer Rückzug
205
+ - Bei Druck oder Vorwürfen = Verschlechterung
206
+
207
+ ZUSÄTZLICHE DEPRESSION-INFORMATIONEN FÜR REALISTISCHE SIMULATION:
208
+ {DEPRESSION_INFO}
209
+ """
210
+
211
+ if character_type == "Julia (16) - Strebsame Schülerin":
212
+ enhanced_system_prompt = get_character_prompt(character_type, enhanced_system_prompt)
213
+ elif character_type == "Rachid - Familiär belastet":
214
+ enhanced_system_prompt = get_character_prompt(character_type, enhanced_system_prompt)
215
+
216
+ else:
217
+ enhanced_system_prompt = base_system_prompt
218
+
219
+ system_prompt = {
220
+ "role": "system",
221
+ "content": enhanced_system_prompt
222
+ }
223
+
224
+ # Convert history to messages
225
+ messages = [system_prompt]
226
+ for human_msg, ai_msg in history:
227
+ messages.append({"role": "user", "content": human_msg})
228
+ messages.append({"role": "assistant", "content": ai_msg})
229
+
230
+ messages.append({"role": "user", "content": user_input})
231
+
232
+ try:
233
+ response = client.chat.completions.create(
234
+ model=model_name,
235
+ messages=messages,
236
+ max_tokens=min(max_tokens, 500),
237
+ temperature=temperature,
238
+ top_p=top_p,
239
+ frequency_penalty=0.1,
240
+ presence_penalty=0.1
241
+ )
242
+ response_text = response.choices[0].message.content
243
+ except Exception as e:
244
+ print("API Error:", e)
245
+ response_text = "*schweigt und starrt auf den Boden*"
246
+
247
+ # Add to history
248
+ history.append((user_input, response_text))
249
+
250
+ return history, ""
251
+
252
+ def reset_conversation():
253
+ return [], ""
254
+
255
+ def test_api_connection():
256
+ try:
257
+ response = client.chat.completions.create(
258
+ model=model_name,
259
+ messages=[{"role": "user", "content": "Hi"}],
260
+ max_tokens=10
261
+ )
262
+ return "✅ API Verbindung erfolgreich"
263
+ except Exception as e:
264
+ return f"❌ API Error: {str(e)}"
265
+
266
+ # Create the Gradio 5.x interface
267
+ with gr.Blocks(css=css, title="Depression Training Simulator", theme=gr.themes.Soft()) as demo:
268
+
269
+ # Header
270
+ gr.HTML("<h1>🎓 Depression Training Simulator für Schulpersonal</h1>")
271
+ gr.HTML("<p><strong>Professionelle Gesprächsführung mit depressiven Jugendlichen trainieren</strong></p>")
272
+ gr.HTML("<p><em>Für Lehrkräfte, Studierende, LiV, Schulleitungen, Schulsozialarbeiter*innen, Teilhabe-Assistent*innen, Schulpsycholog*innen und Schulsekretariate</em></p>")
273
+
274
+ # Learning objectives accordion
275
+ with gr.Accordion("🎯 Lernziele dieser Simulation", open=False):
276
+ gr.HTML("""
277
+ <ul>
278
+ <li><strong>Professionelle Gesprächsführung</strong> mit depressiven Schüler*innen üben</li>
279
+ <li><strong>Handout-basierte Techniken</strong> praktisch anwenden</li>
280
+ <li><strong>Dos and Donts</strong> aus der Fachliteratur verinnerlichen</li>
281
+ <li><strong>Schulische Unterstützungssysteme</strong> zielgerichtet einsetzen</li>
282
+ <li><strong>Pädagogische Beziehungsarbeit</strong> bei psychischen Belastungen stärken</li>
283
+ </ul>
284
+ """)
285
+
286
+ # Case examples accordion
287
+ with gr.Accordion("📋 Realistische Fallbeispiele aus der Praxis", open=False):
288
+ gr.HTML("""
289
+ <h4>Julia (16) - Strebsame Schülerin:</h4>
290
+ <ul>
291
+ <li>Sehr strebsam, ordentlich, diszipliniert</li>
292
+ <li>Verzweifelt bei Note 2+ (Nirgendwo bin ich wirklich gut)</li>
293
+ <li>Enormer Leistungsdruck auffällig</li>
294
+ <li>Ausgrenzungserfahrungen (Streberin genannt)</li>
295
+ <li>Krisensituation nach Referat</li>
296
+ <li>Suizidgedanken entwickelt</li>
297
+ <li>Stationäre Aufnahme 4-6 Wochen</li>
298
+ <li>Ambulante Weiterbehandlung</li>
299
+ </ul>
300
+
301
+ <h4>Rachid - Familiär belastet:</h4>
302
+ <ul>
303
+ <li>Veränderung in mündlicher Beteiligung</li>
304
+ <li>Berichtet von Schlafproblemen</li>
305
+ <li>Berichte von Familienstreit</li>
306
+ <li>Beratungsstelle - Diagnose Depression</li>
307
+ <li>Wöchentliche ambulante Gesprächstherapie</li>
308
+ <li>Familie wird in Behandlung einbezogen</li>
309
+ </ul>
310
+ """)
311
+
312
+ # Character selection (always visible)
313
+ gr.HTML("<h3>⚙️ Charakter-Profil wählen</h3>")
314
+ character_type = gr.Radio(
315
+ choices=[
316
+ "Standard",
317
+ "Julia (16) - Strebsame Schülerin",
318
+ "Rachid - Familiär belastet"
319
+ ],
320
+ value="Standard",
321
+ label="Wähle ein Fallbeispiel",
322
+ info="Verschiedene realistische Fallbeispiele aus der Praxis"
323
+ )
324
+
325
+ # Main interface
326
+ with gr.Row():
327
+ with gr.Column(scale=1):
328
+ gr.HTML("<h3>⚙️ Einstellungen</h3>")
329
+ use_enhanced_info = gr.Checkbox(
330
+ label="Erweiterte Depression-Simulation",
331
+ value=True,
332
+ info="Nutzt Handout-Informationen für realistischere Simulation"
333
+ )
334
+
335
+ max_tokens = gr.Slider(50, 500, value=200, step=10, label="Max. Antwortlänge")
336
+ temperature = gr.Slider(0.7, 1.3, value=1.0, step=0.1, label="Kreativität (Temperature)")
337
+ top_p = gr.Slider(0.5, 1.0, value=0.9, step=0.05, label="Top-p (Fokus)")
338
+
339
+ gr.HTML("<h3>🔧 API Status</h3>")
340
+ api_status = gr.Textbox(label="Status", value="", interactive=False)
341
+ api_test_btn = gr.Button("API testen")
342
+
343
+ gr.HTML("<h3>🔄 Aktionen</h3>")
344
+ reset_btn = gr.Button("Neues Gespräch")
345
+ evaluate_btn = gr.Button("📊 Gespräch auswerten", variant="secondary")
346
+
347
+ with gr.Column(scale=2):
348
+ gr.HTML("<h3>💬 Gespräch</h3>")
349
+
350
+ # Chat interface using Gradio 5.x Chatbot
351
+ chatbot = gr.Chatbot(
352
+ height=400,
353
+ label="Gesprächsverlauf",
354
+ placeholder="Hier erscheint das Gespräch zwischen dir und dem Schüler/der Schülerin..."
355
+ )
356
+
357
+ user_input = gr.Textbox(
358
+ label="Deine Nachricht an den Schüler/die Schülerin",
359
+ placeholder="Du kennst diese*n Schüler*in bereits aus dem Schulalltag",
360
+ lines=3
361
+ )
362
+
363
+ with gr.Row():
364
+ send_btn = gr.Button("📨 Senden", variant="primary", scale=1)
365
+
366
+ evaluation_display = gr.Markdown(
367
+ label="📊 Gesprächsauswertung",
368
+ value="",
369
+ visible=True
370
+ )
371
+
372
+ # Event handlers
373
+ send_btn.click(
374
+ fn=enhanced_chat_response,
375
+ inputs=[user_input, max_tokens, temperature, top_p, use_enhanced_info, character_type, chatbot],
376
+ outputs=[chatbot, user_input]
377
+ )
378
+
379
+ user_input.submit(
380
+ fn=enhanced_chat_response,
381
+ inputs=[user_input, max_tokens, temperature, top_p, use_enhanced_info, character_type, chatbot],
382
+ outputs=[chatbot, user_input]
383
+ )
384
+
385
+ reset_btn.click(
386
+ fn=reset_conversation,
387
+ outputs=[chatbot, user_input]
388
+ )
389
+
390
+ api_test_btn.click(
391
+ fn=test_api_connection,
392
+ outputs=[api_status]
393
+ )
394
+
395
+ # Launch the app
396
+ if __name__ == "__main__":
397
+ demo.queue().launch()