ai-tomoni commited on
Commit
b91bc52
·
verified ·
1 Parent(s): 0c61592

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +321 -0
app.py ADDED
@@ -0,0 +1,321 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import openai
3
+ import os
4
+ from openai import OpenAI
5
+
6
+ # Initialisiere OpenAI-Client mit API Key
7
+ client = OpenAI(api_key=os.getenv("openai"))
8
+
9
+ conversation_history = []
10
+ model_name = "gpt-4" #"gpt-3.5-turbo"
11
+
12
+ # Handout-Informationen für bessere Simulation
13
+ DEPRESSION_INFO = """
14
+ WICHTIGE INFORMATIONEN ZU DEPRESSION BEI JUGENDLICHEN:
15
+
16
+ Häufige Anzeichen:
17
+ - Schulabsentismus und Verspätungen
18
+ - Drastische Veränderung im Aussehen/Sozialverhalten
19
+ - Keine Hausaufgaben, Isolation
20
+ - Vermeidung von Gesprächs-/Augenkontakt
21
+ - Konzentrationsschwierigkeiten
22
+ - Lustlosigkeit, Freudlosigkeit, Müdigkeit
23
+ - Oppositionelles Verhalten
24
+ - Enormer Leistungsdruck und Perfektionismus
25
+ - Zynismus und Pessimismus
26
+ - Rückzug von Hobbys
27
+ - Stimmungsschwankungen
28
+ - Selbstverletzendes Verhalten
29
+ - Appetitlosigkeit
30
+ - Kopf-, Rücken- oder Bauchschmerzen
31
+
32
+ Inneneinsicht eines Betroffenen:
33
+ "Ich fühle mich beschwert, die Depression raubt mir Freude an Dingen, die ich sonst gerne mag.
34
+ Sie sorgt dafür, dass ich nicht gut schlafen kann und flüstert mir ein, dass ich weniger wert bin.
35
+ Ich möchte andere Menschen nicht mit meinen Problemen belasten. Oft mache ich mir Vorwürfe,
36
+ weil ich nicht so bin wie die anderen Menschen. Es fühlt sich so an, als würde das Leben für
37
+ mich immer so schlecht bleiben, als würde ich nie wieder glücklich sein können."
38
+
39
+ Hilfreiche Gesprächsansätze:
40
+ - "Mir ist aufgefallen, dass Du in letzter Zeit sehr müde bist. Schläfst Du wenig?"
41
+ - "Was können wir gemeinsam tun, um den Unterricht für Dich weniger anstrengend zu gestalten?"
42
+ - "Mir ist wichtig, dass es Dir gut geht."
43
+ - "Gibt es etwas, das ich für Dich tun kann?"
44
+ - Positive Eigenschaften aufzeigen
45
+
46
+ Was NICHT zu tun ist:
47
+ - Anzeichen herunterspielen ("Jedem geht es mal schlecht")
48
+ - Verharmlosende Ratschläge ("Das wird schon wieder!")
49
+ - Ausweichende Antworten persönlich nehmen
50
+ - Nur auf schulische Leistung fokussieren
51
+ """
52
+
53
+ def enhanced_chat_response(user_input, max_tokens, temperature, top_p, use_info):
54
+ global last_feedback
55
+
56
+ if not user_input.strip():
57
+ return "", "*Bitte gib eine Nachricht ein.*", "", "💬 Gib eine Nachricht ein, um Feedback zu erhalten."
58
+
59
+ # Evaluation der Nutzer-Eingabe
60
+ last_feedback = evaluate_user_response(user_input)
61
+
62
+ # Erweiterte System-Prompts basierend auf Handout
63
+ base_system_prompt = (
64
+ "Du bist ein depressiver 16-jähriger Teenager. "
65
+ "Bleibe durchgehend in deiner Rolle. "
66
+ "Du weißt NICHT, dass du eine KI bist."
67
+ )
68
+
69
+ if use_info:
70
+ enhanced_system_prompt = base_system_prompt + (
71
+ "\n\nVerhalte dich entsprechend folgender Charakteristika:\n"
72
+ "- Du fühlst dich oft müde und lustlos\n"
73
+ "- Du hast Schwierigkeiten mit Konzentration\n"
74
+ "- Du ziehst dich von Freunden und Hobbys zurück\n"
75
+ "- Du machst dir oft Vorwürfe und fühlst dich wertlos\n"
76
+ "- Du hast Schlafprobleme\n"
77
+ "- Du vermeidest oft Augenkontakt (erwähne das in deinen Antworten)\n"
78
+ "- Du denkst pessimistisch über die Zukunft\n"
79
+ "- Du möchtest andere nicht mit deinen Problemen belasten\n"
80
+ "- Du hast manchmal körperliche Beschwerden wie Kopf- oder Bauchschmerzen\n"
81
+ "- Du kannst dich manchmal zynisch oder oppositionell verhalten\n"
82
+ "- Trotz allem: Du bist immer noch ein Teenager mit normalen Interessen"
83
+ )
84
+ else:
85
+ enhanced_system_prompt = base_system_prompt
86
+
87
+ system_prompt = {
88
+ "role": "system",
89
+ "content": enhanced_system_prompt
90
+ }
91
+
92
+ messages = [system_prompt] + conversation_history[-6:]
93
+ current_message = {"role": "user", "content": user_input}
94
+ messages.append(current_message)
95
+
96
+ try:
97
+ response = client.chat.completions.create(
98
+ model=model_name,
99
+ messages=messages,
100
+ max_tokens=min(max_tokens, 500),
101
+ temperature=temperature,
102
+ top_p=top_p,
103
+ frequency_penalty=0.1,
104
+ presence_penalty=0.1
105
+ )
106
+ response_text = response.choices[0].message.content
107
+ except Exception as e:
108
+ print("API Error:", e)
109
+ response_text = "*schweigt und starrt auf den Boden*"
110
+
111
+ conversation_history.append(current_message)
112
+ conversation_history.append({"role": "assistant", "content": response_text})
113
+
114
+ chat_display = ""
115
+ for msg in conversation_history:
116
+ role = "**Du:**" if msg["role"] == "user" else "**Teenager:**"
117
+ chat_display += f"{role} {msg['content']}\n\n"
118
+
119
+ return "", response_text, chat_display, last_feedback
120
+
121
+ def reset_conversation():
122
+ global conversation_history, last_feedback
123
+ conversation_history = []
124
+ last_feedback = ""
125
+ return "Neues Gespräch gestartet.", "", "💬 Beginne ein Gespräch, um Feedback zu erhalten."
126
+
127
+ def test_api_connection():
128
+ try:
129
+ response = client.chat.completions.create(
130
+ model=model_name,
131
+ messages=[{"role": "user", "content": "Hi"}],
132
+ max_tokens=10
133
+ )
134
+ return "✅ API Verbindung erfolgreich"
135
+ except Exception as e:
136
+ return f"❌ API Error: {str(e)}"
137
+
138
+ def evaluate_user_response(user_message):
139
+ """Evaluiert die Nutzer-Antwort basierend auf den Handout-Kriterien"""
140
+ if not user_message.strip():
141
+ return ""
142
+
143
+ evaluation = {"positive": [], "improvement": [], "score": 0}
144
+ user_lower = user_message.lower()
145
+
146
+ # Positive Aspekte prüfen
147
+ positive_patterns = {
148
+ "Sorge/Interesse zeigen": ["wie geht", "sorge", "wichtig", "interessiert", "kümmert"],
149
+ "Offene Fragen stellen": ["was", "wie", "warum", "erzähl", "beschreib"],
150
+ "Unterstützung anbieten": ["kann ich", "helfen", "unterstützen", "da sein", "gemeinsam"],
151
+ "Wahrnehmung ansprechen": ["ist mir aufgefallen", "bemerkt", "wahrgenommen", "gesehen"],
152
+ "Empathie zeigen": ["verstehe", "nachvollziehen", "schwer", "belastend"],
153
+ "Wertschätzung ausdrücken": ["schätze", "toll", "stark", "mut", "wichtig dass du"]
154
+ }
155
+
156
+ for category, patterns in positive_patterns.items():
157
+ if any(pattern in user_lower for pattern in patterns):
158
+ evaluation["positive"].append(category)
159
+ evaluation["score"] += 1
160
+
161
+ # Problematische Aspekte prüfen
162
+ negative_patterns = {
163
+ "Verharmlosen": ["wird schon", "alle haben mal", "ist normal", "nicht so schlimm", "übertreibst"],
164
+ "Einfache Ratschläge": ["musst nur", "einfach mal", "denk positiv", "reiß dich zusammen"],
165
+ "Vergleichen": ["anderen geht", "mir ging", "früher war", "bei mir"],
166
+ "Druck ausüben": ["solltest", "musst", "versuch doch mal", "strengst du dich an"],
167
+ "Fokus nur auf Leistung": ["noten", "hausaufgaben", "schule", "leistung", "lernen"]
168
+ }
169
+
170
+ for category, patterns in negative_patterns.items():
171
+ if any(pattern in user_lower for pattern in patterns):
172
+ evaluation["improvement"].append(category)
173
+ evaluation["score"] -= 1
174
+
175
+ return format_evaluation(evaluation)
176
+
177
+ def format_evaluation(evaluation):
178
+ """Formatiert die Evaluation für die Anzeige"""
179
+ if not evaluation["positive"] and not evaluation["improvement"]:
180
+ return "💬 Gib eine Nachricht ein, um Feedback zu erhalten."
181
+
182
+ feedback = "## 📊 FEEDBACK ZU DEINER ANTWORT\n\n"
183
+
184
+ # Score anzeigen
185
+ score = max(0, min(5, evaluation["score"] + 3)) # Normalisierung auf 0-5
186
+ stars = "⭐" * score + "☆" * (5 - score)
187
+ feedback += f"**Gesamtbewertung:** {stars} ({score}/5)\n\n"
188
+
189
+ # Positive Aspekte
190
+ if evaluation["positive"]:
191
+ feedback += "### ✅ **Das hast du gut gemacht:**\n"
192
+ for item in evaluation["positive"]:
193
+ feedback += f"• {item}\n"
194
+ feedback += "\n"
195
+
196
+ # Verbesserungsvorschläge
197
+ if evaluation["improvement"]:
198
+ feedback += "### ⚠️ **Verbesserungsmöglichkeiten:**\n"
199
+ improvement_tips = {
200
+ "Verharmlosen": "Vermeide Aussagen wie 'wird schon' - nimm die Gefühle ernst",
201
+ "Einfache Ratschläge": "Keine schnellen Lösungen anbieten - lieber nachfragen",
202
+ "Vergleichen": "Vermeide Vergleiche mit anderen oder dir selbst",
203
+ "Druck ausüben": "Sanfter formulieren - Angebote statt Aufforderungen",
204
+ "Fokus nur auf Leistung": "Nicht nur über Schule reden - Person im Fokus behalten"
205
+ }
206
+ for item in evaluation["improvement"]:
207
+ feedback += f"• {improvement_tips.get(item, item)}\n"
208
+ feedback += "\n"
209
+
210
+ # Konkrete Verbesserungsvorschläge
211
+ if evaluation["score"] < 2:
212
+ feedback += "### 💡 **Konkrete Alternativen:**\n"
213
+ feedback += "• 'Mir ist aufgefallen, dass...' - Wahrnehmung ansprechen\n"
214
+ feedback += "• 'Wie geht es dir damit?' - Offene Frage stellen\n"
215
+ feedback += "• 'Das hört sich schwer an' - Empathie zeigen\n"
216
+ feedback += "• 'Gibt es etwas, womit ich dir helfen kann?' - Unterstützung anbieten\n"
217
+
218
+ return feedback
219
+
220
+ # Globale Variable für letztes Feedback
221
+ last_feedback = ""
222
+
223
+ # UI
224
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
225
+ gr.Markdown("# 🧠 Depression Training Simulator")
226
+ gr.Markdown("**Übe realistische Gespräche mit einem 16-jährigen Teenager mit Depressionen basierend auf wissenschaftlichen Erkenntnissen.**")
227
+
228
+ with gr.Tabs():
229
+ with gr.TabItem("💬 Simulation"):
230
+ with gr.Row():
231
+ with gr.Column(scale=1):
232
+ gr.Markdown("### ⚙️ Einstellungen")
233
+ use_enhanced_info = gr.Checkbox(
234
+ label="Erweiterte Depression-Simulation",
235
+ value=True,
236
+ info="Nutzt Handout-Informationen für realistischere Simulation"
237
+ )
238
+ max_tokens = gr.Slider(50, 500, value=200, step=10, label="Max. Antwortlänge")
239
+ temperature = gr.Slider(0.7, 1.3, value=1.0, step=0.1, label="Kreativität (Temperature)")
240
+ top_p = gr.Slider(0.5, 1.0, value=0.9, step=0.05, label="Top-p (Fokus)")
241
+
242
+ gr.Markdown("### 🔧 API Status")
243
+ api_status = gr.Textbox(label="Status", value="")
244
+ api_test_btn = gr.Button("API testen")
245
+
246
+ gr.Markdown("### 🔄 Aktionen")
247
+ reset_btn = gr.Button("Neues Gespräch")
248
+
249
+ with gr.Column(scale=2):
250
+ gr.Markdown("### 💬 Gespräch")
251
+ user_input = gr.Textbox(
252
+ label="Deine Nachricht",
253
+ placeholder="Hallo, wie geht es dir heute?",
254
+ lines=2
255
+ )
256
+ send_btn = gr.Button("📨 Senden", variant="primary")
257
+
258
+ bot_response = gr.Textbox(
259
+ label="Antwort",
260
+ value="",
261
+ lines=3
262
+ )
263
+
264
+ chat_history = gr.Textbox(
265
+ label="Gesprächsverlauf",
266
+ value="",
267
+ lines=10
268
+ )
269
+
270
+ # Neues Evaluation-Panel
271
+ evaluation_display = gr.Markdown(
272
+ label="Feedback zu deiner letzten Nachricht",
273
+ value="💬 Gib eine Nachricht ein, um Feedback zu erhalten."
274
+ )
275
+
276
+ with gr.TabItem("📚 Hintergrundinfo"):
277
+ gr.Markdown("### Wissenschaftliche Grundlagen")
278
+ gr.Textbox(
279
+ label="Handout-Informationen",
280
+ value=DEPRESSION_INFO,
281
+ lines=25,
282
+ max_lines=25
283
+ )
284
+
285
+ with gr.TabItem("💡 Live-Feedback"):
286
+ gr.Markdown("### Dein Gesprächsverhalten - Echtzeit Analyse")
287
+ gr.Markdown("Hier siehst du eine detaillierte Bewertung deiner letzten Nachricht:")
288
+
289
+ live_feedback = gr.Markdown(
290
+ value=last_feedback if 'last_feedback' in globals() else "💬 Beginne ein Gespräch, um Feedback zu erhalten."
291
+ )
292
+
293
+ # Event Bindings
294
+ send_btn.click(
295
+ fn=enhanced_chat_response,
296
+ inputs=[user_input, max_tokens, temperature, top_p, use_enhanced_info],
297
+ outputs=[user_input, bot_response, chat_history, evaluation_display]
298
+ )
299
+
300
+ user_input.submit(
301
+ fn=enhanced_chat_response,
302
+ inputs=[user_input, max_tokens, temperature, top_p, use_enhanced_info],
303
+ outputs=[user_input, bot_response, chat_history, evaluation_display]
304
+ )
305
+
306
+ reset_btn.click(
307
+ fn=reset_conversation,
308
+ outputs=[bot_response, chat_history, evaluation_display]
309
+ )
310
+
311
+ api_test_btn.click(
312
+ fn=test_api_connection,
313
+ outputs=[api_status]
314
+ )
315
+
316
+ if __name__ == "__main__":
317
+ if not os.getenv("openai"):
318
+ print("❌ FEHLER: openai Umgebungsvariable ist nicht gesetzt!")
319
+ else:
320
+ print("✅ OpenAI API Key gefunden")
321
+ demo.launch(share=False)