project-green / app.py
ai-tomoni's picture
Update app.py
08611e9 verified
raw
history blame
16.6 kB
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()