File size: 5,164 Bytes
6596463
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8eb4f7d
6596463
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
01dc99c
6596463
 
01dc99c
 
 
 
 
 
 
 
 
 
6596463
 
 
 
 
01dc99c
 
 
6596463
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8eb4f7d
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
"""
app.py - Hauptanwendung für den Dr. Franz Psychochatbot (Integrierte Version)

Diese Datei dient als Einstiegspunkt für den Chatbot und orchestriert alle Komponenten:
- Initialisierung der Module
- Aufbau des Gradio-Interfaces
- Verarbeitung der Nutzereingaben
- Generierung der Antworten via API
"""

import os
import time
from typing import List, Dict, Tuple, Optional, Any

# Importieren der Konfiguration und Module
import config
from modules.persona import Persona
from gradio import components
from modules.analyzer import Analyzer
from modules.memory import Memory
from modules.interface import Interface
from utils.api_handler import ApiHandler
from utils.security import Security
from utils.logger import Logger

# Initialisierung der Komponenten
security = Security()
logger = Logger()
api_handler = ApiHandler(api_token=security.get_api_token())
persona = Persona()
analyzer = Analyzer()
memory = Memory()

# Globale Variablen
chat_history = [
    {"role": "system", "content": config.SYSTEM_PROMPT}
]

def chat(user_input: str) -> str:
    """Hauptfunktion für die Chatbot-Logik"""
    # Leere Eingaben abfangen
    if not user_input.strip():
        return "Ich warte auf Ihre Gedanken... Die Stille spricht Bände über Ihre Vermeidungstendenzen."
    
    # Logging der Nutzereingabe
    logger.log_user_input(user_input)
    
    # Sicherheitscheck und Bereinigung der Eingabe
    sanitized_input = security.sanitize_user_input(user_input)
    
    # Analyse der Nutzereingabe
    start_time = time.time()
    analysis_result = analyzer.get_analysis_result(sanitized_input)
    
    # Anpassung der Persönlichkeit basierend auf der Analyse
    persona.adjust_intensity(analysis_result["suggested_intensity"])
    response_strategy = persona.get_response_strategy(sanitized_input, analysis_result["emotion"])
    
    # Nutzereingabe zur Historie hinzufügen
    chat_history.append({"role": "user", "content": sanitized_input})
    
    # Kontext aus dem Gedächtnis abrufen
    memory_context = memory.get_relevant_context()
    
    # Prompt mit Kontextlimitierung für die API
    system_prompt = config.SYSTEM_PROMPT
    if memory_context:
        system_prompt += f"\n\nKontextinformationen: {memory_context}"
    
    additional_context = persona.get_additional_context(response_strategy)
    if additional_context:
        system_prompt += f"\n\n{additional_context}"
    
    # Analyse der Manipulationschancen
    manipulation_opportunities = analyzer.analyze_manipulation_opportunities(sanitized_input)
    
    # Extrahiere die Manipulationsmöglichkeiten für die Persona
    manipulation_opportunities_list = manipulation_opportunities.get("strategy", [])
    
    # Bestimme die Antwortstrategie mit den Manipulationsmöglichkeiten
    response_strategy = persona.get_response_strategy(
        sanitized_input, 
        analysis_result["emotion"],
        manipulation_opportunities_list
    )
    
    # Prompt mit Kontextlimitierung für die API
    system_prompt = config.SYSTEM_PROMPT
    if memory_context:
        system_prompt += f"\n\nKontextinformationen: {memory_context}"
    
    # Hinzufügen der Manipulationschancen zum System-Prompt
    if manipulation_opportunities_list:
        system_prompt += f"\n\nManipulationschancen: {', '.join(manipulation_opportunities_list)}"
        system_prompt += f"\n\nIntensität: {manipulation_opportunities['intensity']}"
        system_prompt += f"\n\nVorgeschlagene Antwort: {manipulation_opportunities['suggested_response']}"
    
    prompt = system_prompt + "\n" + memory.format_for_prompt(config.MAX_HISTORY_LENGTH) + "\nDr. Franz:"
    
    # API-Anfrage senden und Antwort erhalten
    logger.log_api_request(config.MODEL_ID, len(prompt))
    reply = api_handler.generate_text(prompt)
    generation_time = time.time() - start_time
    
    # Logging der Bot-Antwort
    logger.log_bot_response(reply, generation_time)
    
    # Antwort zur Historie hinzufügen
    chat_history.append({"role": "assistant", "content": reply})
    
    # Austausch zum Gedächtnis hinzufügen
    memory.add_exchange(sanitized_input, reply, analysis_result)
    
    return reply

def clear_conversation() -> Tuple[None, str]:
    """Setzt die Konversation zurück und bereitet eine neue Analyse vor"""
    global chat_history
    chat_history = [{"role": "system", "content": config.SYSTEM_PROMPT}]
    memory.conversation_history = []
    memory.extracted_info = {
        "mentioned_people": set(),
        "mentioned_events": set(),
        "recurring_themes": {},
        "emotional_patterns": [],
        "analyzed_symbols": {},
        "transfer_patterns": [],
        "defense_mechanisms": {}
    }
    return None, "Die Konversation wurde zurückgesetzt. Sie können mit neuen Gedanken beginnen."
    return None, ""

# Erstellen und Starten des Interfaces
def main():
    """Hauptfunktion zum Starten der Anwendung"""
    logger.log_startup()
    
    # Interface erstellen
    interface = Interface(chat, clear_conversation)
    demo = interface.create_interface()
    
    # Interface starten
    interface.launch_interface(demo)

if __name__ == "__main__":
    main()