Dr_Frank / app.py
Frajosgro's picture
Update app.py
01dc99c verified
"""
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()