File size: 8,934 Bytes
af46e61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
import gradio as gr
import os
from huggingface_hub import InferenceClient

# Load token and model - DeepSeek models for dialogue
HF_TOKEN = os.getenv("tomoniaccess")

# DeepSeek model options (optimized for dialogue):
model_name = "deepseek-ai/deepseek-llm-7b-chat"        # Primary choice - optimized for chat
# model_name = "deepseek-ai/deepseek-coder-7b-instruct" # Alternative with good instruction following
# model_name = "deepseek-ai/deepseek-llm-67b-chat"     # Larger model (if available)

client = InferenceClient(
    model=model_name,
    token=HF_TOKEN
)

def query_deepseek(messages, max_tokens=200, temperature=1.0, top_p=0.9):
    """Query DeepSeek model via Hugging Face InferenceClient"""
    try:
        # Try chat completion first
        response = client.chat_completion(
            messages=messages,
            max_tokens=max_tokens,
            temperature=temperature,
            top_p=top_p,
            stream=False
        )
        return response.choices[0].message.content
    except Exception as chat_error:
        print(f"Chat completion failed: {chat_error}")
        try:
            # Fallback to text generation if chat completion fails
            # Convert messages to single prompt with DeepSeek format
            prompt = ""
            for msg in messages:
                if msg["role"] == "system":
                    prompt += f"System: {msg['content']}\n\n"
                elif msg["role"] == "user":
                    prompt += f"User: {msg['content']}\n"
                elif msg["role"] == "assistant":
                    prompt += f"Assistant: {msg['content']}\n"
            
            prompt += "Assistant: "
            
            response = client.text_generation(
                prompt=prompt,
                max_new_tokens=max_tokens,
                temperature=temperature,
                top_p=top_p,
                do_sample=True,
                return_full_text=False
            )
            return response
        except Exception as text_error:
            print(f"Text generation also failed: {text_error}")
            raise Exception(f"Both methods failed - Chat: {str(chat_error)}, Text: {str(text_error)}")

def enhanced_chat_response(user_input, max_tokens, temperature, top_p):
    if not user_input.strip():
        return "", "*Bitte gib eine Nachricht ein.*", ""

    # Optimized system prompt for DeepSeek (supports German well)
    system_prompt = {
        "role": "system",
        "content": (
        "Du bist ein depressiver 16-jähriger Teenager."
        "Bleibe durchgehend in deiner Rolle."
        "Du weißt NICHT, dass du eine KI bist."
        "Vervollständige immer deine Antworten."
        )
    }

    # Keep last 8 messages for context (DeepSeek handles context well)
    messages = [system_prompt] + conversation_history[-8:]
    current_message = {"role": "user", "content": user_input}
    messages.append(current_message)

    try:
        response_text = query_deepseek(messages, max_tokens, temperature, top_p)
    except Exception as e:
        print("API Error:", e)
        response_text = "*schweigt und starrt auf den Boden*"

    conversation_history.append(current_message)
    conversation_history.append({"role": "assistant", "content": response_text})

    chat_display = ""
    for msg in conversation_history:
        role = "**Du:**" if msg["role"] == "user" else "**Teenager:**"
        chat_display += f"{role} {msg['content']}\n\n"

    return "", response_text, chat_display

def reset_conversation():
    global conversation_history
    conversation_history = []
    return "Neues Gespräch gestartet.", ""

def test_api_connection():
    """Test API connection with multiple fallback methods"""
    try:
        # Test 1: Simple chat completion
        test_messages = [
            {"role": "system", "content": "Du bist ein hilfsbereit Assistent und antwortest auf Deutsch."},
            {"role": "user", "content": "Hallo"}
        ]
        
        response = query_deepseek(test_messages, max_tokens=20)
        return f"✅ API Verbindung erfolgreich: {response[:50]}..."
    except Exception as e:
        # Test 2: Try direct text generation
        try:
            simple_response = client.text_generation(
                prompt="Hallo, wie geht es dir?",
                max_new_tokens=10,
                do_sample=False,
                return_full_text=False
            )
            return f"✅ API Verbindung (Text Generation): {simple_response[:50]}..."
        except Exception as e2:
            # Test 3: Check if model exists
            try:
                # Try to get model info
                model_info = f"Model: {model_name}"
                return f"❌ API Errors - Chat: {str(e)[:100]}... | Text: {str(e2)[:100]}... | {model_info}"
            except Exception as e3:
                return f"❌ Vollständiger API Fehler: {str(e)[:200]}..."

