import gradio as gr print("Gradio version:", gr.__version__) from huggingface_hub import InferenceClient import os import time import random # Load token and model HF_TOKEN = os.getenv("tomoniaccess") client = InferenceClient( model="mistralai/Mixtral-8x7B-Instruct-v0.1", token=HF_TOKEN ) # Gesprächshistorie für Kontinuität conversation_history = [] # Verschiedene Charaktere mit spezifischen Traits personas = { "Jonas": { "age": 15, "traits": "schüchtern, einsam, selbstzweifelnd", "speech_style": "leise, zögerlich, kurze Pausen", "typical_responses": ["mmh...", "weiß nicht", "vielleicht", "ist halt so"] }, "Lena": { "age": 16, "traits": "wütend, fühlt sich unverstanden, überfordert", "speech_style": "manchmal sarkastisch, abwehrend", "typical_responses": ["whatever", "ist mir egal", "verstehst du eh nicht"] } } # Aktuell gewählte Persona current_persona = "Jonas" persona = personas[current_persona] # Verbesserter, fokussierter System-Prompt SYSTEM_MESSAGE = f"""Du bist {current_persona}, ein {persona['age']}-jähriger Jugendlicher mit Depression. CHARAKTEREIGENSCHAFTEN: - {persona['traits']} - Sprichst {persona['speech_style']} - Nutzt oft: {', '.join(persona['typical_responses'])} VERHALTEN: - Antworte kurz (1-3 Sätze max) - Zeige Emotionen subtil, nicht direkt - Manchmal lange Pausen (verwende "..." oder "äh...") - Sei nicht zu gesprächig - Reagiere natürlich auf das Gesagte WICHTIG: Du bist NICHT hilfreich oder lösungsorientiert. Du bist ein Teenager mit echten Problemen.""" def reset_conversation(): """Gesprächshistorie zurücksetzen""" global conversation_history conversation_history = [] return "Gespräch zurückgesetzt.", "" def chat_response(user_input, max_tokens, temperature, top_p): """Vereinfachte Chat-Funktion ohne Audio""" global conversation_history if not user_input.strip(): return "", "Bitte gib eine Nachricht ein.", "" print(f"\n🗣️ User: {user_input}") print(f"📊 Conversation length: {len(conversation_history)}") t0 = time.time() # Gesprächshistorie aufbauen if len(conversation_history) == 0: # Erste Nachricht messages = [ {"role": "system", "content": SYSTEM_MESSAGE}, {"role": "user", "content": user_input} ] print("🆕 Erste Nachricht") else: # Mit Historie (letzte 6 Nachrichten für Kontext) messages = [{"role": "system", "content": SYSTEM_MESSAGE}] recent_history = conversation_history[-6:] messages.extend(recent_history) messages.append({"role": "user", "content": user_input}) print(f"📚 Using {len(recent_history)} previous messages") # Debug: Messages anzeigen print("\n📋 Messages sent to AI:") for i, msg in enumerate(messages): print(f" {i}: {msg['role']}: {msg['content'][:100]}...") # Chat completion response_text = "" t1 = time.time() try: for message in client.chat_completion( messages=messages, max_tokens=min(max_tokens, 80), stream=True, temperature=temperature, top_p=top_p, stop=["User:", "Human:", "\n\n", "Du:"] ): token = message.choices[0].delta.content if token: response_text += token except Exception as e: print(f"❌ Fehler bei Chat Completion: {e}") response_text = f"{random.choice(persona['typical_responses'])}... hab grad keine Lust zu reden." # Response nachbearbeiten response_text = response_text.strip() if len(response_text.split()) > 25: # Zu lang? Kürzen sentences = response_text.split('.') if len(sentences) > 1: response_text = sentences[0] + "..." t2 = time.time() print(f"🤖 {current_persona}: {response_text}") print(f"⏱️ Response took {t2 - t1:.2f} sec") # Historie aktualisieren conversation_history.append({"role": "user", "content": user_input}) conversation_history.append({"role": "assistant", "content": response_text}) # Chat-Historie für UI formatieren chat_display = "" for i in range(0, len(conversation_history), 2): if i+1 < len(conversation_history): user_msg = conversation_history[i]['content'] bot_msg = conversation_history[i+1]['content'] chat_display += f"**Du:** {user_msg}\n**{current_persona}:** {bot_msg}\n\n" # Debug Info debug_info = f"""**Debug Info:** - Gesprächslänge: {len(conversation_history)//2} Turns - Letzte Antwort: {len(response_text.split())} Wörter - Verarbeitungszeit: {t2-t1:.2f}s - Aktuelle Persona: {current_persona} - Verwendete Tokens: ~{max_tokens}""" return "", response_text, chat_display, debug_info def change_persona(new_persona): """Persona wechseln""" global current_persona, persona, SYSTEM_MESSAGE if new_persona not in personas: return f"Persona {new_persona} nicht gefunden" current_persona = new_persona persona = personas[current_persona] # System Message aktualisieren SYSTEM_MESSAGE = f"""Du bist {current_persona}, ein {persona['age']}-jähriger Jugendlicher mit Depression. CHARAKTEREIGENSCHAFTEN: - {persona['traits']} - Sprichst {persona['speech_style']} - Nutzt oft: {', '.join(persona['typical_responses'])} VERHALTEN: - Antworte kurz (1-3 Sätze max) - Zeige Emotionen subtil, nicht direkt - Manchmal lange Pausen (verwende "..." oder "äh...") - Sei nicht zu gesprächig - Reagiere natürlich auf das Gesagte WICHTIG: Du bist NICHT hilfreich oder lösungsorientiert. Du bist ein Teenager mit echten Problemen.""" reset_conversation() print(f"🎭 Persona gewechselt zu {current_persona}") return f"Persona gewechselt zu {current_persona}. Gespräch zurückgesetzt." # Gradio Interface - Chat-fokussiert with gr.Blocks(title="Depression Training Chatbot - Debug", theme=gr.themes.Soft()) as demo: gr.Markdown("# 🧠 Depression Training Chatbot - Debug Version") gr.Markdown("**Nur Chat-Interaktion für besseres Debugging**") with gr.Row(): with gr.Column(scale=1): # Controls gr.Markdown("### 🎭 Persona") persona_dropdown = gr.Dropdown( choices=list(personas.keys()), value=current_persona, label="Charakter wählen" ) persona_button = gr.Button("Charakter wechseln") persona_status = gr.Textbox(label="Status", interactive=False) gr.Markdown("### ⚙️ Parameter") max_tokens = gr.Slider(20, 150, value=60, step=10, label="Max Tokens") temperature = gr.Slider(0.3, 1.2, value=0.8, step=0.1, label="Temperatur") top_p = gr.Slider(0.1, 1.0, value=0.9, step=0.1, label="Top-p") gr.Markdown("### 🔄 Aktionen") reset_btn = gr.Button("Gespräch zurücksetzen", variant="secondary") with gr.Column(scale=2): # Main Chat Interface gr.Markdown("### 💬 Chat") # Chat Input user_input = gr.Textbox( label="Deine Nachricht", placeholder="Schreib hier deine Nachricht...", lines=2 ) send_btn = gr.Button("📨 Senden", variant="primary") # Bot Response bot_response = gr.Textbox( label=f"{current_persona}'s Antwort", interactive=False, lines=3 ) # Chat History chat_history = gr.Textbox( label="💭 Gesprächsverlauf", interactive=False, lines=12, max_lines=20 ) # Debug Panel with gr.Accordion("🔍 Debug Info", open=True): debug_info = gr.Markdown(label="Debug Information") # Event Handlers send_btn.click( fn=chat_response, inputs=[user_input, max_tokens, temperature, top_p], outputs=[user_input, bot_response, chat_history, debug_info] ) # Enter-Taste für Senden user_input.submit( fn=chat_response, inputs=[user_input, max_tokens, temperature, top_p], outputs=[user_input, bot_response, chat_history, debug_info] ) persona_button.click( fn=change_persona, inputs=[persona_dropdown], outputs=[persona_status] ) reset_btn.click( fn=reset_conversation, outputs=[persona_status, chat_history] ) if __name__ == "__main__": demo.launch(share=False, debug=True)