227 lines
No EOL
7.8 KiB
Python
227 lines
No EOL
7.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Testskript zum Erstellen eines Workflows mit Prompt und Datei über den Gateway.
|
|
"""
|
|
|
|
import requests
|
|
import json
|
|
import os
|
|
import time
|
|
import sys
|
|
from datetime import datetime
|
|
|
|
# Konfiguration
|
|
API_BASE_URL = "http://localhost:8000" # Anpassen an deine Gateway-URL
|
|
API_TOKEN = "your_api_token_here" # Dein API-Token
|
|
|
|
# Headers für Authentifizierung
|
|
HEADERS = {
|
|
"Authorization": f"Bearer {API_TOKEN}",
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
def log_message(message):
|
|
"""Gibt eine formatierte Nachricht mit Zeitstempel aus"""
|
|
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
print(f"[{timestamp}] {message}")
|
|
|
|
def upload_file(file_path):
|
|
"""Lädt eine Datei hoch und gibt die Datei-ID zurück"""
|
|
log_message(f"Lade Datei hoch: {file_path}")
|
|
|
|
if not os.path.exists(file_path):
|
|
log_message(f"FEHLER: Datei nicht gefunden: {file_path}")
|
|
return None
|
|
|
|
# Multipart-Formular für Datei-Upload vorbereiten
|
|
file_name = os.path.basename(file_path)
|
|
files = {
|
|
'file': (file_name, open(file_path, 'rb'), 'application/octet-stream')
|
|
}
|
|
|
|
# Datei hochladen
|
|
upload_url = f"{API_BASE_URL}/api/files/upload"
|
|
response = requests.post(
|
|
upload_url,
|
|
headers={"Authorization": f"Bearer {API_TOKEN}"}, # Nur Authorization-Header
|
|
files=files
|
|
)
|
|
|
|
if response.status_code != 200:
|
|
log_message(f"FEHLER: Datei-Upload fehlgeschlagen. Status: {response.status_code}")
|
|
log_message(f"Response: {response.text}")
|
|
return None
|
|
|
|
# Datei-ID extrahieren
|
|
file_data = response.json()
|
|
file_id = file_data.get("id")
|
|
log_message(f"Datei erfolgreich hochgeladen. ID: {file_id}")
|
|
|
|
return file_id
|
|
|
|
def create_workflow(prompt, file_id=None):
|
|
"""Erstellt einen neuen Workflow mit Prompt und optionaler Datei"""
|
|
log_message("Erstelle neuen Workflow...")
|
|
|
|
# Nachricht für den Workflow vorbereiten
|
|
user_input = {
|
|
"message": prompt
|
|
}
|
|
|
|
# Wenn eine Datei-ID vorhanden ist, füge sie hinzu
|
|
if file_id:
|
|
user_input["additional_files"] = [file_id]
|
|
|
|
# Workflow erstellen
|
|
workflow_url = f"{API_BASE_URL}/api/workflows/user-input"
|
|
response = requests.post(
|
|
workflow_url,
|
|
headers=HEADERS,
|
|
json=user_input
|
|
)
|
|
|
|
if response.status_code >= 400:
|
|
log_message(f"FEHLER: Workflow-Erstellung fehlgeschlagen. Status: {response.status_code}")
|
|
log_message(f"Response: {response.text}")
|
|
return None
|
|
|
|
# Workflow-ID extrahieren
|
|
workflow_data = response.json()
|
|
workflow_id = workflow_data.get("workflow_id")
|
|
log_message(f"Workflow erfolgreich erstellt. ID: {workflow_id}")
|
|
|
|
return workflow_id
|
|
|
|
def poll_workflow_status(workflow_id, max_attempts=20, delay=2):
|
|
"""Fragt den Status eines Workflows ab und wartet bis zur Fertigstellung"""
|
|
log_message(f"Prüfe Status des Workflows {workflow_id}...")
|
|
|
|
for attempt in range(1, max_attempts + 1):
|
|
status_url = f"{API_BASE_URL}/api/workflows/{workflow_id}/status"
|
|
response = requests.get(
|
|
status_url,
|
|
headers=HEADERS
|
|
)
|
|
|
|
if response.status_code != 200:
|
|
log_message(f"FEHLER: Status-Abfrage fehlgeschlagen. Status: {response.status_code}")
|
|
continue
|
|
|
|
status_data = response.json()
|
|
current_status = status_data.get("status")
|
|
log_message(f"Workflow-Status: {current_status} (Versuch {attempt}/{max_attempts})")
|
|
|
|
if current_status in ["completed", "stopped", "failed"]:
|
|
log_message(f"Workflow ist abgeschlossen mit Status: {current_status}")
|
|
return status_data
|
|
|
|
time.sleep(delay)
|
|
|
|
log_message(f"Maximale Anzahl von Versuchen erreicht. Letzter Status: {current_status}")
|
|
return None
|
|
|
|
def get_workflow_messages(workflow_id):
|
|
"""Ruft alle Nachrichten eines Workflows ab"""
|
|
log_message(f"Hole Nachrichten für Workflow {workflow_id}...")
|
|
|
|
messages_url = f"{API_BASE_URL}/api/workflows/{workflow_id}/messages"
|
|
response = requests.get(
|
|
messages_url,
|
|
headers=HEADERS
|
|
)
|
|
|
|
if response.status_code != 200:
|
|
log_message(f"FEHLER: Abrufen der Nachrichten fehlgeschlagen. Status: {response.status_code}")
|
|
return []
|
|
|
|
messages = response.json()
|
|
log_message(f"{len(messages)} Nachrichten gefunden.")
|
|
|
|
return messages
|
|
|
|
def print_workflow_results(workflow_id):
|
|
"""Gibt die Ergebnisse eines Workflows aus"""
|
|
log_message("=== WORKFLOW-ERGEBNISSE ===")
|
|
|
|
# Status abrufen
|
|
status_url = f"{API_BASE_URL}/api/workflows/{workflow_id}/status"
|
|
status_response = requests.get(status_url, headers=HEADERS)
|
|
|
|
if status_response.status_code == 200:
|
|
status_data = status_response.json()
|
|
log_message(f"Workflow-Name: {status_data.get('name')}")
|
|
log_message(f"Status: {status_data.get('status')}")
|
|
log_message(f"Gestartet: {status_data.get('started_at')}")
|
|
log_message(f"Letzte Aktivität: {status_data.get('last_activity')}")
|
|
|
|
# Nachrichten abrufen und ausgeben
|
|
messages = get_workflow_messages(workflow_id)
|
|
log_message(f"Anzahl der Nachrichten: {len(messages)}")
|
|
|
|
for i, msg in enumerate(messages, 1):
|
|
log_message(f"--- Nachricht {i} ---")
|
|
log_message(f"Rolle: {msg.get('role')}")
|
|
|
|
# Inhalt gekürzt ausgeben (maximal ersten 200 Zeichen)
|
|
content = msg.get('content', '')
|
|
if content:
|
|
if len(content) > 200:
|
|
log_message(f"Inhalt: {content[:200]}... [gekürzt]")
|
|
else:
|
|
log_message(f"Inhalt: {content}")
|
|
|
|
# Anzahl der Dokumente ausgeben
|
|
docs = msg.get('documents', [])
|
|
if docs:
|
|
log_message(f"Dokumente: {len(docs)}")
|
|
for j, doc in enumerate(docs, 1):
|
|
source = doc.get('source', {})
|
|
doc_name = source.get('name', f"Dokument {j}")
|
|
log_message(f" - {doc_name}")
|
|
|
|
def main():
|
|
"""Hauptfunktion zum Testen des Workflows"""
|
|
# Beispiel-Datei zum Hochladen (Pfad anpassen)
|
|
file_path = "example.csv" # Hier den Pfad zu deiner Testdatei angeben
|
|
|
|
# Prompt für den Workflow
|
|
test_prompt = """Bitte analysiere die angehängte Datei und erstelle eine Zusammenfassung der wichtigsten Informationen.
|
|
Wenn es sich um eine CSV-Datei handelt, identifiziere die Spalten und gib mir einen Überblick über die enthaltenen Daten.
|
|
Erstelle außerdem eine Visualisierung, wenn du Zahlenwerte in der Datei findest."""
|
|
|
|
try:
|
|
# Datei hochladen
|
|
file_id = upload_file(file_path)
|
|
if not file_id:
|
|
log_message("Test abgebrochen: Datei konnte nicht hochgeladen werden.")
|
|
return False
|
|
|
|
# Workflow erstellen
|
|
workflow_id = create_workflow(test_prompt, file_id)
|
|
if not workflow_id:
|
|
log_message("Test abgebrochen: Workflow konnte nicht erstellt werden.")
|
|
return False
|
|
|
|
# Auf Abschluss des Workflows warten
|
|
workflow_status = poll_workflow_status(workflow_id)
|
|
if not workflow_status:
|
|
log_message("Test unvollständig: Timeout beim Warten auf Workflow-Abschluss.")
|
|
# Weiter machen, um zumindest Teilergebnisse zu sehen
|
|
|
|
# Ergebnisse ausgeben
|
|
print_workflow_results(workflow_id)
|
|
|
|
log_message("Test abgeschlossen.")
|
|
return True
|
|
|
|
except Exception as e:
|
|
log_message(f"FEHLER: Unerwartete Ausnahme: {str(e)}")
|
|
import traceback
|
|
log_message(traceback.format_exc())
|
|
return False
|
|
|
|
if __name__ == "__main__":
|
|
log_message("=== WORKFLOW-TEST GESTARTET ===")
|
|
success = main()
|
|
log_message(f"=== WORKFLOW-TEST BEENDET (Erfolgreich: {success}) ===")
|
|
sys.exit(0 if success else 1) |