182 lines
No EOL
6.2 KiB
Python
182 lines
No EOL
6.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Backend-Testskript für die Workflow-Funktionalität mit Prompt und Datei.
|
|
Dieses Skript testet die Backend-Komponenten direkt, ohne über die API zu gehen.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import asyncio
|
|
import uuid
|
|
from datetime import datetime
|
|
import logging
|
|
import json
|
|
|
|
# Pfad zum Projekt-Root hinzufügen, damit Module gefunden werden
|
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
|
|
|
# Logging konfigurieren
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='[%(asctime)s] %(levelname)s: %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S'
|
|
)
|
|
logger = logging.getLogger("backend_test")
|
|
|
|
# Imports aus dem Backend
|
|
from modules.lucydom_interface import get_lucydom_interface
|
|
from modules.chat import get_chat_manager
|
|
|
|
# Testparameter
|
|
TEST_MANDATE_ID = 1
|
|
TEST_USER_ID = 1
|
|
TEST_FILE_PATH = "d:/temp/prompt_a1.txt" # Pfad zur Testdatei anpassen
|
|
TEST_FILE_PATH1 = "d:/temp/LF-Nutshell.png" # Pfad zur Testdatei anpassen
|
|
TEST_PROMPT = """Bitte analysiere die angehängte Datei und erstelle eine Zusammenfassung der wichtigsten Informationen.
|
|
Erstelle außerdem eine Visualisierung, wenn du Zahlenwerte in der Datei findest."""
|
|
|
|
async def upload_test_file():
|
|
"""Lädt eine Testdatei ins Backend hoch und gibt die Datei-ID zurück"""
|
|
logger.info(f"Lade Testdatei hoch: {TEST_FILE_PATH}")
|
|
|
|
# LucyDOM-Interface initialisieren
|
|
lucy_interface = get_lucydom_interface(TEST_MANDATE_ID, TEST_USER_ID)
|
|
|
|
try:
|
|
# Prüfen, ob die Datei existiert
|
|
if not os.path.exists(TEST_FILE_PATH):
|
|
logger.error(f"Testdatei nicht gefunden: {TEST_FILE_PATH}")
|
|
return None
|
|
|
|
# Datei lesen
|
|
with open(TEST_FILE_PATH, 'rb') as f:
|
|
file_content = f.read()
|
|
|
|
# Dateinamen extrahieren
|
|
file_name = os.path.basename(TEST_FILE_PATH)
|
|
|
|
# Datei hochladen
|
|
file_meta = lucy_interface.save_uploaded_file(file_content, file_name)
|
|
file_id = file_meta.get('id')
|
|
|
|
logger.info(f"Datei erfolgreich hochgeladen. ID: {file_id}")
|
|
return file_meta
|
|
|
|
except Exception as e:
|
|
logger.error(f"Fehler beim Hochladen der Datei: {str(e)}")
|
|
return None
|
|
|
|
async def create_test_workflow(file_meta):
|
|
"""Erstellt einen Testworkflow mit dem angegebenen Prompt und der Datei"""
|
|
logger.info("Erstelle Testworkflow...")
|
|
|
|
# Chat-Manager initialisieren
|
|
chat_manager = get_chat_manager(TEST_MANDATE_ID, TEST_USER_ID)
|
|
|
|
# Nachrichtenobjekt vorbereiten
|
|
message = {
|
|
"role": "user",
|
|
"content": TEST_PROMPT,
|
|
"documents": [file_meta] if file_meta else []
|
|
}
|
|
|
|
try:
|
|
# Workflow erstellen (neue Workflow-ID wird automatisch generiert)
|
|
workflow = await chat_manager.workflow_integrate_userinput(message)
|
|
|
|
if not workflow:
|
|
logger.error("Workflow konnte nicht erstellt werden")
|
|
return None
|
|
|
|
workflow_id = workflow.get("id")
|
|
logger.info(f"Workflow erfolgreich erstellt. ID: {workflow_id}")
|
|
return workflow
|
|
|
|
except Exception as e:
|
|
logger.error(f"Fehler bei der Workflow-Erstellung: {str(e)}")
|
|
import traceback
|
|
logger.error(traceback.format_exc())
|
|
return None
|
|
|
|
def print_workflow_details(workflow):
|
|
"""Gibt Details zum Workflow aus"""
|
|
if not workflow:
|
|
logger.warning("Kein Workflow zum Anzeigen vorhanden")
|
|
return
|
|
|
|
logger.info("=== WORKFLOW-DETAILS ===")
|
|
logger.info(f"ID: {workflow.get('id')}")
|
|
logger.info(f"Name: {workflow.get('name')}")
|
|
logger.info(f"Status: {workflow.get('status')}")
|
|
logger.info(f"Mandanten-ID: {workflow.get('mandate_id')}")
|
|
logger.info(f"Benutzer-ID: {workflow.get('user_id')}")
|
|
logger.info(f"Gestartet: {workflow.get('started_at')}")
|
|
logger.info(f"Letzte Aktivität: {workflow.get('last_activity')}")
|
|
|
|
# Nachrichten ausgeben
|
|
messages = workflow.get("messages", [])
|
|
logger.info(f"Anzahl der Nachrichten: {len(messages)}")
|
|
|
|
for i, msg in enumerate(messages, 1):
|
|
logger.info(f"--- Nachricht {i} ---")
|
|
logger.info(f"ID: {msg.get('id')}")
|
|
logger.info(f"Rolle: {msg.get('role')}")
|
|
logger.info(f"Sequenz: {msg.get('sequence_no')}")
|
|
logger.info(f"Agent: {msg.get('agent_name')}")
|
|
|
|
# Inhalt gekürzt ausgeben
|
|
content = msg.get('content', '')
|
|
if content:
|
|
preview = content[:200] + ('...' if len(content) > 200 else '')
|
|
logger.info(f"Inhalt: {preview}")
|
|
|
|
# Dokumente auflisten
|
|
documents = msg.get('documents', [])
|
|
if documents:
|
|
logger.info(f"Dokumente: {len(documents)}")
|
|
for j, doc in enumerate(documents, 1):
|
|
source = doc.get('source', {})
|
|
doc_name = source.get('name', f"Dokument {j}")
|
|
logger.info(f" - {doc_name}")
|
|
|
|
# Logs ausgeben
|
|
logs = workflow.get("logs", [])
|
|
logger.info(f"Anzahl der Logs: {len(logs)}")
|
|
if len(logs) > 0:
|
|
logger.info("Letzte 3 Logs:")
|
|
for log in logs[-3:]:
|
|
logger.info(f" - [{log.get('timestamp')}] {log.get('message')}")
|
|
|
|
async def main():
|
|
"""Hauptfunktion für den Backend-Test"""
|
|
logger.info("=== BACKEND WORKFLOW-TEST GESTARTET ===")
|
|
|
|
try:
|
|
# Schritt 1: Testdatei hochladen
|
|
file_meta = await upload_test_file()
|
|
if not file_meta:
|
|
logger.error("Test abgebrochen: Datei konnte nicht hochgeladen werden")
|
|
return False
|
|
|
|
# Schritt 2: Workflow erstellen
|
|
workflow = await create_test_workflow(file_meta)
|
|
if not workflow:
|
|
logger.error("Test abgebrochen: Workflow konnte nicht erstellt werden")
|
|
return False
|
|
|
|
# Schritt 3: Workflow-Details ausgeben
|
|
print_workflow_details(workflow)
|
|
|
|
logger.info("=== BACKEND WORKFLOW-TEST ERFOLGREICH BEENDET ===")
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(f"Unerwarteter Fehler im Test: {str(e)}")
|
|
import traceback
|
|
logger.error(traceback.format_exc())
|
|
return False
|
|
|
|
if __name__ == "__main__":
|
|
# Event-Loop ausführen
|
|
success = asyncio.run(main())
|
|
sys.exit(0 if success else 1) |