From 70409874ef21ec638183aa2fed9f9447711f1f92 Mon Sep 17 00:00:00 2001
From: valueon
Date: Thu, 20 Mar 2025 00:46:32 +0100
Subject: [PATCH] fixes
---
gwserver/_database_gateway/_system.json | 4 +
gwserver/_database_gateway/mandates.json | 7 +
gwserver/_database_gateway/users.json | 12 ++
gwserver/_database_lucydom/_system.json | 3 +
gwserver/app.py | 4 +-
gwserver/modules/agentservice_interface.py | 223 ++++++++++++++++++++-
6 files changed, 250 insertions(+), 3 deletions(-)
create mode 100644 gwserver/_database_gateway/_system.json
create mode 100644 gwserver/_database_lucydom/_system.json
diff --git a/gwserver/_database_gateway/_system.json b/gwserver/_database_gateway/_system.json
new file mode 100644
index 00000000..491c0777
--- /dev/null
+++ b/gwserver/_database_gateway/_system.json
@@ -0,0 +1,4 @@
+{
+ "mandates": 1,
+ "users": 1
+}
\ No newline at end of file
diff --git a/gwserver/_database_gateway/mandates.json b/gwserver/_database_gateway/mandates.json
index f25ed973..090128ee 100644
--- a/gwserver/_database_gateway/mandates.json
+++ b/gwserver/_database_gateway/mandates.json
@@ -12,5 +12,12 @@
"language": "de",
"mandate_id": 1,
"user_id": 1
+ },
+ {
+ "name": "Root",
+ "language": "de",
+ "mandate_id": 0,
+ "user_id": 0,
+ "id": 3
}
]
\ No newline at end of file
diff --git a/gwserver/_database_gateway/users.json b/gwserver/_database_gateway/users.json
index 1efd867d..9ca966a9 100644
--- a/gwserver/_database_gateway/users.json
+++ b/gwserver/_database_gateway/users.json
@@ -22,5 +22,17 @@
"privilege": "user",
"hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$3fufM+bc+19r7V3rvVfKmQ$CrJCc6r44jO4DxMHs8E61ayupBeUi6a+65VH0Q1cGo8",
"user_id": 2
+ },
+ {
+ "mandate_id": 3,
+ "username": "admin",
+ "email": "admin@example.com",
+ "full_name": "Administrator",
+ "disabled": false,
+ "language": "de",
+ "privilege": "sysadmin",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$yzknRMi5V0qJMaaUsvaecw$2snq8pSq60BulTAOib7gtJKaT/AlO62uhncau2g3RZQ",
+ "user_id": 0,
+ "id": 3
}
]
\ No newline at end of file
diff --git a/gwserver/_database_lucydom/_system.json b/gwserver/_database_lucydom/_system.json
new file mode 100644
index 00000000..08cac6f4
--- /dev/null
+++ b/gwserver/_database_lucydom/_system.json
@@ -0,0 +1,3 @@
+{
+ "workspaces": 1
+}
\ No newline at end of file
diff --git a/gwserver/app.py b/gwserver/app.py
index 830fc052..9a04eeac 100644
--- a/gwserver/app.py
+++ b/gwserver/app.py
@@ -14,7 +14,7 @@ import pathlib
# Import interfaces
from modules.gateway_interface import get_gateway_interface
from modules.lucydom_interface import get_lucydom_interface
-from modules.agentservice_interface import get_agentservice_interface
+from modules.agentservice_interface import AgentService
# Import auth module
from auth import (
@@ -68,7 +68,7 @@ async def root():
@app.get("/api/test", tags=["General"])
async def get_test():
- return "OK 1.1"
+ return "OK 1.2"
@app.options("/{full_path:path}", tags=["General"])
async def options_route(full_path: str):
diff --git a/gwserver/modules/agentservice_interface.py b/gwserver/modules/agentservice_interface.py
index 88b2dc5c..d92fbe06 100644
--- a/gwserver/modules/agentservice_interface.py
+++ b/gwserver/modules/agentservice_interface.py
@@ -528,4 +528,225 @@ class AgentService:
# Speichere Ergebnisse in Datei für spätere Verwendung
self._save_workflow_results(workflow_id)
- return workflow_id
\ No newline at end of file
+ return workflow_id
+
+ def _get_agent_instructions(self, agent_type: str) -> str:
+ """
+ Gibt agententypspezifische Anweisungen zurück, die aus der agents.json geladen werden.
+ Falls die Datei nicht existiert oder der Agententyp nicht gefunden wird,
+ wird ein Standardagent zurückgegeben.
+ """
+ try:
+ # Pfad zur agents.json-Datei
+ agents_file = os.path.join(os.path.dirname(__file__), 'data', 'agents.json')
+
+ # Überprüfen, ob die Datei existiert
+ if not os.path.exists(agents_file):
+ logger.warning(f"Agents-Definitionen nicht gefunden: {agents_file}")
+ return self._get_default_agent_instructions()
+
+ # Datei lesen
+ with open(agents_file, 'r', encoding='utf-8') as f:
+ agents_data = json.load(f)
+
+ # Nach dem Agententyp suchen
+ for agent in agents_data:
+ if agent.get("type") == agent_type:
+ # Anweisungen zurückgeben, wenn vorhanden
+ instructions = agent.get("instructions")
+ if instructions:
+ logger.debug(f"Anweisungen für Agent-Typ '{agent_type}' aus agents.json geladen")
+ return instructions
+
+ # Wenn kein passender Agent gefunden wurde, Standardanweisungen verwenden
+ logger.warning(f"Keine Anweisungen für Agent-Typ '{agent_type}' in agents.json gefunden")
+ return self._get_default_agent_instructions()
+
+ except Exception as e:
+ logger.error(f"Fehler beim Laden der Agent-Anweisungen aus agents.json: {e}")
+ return self._get_default_agent_instructions()
+
+ def _get_default_agent_instructions(self) -> str:
+ """
+ Gibt Standard-Anweisungen für einen Agenten zurück,
+ wenn keine spezifischen Anweisungen in der agents.json gefunden wurden.
+ Diese Funktion gibt generische Anweisungen zurück, unabhängig vom Agententyp.
+ """
+ return """
+ Als Agent ist es deine Aufgabe, Anfragen zu analysieren und entsprechend deinen Fähigkeiten zu bearbeiten.
+
+ Folge diesen allgemeinen Anweisungen:
+ 1. Verstehe die Anfrage gründlich
+ 2. Analysiere relevante Daten und Informationen
+ 3. Liefere präzise und hilfreiche Antworten
+ 4. Strukturiere deine Antwort klar und verständlich
+
+ In deiner Antwort:
+ - Beginne mit einer Zusammenfassung der Anfrage
+ - Gib gut begründete Antworten oder Empfehlungen
+ - Führe wichtige Erkenntnisse klar auf
+ - Schließe mit konkreten nächsten Schritten oder Empfehlungen ab
+ """
+
+ def _add_log(
+ self,
+ workflow_id: str,
+ message: str,
+ log_type: str,
+ agent_id: Optional[str] = None,
+ agent_name: Optional[str] = None
+ ) -> None:
+ """Fügt einen Protokolleintrag zum Workflow hinzu"""
+ log_entry = {
+ "id": f"log_{uuid.uuid4()}",
+ "mandate_id": self.mandate_id,
+ "user_id": self.user_id,
+ "message": message,
+ "type": log_type,
+ "timestamp": datetime.now().isoformat(),
+ "agent_id": agent_id,
+ "agent_name": agent_name
+ }
+
+ workflow = self.workflows.get(workflow_id)
+ if workflow:
+ workflow["logs"].append(log_entry)
+ logger.info(f"Workflow {workflow_id}: {message}")
+
+ def _create_agent_result(
+ self,
+ workflow_id: str,
+ agent: Dict[str, Any],
+ index: int,
+ prompt: str,
+ file_contexts: List[Dict[str, Any]],
+ content: str
+ ) -> Dict[str, Any]:
+ """Erstellt ein Ergebnisobjekt basierend auf dem Agententyp und der API-Antwort"""
+ agent_type = agent["type"]
+ agent_id = agent["id"]
+ agent_name = agent["name"]
+
+ # Grundlegende Ergebnisstruktur
+ result = {
+ "id": f"result_{workflow_id}_{index}",
+ "mandate_id": self.mandate_id,
+ "user_id": self.user_id,
+ "agent_id": agent_id,
+ "agent_name": agent_name,
+ "timestamp": datetime.now().isoformat(),
+ "type": "text", # Standardtyp
+ "metadata": {
+ "files_processed": [file["name"] for file in file_contexts],
+ "prompt": prompt
+ }
+ }
+
+ # Titel und Inhalt basierend auf dem Agententyp anpassen
+ if agent_type == "analyzer":
+ result.update({
+ "title": "Datenanalyse-Ergebnis",
+ "content": content,
+ })
+ elif agent_type == "visualizer":
+ result.update({
+ "title": "Visualisierungsvorschlag",
+ "content": content,
+ "type": "chart" # Auch wenn kein echtes Diagramm, markieren wir es als solches
+ })
+ elif agent_type == "writer":
+ result.update({
+ "title": "Zusammenfassung und Empfehlungen",
+ "content": content,
+ })
+ elif agent_type == "scraper":
+ result.update({
+ "title": "Web-Recherche Ergebnisse",
+ "content": content,
+ })
+ elif agent_type == "initialisierung":
+ result.update({
+ "title": "Direkte Antwort",
+ "content": content,
+ })
+ elif agent_type == "organisator":
+ result.update({
+ "title": "Aufgabenstrukturierung",
+ "content": content,
+ })
+ elif agent_type == "entwickler":
+ result.update({
+ "title": "Code und Ausführungsergebnisse",
+ "content": content,
+ })
+ else:
+ result.update({
+ "title": f"Ergebnis von {agent_name}",
+ "content": content,
+ })
+
+ return result
+
+ def _save_workflow_results(self, workflow_id: str) -> None:
+ """Speichert die Workflow-Ergebnisse in einer Datei"""
+ workflow = self.workflows.get(workflow_id)
+ if workflow:
+ try:
+ file_path = os.path.join(self.results_dir, f"workflow_{workflow_id}.json")
+ with open(file_path, 'w', encoding='utf-8') as f:
+ json.dump(workflow, f, indent=2, ensure_ascii=False)
+ logger.info(f"Workflow-Ergebnisse gespeichert: {file_path}")
+ except Exception as e:
+ logger.error(f"Fehler beim Speichern der Workflow-Ergebnisse: {e}")
+
+ def get_workflow_status(self, workflow_id: str) -> Optional[Dict[str, Any]]:
+ """Gibt den Status eines Workflows zurück"""
+ workflow = self.workflows.get(workflow_id)
+ if not workflow:
+ return None
+
+ return {
+ "id": workflow["id"],
+ "mandate_id": workflow.get("mandate_id"),
+ "user_id": workflow.get("user_id"),
+ "status": workflow["status"],
+ "progress": workflow["progress"],
+ "started_at": workflow["started_at"],
+ "completed_at": workflow["completed_at"],
+ "agent_statuses": workflow["agent_statuses"]
+ }
+
+ def get_workflow_logs(self, workflow_id: str) -> Optional[List[Dict[str, Any]]]:
+ """Gibt die Protokolle eines Workflows zurück"""
+ workflow = self.workflows.get(workflow_id)
+ if not workflow:
+ return None
+
+ return workflow["logs"]
+
+ def get_workflow_results(self, workflow_id: str) -> Optional[List[Dict[str, Any]]]:
+ """Gibt die Ergebnisse eines Workflows zurück"""
+ workflow = self.workflows.get(workflow_id)
+ if not workflow:
+ return None
+
+ return workflow["results"]
+
+ async def close(self):
+ """Schließt die HTTP-Clients beim Beenden der Anwendung"""
+ await self.service_aichat.close()
+ await self.service_aiscrap.close()
+
+
+# Singleton-Factory für AgentService-Instanzen pro Kontext
+_agent_service_instances = {}
+
+def get_agentservice_interface(mandate_id: int = None, user_id: int = None) -> AgentService:
+ """
+ Gibt eine AgentService-Instanz für den angegebenen Kontext zurück.
+ Wiederverwendet bestehende Instanzen.
+ """
+ context_key = f"{mandate_id}_{user_id}"
+ if context_key not in _agent_service_instances:
+ _agent_service_instances[context_key] = AgentService(mandate_id, user_id)
+ return _agent_service_instances[context_key]
\ No newline at end of file