# Initialize conversation history
conversation_history = []

# UI
with gr.Blocks(title="DeepSeek Depression Training Simulator") as demo:
    gr.Markdown("## 🧠 Depression Training Simulator (DeepSeek-7B-Chat)")
    gr.Markdown("**Übe realistische Gespräche mit einem 16-jährigen Teenager mit Depressionen.**")
    gr.Markdown("*Powered by DeepSeek-LLM-7B-Chat - Optimiert für natürliche Dialoge*")

    with gr.Row():
        with gr.Column(scale=1):
            gr.Markdown("### ⚙️ Einstellungen")
            max_tokens = gr.Slider(50, 300, value=150, step=10, label="Max. Antwortlänge")
            temperature = gr.Slider(0.1, 1.5, value=0.9, step=0.1, label="Kreativität (Temperature)")
            top_p = gr.Slider(0.1, 1.0, value=0.85, step=0.05, label="Top-p (Fokus)")

            gr.Markdown("### 🔧 API Status")
            api_status = gr.Textbox(label="Status", value="")
            api_test_btn = gr.Button("API testen")

            gr.Markdown("### 🔄 Aktionen")
            reset_btn = gr.Button("Neues Gespräch")
            
            gr.Markdown("### 📋 Setup & Troubleshooting")
            gr.Markdown("""
            **Benötigt:**
            - `tomoniaccess` Umgebungsvariable mit HF Token
            - `pip install huggingface_hub gradio`
            
            **DeepSeek Info:**
            - Optimiert für Dialoge und Konversationen
            - 7B Parameter, sehr effizient
            - Modell: `deepseek-ai/deepseek-llm-7b-chat`
            - Starke multilinguale Fähigkeiten (DE/EN)
            
            **Bei API Fehlern:**
            1. Token prüfen (muss Pro/Enterprise sein)
            2. Modell verfügbar? → [HF Model Card](https://huggingface.co/deepseek-ai/deepseek-llm-7b-chat)
            3. Alternative: `deepseek-ai/deepseek-coder-7b-instruct`
            4. Größere Version: `deepseek-ai/deepseek-llm-67b-chat`
            
            **DeepSeek Vorteile:**
            - Bessere Dialogqualität
            - Konsistente Rollenausführung
            - Natürlichere Antworten
            """)

        with gr.Column(scale=2):
            gr.Markdown("### 💬 Gespräch")
            user_input = gr.Textbox(
                label="Deine Nachricht", 
                placeholder="Hallo, wie geht es dir heute?",
                lines=2
            )
            send_btn = gr.Button("📨 Senden")

            bot_response = gr.Textbox(
                label="Antwort", 
                value="",
                lines=3
            )

            chat_history = gr.Textbox(
                label="Gesprächsverlauf",
                value="",
                lines=15
            )

    # Event Bindings
    send_btn.click(
        fn=enhanced_chat_response,
        inputs=[user_input, max_tokens, temperature, top_p],
        outputs=[user_input, bot_response, chat_history]
    )

    user_input.submit(
        fn=enhanced_chat_response,
        inputs=[user_input, max_tokens, temperature, top_p],
        outputs=[user_input, bot_response, chat_history]
    )

    reset_btn.click(
        fn=reset_conversation,
        outputs=[bot_response, chat_history]
    )

    api_test_btn.click(
        fn=test_api_connection,
        outputs=[api_status]
    )

if __name__ == "__main__":
    print("🚀 DeepSeek Depression Training Simulator")
    print(f"📊 Model: {model_name}")
    
    if not HF_TOKEN:
        print("❌ FEHLER: tomoniaccess Umgebungsvariable ist nicht gesetzt!")
        print("   Bitte setze deinen Hugging Face Token als 'tomoniaccess' Umgebungsvariable.")
    else:
        print("✅ Hugging Face API Token gefunden")
    
    print("\n📦 Benötigte Pakete:")
    print("pip install huggingface_hub gradio")
    print("\n🤖 DeepSeek: Hochperformantes Modell für natürliche Dialoge")
    print("   - Bessere Konsistenz in Rollenspielen")
    print("   - Verbesserte multilinguale Fähigkeiten")
    print("   - Optimiert für Konversations-KI")
    
    demo.launch(share=False)