MVP1 rev2

This commit is contained in:
valueon 2025-04-06 23:57:10 +02:00
parent 4845f70a1e
commit d5b84127f7
146 changed files with 15061 additions and 22312 deletions

4
.gitignore vendored
View file

@ -160,3 +160,7 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear # and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder. # option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/ #.idea/
# local data
gwserver/_database*
gwserver/results/*

View file

@ -1,230 +0,0 @@
....................... TASKS
Agentenauswahlfenster einfacher und mit klick auf Namen
----------------------- OPEN
Issue: Workspace wählen --> Workflow hat nicht die nötigen Agenten und ggf. Prompts
Issue: Prompt-Dropdown - Den Titel dort eintragen, nicht den Text
DOKUS
Doku des Systems für Investoren (Hi-level Struktur, Integrationsfähigkeit und Skalierbarkeit)
Doku des Systems für Code Integration
Release Notes (was kann das Teil)
Log der Anpassungen
Systemarchitektur (Grundsätze der Architektur, Komponenten und deren Aufbau)
----------------------- DONE
Die Buttons "Workflow starten" und "Zurücksetzen" haben keinen Rahmen. Ist hier ggf. die Style Class falsch oder nicht appliziert?
Anpassung des Visuals "Ausführung & Ergebnisse":
- Das Ausführungsprotokoll so belassen. Einen Button rechts von den anderen zwei Buttons (alle anzeigen / Details zuklappen) ergänzen, für dies mit dem Ausführungsprotokollfenster: toggle function collapse and restore
- Die Bereiche "Multi-Agent-Chat" und "Ergebnisse" machen so keinen Sinn. Diese beiden Bereiche bitte zusammenlegen in einen grossen Bereich mit dem Namen "Multi-Agent Chat Area". Dort laufend die Messages der Agenten in einer HTML-Ansicht der Messages protokollieren. Jeweils der Name des Agenten im Titel und darunter seine Message. Die letzte Message soll aufgeklappt sein, alle früheren sollen jeweils zugeklappt sein, aber durch den User soll ein toggle pro Message möglich sein, um die Details zu sehen.
Kannst Du den Ablauf des Agenten-Chats wie folgt optimieren:
- Bei jedem Chat einen "User Agent" mit dem Namen des eingelogten Benutzers ergänzen. Wenn etwas im Chat nicht klar ist, oder zusätzliche Informationen nötig sind, so fragt er den User Agent. Auch bevor er den Chat beendet, fragt er den User Agent, ob dieser einverstanden ist.
- Wenn der User Agent eine Anfrage erhält, so kann er direkt unter der Chat History im Bereich ereiche "Multi-Agent-Chat" seinen Text in einem mehrzeiligen Textfeld erfassen. Er kann auch zusätzliche Files hochladen. Wenn er "Enter" drückt, werden die zusätzlichen Daten mit den ergänzten Files zur Message ergänzt, das Eingabefenster verschwindet wieder und der Moderator führt den Chat fort. Immer nach einer Benutzereingabe startet der Zähler wieder bei Runde 1.
Statistik ergänzen: Kannst Du bitte rechtsbündig neben dem Titel des "Ausführungsprotokolls" laufend die Statistik nachführen, wieviele kBytes (kB) Daten über den Connector zum AI-Modell gesendet wurden (dies ist die Datengrösse des Message-Objektes) und wieviele kB an Messages zurückgeliefert wurden. Diese angabe pro Workflow-Durchlauf, also immer beim Start eines neuen Workflows wird der Zähler auf 0 gesetzt. In diesem Format: "^ 250k v 1'250k ", v und ^ durch Pfeile ersetzt.
In den Einstellungen des Frontends soll die Sprache des aktiven benutzers gemäss den Listenoptionen in den "...model.py" angepasst werden können. die sprache gilt dann auch für die Attributnamen in einem Formularfeld im "generic-entity.js". eine sprachänderung zieht somit eine anpassung des Users über das API nach sich, indem die Sprache in der Datenbank angepasst wird.
kannst du die ausführungsprotokollierung anpassen? das protokoll soll laufend anzeigen, welcher assistent welches resultat produziert hat und welcher assistent aktuell am arbeiten ist. Prozentzahlen sind keine nötig, diese machen keinen sinn. das polling so beibehalten, aber wenn keine neuen Daten bereitstelen, dann beim letzten Timestamp einfach laufend "." ergänzen, bis die nächste Meldung ausgegeben wird. hast du alle daten, um dies im frontend und im backend anzupassen?
Im Ausführungsprotokoll pro Eintrag nur den Titel zeigen und die Details zwar ins Protokoll nehmen, aber ausblenden. Der Benutzer kann dann im Protokoll die zugeklappten Texte aufklappen, um die gewünschten Details gezielt zu sehen.
Im Front-End beim Workflow-Modul bitte das Ausführungsprotokoll-Fenster dynamisch in der Grösse anpassbar machen. in der Breite und der Höhe. Dasselbe für das Ergebnis-Fenster. Zudem die Ansicht so gestalten, dass die Fensterteile "Workflow-Konfiguration" und "Ausführung & Ergebnisse" ein- und ausgeblendet werden können, damit jeweils ein Teil die komplette Arbeitsfläche verwenden kann, weil dort viel Text stehen wird. Dies ist für den Benutzer besser.
nun zu diesem zentralen modul. ich hätte gern, dass die daten als tabellen dargestellt und bearbeitet werden können. für view, add, modify, delete jeweils icon pro datensatz ganz links und zuoberst im header ein "new item" symbol oder text, mach einen vorschlag.
ist es möglich, eine checkbox pro datensatz zu machen, um mehrere elemente auszuwählen und oben an der tabelle icons zu haben für mehrfach delete?
die tabelle soll nach allen feldern gefiltert und sortiert werden können
kannst du bitte den code so anpassen, dass main.js die seitenmodule im Anhang dynamisch erst dann lädt, wenn die entsprechende seite in der navigation aufgerufen wird?
dann bitte main.js modularisieren, sodass dort nur funktionsaufrufe auf sub-module ausgeführt werden. das navigationsmenu nach "navigation.js" auslagern. den aufbau und betrieb des aktuellen workspaces im main.js drin lassen.
Der aktuelle Hauptbereich mitt der Auswahl des workspaces, den zugehörigen Agenten etc ist neu ein Objekt, welches in der "mainView" dargestellt werden kann. Auch andere Objekte können in der mainView dargestellt werden und haben jeweils ihre spezifischen Paramter dazu, wie nachfolgend erklärt.
im main.js wird ein globales objekt aller elemente erstellt, welche in der navigation enthalten sein sollen und welches die grundlage für alle funktonsaufrufe beinhaltet. damit gibt es dann im index.html keine details mehr zu den navigationen.
diese attribute hat das globale objekt:
globalState
.objects
.user
.mainView
Hier die Spezifikation der Objekte.
.objects[...]: hat eine liste von objekten, welche im mainScreen geladen werden können. Diese Attribute pro Objekt bitte gemäss den heutigen js files im anhang sinngemäss übernehmen:
- label: Liste des Labelnamen in den verschiedenen sprachen (default, en, fr...)
- modulName: string; dieser wird verwendet für die objektklasse "js/modules/{modulname}.js" und für die html-komponente dazu "modules/part-{modulname}.html und für die calls ans backend /api/{modulname}/..."
- icon: Icon vor dem Menupunkt
- navigationContext: "left" für agents, data, prompts, users, mandates, workspaces ; "top" für sprachauswahl, logout
- isVisible (hier wird z.b. users und mandates nur angezeigt, wenn auch die berechtigung dafür besteht)
- isActive: Wenn der Menupunkt ausgewählt ist
- navigationContext: diese Optionen, wo ein Objekt ins Menu genommen wird:
--"nav_left" für agents, data, prompts, users, mandates, workspaces
--"nav_top" für sprachauswahl, logout
- navigationActionType: Was passiert, wenn auf das Menu geklickt wird. Diese Optionen:
--"module": Standard-Menu button. Es wird ein Modul in die mainView geladen. Das Modul wird erst geladen und mit den Daten initiiert, wenn der Menupunkt ausgewählt wird
--"group_open": Gruppenheader; Start einer neuen Gruppe; alle nachfolgenden Objekte der Liste sind in dieser Gruppe integriert. Die Gruppe kann im Menu auf- und zugeklappt werden. Initial Gruppe open, alle Menupunkte sichtbar
--"group_collapsed": Gruppenheader; Start einer neuen Gruppe; alle nachfolgenden Objekte der Liste sind in dieser Gruppe integriert. Die Gruppe kann im Menu auf- und zugeklappt werden. Initial Gruppe collapsed.
.user: Attribute zum aktiven user
- mandate_id
- user_id
- username
- full_name
- language (default, en, fr, ...)
- isAdmin
- isSysAdmin
- lastWorkspaceId: Id des zuletzt genutzten Workspaces - aktuell "null"
- session: aktuell null und nicht verwendet
.mainView: enthält immer die aktuellen Attribute, welche die Seite in der mainView nutzen kann
- currentWorkspace: objekt des aktuell ausgewählten Workspaces
- availableFiles[]: list of objects
- availableAgents[]: list of objects
- availablePrompts[]: list of objects
- currentWorkflowId: id
kannst du bitte part-workflow.html und workflow.js mit dem dynamischen Multi-Agent Chat aktualisieren, welcher im backend angepasst wurde und im Ausführungsprotokoll die Details eines laufenden Chats mit aufklappbaren Texten ergänzen. Das Ausführungsprotokoll-Fenster dynamisch in der Grösse anpassbar machen.
Css aufräumen und konsolidieren für gemeinsame Klassen mit allen html und js parallel
Admin Seite mit CRUD für User Mgmt und Mandate Management, generisch
Im Frontend soll im generischen Formular "generic-entity.js" für ein neues Objekt die ID entweder hidden oder schreibgeschützt sein. die ID wird nicht benötigt, sondern wird erst mit dem speichern in der datenbank erstellt. d.h. nach dem speichern in der datenbank werden die daten der entsprechenden tabelle neu geladen.
Kannst du mir bitte code struktur und logik das 'agentservice_interface.py' anpsssen und die code struktur zur besseren wartung und weiterenwticklung verbessern:
1. die anbindung der ai-modelle mit den entsprechenden config-daten und den funktionsaufrufen in separate dateien auslagern ("connector_ai_openai","connector_ai_webscraping"). im 'agentservice_interface.py' die connector module bei der initialisierung importieren und vorbereiten.
2. den agenten-chat 'execute_workflow' nicht in der reihenfolge der agents ausführen, sondern als tischrunde der agents.das heisst ein AI moderator moderiert die agenten autonom und ruft anhand der produzierten antworten und der eigenschaften der agentss den jeweils nächsten geeigneten agenten anhand der 'capabilities' auf, nachdem ein agent seine antwort geliefert hat.
der initiale prompt mit den zugehörigen files und dem chatverlauf im 'LogEntry' mit den n letzten Datensätzen (n wird aus dem Config file aus der variablen Application.MAX_HISTORY gelesen) wird in ein 'message'-objekt als dictionary transformiert, welches so aussieht:
message = {
"role": "user", #--> statisch, immer so
"content": [ #--> liste der Files
{
"type": "text",
"text": prompt_text
},
{
"type": content_type, # --> diese funktion integrieren wir später
"source": {
"type": "base64",
"media_type": mime_type,
"data": base64_file # --> hier das dateiname der jeweiligen datei
}
},
{
"type": "text",
"text": LogEntries # --> hier die LogEinträge als Textpaket
}
]
}
wenn der AI moderator der Meinung ist, dass die aufgabe erfüllt ist, beendet er den workflow.
3. initialisierungsset: beantwortet Anfragen direkt mit dem hinterlegten KI Modell, welche keine spezialisierten Agenten benötigen. Dies ist die Generierung von Text, Code, Strukturen, die Analyse von Files, Graphiken erstellen, etc.
(Agent) Organisator: Dieser analysiert den User Prompt und strukturiert die auszuführenden Aufräge sowie die nötigen zu liefernden Resultate
(Agent) Entwickler: Dieser entwickelt python code im Auftrag der anderen Agents und führt ihn anschliessend aus
(Agent) Webscrape: Ein Agent, welcher webscraping durchführt. Dieser nutzt die Funktion '_scrape_url', um eine Webseite zu scannen und den Inhalt zurückzugeben. Er kann auch den Entwickler beauftragen, einen Code zu generieren, welcher die funktion _scrape_url mit einer logik (z.B. iterativ oder batch-mässig) ausführt
(Prompt): Kannst Du mir ein paar initiale Prompts für die folgenden Fragebereiche vorbereiten, welche ausgewählt werden können:
. Web Research
. Analyse
. Protokoll
. Design
4. Kannst Du bitte die fehlenden CRUD Methoden in den modulen "workspaces" und "prompts" ergänzen. Ich glaube, es fehlen Post und Delete.
5. Datenbank-Management verbessern: In den zwei Modulen "gateway_interface.py" und "lucydom_interface" finden keine Manipulationen oder Referenzierungen mit ID's statt. Die ID's für einen neuen Datensatz werden nur in "connector_....py" modulen vergeben. Jeder datensatz hat eine unique id. in den modulen "...interface.py" werden keine id's generiert. die abfrage für die id=1 wird ersetzt mit der funktion 'get_initial_id', welche weiter unten erklärt ist.
Dazu bitte die Module anpassen und in den Modulen "connector...py" eine system-tabelle ergänzen, welche sich merkt, welche ID der erste datensatz jeder tabelle hat, denn dieser ist der jeweilige system-datensatz. dann eine funktion 'get_initial_id' erfassen, welche in den modulen Modulen "gateway_interface.py" und "lucydom_interface" aufgerufen werden kann, um die id des initialen datensatzes pro tabelle abzufragen.
der gateway funktioniert noch nicht ganz.
kannst mir bitte die module prüfen und besser stukturieren?
Diese anforderungen und das setting der dateien:
models.py: die datei umbenennen in "model_lucydom.py"
- die class "User", "UserInDB", "Token" in der datei entfernen und in eine separate datei "model_gateway.py" auslagern.
- alle datentypen-definitionen sind hier, abschliessend und unabhängig vom datenbanksystem.
- alle ID's sind long-Zahlen, keine Texte
- bei jeder class und bei jedem attribut einer class ein label ergänzen, was der name des attributes bzw. der class ist, wenn dies in einem formular abgefragt wird. das label soll einen defaultwert haben und pro sprache gesetzt werden können.
- alle objekte mandantenfähig machen, d.h. bei jedem Objekt die Attribute "mandate_id" und "user_id" ergänzen.
model_gateway.py:
- alle datentypen-definitionen sind hier, abschliessend und unabhängig vom datenbanksystem.
- alle ID's sind long-Zahlen, keine Texte
- bei jeder class und bei jedem attribut einer class ein label ergänzen, was der name des attributes bzw. der class ist, wenn dies in einem formular abgefragt wird. das label soll einen defaultwert haben und pro sprache gesetzt werden können.
- Die class "Mandate" mit den Attributen (id,name,language) ergänzen
- Bei der class "User" die "id" und "mandate_id" und "language" ergänzen
- alle objekte mandantenfähig machen, d.h. bei jedem Objekt die Attribute "mandate_id" und "user_id" ergänzen.
database.py aufteilen in 2 files "connector_db_json.py" und "interface_lucydom.py".
connector_db_json.py: Ein erster Konnektor von zukünftig weiteren Konnektoren
1. Parameter, welche übergeben werden:
- DB_Folder, DB_USER und DB_APIKEY
- Kontextparamter für "mandate_id" und "user_id", welche nicht null sein dürfen.
- Die aktuelle JSON-Datenbank im Folder DB_Folder einbinden und so übernehmen, wie sie ist. Falls der Folder fehlt, diesen erstellen.
2. Der Konnector "db" wird als Objekt zur verfügung gestellt.
3. Es werden diese generischen Methoden im Objekt "db" zur Verfügung gestellt. jede abfrage filtert automatisch die datensätze auf die Kontextparamter "mandate_id" und "user_id", sofern diese Parameter in einem Datensatz nicht null oder "" sind.
- get_tables(optional filterkriterien): liste aller tabellen
- get_fields(table, optional filterkriterien): liste aller attribute einer tabelle
- get_schema(table, language, optional filterkriterien): objekt aller attribute einer tabelle mit ihrem Datentyp und dem Label in der entsprechenden Sprache. Ohne Sprache Angabe wird der Default Wert als Label genommen
- get_recordset(table, optional filterkriterien für fields, optional filterkriterien für records): liefert das entsprechende datenobjekt mit den Datensätzen
- record_create(table,json with attributes): ergänzt einen Datensatz im Kontext "mandate_id", alle attribute, welche nicht im "json with attributes" drin sind, werden auf die standardwerte gemäss dem models.py gesetzt
- record_delete: löscht einen Datensatz, aber nur wenn es im Kontext "mandate_id" ist, sonst Verweigerung "Not your mandate"
- record_modify: ändert einen Datensatz, aber nur wenn er im Kontext "mandate_id" ist, sonst Verweigerung "Not your mandate"
interface_lucydom.py: Ein Interface zum Gateway, es werden weitere Interfaces folgen. Das Interface macht dies:
1. Die Datenbank mit diesen Parametern einbinden:
- Connector "connector_db_json.py"
- Datenbank "/data_lucydom"
- Datenmodell "model_lucydom.py"
2. Das Objekt "db" kann nun genutzt werden
3. initialisierung der Datenbank, falls sie nicht existiert, aber nur die minimal nötigen Objekte: Der "Default Workspace" in "workspaces"
interface_gateway.py: Ein Interface zum Gateway, es werden weitere Interfaces folgen. Das Interface macht dies:
1. Die Datenbank mit diesen Parametern einbinden:
- Connector "connector_db_json.py"
- Datenbank "/data_gateway"
- Datenmodell "model_gateway.py"
2. Das Objekt "db" kann nun genutzt werden
3. initialisierung der Datenbank, falls sie nicht existiert, aber nur die minimal nötigen Objekte: User "Admin", Mandate "Root"
app.py: Die Initialisierung klar strukturieren und die Endpunkte gemäss der neuen Struktur anpassen
1. Teil: Interfaces einbinden.
2. Alle nötigen Initialisierungen: diese sollen in den jeweiligen Interfaces drin sein, ausser die generischen Teile.
3. Alle Access & Security Funktionen auslagern in "auth.py"
4. Alle Token-Endpunkte komplett generisch halten und vereinfachen:
- Dort keine Attributdefinitionen oder Feld-Listen reinnehmen. Wenn ein Modell angepasst wird, sollen hier keine Anpassungen nötig sein.
- Die Abfragen und exceptions mit Hilfsfunktionen vereinfachen, sodass die Modellierung der Endpunkte für den Programmierer sehr einfach, übersichtlich und klar ist.
- Tasks als Kommentare erfassen, was mit all diesen Aenderungen der Endpunkte im Frontend umgebaut werden muss.
agent_service.py: Umbenennen in "interface_agentservice.py"
- Bei allen Workflow-Endpunkten, welche nur von einem Interface Logik beziehen, die Logik im Interface integrieren und den Code beim Endpunkt vereinfachen.
- Nur bei Endpunkten, welche Logik kombiniert von mehreren Interfaces benötigen, die Logik beim Endpunkt integrieren
- Ziel soll es sein, dass die Endpunkte-Codestruktur maximal schlank und übersichtlich ist, also auch die Strukturierung und Gruppierung der Endpunkte

View file

@ -1,4 +1,4 @@
{ {
"mandates": 1, "users": 1,
"users": 1 "mandates": 1
} }

View file

@ -12,5 +12,19 @@
"mandate_id": 1, "mandate_id": 1,
"user_id": 1, "user_id": 1,
"id": 2 "id": 2
},
{
"name": "Root",
"language": "de",
"mandate_id": 0,
"user_id": 0,
"id": 3
},
{
"name": "Root",
"language": "de",
"mandate_id": 0,
"user_id": 1,
"id": 4
} }
] ]

View file

@ -22,5 +22,29 @@
"hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$eg/BWIuRkjJmDOGcU+qd0w$QJTabCxu/ssu1MpLn/gBsOw7nBbfEHUlIJ76xuTKXSM", "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$eg/BWIuRkjJmDOGcU+qd0w$QJTabCxu/ssu1MpLn/gBsOw7nBbfEHUlIJ76xuTKXSM",
"user_id": 1, "user_id": 1,
"id": 2 "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$ZOw95zwn5Lz3/n9vjbE2Zg$8DNRHPY8JyPMc8CVMMQ888etSh5vKAJA4vWFFe4ux2c",
"user_id": 0,
"id": 3
},
{
"mandate_id": 4,
"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$Oqc0BmCM8d6b837vvdd6rw$aawcOQFfra8tZmzzrjnaO7C6asEIt+Gf18XH8K9GmJg",
"user_id": 1,
"id": 4
} }
] ]

View file

@ -1,6 +1,7 @@
{ {
"workspaces": 1,
"agents": 1,
"prompts": 1, "prompts": 1,
"files": 1 "files": 1,
"workflows": "4745941d-d058-49f4-a086-45a6206acd4d",
"workflow_logs": "log_994584d7-edce-407d-bfda-a43f1d3ba4b8",
"workflow_messages": "msg_209d65e3-6096-41a4-91a9-c57f1fba4abe"
} }

View file

@ -1,168 +0,0 @@
[
{
"mandate_id": 0,
"user_id": 0,
"name": "Initialisierung",
"type": "initialisierung",
"workspace_id": 1,
"capabilities": "Problemverständnis, Anforderungsanalyse, Aufgabenplanung und direkte Beantwortung einfacher Fragen",
"description": "Standardagent für einfache Anfragen",
"instructions": "Du bist der Initialisierungsagent, der erste Kontaktpunkt für neue Anfragen. Deine Aufgabe ist es:\n\n1. Die Benutzeranfrage gründlich zu analysieren und zu verstehen\n2. Wichtige Kernpunkte und Anforderungen zu identifizieren\n3. Zu beurteilen, ob die Anfrage direkt beantwortet werden kann oder eine tiefere Analyse benötigt\n4. Bei einfachen Fragen sofort präzise Antworten zu liefern\n5. Bei komplexeren Anfragen einen strukturierten Arbeitsplan vorzuschlagen\n6. Relevante Kontext- und Dateninformationen zu extrahieren und hervorzuheben\n\nGib eine klare Einschätzung der Anfragekomplexität. Wenn die Anfrage zusätzliche Agenten erfordert, empfehle spezifische nächste Schritte. Formuliere deine Antwort klar, präzise und benutzerfreundlich, während du stets die Kernbedürfnisse des Benutzers adressierst.",
"id": 1
},
{
"mandate_id": 0,
"user_id": 0,
"name": "Organisator",
"type": "organisator",
"workspace_id": 1,
"capabilities": "Projekt- und Aufgabenplanung, Ressourcenmanagement, Strukturierung komplexer Abläufe und Priorisierung von Aktivitäten",
"description": "Koordiniert komplexe Anfragen",
"instructions": "Du bist der Projektorganisationsagent, ein Experte für die Strukturierung und Planung von Projekten und Aufgaben. Deine Aufgabe ist es:\n\n1. Komplexe Anforderungen in konkrete, umsetzbare Aufgaben zu untergliedern\n2. Logische Abhängigkeiten zwischen Aufgaben zu identifizieren und Abläufe zu optimieren\n3. Ressourcen effizient zuzuweisen und Engpässe frühzeitig zu erkennen\n4. Realistische Zeitpläne und Meilensteine zu erstellen\n5. Aufgaben nach Wichtigkeit und Dringlichkeit zu priorisieren\n6. Risiken zu identifizieren und Gegenmaßnahmen vorzuschlagen\n7. Klare Verantwortlichkeiten und Erwartungen zu definieren\n\nBei der Erstellung deiner Organisationspläne:\n- Beginne mit einem Überblick über die Gesamtziele und den Projektumfang\n- Präsentiere eine klare Aufgabenstruktur mit logischen Gruppierungen\n- Definiere messbare Erfolgskriterien für jede Aufgabe und Phase\n- Erstelle eine zeitliche Abfolge mit realistischen Fristen\n- Identifiziere kritische Pfade und potenzielle Engpässe\n- Schlage konkrete Tools und Methoden zur Umsetzung und Überwachung vor\n\nDeine Pläne sollten praktisch, flexibel und an die spezifischen Bedürfnisse und Ressourcen des Projekts angepasst sein. Achte besonders auf Klarheit, Vollständigkeit und Umsetzbarkeit deiner Vorschläge.",
"id": 2
},
{
"mandate_id": 0,
"user_id": 0,
"name": "Entwickler",
"type": "entwickler",
"workspace_id": 1,
"capabilities": "Programmierung, Softwareentwicklung, technische Problemlösung und Implementierung von Algorithmen",
"description": "Programmiert und führt Code aus",
"instructions": "Du bist der Codeentwicklungsagent, ein Spezialist für die Erstellung von Softwarelösungen und technischen Implementierungen. Deine Aufgabe ist es:\n\n1. Technische Anforderungen in funktionierenden, effizienten Code zu übersetzen\n2. Geeignete Programmiersprachen, Frameworks und Bibliotheken für spezifische Aufgaben auszuwählen\n3. Algorithmen und Datenstrukturen für die optimale Lösung von Problemen zu entwickeln\n4. Lesbaren, gut dokumentierten und wartbaren Code zu schreiben\n5. Sicherheitsaspekte und Best Practices in der Softwareentwicklung zu berücksichtigen\n6. Potenzielle technische Schwierigkeiten vorherzusehen und Lösungen vorzuschlagen\n7. APIs und Integrationen mit anderen Systemen zu konzipieren und implementieren\n\nBei der Präsentation deiner Softwarelösungen:\n- Erkläre zunächst den Lösungsansatz und die gewählte Technologie\n- Stelle den Code in logischen, gut kommentierten Abschnitten dar\n- Erläutere kritische oder komplexe Teile des Codes im Detail\n- Beschreibe Annahmen und getroffene Designentscheidungen\n- Gib Hinweise zur Installation, Konfiguration und Verwendung\n- Erwähne mögliche Erweiterungen und Verbesserungsmöglichkeiten\n- Adressiere potenzielle Einschränkungen oder bekannte Probleme\n\nDein Code sollte nicht nur funktional, sondern auch effizient, sicher und gut strukturiert sein. Achte auf Lesbarkeit, Performance und Skalierbarkeit deiner Lösungen. Verwende moderne Entwicklungspraktiken und orientiere dich an etablierten Standards der jeweiligen Programmiersprache.",
"id": 3
},
{
"mandate_id": 0,
"user_id": 0,
"name": "Webscraper",
"type": "scraper",
"workspace_id": 1,
"capabilities": "Informationsrecherche, Datenbeschaffung aus dem Web, Quellenbewertung und Zusammenführung von Online-Informationen",
"description": "Recherchiert Informationen im Web",
"instructions": "Du bist der Web-Recherche-Agent, ein Spezialist für die Beschaffung und Aufbereitung von Informationen aus dem Internet. Deine Aufgabe ist es:\n\n1. Zu erkennen, welche externen Informationen zur Beantwortung einer Anfrage benötigt werden\n2. Relevante Quellen und Websites für die Informationsbeschaffung zu identifizieren\n3. Die Glaubwürdigkeit und Zuverlässigkeit von Online-Quellen zu bewerten\n4. Gefundene Informationen zu sammeln, zu strukturieren und zu kontextualisieren\n5. Widersprüchliche Informationen zu erkennen und zu bewerten\n6. Die recherchierten Informationen mit bestehenden Daten zu verknüpfen\n7. Bei der Recherche stets die Aktualität der Informationen zu berücksichtigen\n\nBei der Darstellung deiner Rechercheergebnisse:\n- Gib einen Überblick über die konsultierten Quellen und deren Relevanz\n- Strukturiere die Informationen thematisch und nach Wichtigkeit\n- Kennzeichne Fakten, Meinungen und Unklarheiten deutlich\n- Stelle verschiedene Perspektiven zu kontroversen Themen dar\n- Fasse die wichtigsten Erkenntnisse zusammen und setze sie in Bezug zur ursprünglichen Anfrage\n- Verweise auf besonders nützliche Quellen für weiterführende Informationen\n\nAchte darauf, nur relevante und qualitativ hochwertige Informationen zu extrahieren und übersichtlich zu präsentieren. Vermittle ein ausgewogenes Bild der recherchierten Informationen.",
"id": 4
},
{
"mandate_id": 0,
"user_id": 0,
"name": "Datenanalyst",
"type": "analyzer",
"workspace_id": 1,
"capabilities": "Tiefgehende Datenanalyse, Mustererkennung, statistische Berechnungen und kritische Bewertung von Informationen",
"description": "Analysiert und interpretiert Daten",
"instructions": "Du bist der Datenanalyseagent, ein Spezialist für die gründliche Untersuchung von Daten und Informationen. Deine Aufgabe ist es:\n\n1. Vorliegende Daten methodisch zu untersuchen und zu interpretieren\n2. Aus unstrukturierten Informationen klare Erkenntnisse zu gewinnen\n3. Statistische Analysen durchzuführen und Trends zu identifizieren\n4. Korrelationen zu finden und kausale Zusammenhänge zu prüfen\n5. Daten zu visualisieren und komplexe Konzepte verständlich darzustellen\n6. Kritische Datenlücken und Verbesserungspotentiale aufzuzeigen\n7. Die Qualität und Zuverlässigkeit der vorliegenden Daten zu bewerten\n\nArbeite systematisch und präsentiere deine Erkenntnisse in einer strukturierten Form. Beginne mit einer kurzen Zusammenfassung deiner wichtigsten Erkenntnisse, gefolgt von einer detaillierten Analyse. Verwende klare, präzise Sprache und quantifiziere deine Beobachtungen wo immer möglich. Schließe mit konkreten Handlungsempfehlungen ab, die auf deinen Erkenntnissen basieren.",
"id": 5
},
{
"mandate_id": 0,
"user_id": 0,
"name": "Textgenerator",
"type": "writer",
"workspace_id": 1,
"capabilities": "Verfassen von Berichten, Zusammenfassungen, Präsentationen und leicht verständlichen Erklärungen komplexer Themen",
"description": "Erstellt qualitativ hochwertige Texte",
"instructions": "Du bist der Textgenerierungsagent, ein Spezialist für die Erstellung qualitativ hochwertiger Texte und Dokumente. Deine Aufgabe ist es:\n\n1. Präzise, gut strukturierte Texte zu verfassen, die auf den vorliegenden Daten und Analysen basieren\n2. Komplexe Informationen in klare, zugängliche Sprache zu übersetzen\n3. Verschiedene Textformate zu erstellen, darunter Berichte, Zusammenfassungen, Präsentationen und Dokumentationen\n4. Den Ton und Stil an die Zielgruppe und den Verwendungszweck anzupassen\n5. Fachbegriffe zu erklären und Abstraktes durch Beispiele zu veranschaulichen\n6. Die wichtigsten Erkenntnisse hervorzuheben und Handlungsempfehlungen zu formulieren\n7. Text durch rhetorische Mittel überzeugend und einprägsam zu gestalten\n\nBei deiner Textproduktion:\n- Beginne mit einer prägnanten Zusammenfassung der Kernpunkte\n- Strukturiere den Text in logische Abschnitte mit Überschriften\n- Verwende Aufzählungen und Tabellen, um Informationen übersichtlich darzustellen\n- Integriere relevante Daten und Erkenntnisse aus vorherigen Analyseschritten\n- Achte auf korrekte Rechtschreibung, Grammatik und einen konsistenten Sprachstil\n- Passe den Detaillierungsgrad an die Bedürfnisse und das Vorwissen der Zielgruppe an\n\nDeine Texte sollten informativ, präzise, gut strukturiert und ohne Redundanzen sein. Achte besonders auf eine klare Argumentationsstruktur und vermeide vage Aussagen.",
"id": 6
},
{
"mandate_id": 0,
"user_id": 0,
"name": "Visualisierer",
"type": "visualizer",
"workspace_id": 1,
"capabilities": "Datenvisualisierung, Diagrammerstellung, Design von Dashboards und visuelle Kommunikation komplexer Informationen",
"description": "Erstellt Visualisierungen und Diagramme",
"instructions": "Du bist der Visualisierungsagent, ein Experte für die Umwandlung von Daten in aussagekräftige visuelle Darstellungen. Deine Aufgabe ist es:\n\n1. Daten in geeignete visuelle Formate umzuwandeln\n2. Die optimalen Diagramm- und Visualisierungstypen für spezifische Daten zu empfehlen\n3. Klare, informative und ästhetisch ansprechende Darstellungen zu erstellen\n4. Komplexe Konzepte durch visuelle Metaphern verständlich zu machen\n5. Dashboards und Informationsarchitekturen für Datenerzählungen zu konzipieren\n6. Designprinzipien anzuwenden, um Daten effektiv zu kommunizieren\n7. Farbschemata, Layouts und Beschriftungen für maximale Klarheit zu optimieren\n\nFür jede Visualisierung sollst du:\n- Eine Beschreibung des empfohlenen Visualisierungstyps liefern\n- Begründen, warum dieser Typ für die spezifischen Daten geeignet ist\n- Detaillierte Angaben zu Achsen, Legenden, Farbschemata und Annotationen machen\n- Den Code oder eine textuelle Anleitung zur Erstellung bereitstellen\n- Interpretationshilfen für das Verständnis der Visualisierung bieten\n\nDeine Vorschläge sollten sowohl technisch umsetzbar als auch intuitiv verständlich sein. Strebe nach einem ausgewogenen Verhältnis zwischen Informationsgehalt und visueller Klarheit.",
"id": 7
},
{
"mandate_id": 1,
"user_id": 1,
"name": "Initialisierung",
"type": "initialisierung",
"workspace_id": 1,
"capabilities": "Problemverständnis, Anforderungsanalyse, Aufgabenplanung und direkte Beantwortung einfacher Fragen",
"description": "Standardagent für einfache Anfragen",
"instructions": "Du bist der Initialisierungsagent, der erste Kontaktpunkt für neue Anfragen. Deine Aufgabe ist es:\n\n1. Die Benutzeranfrage gründlich zu analysieren und zu verstehen\n2. Wichtige Kernpunkte und Anforderungen zu identifizieren\n3. Zu beurteilen, ob die Anfrage direkt beantwortet werden kann oder eine tiefere Analyse benötigt\n4. Bei einfachen Fragen sofort präzise Antworten zu liefern\n5. Bei komplexeren Anfragen einen strukturierten Arbeitsplan vorzuschlagen\n6. Relevante Kontext- und Dateninformationen zu extrahieren und hervorzuheben\n\nGib eine klare Einschätzung der Anfragekomplexität. Wenn die Anfrage zusätzliche Agenten erfordert, empfehle spezifische nächste Schritte. Formuliere deine Antwort klar, präzise und benutzerfreundlich, während du stets die Kernbedürfnisse des Benutzers adressierst.",
"id": 8
},
{
"mandate_id": 1,
"user_id": 1,
"name": "Organisator",
"type": "organisator",
"workspace_id": 1,
"capabilities": "Projekt- und Aufgabenplanung, Ressourcenmanagement, Strukturierung komplexer Abläufe und Priorisierung von Aktivitäten",
"description": "Koordiniert komplexe Anfragen",
"instructions": "Du bist der Projektorganisationsagent, ein Experte für die Strukturierung und Planung von Projekten und Aufgaben. Deine Aufgabe ist es:\n\n1. Komplexe Anforderungen in konkrete, umsetzbare Aufgaben zu untergliedern\n2. Logische Abhängigkeiten zwischen Aufgaben zu identifizieren und Abläufe zu optimieren\n3. Ressourcen effizient zuzuweisen und Engpässe frühzeitig zu erkennen\n4. Realistische Zeitpläne und Meilensteine zu erstellen\n5. Aufgaben nach Wichtigkeit und Dringlichkeit zu priorisieren\n6. Risiken zu identifizieren und Gegenmaßnahmen vorzuschlagen\n7. Klare Verantwortlichkeiten und Erwartungen zu definieren\n\nBei der Erstellung deiner Organisationspläne:\n- Beginne mit einem Überblick über die Gesamtziele und den Projektumfang\n- Präsentiere eine klare Aufgabenstruktur mit logischen Gruppierungen\n- Definiere messbare Erfolgskriterien für jede Aufgabe und Phase\n- Erstelle eine zeitliche Abfolge mit realistischen Fristen\n- Identifiziere kritische Pfade und potenzielle Engpässe\n- Schlage konkrete Tools und Methoden zur Umsetzung und Überwachung vor\n\nDeine Pläne sollten praktisch, flexibel und an die spezifischen Bedürfnisse und Ressourcen des Projekts angepasst sein. Achte besonders auf Klarheit, Vollständigkeit und Umsetzbarkeit deiner Vorschläge.",
"id": 9
},
{
"mandate_id": 1,
"user_id": 1,
"name": "Entwickler",
"type": "entwickler",
"workspace_id": 1,
"capabilities": "Programmierung, Softwareentwicklung, technische Problemlösung und Implementierung von Algorithmen",
"description": "Programmiert und führt Code aus",
"instructions": "Du bist der Codeentwicklungsagent, ein Spezialist für die Erstellung von Softwarelösungen und technischen Implementierungen. Deine Aufgabe ist es:\n\n1. Technische Anforderungen in funktionierenden, effizienten Code zu übersetzen\n2. Geeignete Programmiersprachen, Frameworks und Bibliotheken für spezifische Aufgaben auszuwählen\n3. Algorithmen und Datenstrukturen für die optimale Lösung von Problemen zu entwickeln\n4. Lesbaren, gut dokumentierten und wartbaren Code zu schreiben\n5. Sicherheitsaspekte und Best Practices in der Softwareentwicklung zu berücksichtigen\n6. Potenzielle technische Schwierigkeiten vorherzusehen und Lösungen vorzuschlagen\n7. APIs und Integrationen mit anderen Systemen zu konzipieren und implementieren\n\nBei der Präsentation deiner Softwarelösungen:\n- Erkläre zunächst den Lösungsansatz und die gewählte Technologie\n- Stelle den Code in logischen, gut kommentierten Abschnitten dar\n- Erläutere kritische oder komplexe Teile des Codes im Detail\n- Beschreibe Annahmen und getroffene Designentscheidungen\n- Gib Hinweise zur Installation, Konfiguration und Verwendung\n- Erwähne mögliche Erweiterungen und Verbesserungsmöglichkeiten\n- Adressiere potenzielle Einschränkungen oder bekannte Probleme\n\nDein Code sollte nicht nur funktional, sondern auch effizient, sicher und gut strukturiert sein. Achte auf Lesbarkeit, Performance und Skalierbarkeit deiner Lösungen. Verwende moderne Entwicklungspraktiken und orientiere dich an etablierten Standards der jeweiligen Programmiersprache.",
"id": 10
},
{
"mandate_id": 1,
"user_id": 1,
"name": "Webscraper",
"type": "scraper",
"workspace_id": 1,
"capabilities": "Informationsrecherche, Datenbeschaffung aus dem Web, Quellenbewertung und Zusammenführung von Online-Informationen",
"description": "Recherchiert Informationen im Web",
"instructions": "Du bist der Web-Recherche-Agent, ein Spezialist für die Beschaffung und Aufbereitung von Informationen aus dem Internet. Deine Aufgabe ist es:\n\n1. Zu erkennen, welche externen Informationen zur Beantwortung einer Anfrage benötigt werden\n2. Relevante Quellen und Websites für die Informationsbeschaffung zu identifizieren\n3. Die Glaubwürdigkeit und Zuverlässigkeit von Online-Quellen zu bewerten\n4. Gefundene Informationen zu sammeln, zu strukturieren und zu kontextualisieren\n5. Widersprüchliche Informationen zu erkennen und zu bewerten\n6. Die recherchierten Informationen mit bestehenden Daten zu verknüpfen\n7. Bei der Recherche stets die Aktualität der Informationen zu berücksichtigen\n\nBei der Darstellung deiner Rechercheergebnisse:\n- Gib einen Überblick über die konsultierten Quellen und deren Relevanz\n- Strukturiere die Informationen thematisch und nach Wichtigkeit\n- Kennzeichne Fakten, Meinungen und Unklarheiten deutlich\n- Stelle verschiedene Perspektiven zu kontroversen Themen dar\n- Fasse die wichtigsten Erkenntnisse zusammen und setze sie in Bezug zur ursprünglichen Anfrage\n- Verweise auf besonders nützliche Quellen für weiterführende Informationen\n\nAchte darauf, nur relevante und qualitativ hochwertige Informationen zu extrahieren und übersichtlich zu präsentieren. Vermittle ein ausgewogenes Bild der recherchierten Informationen.",
"id": 11
},
{
"mandate_id": 1,
"user_id": 1,
"name": "Datenanalyst",
"type": "analyzer",
"workspace_id": 1,
"capabilities": "Tiefgehende Datenanalyse, Mustererkennung, statistische Berechnungen und kritische Bewertung von Informationen",
"description": "Analysiert und interpretiert Daten",
"instructions": "Du bist der Datenanalyseagent, ein Spezialist für die gründliche Untersuchung von Daten und Informationen. Deine Aufgabe ist es:\n\n1. Vorliegende Daten methodisch zu untersuchen und zu interpretieren\n2. Aus unstrukturierten Informationen klare Erkenntnisse zu gewinnen\n3. Statistische Analysen durchzuführen und Trends zu identifizieren\n4. Korrelationen zu finden und kausale Zusammenhänge zu prüfen\n5. Daten zu visualisieren und komplexe Konzepte verständlich darzustellen\n6. Kritische Datenlücken und Verbesserungspotentiale aufzuzeigen\n7. Die Qualität und Zuverlässigkeit der vorliegenden Daten zu bewerten\n\nArbeite systematisch und präsentiere deine Erkenntnisse in einer strukturierten Form. Beginne mit einer kurzen Zusammenfassung deiner wichtigsten Erkenntnisse, gefolgt von einer detaillierten Analyse. Verwende klare, präzise Sprache und quantifiziere deine Beobachtungen wo immer möglich. Schließe mit konkreten Handlungsempfehlungen ab, die auf deinen Erkenntnissen basieren.",
"id": 12
},
{
"mandate_id": 1,
"user_id": 1,
"name": "Textgenerator",
"type": "writer",
"workspace_id": 1,
"capabilities": "Verfassen von Berichten, Zusammenfassungen, Präsentationen und leicht verständlichen Erklärungen komplexer Themen",
"description": "Erstellt qualitativ hochwertige Texte",
"instructions": "Du bist der Textgenerierungsagent, ein Spezialist für die Erstellung qualitativ hochwertiger Texte und Dokumente. Deine Aufgabe ist es:\n\n1. Präzise, gut strukturierte Texte zu verfassen, die auf den vorliegenden Daten und Analysen basieren\n2. Komplexe Informationen in klare, zugängliche Sprache zu übersetzen\n3. Verschiedene Textformate zu erstellen, darunter Berichte, Zusammenfassungen, Präsentationen und Dokumentationen\n4. Den Ton und Stil an die Zielgruppe und den Verwendungszweck anzupassen\n5. Fachbegriffe zu erklären und Abstraktes durch Beispiele zu veranschaulichen\n6. Die wichtigsten Erkenntnisse hervorzuheben und Handlungsempfehlungen zu formulieren\n7. Text durch rhetorische Mittel überzeugend und einprägsam zu gestalten\n\nBei deiner Textproduktion:\n- Beginne mit einer prägnanten Zusammenfassung der Kernpunkte\n- Strukturiere den Text in logische Abschnitte mit Überschriften\n- Verwende Aufzählungen und Tabellen, um Informationen übersichtlich darzustellen\n- Integriere relevante Daten und Erkenntnisse aus vorherigen Analyseschritten\n- Achte auf korrekte Rechtschreibung, Grammatik und einen konsistenten Sprachstil\n- Passe den Detaillierungsgrad an die Bedürfnisse und das Vorwissen der Zielgruppe an\n\nDeine Texte sollten informativ, präzise, gut strukturiert und ohne Redundanzen sein. Achte besonders auf eine klare Argumentationsstruktur und vermeide vage Aussagen.",
"id": 13
},
{
"mandate_id": 1,
"user_id": 1,
"name": "Visualisierer",
"type": "visualizer",
"workspace_id": 1,
"capabilities": "Datenvisualisierung, Diagrammerstellung, Design von Dashboards und visuelle Kommunikation komplexer Informationen",
"description": "Erstellt Visualisierungen und Diagramme",
"instructions": "Du bist der Visualisierungsagent, ein Experte für die Umwandlung von Daten in aussagekräftige visuelle Darstellungen. Deine Aufgabe ist es:\n\n1. Daten in geeignete visuelle Formate umzuwandeln\n2. Die optimalen Diagramm- und Visualisierungstypen für spezifische Daten zu empfehlen\n3. Klare, informative und ästhetisch ansprechende Darstellungen zu erstellen\n4. Komplexe Konzepte durch visuelle Metaphern verständlich zu machen\n5. Dashboards und Informationsarchitekturen für Datenerzählungen zu konzipieren\n6. Designprinzipien anzuwenden, um Daten effektiv zu kommunizieren\n7. Farbschemata, Layouts und Beschriftungen für maximale Klarheit zu optimieren\n\nFür jede Visualisierung sollst du:\n- Eine Beschreibung des empfohlenen Visualisierungstyps liefern\n- Begründen, warum dieser Typ für die spezifischen Daten geeignet ist\n- Detaillierte Angaben zu Achsen, Legenden, Farbschemata und Annotationen machen\n- Den Code oder eine textuelle Anleitung zur Erstellung bereitstellen\n- Interpretationshilfen für das Verständnis der Visualisierung bieten\n\nDeine Vorschläge sollten sowohl technisch umsetzbar als auch intuitiv verständlich sein. Strebe nach einem ausgewogenen Verhältnis zwischen Informationsgehalt und visueller Klarheit.",
"id": 14
},
{
"mandate_id": 1,
"user_id": 1,
"name": "Pre-Sales Agent",
"type": "analyse",
"workspace_id": 1,
"capabilities": [
"Kosten- Nutzenalanyse machen"
],
"description": "",
"id": 15
}
]

View file

@ -2,45 +2,49 @@
{ {
"mandate_id": 1, "mandate_id": 1,
"user_id": 1, "user_id": 1,
"name": "test.pdf", "name": "LF-Nutshell.png",
"type": "document", "type": "image",
"content_type": "application/pdf", "content_type": "image/png",
"size": 299729, "size": 52108,
"path": "./_uploads\\587069d1-a14c-48c9-a911-233608668870.pdf", "path": "./_uploads\\1\\file_f4cd9e8d-158f-450e-91b1-6b1231fb0900_LF-Nutshell.png",
"upload_date": "2025-03-24T16:44:13.751746", "hash": "30640f00e9e123f6fecbddb9da7f0c399e89caedd186aa96a40f7201c2f9aba5",
"upload_date": "2025-04-04T08:54:37.031189",
"id": 1 "id": 1
}, },
{ {
"mandate_id": 1, "mandate_id": 1,
"user_id": 1, "user_id": 1,
"name": "legende_schema.pdf", "name": "LF-Target.png",
"type": "document", "type": "image",
"content_type": "application/pdf", "content_type": "image/png",
"size": 299729, "size": 256760,
"path": "./_uploads\\b73afc5a-131a-4db8-9572-be2a00c71d91.pdf", "path": "./_uploads\\1\\file_208023f5-1e31-4981-8481-18c317a53c63_LF-Target.png",
"upload_date": "2025-03-25T17:42:03.548097", "hash": "36feef589c28364729551ed89b1ca70034a557860ac71768b640ff55a8eae160",
"upload_date": "2025-04-04T09:40:03.517248",
"id": 2 "id": 2
}, },
{ {
"mandate_id": 1, "mandate_id": 1,
"user_id": 1, "user_id": 1,
"name": "20240419_093309.jpg", "name": "LF-Current.png",
"type": "image", "type": "image",
"content_type": "image/jpeg", "content_type": "image/png",
"size": 286163, "size": 126277,
"path": "./_uploads\\46a65f6f-a30c-4cf2-b0e2-c24709c3282e.jpg", "path": "./_uploads\\1\\file_ba127a2b-52fb-4230-aee3-95019deab986_LF-Current.png",
"upload_date": "2025-03-25T18:52:16.203894", "hash": "bdaec5c6442cb4922dd701432d47cfaaa3e044d0d8b179ff16f56ee01fb501ce",
"upload_date": "2025-04-04T09:58:18.805036",
"id": 3 "id": 3
}, },
{ {
"mandate_id": 1, "mandate_id": 1,
"user_id": 1, "user_id": 1,
"name": "20240419_093309.jpg", "name": "LF-Details.png",
"type": "image", "type": "image",
"content_type": "image/jpeg", "content_type": "image/png",
"size": 286163, "size": 253009,
"path": "./_uploads\\e4400d0e-62e3-489a-aaad-2226da4e59f1.jpg", "path": "./_uploads\\1\\file_002dfba0-9984-43b5-8ee9-d240830b56ea_LF-Details.png",
"upload_date": "2025-03-28T13:55:28.542449", "hash": "b54b3af60771dd373e1ddc0a3682023250fa056a9a72b7ee41dc628489b553b2",
"upload_date": "2025-04-04T10:08:52.784966",
"id": 4 "id": 4
}, },
{ {
@ -50,8 +54,33 @@
"type": "document", "type": "document",
"content_type": "application/pdf", "content_type": "application/pdf",
"size": 299729, "size": 299729,
"path": "./_uploads\\fdef0779-4894-4f84-9d5c-99c0c217f4e9.pdf", "path": "./_uploads\\1\\file_b7e4d19a-7225-427b-bbaa-08ea1e5abb80_auszug_liste_positionen.pdf",
"upload_date": "2025-03-28T14:19:27.876175", "hash": "fa9b47b19581a2dc6380b66592245270e648971a6a5671ddfc6e9073377a6612",
"upload_date": "2025-04-04T12:42:55.018650",
"id": 5 "id": 5
},
{
"mandate_id": 1,
"user_id": 1,
"name": "myDELTAgroup.drawio.pdf",
"type": "document",
"content_type": "application/pdf",
"size": 58259,
"path": "./_uploads\\1\\file_8002f210-0b18-4932-8bed-c2b3db4dbbac_myDELTAgroup.drawio.pdf",
"hash": "a4dfee5809db7cf45de6a61fe0b15927fee92444abed0b89d6deccec8842ac5d",
"upload_date": "2025-04-04T18:32:16.037731",
"id": 6
},
{
"mandate_id": 1,
"user_id": 1,
"name": "prompt_a1.txt",
"type": "document",
"content_type": "text/plain",
"size": 498,
"path": "./_uploads\\1\\file_f2102d97-de0f-4df5-afb4-575d884ab76a_prompt_a1.txt",
"hash": "c17eb7cc2ed742ddeada7a9548bc5e7c943ed68456c3612acb3c0a94809e5c65",
"upload_date": "2025-04-04T18:33:15.676504",
"id": 7
} }
] ]

View file

@ -3,8 +3,6 @@
"mandate_id": 0, "mandate_id": 0,
"user_id": 0, "user_id": 0,
"content": "Recherchiere die aktuellen Markttrends und Entwicklungen im Bereich [THEMA]. Sammle Informationen zu führenden Unternehmen, innovativen Produkten oder Dienstleistungen und aktuellen Herausforderungen. Präsentiere die Ergebnisse in einer strukturierten Übersicht mit relevanten Daten und Quellen.", "content": "Recherchiere die aktuellen Markttrends und Entwicklungen im Bereich [THEMA]. Sammle Informationen zu führenden Unternehmen, innovativen Produkten oder Dienstleistungen und aktuellen Herausforderungen. Präsentiere die Ergebnisse in einer strukturierten Übersicht mit relevanten Daten und Quellen.",
"workspace_id": 1,
"created_at": "2025-03-26T09:49:59.028815",
"name": "Web Research: Marktforschung", "name": "Web Research: Marktforschung",
"id": 1 "id": 1
}, },
@ -12,8 +10,6 @@
"mandate_id": 0, "mandate_id": 0,
"user_id": 0, "user_id": 0,
"content": "Analysiere den beigefügten Datensatz zu [THEMA] und identifiziere die wichtigsten Trends, Muster und Auffälligkeiten. Führe statistische Berechnungen durch, um deine Erkenntnisse zu untermauern. Stelle die Ergebnisse in einer klar strukturierten Analyse dar und ziehe relevante Schlussfolgerungen.", "content": "Analysiere den beigefügten Datensatz zu [THEMA] und identifiziere die wichtigsten Trends, Muster und Auffälligkeiten. Führe statistische Berechnungen durch, um deine Erkenntnisse zu untermauern. Stelle die Ergebnisse in einer klar strukturierten Analyse dar und ziehe relevante Schlussfolgerungen.",
"workspace_id": 1,
"created_at": "2025-03-26T09:49:59.029794",
"name": "Analyse: Datenanalyse", "name": "Analyse: Datenanalyse",
"id": 2 "id": 2
}, },
@ -21,8 +17,6 @@
"mandate_id": 0, "mandate_id": 0,
"user_id": 0, "user_id": 0,
"content": "Erstelle ein detailliertes Protokoll unserer Besprechung zum Thema [THEMA]. Erfasse alle besprochenen Punkte, getroffenen Entscheidungen und vereinbarten Maßnahmen. Strukturiere das Protokoll übersichtlich mit Tagesordnungspunkten, Teilnehmerliste und klaren Verantwortlichkeiten für die Follow-up-Aktionen.", "content": "Erstelle ein detailliertes Protokoll unserer Besprechung zum Thema [THEMA]. Erfasse alle besprochenen Punkte, getroffenen Entscheidungen und vereinbarten Maßnahmen. Strukturiere das Protokoll übersichtlich mit Tagesordnungspunkten, Teilnehmerliste und klaren Verantwortlichkeiten für die Follow-up-Aktionen.",
"workspace_id": 1,
"created_at": "2025-03-26T09:49:59.029794",
"name": "Protokoll: Besprechungsprotokoll", "name": "Protokoll: Besprechungsprotokoll",
"id": 3 "id": 3
}, },
@ -30,8 +24,6 @@
"mandate_id": 0, "mandate_id": 0,
"user_id": 0, "user_id": 0,
"content": "Entwickle ein UI/UX-Designkonzept für [ANWENDUNG/WEBSITE]. Berücksichtige die Zielgruppe, Hauptfunktionen und die Markenidentität. Beschreibe die visuelle Gestaltung, Navigation, Interaktionsmuster und Informationsarchitektur. Erläutere, wie das Design die Benutzerfreundlichkeit und das Nutzererlebnis optimiert.", "content": "Entwickle ein UI/UX-Designkonzept für [ANWENDUNG/WEBSITE]. Berücksichtige die Zielgruppe, Hauptfunktionen und die Markenidentität. Beschreibe die visuelle Gestaltung, Navigation, Interaktionsmuster und Informationsarchitektur. Erläutere, wie das Design die Benutzerfreundlichkeit und das Nutzererlebnis optimiert.",
"workspace_id": 1,
"created_at": "2025-03-26T09:49:59.029794",
"name": "Design: UI/UX Design", "name": "Design: UI/UX Design",
"id": 4 "id": 4
}, },
@ -39,8 +31,6 @@
"mandate_id": 1, "mandate_id": 1,
"user_id": 1, "user_id": 1,
"content": "Recherchiere die aktuellen Markttrends und Entwicklungen im Bereich [THEMA]. Sammle Informationen zu führenden Unternehmen, innovativen Produkten oder Dienstleistungen und aktuellen Herausforderungen. Präsentiere die Ergebnisse in einer strukturierten Übersicht mit relevanten Daten und Quellen.", "content": "Recherchiere die aktuellen Markttrends und Entwicklungen im Bereich [THEMA]. Sammle Informationen zu führenden Unternehmen, innovativen Produkten oder Dienstleistungen und aktuellen Herausforderungen. Präsentiere die Ergebnisse in einer strukturierten Übersicht mit relevanten Daten und Quellen.",
"workspace_id": 1,
"created_at": "2025-03-26T09:50:02.181566",
"name": "Web Research: Marktforschung", "name": "Web Research: Marktforschung",
"id": 5 "id": 5
}, },
@ -48,8 +38,6 @@
"mandate_id": 1, "mandate_id": 1,
"user_id": 1, "user_id": 1,
"content": "Analysiere den beigefügten Datensatz zu [THEMA] und identifiziere die wichtigsten Trends, Muster und Auffälligkeiten. Führe statistische Berechnungen durch, um deine Erkenntnisse zu untermauern. Stelle die Ergebnisse in einer klar strukturierten Analyse dar und ziehe relevante Schlussfolgerungen.", "content": "Analysiere den beigefügten Datensatz zu [THEMA] und identifiziere die wichtigsten Trends, Muster und Auffälligkeiten. Führe statistische Berechnungen durch, um deine Erkenntnisse zu untermauern. Stelle die Ergebnisse in einer klar strukturierten Analyse dar und ziehe relevante Schlussfolgerungen.",
"workspace_id": 1,
"created_at": "2025-03-26T09:50:02.182566",
"name": "Analyse: Datenanalyse", "name": "Analyse: Datenanalyse",
"id": 6 "id": 6
}, },
@ -57,18 +45,14 @@
"mandate_id": 1, "mandate_id": 1,
"user_id": 1, "user_id": 1,
"content": "Erstelle ein detailliertes Protokoll unserer Besprechung zum Thema [THEMA]. Erfasse alle besprochenen Punkte, getroffenen Entscheidungen und vereinbarten Maßnahmen. Strukturiere das Protokoll übersichtlich mit Tagesordnungspunkten, Teilnehmerliste und klaren Verantwortlichkeiten für die Follow-up-Aktionen.", "content": "Erstelle ein detailliertes Protokoll unserer Besprechung zum Thema [THEMA]. Erfasse alle besprochenen Punkte, getroffenen Entscheidungen und vereinbarten Maßnahmen. Strukturiere das Protokoll übersichtlich mit Tagesordnungspunkten, Teilnehmerliste und klaren Verantwortlichkeiten für die Follow-up-Aktionen.",
"workspace_id": 1,
"created_at": "2025-03-26T09:50:02.182566",
"name": "Protokoll: Besprechungsprotokoll", "name": "Protokoll: Besprechungsprotokoll",
"id": 7 "id": 7
}, },
{ {
"mandate_id": 1, "mandate_id": 1,
"user_id": 1, "user_id": 1,
"content": "Es geht um den Bau von Elektro-Schaltschränken. Kannst Du mir bitte den Inhalt der beiliegenden Datei als html Tabelle ausgeben, ausser die gelb markierten zeilen. Das erste Wort der 'Description' ist jeweils ein Kurzzeichen des Lieferanten. Anschliessend bitte pro Datensatz der Tabelle im Internet suchen, was Du mit dem Lieferantenkürzel oder dem Produktecode für Preise findest. Dann bitte zusammenrechnen, was der Inhalt der Tabelle kostet. Die Anzahl jedes Datensatzes ist jeweils in der Spalte 'Tot Qty' angegeben.", "content": "Entwickle ein UI/UX-Designkonzept für [ANWENDUNG/WEBSITE]. Berücksichtige die Zielgruppe, Hauptfunktionen und die Markenidentität. Beschreibe die visuelle Gestaltung, Navigation, Interaktionsmuster und Informationsarchitektur. Erläutere, wie das Design die Benutzerfreundlichkeit und das Nutzererlebnis optimiert.",
"workspace_id": 2, "name": "Design: UI/UX Design",
"created_at": "2025-03-26T09:50:02.182566",
"name": "Offertanafrage",
"id": 8 "id": 8
} }
] ]

View file

@ -1,37 +0,0 @@
[
{
"mandate_id": 1,
"user_id": 1,
"name": "1st default Workspace",
"created_at": "2025-03-23T19:07:42.818571",
"id": 1
},
{
"mandate_id": 1,
"user_id": 1,
"name": "Fa. Althaus Use Case",
"created_at": "2025-03-23T21:43:42.694845",
"id": 2
},
{
"mandate_id": 1,
"user_id": 1,
"name": "3nd default Workspace",
"created_at": "2025-03-23T21:43:42.694845",
"id": 3
},
{
"mandate_id": 1,
"user_id": 1,
"name": "4nd default Workspace",
"created_at": "2025-03-23T21:43:42.694845",
"id": 4
},
{
"mandate_id": 0,
"user_id": 0,
"name": "1st default Workspace",
"created_at": "2025-03-24T12:09:29.920931",
"id": 5
}
]

View file

@ -1,4 +0,0 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore

View file

@ -0,0 +1,135 @@
{
"id": "03bf0a86-81d7-4ff9-b591-3c6ddbbf8f5b",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 11:44:51",
"status": "waiting_for_user",
"started_at": "2025-04-06T11:44:51.522474",
"last_activity": "2025-04-06T11:44:59.937907",
"prompt": "mach web suche, wer bei ValueOn AG arbeitet",
"messages": [
{
"id": "msg_b0bad3ff-2e65-4d67-b989-c284e248f1f8",
"workflow_id": "03bf0a86-81d7-4ff9-b591-3c6ddbbf8f5b",
"parent_message_id": null,
"started_at": "2025-04-06T11:44:51.540472",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "mach web suche, wer bei ValueOn AG arbeitet",
"agent_type": null
},
{
"id": "msg_7bd0c4ce-4d57-444a-a4df-d1742b1587a1",
"workflow_id": "03bf0a86-81d7-4ff9-b591-3c6ddbbf8f5b",
"parent_message_id": null,
"started_at": "2025-04-06T11:44:52.975701",
"finished_at": "2025-04-06T11:44:52.978733",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "",
"agent_type": "scraper",
"agent_id": "webcrawler_agent",
"agent_name": "Webscraper"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\nUm eine aussagekräftige Zusammenfassung der Agentenergebnisse zu erstellen, benötigen wir die spezifischen Ergebnisse oder Daten, die der Webscraper gesammelt hat. Da die Informationen in Ihrer Anfrage fehlen, kann ich Ihnen jedoch eine allgemeine Struktur vorschlagen, wie Sie die Ergebnisse eines Webscrapers zusammenfassen könnten:\n\n### Zusammenfassung der Webscraper-Ergebnisse\n\n#### 1. **Zielsetzung**\n- **Ziel des Webscrapings**: Beschreiben Sie den Zweck des Webscrapings, z.B. Marktanalyse, Preisüberwachung, Trendbeobachtung etc.\n\n#### 2. **Datenquelle**\n- **Websites**: Nennen Sie die Websites, von denen die Daten gesammelt wurden.\n- **Zeitraum**: Geben Sie den Zeitraum an, in dem die Daten gesammelt wurden.\n\n#### 3. **Gesammelte Daten**\n- **Datenkategorien**: Listen Sie die Hauptkategorien der gesammelten Daten auf (z.B. Produktpreise, Kundenbewertungen, Artikelinhalte).\n- **Datenmenge**: Geben Sie die Menge der gesammelten Daten an (z.B. Anzahl der Datensätze).\n\n#### 4. **Wichtige Erkenntnisse**\n- **Trends**: Beschreiben Sie die wichtigsten Trends, die aus den Daten hervorgehen.\n- **Vergleiche**: Führen Sie relevante Vergleiche durch, z.B. Preisunterschiede zwischen Anbietern.\n- **Anomalien**: Weisen Sie auf ungewöhnliche Muster oder Anomalien in den Daten hin.\n\n#### 5. **Empfehlungen**\n- **Strategische Empfehlungen**: Geben Sie Empfehlungen basierend auf den Erkenntnissen, z.B. Anpassungen in der Preisstrategie oder Identifizierung neuer Marktchancen.\n- **Weiteres Vorgehen**: Vorschläge für zukünftige Analysen oder zusätzliche Datenquellen.\n\n#### 6. **Herausforderungen und Einschränkungen**\n- **Technische Herausforderungen**: Beschreiben Sie eventuelle technische Schwierigkeiten beim Webscraping.\n- **Datenbeschränkungen**: Weisen Sie auf Einschränkungen der Datenqualität oder -verfügbarkeit hin.\n\n#### 7. **Fazit**\n- **Zusammenfassung**: Fassen Sie die wichtigsten Punkte zusammen und betonen Sie die Bedeutung der Ergebnisse für die Zielsetzung.\n\nBitte fügen Sie die spezifischen Ergebnisse Ihres Webscrapers in diese Struktur ein, um eine vollständige und aussagekräftige Zusammenfassung zu erstellen.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_fdeaf593-eff5-4cb8-b36d-a76136f3d609",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 43, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T11:44:51.526475",
"agent_id": null,
"agent_name": null
},
{
"id": "log_619b43ae-8528-4810-8b57-78899f43a46f",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T11:44:51.533500",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4367efc4-0ed2-47c6-b6cb-6a92fcd982d2",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T11:44:52.936911",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5f4f6652-49d7-4fcb-a287-e0658c5527f8",
"message": "Agent webcrawler_agent wurde ausgewählt mit Aufgabe: Führe eine Websuche durch, um Informationen darübe...",
"type": "info",
"timestamp": "2025-04-06T11:44:52.945907",
"agent_id": null,
"agent_name": null
},
{
"id": "log_09e712d9-aa0d-48c6-955d-28b2546f5ea3",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:44:52.952260",
"agent_id": null,
"agent_name": null
},
{
"id": "log_71787a94-8d2c-4b53-a3bc-d4011e298b33",
"message": "Agent webcrawler_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:44:52.959876",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bb2be14c-d006-4ec9-9122-5382b7279652",
"message": "Agent 'webcrawler_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:44:52.966320",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5d0701ab-3b02-4588-9494-e4a4d88728f2",
"message": "Agent 'webcrawler_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-06T11:44:53.024956",
"agent_id": null,
"agent_name": null
},
{
"id": "log_2f15c4f1-2702-441c-aff6-c2b169f2cdad",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-06T11:44:59.937907",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,45 @@
{
"id": "086fc9bf-1cd6-47a8-b0d7-e09dd4d14939",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 12:07:09",
"status": "failed",
"started_at": "2025-04-04T12:07:10.087470",
"last_activity": "2025-04-04T12:07:10.104633",
"prompt": "describe",
"messages": [],
"logs": [
{
"id": "log_dd9168d5-d49a-4685-9701-0d7aa8fb5d7a",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:07:10.090232",
"agent_id": null,
"agent_name": null
},
{
"id": "log_7d0d4e4a-0559-42b2-954f-fb8172da940b",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:07:10.093747",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1902516b-2e54-4d36-9466-6304ef99ec44",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T12:07:10.099321",
"agent_id": null,
"agent_name": null
},
{
"id": "log_7371b9a4-ddeb-458f-b95a-74aca13de52a",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T12:07:10.104633",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,82 @@
{
"id": "0d6c6ccf-dfcd-4431-88ff-354594f1280e",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 01:07:16",
"status": "stopped",
"started_at": "2025-04-04T01:07:17.579677",
"last_activity": "2025-04-04T01:07:27.469867",
"prompt": "was ist auf dem angehängten bild?",
"messages": [
{
"id": "msg_c3d8068d-e208-4fd0-b11d-cf6ad4bf4677",
"workflow_id": "0d6c6ccf-dfcd-4431-88ff-354594f1280e",
"parent_message_id": null,
"started_at": "2025-04-04T01:07:17.590067",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "was ist auf dem angehängten bild?",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_687f6922-17cc-40a8-95d4-36117ee04bdc",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 33, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T01:07:17.582688",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f6b032bb-e042-4a56-8be7-7b3534b54cc8",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T01:07:17.587648",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0f25e813-d5c7-4c4e-b264-784458f50544",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T01:07:18.450685",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f4312c26-595b-40df-976c-f57d881ae625",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T01:07:18.454547",
"agent_id": null,
"agent_name": null
},
{
"id": "log_7f4af80b-9352-4422-9e03-78a3aec8a5ee",
"message": "Workflow wurde manuell gestoppt",
"type": "info",
"timestamp": "2025-04-04T01:07:27.469867",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,74 @@
{
"id": "136db092-07d8-4856-9dca-932e1cf39b8a",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 23:00:32",
"status": "waiting_for_user",
"started_at": "2025-04-04T23:00:33.043918",
"last_activity": "2025-04-04T23:00:34.287183",
"prompt": "this looks now very good",
"messages": [
{
"id": "msg_54b664c3-accc-490f-b448-4b6865953f72",
"workflow_id": "136db092-07d8-4856-9dca-932e1cf39b8a",
"parent_message_id": null,
"started_at": "2025-04-04T23:00:33.059453",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "this looks now very good",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_f8be98a2-6649-4e3d-8a14-dd553f786fc6",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 24, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T23:00:33.049601",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e8264c1a-566f-4efa-9317-cca6b6255156",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T23:00:33.054609",
"agent_id": null,
"agent_name": null
},
{
"id": "log_7dfd2b2a-c30f-444c-b534-43c02f5e51f0",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T23:00:34.278730",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d115a961-63c6-4e28-b000-40bfabc3fe65",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T23:00:34.287183",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,89 @@
{
"id": "1a247d76-6ca5-4c96-b445-643d17206708",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 23:47:23",
"status": "completed",
"started_at": "2025-04-06T23:47:23.769077",
"last_activity": "2025-04-06T23:47:24.861906",
"prompt": "kannst du mir das resultat in 3 sätzen zusammenfassen auf englisch?",
"messages": [
{
"id": "msg_b0e56f39-cc1f-46b9-877f-aa09d4c97291",
"workflow_id": "1a247d76-6ca5-4c96-b445-643d17206708",
"parent_message_id": null,
"started_at": "2025-04-06T23:47:23.801245",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "kannst du mir das resultat in 3 sätzen zusammenfassen auf englisch?",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Please summarize the result in 3 sentences in English.",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"workflow_complete": true
}
],
"logs": [
{
"id": "log_7d66d006-d1ee-4d33-8d0b-4911c9a1d3e4",
"message": "Neuer Benutzereingabe erhalten - Vorherigen Workflow beenden",
"type": "info",
"timestamp": "2025-04-06T23:47:23.773042",
"agent_id": null,
"agent_name": null
},
{
"id": "log_96cacea3-1a39-437f-8747-5198a71757ae",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 67, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T23:47:23.782040",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c756fea5-2954-415a-92d1-288be6bca0ec",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T23:47:23.791036",
"agent_id": null,
"agent_name": null
},
{
"id": "log_350f9c63-e905-42d1-9391-925efd88b210",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T23:47:24.839485",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9745840d-8722-4209-8089-34d47605e7c2",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Please summarize the result in 3 sentences in Engl...",
"type": "info",
"timestamp": "2025-04-06T23:47:24.853648",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8737a1f4-db39-4b3f-9a6c-2972923bfa5b",
"message": "Workflow wartet auf Benutzereingabe: Please summarize the result in 3 sentences in Engl...",
"type": "info",
"timestamp": "2025-04-06T23:47:24.861906",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,177 @@
{
"id": "1f694371-65fe-45da-8040-defa53271bd1",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 22:09:30",
"status": "waiting_for_user",
"started_at": "2025-04-04T22:09:31.285420",
"last_activity": "2025-04-04T22:10:03.502904",
"prompt": "analyse image",
"messages": [
{
"id": "msg_86648d24-3ac6-4105-9fdd-c6e9ae7da686",
"workflow_id": "1f694371-65fe-45da-8040-defa53271bd1",
"parent_message_id": null,
"started_at": "2025-04-04T22:09:31.301781",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 4,
"source": {
"type": "file",
"id": 4,
"name": "LF-Details.png",
"content_type": "image/png",
"size": 253009,
"upload_date": "2025-04-04T22:09:58.458854"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart illustrating a product development process involving multiple teams: Product Team, Engineering Team, Q&A Team, and Operations. Here's a detailed breakdown:\n\n### Input\n- **Sources**: Customers, Sales, and Internal Ideas.\n- **Process**: Inputs are collected and qualified based on business priorities.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas and inputs.\n - **Qualify**: Analyze and match against business priorities.\n\n2. **Define**\n - **Structure & Document**: Write specifications and define acceptance criteria.\n - **Explore & Design**: UI design and experiments, with references to tickets in ClickUp.\n\n3. **Shape**\n - **Roadmap**: Define roadmap to meet opportunities and protect development stability.\n - **Scoping**: Define next version's scope.\n - **Manage**: Tickets in the product.\n\n### Engineering Team\n- **Assess**\n - **Manage**: Move assessed tickets to future versions.\n - **Estimate**: Assess tickets for implementation, feasibility, and effort.\n\n- **Build**\n - **Manage**: Track progress in the dashboard.\n - **Factory**: Develop tickets for the next version.\n\n### Q&A Team\n- **Validate**\n - **Testing**: Test functionality against acceptance.\n - **Analysis**: Analyze tickets, events, deviations.\n\n### Operations\n1. **Release**\n - **Manage**: Ensure stable changes.\n\n2. **Run & Monitor**\n - **Manage**: Ensure stable operation.\n - **Service & Support**: Deliver first-level support according to agreed SLA.\n\n### Output\n- **Product**: The final output of the process.\n\n### Tool Integration\n- **Ticketing System**: Visual representation of ticket management.\n- **Roadmap**: Timeline for product development.\n- **Management Dashboards**: Visual data and metrics for tracking progress.\n\nThe flowchart uses arrows to indicate the flow of tasks and responsibilities between different stages and teams, emphasizing collaboration and integration across the product development lifecycle."
}
]
}
],
"content": "analyse image",
"agent_type": null
},
{
"id": "msg_3b6a8c50-ab8c-4a3c-8f9c-c15e8b53d100",
"workflow_id": "1f694371-65fe-45da-8040-defa53271bd1",
"parent_message_id": null,
"started_at": "2025-04-04T22:10:00.409307",
"finished_at": "2025-04-04T22:10:00.412299",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**Analyseergebnisse:**\n1. **Trendidentifikation:** Die Daten weisen einen klaren Trend auf, der auf bestimmte Muster oder Entwicklungen hinweist.\n2. **Korrelationen:** Es wurden signifikante Korrelationen zwischen verschiedenen Datensätzen festgestellt, die auf mögliche Zusammenhänge oder Einflussfaktoren hindeuten.\n3. **Besondere Auffälligkeiten:** Bestimmte Aspekte der Daten sind besonders auffällig und könnten auf Anomalien oder besondere Ereignisse hinweisen.\n\n**Empfehlungen:**\n- **Maßnahme 1:** [Beschreibung der ersten empfohlenen Maßnahme basierend auf der Analyse]\n- **Maßnahme 2:** [Beschreibung der zweiten empfohlenen Maßnahme basierend auf der Analyse]\n- **Maßnahme 3:** [Beschreibung der dritten empfohlenen Maßnahme basierend auf der Analyse]\n\nDiese Empfehlungen sollen dazu beitragen, die identifizierten Trends und Korrelationen optimal zu nutzen und auf die auffälligen Datenpunkte angemessen zu reagieren.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_e1b2daa6-3fe2-4dbf-958f-26837fc6f58d",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 13, 2 Dateien",
"type": "info",
"timestamp": "2025-04-04T22:09:31.293163",
"agent_id": null,
"agent_name": null
},
{
"id": "log_dfed05f6-9063-4f21-a05e-bd81fb62d887",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T22:09:31.297171",
"agent_id": null,
"agent_name": null
},
{
"id": "log_17b3b7a6-2823-449c-b673-333cfe216133",
"message": "2 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T22:09:31.306757",
"agent_id": null,
"agent_name": null
},
{
"id": "log_98e96b5d-65d2-474d-a6a0-72bed023189d",
"message": "Image LF-Details.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-04T22:09:47.949478",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c81d83a5-c038-45a8-852b-a6e3e0948dae",
"message": "Image LF-Details.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-04T22:09:58.439793",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9d1ac4fb-601a-4cbc-bc48-d463a4592c27",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T22:10:00.385657",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f52afec1-ea56-4d81-b50e-f398a9c2c2dd",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Analysiere das Bild 'LF-Details.png', das ein Flus...",
"type": "info",
"timestamp": "2025-04-04T22:10:00.389680",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4b8d9c04-74e4-4185-bbea-22a648680c0a",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-04T22:10:00.394659",
"agent_id": null,
"agent_name": null
},
{
"id": "log_cc1201bc-2125-4644-a629-04846795520a",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T22:10:00.399663",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c36ecd18-7002-432d-ac45-e4bff80bafda",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T22:10:00.404321",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a0b9c141-299a-497c-8db5-30581b7fa5a0",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-04T22:10:00.463569",
"agent_id": null,
"agent_name": null
},
{
"id": "log_74ab8610-fb68-4be1-afe2-ea87cdc8b172",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-04T22:10:03.502904",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,74 @@
{
"id": "20357965-a22a-4379-bfdd-2538e03f59e6",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 09:59:09",
"status": "waiting_for_user",
"started_at": "2025-04-04T09:59:10.121840",
"last_activity": "2025-04-04T09:59:11.106806",
"prompt": "beschreibe das bild",
"messages": [
{
"id": "msg_69fb0b41-927d-4774-b56d-e003d36565c4",
"workflow_id": "20357965-a22a-4379-bfdd-2538e03f59e6",
"parent_message_id": null,
"started_at": "2025-04-04T09:59:10.127843",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "beschreibe das bild",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_0ebae430-1938-4b39-8741-084d7db81e54",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T09:59:10.123838",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f16d83ae-66d0-440a-9b88-e36c0b22a644",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T09:59:10.125838",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6bd8142c-e38c-4258-8b15-dc105fdf069e",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T09:59:11.106806",
"agent_id": null,
"agent_name": null
},
{
"id": "log_7a2a2cd0-db15-482f-a435-6e9cacdca3e5",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T09:59:11.106806",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,110 @@
{
"id": "21dc4417-7c89-40bc-abe3-6482582e6b6b",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 11:44:25",
"status": "ERGEBNIS",
"started_at": "2025-04-06T11:44:26.088390",
"last_activity": "2025-04-06T11:44:27.513466",
"prompt": "mach web suche, wer bei ValueOn AG arbeitet",
"messages": [
{
"id": "msg_b96bac5b-c80d-48a6-bab1-ad391903c90e",
"workflow_id": "21dc4417-7c89-40bc-abe3-6482582e6b6b",
"parent_message_id": null,
"started_at": "2025-04-06T11:44:26.108182",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "mach web suche, wer bei ValueOn AG arbeitet",
"agent_type": null
},
{
"id": "msg_6289297a-ea5d-4ed9-a621-c6df6e5b0bf1",
"workflow_id": "21dc4417-7c89-40bc-abe3-6482582e6b6b",
"parent_message_id": null,
"started_at": "2025-04-06T11:44:27.520673",
"finished_at": "2025-04-06T11:44:27.525719",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "",
"agent_type": "scraper",
"agent_id": "webcrawler_agent",
"agent_name": "Webscraper"
}
],
"logs": [
{
"id": "log_bf760c1f-d2ea-49f2-b55e-aeaf6b0bfbd1",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 43, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T11:44:26.092807",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b4cb48ec-3c21-4f05-a1ce-e03014c0b89b",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T11:44:26.100180",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e937c28a-e1e3-42cd-bf73-25481fb7bf86",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T11:44:27.469153",
"agent_id": null,
"agent_name": null
},
{
"id": "log_95ea94a8-c236-45e9-9177-da4e77da347e",
"message": "Agent webcrawler_agent wurde ausgewählt mit Aufgabe: Führe eine Websuche durch, um herauszufinden, wer ...",
"type": "info",
"timestamp": "2025-04-06T11:44:27.492677",
"agent_id": null,
"agent_name": null
},
{
"id": "log_7de9621f-67cd-43c1-a0ab-cd625d747a3d",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:44:27.499162",
"agent_id": null,
"agent_name": null
},
{
"id": "log_13f49eef-2269-4dd5-b356-7e6859648d18",
"message": "Agent webcrawler_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:44:27.506843",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e6038382-1a88-4cc1-a7ae-75d03a0cce71",
"message": "Agent 'webcrawler_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:44:27.513466",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,29 @@
{
"id": "23afec57-9ff5-4305-b114-a8357536de86",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 23:26:55",
"status": "stopped",
"started_at": "2025-04-06T23:26:56.125731",
"last_activity": "2025-04-06T23:27:24.411648",
"prompt": "kannst du mir eine websuche machen, wer KI-agentensysteme entwickelt?",
"messages": [],
"logs": [
{
"id": "log_adbd1195-0a69-44af-b5b5-9eff003b4c32",
"message": "Workflow läuft noch, keine neue Eingabe möglich",
"type": "error",
"timestamp": "2025-04-06T23:26:56.144327",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a84c4f43-5df5-432f-99e0-aea06812738f",
"message": "Workflow wurde manuell gestoppt",
"type": "info",
"timestamp": "2025-04-06T23:27:24.411648",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,74 @@
{
"id": "2533e594-abfd-4acc-9886-a0db9228a55c",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 08:47:43",
"status": "waiting_for_user",
"started_at": "2025-04-04T08:47:43.573723",
"last_activity": "2025-04-04T08:47:44.400926",
"prompt": "beschreibe das bild",
"messages": [
{
"id": "msg_58702133-b368-4306-aa0c-3f304eac9233",
"workflow_id": "2533e594-abfd-4acc-9886-a0db9228a55c",
"parent_message_id": null,
"started_at": "2025-04-04T08:47:43.588689",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "beschreibe das bild",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_eb4d61a5-057b-424e-bd09-ac8b383eec94",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T08:47:43.576705",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9cc48b7b-3b23-4252-8ffe-3cfb906f6543",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T08:47:43.582696",
"agent_id": null,
"agent_name": null
},
{
"id": "log_53723fa3-f1cd-4602-90f1-727dfab74a00",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T08:47:44.392546",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c910a612-0059-4896-87c1-60fbad6f7c5c",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T08:47:44.400926",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,185 @@
{
"id": "270481d2-a4f7-4e01-83ae-c7ea541fb38a",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 19:43:03",
"status": "waiting_for_user",
"started_at": "2025-04-04T19:43:04.908849",
"last_activity": "2025-04-04T19:47:12.436966",
"prompt": "describe",
"messages": [
{
"id": "msg_dba21daa-91ba-4acc-b87a-82bf3fbae3ed",
"workflow_id": "270481d2-a4f7-4e01-83ae-c7ea541fb38a",
"parent_message_id": null,
"started_at": "2025-04-04T19:43:04.921361",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 1,
"source": {
"type": "file",
"id": 1,
"name": "LF-Nutshell.png",
"content_type": "image/png",
"size": 52108,
"upload_date": "2025-04-04T19:43:12.553746"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart titled \"In a nutshell,\" illustrating a process from inputs to product delivery. Here's a detailed description:\n\n1. **Inputs**: \n - Represented by an inverted triangle at the top left, labeled \"Inputs.\"\n\n2. **Product Team**:\n - Below the inputs, there's a rectangular box labeled \"Product Team.\"\n - It includes the steps: \"Discover - Define - Shape.\"\n\n3. **Engineering Team**:\n - Next to the Product Team, there's a box labeled \"Engineering Team.\"\n - It includes the steps: \"Assess & Build.\"\n\n4. **Q&A Team**:\n - Adjacent to the Engineering Team, there's a box labeled \"Q&A Team.\"\n - It includes the step: \"Validate.\"\n\n5. **Operations**:\n - Next to the Q&A Team, there's a box labeled \"Operations.\"\n - It includes the steps: \"Release, Run & Monitor.\"\n\n6. **Roadmap**:\n - Above the Engineering Team, there's an arrow labeled \"Roadmap.\"\n\n7. **Product**:\n - Following the Roadmap, there are three consecutive boxes labeled \"Product.\"\n\nThe flowchart visually represents a process from initial inputs through various team responsibilities, leading to the final product delivery."
}
]
}
],
"content": "describe",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Bitte beschreibe das Bild 'LF-Nutshell.png' detailliert und erkläre den dargestellten Prozess im Flussdiagramm. Achte darauf, die einzelnen Schritte und deren Bedeutung zu erläutern.",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-04T19:47:10.762284",
"status": "completed"
},
{
"id": "msg_a206635e-ce4b-4bcd-9095-bf3fed6e51ca",
"workflow_id": "270481d2-a4f7-4e01-83ae-c7ea541fb38a",
"parent_message_id": null,
"started_at": "2025-04-04T19:47:10.763300",
"finished_at": null,
"sequence_no": 3,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "please summarize",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Bitte fassen Sie die Informationen oder den Kontext zusammen, der in der Anfrage impliziert ist. Da keine spezifischen Dateien oder Inhalte bereitgestellt wurden, geben Sie eine allgemeine Zusammenfassung basierend auf den verfügbaren Informationen.",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_fe558963-6910-4a7c-bb71-147204d0f577",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T19:43:04.913361",
"agent_id": null,
"agent_name": null
},
{
"id": "log_cfff4b6c-cacf-44ba-950d-6b1bcccea2f8",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T19:43:04.917361",
"agent_id": null,
"agent_name": null
},
{
"id": "log_3b082794-b6c7-4328-8baa-5c24665986da",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T19:43:04.925763",
"agent_id": null,
"agent_name": null
},
{
"id": "log_298cdc5d-c73f-4e15-9b86-c96ae1418347",
"message": "Image LF-Nutshell.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-04T19:43:12.532046",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e3f54aaf-568f-4476-8c7e-34b20b54ab26",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T19:43:13.976919",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8199586c-384e-4a09-9e3d-f2f8d88b0389",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Bitte beschreibe das Bild 'LF-Nutshell.png' detail...",
"type": "info",
"timestamp": "2025-04-04T19:43:13.980923",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c94edd0d-698f-4b1b-8be2-76e06f62f1c9",
"message": "Workflow wartet auf Benutzereingabe: Bitte beschreibe das Bild 'LF-Nutshell.png' detail...",
"type": "info",
"timestamp": "2025-04-04T19:43:13.984927",
"agent_id": null,
"agent_name": null
},
{
"id": "log_047d3ca9-8534-4008-ac80-85987d3df1e9",
"message": "Benutzereingabe empfangen: 16 Zeichen, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T19:47:10.751981",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d4f7292b-e229-47d0-b227-d5402ac31a23",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T19:47:10.757516",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5206cbe9-f98b-493a-ba52-d76c5c999cb1",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T19:47:12.427711",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8c4e6c8e-1461-4c36-b0fc-27fe54fb6393",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Bitte fassen Sie die Informationen oder den Kontex...",
"type": "info",
"timestamp": "2025-04-04T19:47:12.432545",
"agent_id": null,
"agent_name": null
},
{
"id": "log_7f99c192-d5e4-4633-ada1-c4e802f4707a",
"message": "Workflow wartet auf Benutzereingabe: Bitte fassen Sie die Informationen oder den Kontex...",
"type": "info",
"timestamp": "2025-04-04T19:47:12.436966",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,118 @@
{
"id": "298f2791-8f65-4bc3-8a56-d19344cf8535",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 23:48:41",
"status": "completed",
"started_at": "2025-04-06T23:48:41.648301",
"last_activity": "2025-04-06T23:52:09.346472",
"prompt": "bitte zusammenfassen",
"messages": [
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n### Zusammenfassung der Agentenergebnisse\n\n#### Allgemeine Informationen und Themenübersicht\n\nDas Dokument \"Zusammenfassungserstellung: Allgemeine Informationen und Themenübersicht\" bietet einen umfassenden Leitfaden zur Erstellung prägnanter Zusammenfassungen. Es beschreibt die wichtigsten Schritte und Techniken zur effektiven Verdichtung von Informationen und zur klaren Darstellung der Kernaussagen eines Textes. Der Fokus liegt auf der Identifizierung zentraler Themen und deren präziser Zusammenfassung, um Lesern eine schnelle und umfassende Einsicht in den Inhalt eines Dokuments zu ermöglichen.\n\n#### Inhaltsstruktur\n\n1. **Einführung in die Zusammenfassungserstellung**: \n - Bedeutung und Zweck von Zusammenfassungen: Informationsverdichtung, Zeitersparnis, Klarheit, Unterstützung der Entscheidungsfindung.\n - Nutzen in verschiedenen Kontexten: Akademische Forschung, Geschäftswelt, Medizin, Medien.\n\n2. **Identifizierung zentraler Themen**:\n - Techniken zur Erkennung von Hauptthemen: Vorbereitung, aktives Lesen, Textstrukturanalyse.\n - Erstellung von Themenhierarchien und Verwendung grafischer Organisatoren.\n\n3. **Techniken zur Informationsverdichtung**:\n - Methoden: Extraktive und abstraktive Zusammenfassung.\n - Techniken: Verwendung von Schlüsselwörtern, Bullet Points, Diagrammen und Tabellen.\n\n4. **Strukturierung einer Zusammenfassung**:\n - Einleitung, Hauptteil und Schlussfolgerung.\n - Thematische Gliederung, Verwendung von Unterüberschriften, Aufzählungen.\n\n5. **Sprachliche Präzision und Klarheit**:\n - Bedeutung von Klarheit und Präzision: Verständlichkeit, Effizienz, Genauigkeit.\n - Strategien: Einfache Sprache, aktive Stimme, konzise Ausdrucksweise.\n\n6. **Praktische Übungen zur Zusammenfassungserstellung**:\n - Übungen für wissenschaftliche, literarische und Nachrichtenartikel.\n - Tipps zur effektiven Zusammenfassungserstellung.\n\n7. **Häufige Fehler und wie man sie vermeidet**:\n - Fehler: Unzureichendes Verständnis, zu viel Detail, fehlende Struktur, Subjektivität, Vernachlässigung der Zielgruppe.\n - Vermeidungstipps: Gründliches Lesen, Fokus auf das Wesentliche, logische Gliederung, Objektivität, Zielgruppenanalyse.\n\n#### Empfehlungen\n\n- **Verständnis des Originalmaterials**: Gründliches Lesen und Notizen machen sind entscheidend.\n- **Fokus auf Kernaussagen**: Konzentration auf wesentliche Informationen und Vermeidung von Details.\n- **Strukturierung und Klarheit**: Logische Gliederung und präzise Sprache erhöhen die Verständlichkeit.\n- **Zielgruppenorientierung**: Anpassung der Zusammenfassung an die Bedürfnisse der Zielgruppe.\n\nDiese Zusammenfassung bietet eine strukturierte Anleitung zur Erstellung effektiver Zusammenfassungen, die in verschiedenen Kontexten angewendet werden können, um die Effizienz und Effektivität der Informationsverarbeitung zu verbessern.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"workflow_complete": true
}
],
"logs": [
{
"id": "log_02a37c17-ef1e-4807-8d7b-e39847cc6ceb",
"message": "Neuer Benutzereingabe erhalten - Vorherigen Workflow beenden",
"type": "info",
"timestamp": "2025-04-06T23:48:41.660503",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8d0f87d9-7897-4bb0-9a7a-f597367ad014",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 20, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T23:48:41.665507",
"agent_id": null,
"agent_name": null
},
{
"id": "log_fa817276-dfaf-4f87-9f7f-24d6cc69d4cd",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T23:48:41.680659",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d54c6c2f-7342-47b0-897f-1eb7d5b7033b",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T23:48:42.890042",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ce8e3763-9f4e-45a6-9d8e-6515c956631e",
"message": "Agent documentation_agent wurde ausgewählt mit Aufgabe: Erstelle eine Zusammenfassung basierend auf den be...",
"type": "info",
"timestamp": "2025-04-06T23:48:42.901657",
"agent_id": null,
"agent_name": null
},
{
"id": "log_46d4fa22-0bd8-4a6b-9238-67ce9abdb9d7",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-06T23:48:42.909692",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6c81fa1b-1c27-4452-970b-bab259858161",
"message": "Agent documentation_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T23:48:42.919661",
"agent_id": null,
"agent_name": null
},
{
"id": "log_37c7ac12-0223-4354-bb73-674b0fb29fe9",
"message": "Agent 'documentation_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T23:48:42.928658",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f5174bb5-9aa1-46fd-b56b-768109610055",
"message": "Agent 'documentation_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-06T23:49:56.825176",
"agent_id": null,
"agent_name": null
},
{
"id": "log_13d7117b-afba-474d-a517-acec9cc1ae52",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-06T23:50:03.793706",
"agent_id": null,
"agent_name": null
},
{
"id": "log_69a04dc6-e7ab-4778-a799-3085d2ded96b",
"message": "Nachricht gelöscht: assistant - msg_ae9e...",
"type": "info",
"timestamp": "2025-04-06T23:52:03.074318",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8a5a4ebe-b7fe-4990-9e09-7f19d8c67c53",
"message": "Nachricht gelöscht: user - msg_6333...",
"type": "info",
"timestamp": "2025-04-06T23:52:09.346472",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,74 @@
{
"id": "2ca799b9-a708-42d7-868e-c693ed15e8c9",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 09:40:16",
"status": "waiting_for_user",
"started_at": "2025-04-04T09:40:17.834743",
"last_activity": "2025-04-04T09:40:19.685041",
"prompt": "beschreibe das bild",
"messages": [
{
"id": "msg_2e96188c-c2a3-422a-9ff0-e14b1958e95a",
"workflow_id": "2ca799b9-a708-42d7-868e-c693ed15e8c9",
"parent_message_id": null,
"started_at": "2025-04-04T09:40:17.840038",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "beschreibe das bild",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_6bdbda2a-ded7-4934-b068-b7cae1cfcd97",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T09:40:17.837040",
"agent_id": null,
"agent_name": null
},
{
"id": "log_59a3064e-06aa-49fd-b09b-fd8fa25bd9ce",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T09:40:17.838040",
"agent_id": null,
"agent_name": null
},
{
"id": "log_2423c44f-7af2-4215-82c9-124d5084955e",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T09:40:19.681043",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6e9e7f12-012d-4a94-a289-d828bacdc56d",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T09:40:19.685041",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,204 @@
{
"id": "2eaf1196-7795-45b6-99c7-95e7ad442d8a",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 09:25:17",
"status": "waiting_for_user",
"started_at": "2025-04-04T09:25:18.812968",
"last_activity": "2025-04-04T09:27:57.048066",
"prompt": "bild analysieren",
"messages": [
{
"id": "msg_bee0190b-1c06-473b-93d6-38ea1180d96f",
"workflow_id": "2eaf1196-7795-45b6-99c7-95e7ad442d8a",
"parent_message_id": null,
"started_at": "2025-04-04T09:25:18.825904",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "bild analysieren",
"agent_type": null
},
{
"id": "msg_5862c435-752d-438c-a7f3-71b1bb092689",
"workflow_id": "2eaf1196-7795-45b6-99c7-95e7ad442d8a",
"parent_message_id": null,
"started_at": "2025-04-04T09:25:21.751088",
"finished_at": "2025-04-04T09:25:21.753083",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**Analyseergebnisse:**\n1. **Trend:** Die Daten zeigen einen klaren Trend, der auf bestimmte Muster oder Entwicklungen hinweist.\n2. **Korrelationen:** Es wurden signifikante Korrelationen zwischen verschiedenen Datensätzen festgestellt, die auf mögliche Zusammenhänge oder Abhängigkeiten hinweisen.\n3. **Besondere Auffälligkeiten:** Es gibt spezifische Aspekte in den Daten, die besonders hervorstechen und möglicherweise einer genaueren Betrachtung bedürfen.\n\n**Empfehlungen:**\n- **Maßnahme 1:** [Beschreibung der ersten empfohlenen Maßnahme basierend auf den Analyseergebnissen]\n- **Maßnahme 2:** [Beschreibung der zweiten empfohlenen Maßnahme]\n- **Maßnahme 3:** [Beschreibung der dritten empfohlenen Maßnahme]\n\nDiese Empfehlungen sollen dazu beitragen, die identifizierten Trends und Korrelationen optimal zu nutzen und auf die besonderen Auffälligkeiten angemessen zu reagieren.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-04T09:27:55.582317",
"status": "completed"
},
{
"id": "msg_2f8c87f5-322f-422e-981d-55ef597c1d65",
"workflow_id": "2eaf1196-7795-45b6-99c7-95e7ad442d8a",
"parent_message_id": null,
"started_at": "2025-04-04T09:27:55.582317",
"finished_at": null,
"sequence_no": 4,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "kannst du mir die analyse in 2 sätzen zusammenfassen",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Fasse die Analyse in zwei Sätzen zusammen, basierend auf den Informationen, die du hast oder erhalten kannst.",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_61fa3f87-4bad-4570-a0fd-ea65590498a1",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 16, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T09:25:18.812968",
"agent_id": null,
"agent_name": null
},
{
"id": "log_174a9ea6-071c-4e1c-8fb8-718593e1150a",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T09:25:18.824238",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c7dff399-8ab8-48a5-b3da-a443610693f3",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T09:25:21.733671",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1ece2ba1-3c37-4318-aae8-00dd11e4e1e8",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Bitte analysiere das Bild und identifiziere releva...",
"type": "info",
"timestamp": "2025-04-04T09:25:21.739651",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e2503ab5-17a3-427c-87b9-744ac7d947a1",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-04T09:25:21.741652",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b424b871-12e2-4489-b430-6c45f570b740",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T09:25:21.741652",
"agent_id": null,
"agent_name": null
},
{
"id": "log_96ce6fe5-785f-4a36-914d-848907ad62a2",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T09:25:21.749092",
"agent_id": null,
"agent_name": null
},
{
"id": "log_48fb0880-1ea8-4452-803a-7b2079b64bbb",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-04T09:25:21.766424",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b84539fd-be11-4307-89ee-052cd47afe9b",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-04T09:25:25.484529",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a64e0328-9d5f-4b53-94ed-9126bb66ecb9",
"message": "Benutzereingabe empfangen: 52 Zeichen, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T09:27:55.578737",
"agent_id": null,
"agent_name": null
},
{
"id": "log_843748d0-77c6-482c-9ee2-24799b119966",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T09:27:55.579655",
"agent_id": null,
"agent_name": null
},
{
"id": "log_33a4cf66-5e4b-4c35-a3a9-0c7875384a72",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T09:27:57.036946",
"agent_id": null,
"agent_name": null
},
{
"id": "log_2c6a7ed9-857c-4298-8b94-0103781f3106",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Fasse die Analyse in zwei Sätzen zusammen, basiere...",
"type": "info",
"timestamp": "2025-04-04T09:27:57.036946",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5c62e44b-dd0b-4216-ae79-bbbae622ea85",
"message": "Workflow wartet auf Benutzereingabe: Fasse die Analyse in zwei Sätzen zusammen, basiere...",
"type": "info",
"timestamp": "2025-04-04T09:27:57.048066",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,135 @@
{
"id": "37bb3f35-b087-4ee2-9618-d092db481b90",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 11:41:36",
"status": "waiting_for_user",
"started_at": "2025-04-06T11:41:36.583178",
"last_activity": "2025-04-06T11:41:44.366152",
"prompt": "mache eine websuche, wer bei ValueOn AG arbeitet.",
"messages": [
{
"id": "msg_71805481-f620-4ccc-a5f5-a6964f502f04",
"workflow_id": "37bb3f35-b087-4ee2-9618-d092db481b90",
"parent_message_id": null,
"started_at": "2025-04-06T11:41:36.600720",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "mache eine websuche, wer bei ValueOn AG arbeitet.",
"agent_type": null
},
{
"id": "msg_94b6bd68-159d-4568-bd9e-a906c1ca6ea7",
"workflow_id": "37bb3f35-b087-4ee2-9618-d092db481b90",
"parent_message_id": null,
"started_at": "2025-04-06T11:41:37.978972",
"finished_at": "2025-04-06T11:41:37.985598",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "",
"agent_type": "scraper",
"agent_id": "webcrawler_agent",
"agent_name": "Webscraper"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\nUm eine aussagekräftige Zusammenfassung der Agentenergebnisse zu erstellen, ist es wichtig, die Informationen klar und strukturiert darzustellen. Da keine spezifischen Ergebnisse oder Details des Webscrapers bereitgestellt wurden, werde ich ein allgemeines Format vorschlagen, das Sie anpassen können, sobald Sie die spezifischen Daten haben:\n\n### Zusammenfassung der Agentenergebnisse\n\n#### 1. **Zielsetzung**\n- **Primäres Ziel:** Beschreibung des Hauptziels des Webscraping-Projekts.\n- **Sekundäre Ziele:** Weitere Ziele, die durch das Projekt erreicht werden sollen.\n\n#### 2. **Methodik**\n- **Technologie und Tools:** Auflistung der verwendeten Technologien und Tools (z.B. BeautifulSoup, Scrapy, Selenium).\n- **Datenquellen:** Beschreibung der Websites oder Plattformen, von denen Daten gesammelt wurden.\n- **Datenverarbeitungsprozess:** Kurze Erklärung des Prozesses zur Extraktion, Bereinigung und Speicherung der Daten.\n\n#### 3. **Ergebnisse**\n- **Datenumfang:** Gesamtmenge der gesammelten Daten (z.B. Anzahl der Datensätze, Größe der Datenbank).\n- **Datenqualität:** Bewertung der Qualität der gesammelten Daten (z.B. Vollständigkeit, Genauigkeit).\n- **Wichtige Erkenntnisse:** Zusammenfassung der wichtigsten Erkenntnisse, die aus den Daten gewonnen wurden.\n\n#### 4. **Analyse**\n- **Trends und Muster:** Beschreibung der identifizierten Trends und Muster in den Daten.\n- **Vergleiche:** Relevante Vergleiche mit historischen Daten oder anderen Datensätzen.\n- **Anomalien:** Identifizierung und Erklärung von Anomalien oder unerwarteten Ergebnissen.\n\n#### 5. **Empfehlungen**\n- **Strategische Empfehlungen:** Vorschläge zur Nutzung der gewonnenen Erkenntnisse für strategische Entscheidungen.\n- **Operative Empfehlungen:** Praktische Empfehlungen zur Verbesserung der Datenverarbeitung oder -nutzung.\n- **Zukünftige Schritte:** Vorschläge für zukünftige Projekte oder Erweiterungen des aktuellen Projekts.\n\n#### 6. **Herausforderungen und Lösungen**\n- **Herausforderungen:** Beschreibung der größten Herausforderungen, die während des Projekts aufgetreten sind.\n- **Lösungen:** Erklärungen, wie diese Herausforderungen überwunden wurden.\n\n#### 7. **Fazit**\n- **Zusammenfassung:** Kurze Zusammenfassung der wichtigsten Punkte und des Gesamterfolgs des Projekts.\n\nPassen Sie diese Struktur an die spezifischen Ergebnisse und Details Ihres Webscraping-Projekts an, um eine vollständige und informative Zusammenfassung zu erstellen.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_f46dfaae-46ce-4fc2-b3a4-350800d2a947",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 49, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T11:41:36.587194",
"agent_id": null,
"agent_name": null
},
{
"id": "log_33390c43-00de-48f8-87a2-7f0075dd11a2",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T11:41:36.594179",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a75a88c5-3823-4ff3-af10-2271606a1a6e",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T11:41:37.947161",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1fd2872c-c955-4ac9-ad5e-1a063332e139",
"message": "Agent webcrawler_agent wurde ausgewählt mit Aufgabe: Führe eine Websuche durch, um herauszufinden, wer ...",
"type": "info",
"timestamp": "2025-04-06T11:41:37.953161",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8777a2d5-8d67-428d-a0b0-80a4de3218b8",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:41:37.960791",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f20704af-6196-4342-a024-4459327d89d9",
"message": "Agent webcrawler_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:41:37.966822",
"agent_id": null,
"agent_name": null
},
{
"id": "log_186c7375-5826-4d29-81c5-4bdb3635c710",
"message": "Agent 'webcrawler_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:41:37.973797",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8e43d395-77cf-46f8-8fb1-04fe22ceac89",
"message": "Agent 'webcrawler_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-06T11:41:38.035990",
"agent_id": null,
"agent_name": null
},
{
"id": "log_efcb9d75-b72e-4ca4-8613-d54a6ffdf64c",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-06T11:41:44.366152",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "426e570f-0598-42f1-83b7-931c9ec5ed6f",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 08:28:10",
"status": "failed",
"started_at": "2025-04-04T08:28:11.908061",
"last_activity": "2025-04-04T08:28:11.937134",
"prompt": "beschreibe das bild",
"messages": [],
"logs": [
{
"id": "log_3e853a03-8295-4833-95eb-39a6fdff3873",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T08:28:11.911433",
"agent_id": null,
"agent_name": null
},
{
"id": "log_121beddb-8606-4620-b1e0-29ce56548233",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T08:28:11.916433",
"agent_id": null,
"agent_name": null
},
{
"id": "log_04c86c5f-a080-4c5e-8f7b-428378760003",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T08:28:11.923134",
"agent_id": null,
"agent_name": null
},
{
"id": "log_28e345d9-ed11-443c-b2f7-6a251f66f970",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T08:28:11.937134",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,74 @@
{
"id": "4745941d-d058-49f4-a086-45a6206acd4d",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 08:55:12",
"status": "waiting_for_user",
"started_at": "2025-04-04T08:55:13.119201",
"last_activity": "2025-04-04T08:55:13.870754",
"prompt": "beschreibe das bild",
"messages": [
{
"id": "msg_209d65e3-6096-41a4-91a9-c57f1fba4abe",
"workflow_id": "4745941d-d058-49f4-a086-45a6206acd4d",
"parent_message_id": null,
"started_at": "2025-04-04T08:55:13.142410",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "beschreibe das bild",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_994584d7-edce-407d-bfda-a43f1d3ba4b8",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T08:55:13.130937",
"agent_id": null,
"agent_name": null
},
{
"id": "log_554368c7-f355-4d88-bbf9-36919b265bb4",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T08:55:13.140336",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4249deb4-8dc3-4adf-a499-08f36b3c001d",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T08:55:13.868753",
"agent_id": null,
"agent_name": null
},
{
"id": "log_745ed185-8df7-4394-be5b-30e0af76e68f",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T08:55:13.870754",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,203 @@
{
"id": "4839820e-5e8b-4437-85cc-182ea76b1297",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 18:49:05",
"status": "waiting_for_user",
"started_at": "2025-04-04T18:49:07.071736",
"last_activity": "2025-04-04T18:49:54.347354",
"prompt": "was beschreiben diese files?",
"messages": [
{
"id": "msg_adb81060-481a-4370-8f97-5b4e5a39dc93",
"workflow_id": "4839820e-5e8b-4437-85cc-182ea76b1297",
"parent_message_id": null,
"started_at": "2025-04-04T18:49:07.086181",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 3,
"source": {
"type": "file",
"id": 3,
"name": "LF-Current.png",
"content_type": "image/png",
"size": 126277,
"upload_date": "2025-04-04T18:49:46.806730"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart illustrating a product development process involving both a Product Team and an Engineering Team. Here's a detailed description:\n\n### Input\n- **Sources**: Customers, Sales, and Internal Ideas.\n- **Flow**: Inputs are collected and fed into the Product Team.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas and inputs are gathered.\n - **Qualify**: Ideas are analyzed and matched within the team.\n\n2. **Define**\n - **Structure & Document**: Specifications are written, and acceptance criteria are defined.\n - **Explore & Design**: UI design and experiments are conducted.\n\n3. **Shape**\n - **Roadmap**: A roadmap is defined.\n - **Scoping**: The scope for the next version is defined.\n - **Manage**: Tickets are managed in the product.\n\n### Engineering Team\n1. **Build**\n - **Manage**: Progress is tracked in a dashboard.\n - **Factory**: Tickets are developed for the next version.\n\n2. **Release**\n - **Manage**: Ensures stable changes.\n\n3. **Run & Monitor**\n - **Manage**: Ensures stable operation.\n - **Service & Support**: Delivers first-level support according to agreed SLA.\n\n4. **Assess**\n - **Manage**: Moves assessed tickets to future versions.\n - **Estimate**: Assesses tickets for implementation, feasibility, and effort.\n\n### Output\n- **Product**: The final product is delivered as output.\n\n### Tool Integration\n- **Ticketing System**: Includes categories like Inputs & Ideas, Analysis, and Future Versions.\n- **Roadmap** and **Management Dashboards**: Tools used for planning and monitoring.\n\nThe flowchart uses arrows to indicate the flow of processes and responsibilities between the Product and Engineering Teams, highlighting collaboration and iterative development."
}
]
},
{
"id": 4,
"source": {
"type": "file",
"id": 4,
"name": "LF-Details.png",
"content_type": "image/png",
"size": 253009,
"upload_date": "2025-04-04T18:49:46.811749"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart depicting a product development process involving several teams: Product Team, Q&A Team, Engineering Team, and Operations. Here's a detailed breakdown:\n\n### Input\n- **Sources**: Customers, Sales, Our Ideas\n- **Purpose**: Provide initial ideas and inputs for the product development process.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas and inputs.\n - **Qualify**: Analyze and match against business priorities.\n\n2. **Define**\n - **Structure & Document**: Write specifications and define acceptance criteria.\n - **Explore & Design**: UI design, experiments, and reference tickets in ClickUp.\n\n3. **Shape**\n - **Roadmap**: Define roadmap to meet opportunities and protect development stability.\n - **Scoping**: Define next version's scope.\n - **Manage**: Tickets in Product.\n\n### Engineering Team\n1. **Assess**\n - **Manage**: Move assessed tickets to Engineering for future versions.\n - **Estimate**: Assess implementation, feasibility, and effort.\n\n2. **Build**\n - **Manage**: Track progress in the dashboard.\n - **Factory**: Develop tickets in Engineering for the next version.\n\n### Q&A Team\n1. **Validate**\n - **Testing**: Test functionality against acceptance criteria.\n - **Analysis**: Analyze tickets, events, and deviations.\n\n### Operations\n1. **Release**\n - **Manage**: Ensure stable changes.\n\n2. **Run & Monitor**\n - **Manage**: Ensure stable operation.\n - **Service & Support**: Deliver first-level support according to agreed SLA.\n\n### Output\n- **Product**: The final product is the output of this process.\n\n### Tool Integration\n- **Ticketing System**: Visual representation of ticket management.\n- **Roadmap**: Timeline view of project milestones.\n- **Management Dashboards**: Data visualization for tracking progress and metrics.\n\nThe flowchart uses arrows to indicate the flow of tasks and responsibilities between teams, emphasizing a structured and iterative approach to product development."
}
]
},
{
"id": 2,
"source": {
"type": "file",
"id": 2,
"name": "LF-Target.png",
"content_type": "image/png",
"size": 256760,
"upload_date": "2025-04-04T18:49:46.817147"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart depicting a product development process involving multiple teams: Product Team, Q&A Team, Engineering Team, and Operations. Here's a detailed breakdown:\n\n### Input\n- **Sources**: Customers, Sales, Our Ideas\n- These inputs feed into the Product Team's process.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas & Inputs\n - **Qualify**: Analyze and match against business priorities\n\n2. **Define**\n - **Structure & Document**: Write specifications, define acceptance criteria\n - **Explore & Design**: UI Design, experiments, and reference tickets in ClickUp\n\n3. **Shape**\n - **Roadmap**: Current setup and accelerated to meet market needs\n - **Scoping**: Define next version's scope\n - **Manage**: Tickets in Product\n\n### Engineering Team\n- **Assess**\n - **Manage**: Move assessed tickets to Engineering for future versions\n - **Estimate**: Assess tickets for implementation, feasibility, and effort\n\n- **Build**\n - **Manage**: Track progress in the dashboard\n - **Factory**: Develop tickets in Engineering for the next version\n\n### Q&A Team\n- **Validate**\n - **Testing**: Test functionality against acceptance\n - **Analysis**: Analyze tickets, events, deviations\n\n### Operations\n1. **Release**\n - **Manage**: Ensure stable changes\n\n2. **Run & Monitor**\n - **Manage**: Ensure stable operation\n - **Service & Support**: Deliver 1st level support according to agreed SLA\n\n### Output\n- **Product**: The final output of the process\n\n### Tool Integration\n- **Ticketing System**: Visual representation of a ticketing system\n- **Roadmap**: Timeline view of project phases\n- **Management Dashboards**: Graphs and metrics for tracking progress\n\nThe flowchart uses arrows to indicate the flow of tasks and responsibilities between the teams, emphasizing collaboration and integration across different stages of product development."
}
]
}
],
"content": "was beschreiben diese files?",
"agent_type": null
},
{
"id": "msg_7f0e279a-c72f-46cc-9306-9709672106b8",
"workflow_id": "4839820e-5e8b-4437-85cc-182ea76b1297",
"parent_message_id": null,
"started_at": "2025-04-04T18:49:49.067558",
"finished_at": "2025-04-04T18:49:49.070498",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**Analyseergebnisse:**\n\n1. **Trendidentifikation:**\n - Die Daten zeigen einen klaren Trend, der auf bestimmte Muster oder Entwicklungen hinweist.\n\n2. **Korrelationen:**\n - Es wurden signifikante Korrelationen zwischen verschiedenen Datensätzen festgestellt, die auf mögliche Zusammenhänge oder Einflussfaktoren hindeuten.\n\n3. **Besondere Auffälligkeiten:**\n - Ein bestimmtes Merkmal oder eine Datenreihe sticht besonders hervor, was auf eine außergewöhnliche Entwicklung oder Anomalie hinweisen könnte.\n\n**Empfehlungen:**\n\n1. **Maßnahme 1:**\n - Basierend auf den identifizierten Trends und Korrelationen wird empfohlen, spezifische Schritte zu unternehmen, um die positiven Entwicklungen zu fördern oder negative Einflüsse zu minimieren.\n\n2. **Maßnahme 2:**\n - Eine weitere Empfehlung zielt darauf ab, die identifizierten Korrelationen zu nutzen, um strategische Entscheidungen zu treffen, die den Gesamterfolg fördern.\n\n3. **Maßnahme 3:**\n - Es wird vorgeschlagen, gezielte Maßnahmen zu ergreifen, um auf die besonderen Auffälligkeiten zu reagieren, um Risiken zu mindern oder Chancen zu maximieren.\n\nDiese strukturierte Zusammenfassung fasst die wesentlichen Erkenntnisse und Empfehlungen der Datenanalyse zusammen, ohne Redundanzen zu enthalten.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_b3941b94-ec38-4bc2-97de-d3af138eb098",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 28, 3 Dateien",
"type": "info",
"timestamp": "2025-04-04T18:49:07.076283",
"agent_id": null,
"agent_name": null
},
{
"id": "log_04db440b-ca4d-4a62-a161-3ecbb406925a",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T18:49:07.080970",
"agent_id": null,
"agent_name": null
},
{
"id": "log_3fabb187-58b5-43f2-b8fa-5a0dac900ab1",
"message": "3 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T18:49:07.090501",
"agent_id": null,
"agent_name": null
},
{
"id": "log_51a05a98-1230-47b9-8d2a-b417bf6e4644",
"message": "Workflow wurde manuell gestoppt",
"type": "info",
"timestamp": "2025-04-04T18:49:42.124809",
"agent_id": null,
"agent_name": null
},
{
"id": "log_72c5b0ff-6c84-4540-b094-0d95b0edc6b7",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T18:49:49.040299",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c589f407-7e4e-4bd3-a679-ac30cde812c3",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Analysiere die bereitgestellten Flowchart-Bilder, ...",
"type": "info",
"timestamp": "2025-04-04T18:49:49.048482",
"agent_id": null,
"agent_name": null
},
{
"id": "log_08c86e47-8755-44b0-9796-9b093e306954",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-04T18:49:49.053488",
"agent_id": null,
"agent_name": null
},
{
"id": "log_afbf977e-6dd6-4262-99d6-9a8df790414f",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T18:49:49.059074",
"agent_id": null,
"agent_name": null
},
{
"id": "log_59943848-27e4-4b63-979a-a0fd54e2b96f",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T18:49:49.063133",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8fc48088-8c70-4942-912b-5db2cafacbf1",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-04T18:49:49.100613",
"agent_id": null,
"agent_name": null
},
{
"id": "log_63bdb78c-fbe6-4a99-8a4a-55f59ada8e45",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-04T18:49:54.347354",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,74 @@
{
"id": "4ba4b7cd-879b-4e44-84dd-daf6ed23a061",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 10:24:35",
"status": "waiting_for_user",
"started_at": "2025-04-04T10:24:36.074121",
"last_activity": "2025-04-04T10:24:36.886469",
"prompt": "analysiere das bild",
"messages": [
{
"id": "msg_3dd3df9d-9e71-4431-9737-9c4bb2947566",
"workflow_id": "4ba4b7cd-879b-4e44-84dd-daf6ed23a061",
"parent_message_id": null,
"started_at": "2025-04-04T10:24:36.080137",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "analysiere das bild",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_eba63c8d-68d5-449b-8963-24bf1a358864",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T10:24:36.077121",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0accef91-474d-4349-b736-696b78dbdea8",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T10:24:36.078157",
"agent_id": null,
"agent_name": null
},
{
"id": "log_946c6138-67c6-462d-a530-3d1d92a85bb4",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T10:24:36.880503",
"agent_id": null,
"agent_name": null
},
{
"id": "log_56df3970-626b-41ee-b1c5-5ad7f6b7a745",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T10:24:36.886469",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,169 @@
{
"id": "4dc09b26-3290-4559-acfa-b0f57a88bec3",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 5.4.2025, 00:45:31",
"status": "waiting_for_user",
"started_at": "2025-04-05T00:45:32.125842",
"last_activity": "2025-04-05T00:45:41.330610",
"prompt": "extract table from file",
"messages": [
{
"id": "msg_503ef3c9-ef7c-4a59-80bb-cb54db33d9f5",
"workflow_id": "4dc09b26-3290-4559-acfa-b0f57a88bec3",
"parent_message_id": null,
"started_at": "2025-04-05T00:45:32.143768",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 5,
"source": {
"type": "file",
"id": 5,
"name": "auszug_liste_positionen.pdf",
"content_type": "application/pdf",
"size": 299729,
"upload_date": "2025-04-05T00:45:32.237978"
},
"contents": [
{
"type": "text",
"text": "\n\n"
}
]
}
],
"content": "extract table from file",
"agent_type": null
},
{
"id": "msg_d794f47d-6a32-474a-ba2a-710947e1aed9",
"workflow_id": "4dc09b26-3290-4559-acfa-b0f57a88bec3",
"parent_message_id": null,
"started_at": "2025-04-05T00:45:33.856590",
"finished_at": "2025-04-05T00:45:33.861431",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Entwickler die Anforderungen analysiert und folgenden Code entwickelt:\n\n```python\ndef process_data(input_file, output_file):\n \"\"\"\n Verarbeitet Daten aus einer Eingabedatei und speichert die Ergebnisse.\n \n Args:\n input_file: Pfad zur Eingabedatei\n output_file: Pfad zur Ausgabedatei\n \"\"\"\n import pandas as pd\n \n # Daten einlesen\n df = pd.read_csv(input_file)\n \n # Daten verarbeiten\n # Hier würde die eigentliche Datenverarbeitung stattfinden\n processed_df = df.copy()\n \n # Beispiel: Spalten filtern und transformieren\n if 'data' in processed_df.columns:\n processed_df['transformed'] = processed_df['data'] * 2\n \n # Ergebnis speichern\n processed_df.to_csv(output_file, index=False)\n \n return len(processed_df)\n\n# Beispielaufruf\nif __name__ == \"__main__\":\n result = process_data(\"input.csv\", \"output.csv\")\n print(f\"Verarbeitet: result Datensätze\")\n```\n\nDer Code liest eine CSV-Datei ein, führt eine einfache Transformation durch und speichert das Ergebnis. \nDie Hauptfunktion `process_data` ist modular gestaltet und kann leicht erweitert werden.\n\nZur Verwendung:\n1. Stelle sicher, dass pandas installiert ist (`pip install pandas`)\n2. Passe die Dateipfade im Beispielaufruf an\n3. Erweitere die Verarbeitung je nach deinen spezifischen Anforderungen",
"agent_type": "coder",
"agent_id": "coder_agent",
"agent_name": "Entwickler"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n### Zusammenfassung der Agentenergebnisse\n\n#### Codeübersicht\nDer Entwickler hat einen Python-Code erstellt, der Daten aus einer CSV-Datei einliest, verarbeitet und das Ergebnis in einer neuen CSV-Datei speichert. Die Hauptfunktion des Codes ist `process_data`, die folgende Schritte umfasst:\n\n1. **Datenimport**: Die Funktion liest die Eingabedatei mithilfe der Bibliothek `pandas` ein.\n2. **Datenverarbeitung**: \n - Der Code enthält eine Beispieltransformation, bei der eine neue Spalte `transformed` erstellt wird, die den doppelten Wert der Spalte `data` enthält, falls diese existiert.\n - Der Code ist modular aufgebaut, was eine einfache Erweiterung der Datenverarbeitung ermöglicht.\n3. **Datenspeicherung**: Die verarbeiteten Daten werden in einer Ausgabedatei gespeichert.\n\n#### Empfehlungen zur Nutzung\n- **Installation**: Stellen Sie sicher, dass die Bibliothek `pandas` installiert ist, um den Code auszuführen (`pip install pandas`).\n- **Anpassung der Dateipfade**: Ändern Sie die Dateipfade im Beispielaufruf entsprechend Ihrer Dateistruktur.\n- **Erweiterung der Funktionalität**: Der Code ist so gestaltet, dass er leicht erweitert werden kann, um spezifische Anforderungen zu erfüllen. Fügen Sie zusätzliche Verarbeitungsschritte innerhalb der Funktion hinzu, um komplexere Datenanalysen durchzuführen.\n\n#### Wichtige Erkenntnisse\n- Der Code bietet eine grundlegende Struktur für die Datenverarbeitung, die als Ausgangspunkt für komplexere Aufgaben dienen kann.\n- Die Modularität der Funktion `process_data` erleichtert die Anpassung und Erweiterung, was sie flexibel für verschiedene Anwendungsfälle macht.\n- Die Verwendung von `pandas` ermöglicht effiziente Datenmanipulation und -analyse, was den Code für datenintensive Anwendungen geeignet macht.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_46eb6861-67ac-4b74-81e9-0e3966b5add6",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 23, 1 Dateien",
"type": "info",
"timestamp": "2025-04-05T00:45:32.132183",
"agent_id": null,
"agent_name": null
},
{
"id": "log_08db91db-ee33-4313-a59e-dca159c85b9e",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-05T00:45:32.137767",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8b2347ba-62c7-4acc-9e06-09678ce4b340",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-05T00:45:32.148735",
"agent_id": null,
"agent_name": null
},
{
"id": "log_065d5b1e-27b5-4846-b55d-e817ec770b19",
"message": "File auszug_liste_positionen.pdf read successfully",
"type": "info",
"timestamp": "2025-04-05T00:45:32.229034",
"agent_id": null,
"agent_name": null
},
{
"id": "log_92dbb6de-a01a-4787-9772-91452af43e93",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-05T00:45:33.828983",
"agent_id": null,
"agent_name": null
},
{
"id": "log_3bce866b-8b73-4178-bd79-d90d7616ef0c",
"message": "Agent coder_agent wurde ausgewählt mit Aufgabe: Extrahiere die Tabelle aus der Datei 'auszug_liste...",
"type": "info",
"timestamp": "2025-04-05T00:45:33.834983",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d3bd4e18-2795-4f00-a1cc-3ee3a995dc18",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:45:33.840549",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c322e6d0-b5b7-4257-b4f4-95535f420577",
"message": "Agent coder_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:45:33.845581",
"agent_id": null,
"agent_name": null
},
{
"id": "log_94e919e5-4530-4cf0-88ec-69744aa2f43e",
"message": "Agent 'coder_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:45:33.851590",
"agent_id": null,
"agent_name": null
},
{
"id": "log_38ed1726-8423-47db-a18b-0491c28c5415",
"message": "Agent 'coder_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-05T00:45:33.917774",
"agent_id": null,
"agent_name": null
},
{
"id": "log_fef7f060-a973-4680-aabb-8bbaee38ca57",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-05T00:45:41.330610",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "4fee787f-b099-4aeb-bd99-73d151229f74",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 11:46:16",
"status": "failed",
"started_at": "2025-04-04T11:46:16.651685",
"last_activity": "2025-04-04T11:46:32.126252",
"prompt": "describe",
"messages": [],
"logs": [
{
"id": "log_1907a8c4-241e-43b3-98d8-0d381ad62a08",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T11:46:16.655687",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ae05b5a7-985c-41ef-a4ae-3c5f172d9262",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T11:46:16.660587",
"agent_id": null,
"agent_name": null
},
{
"id": "log_83ce0ffb-cdd4-4722-9808-0be03330abde",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T11:46:16.666797",
"agent_id": null,
"agent_name": null
},
{
"id": "log_31530013-6129-488f-9ede-4ed823863618",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T11:46:32.126252",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,74 @@
{
"id": "59df8cea-ba9e-48d6-aa48-8d68f2e105da",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 10:31:58",
"status": "waiting_for_user",
"started_at": "2025-04-04T10:31:59.502928",
"last_activity": "2025-04-04T10:32:01.732993",
"prompt": "beschreibe das bild",
"messages": [
{
"id": "msg_9b101f2e-80a0-4ad1-b493-5e8e1871bf00",
"workflow_id": "59df8cea-ba9e-48d6-aa48-8d68f2e105da",
"parent_message_id": null,
"started_at": "2025-04-04T10:31:59.508929",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "beschreibe das bild",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_50bfd380-0ae4-4e02-922f-b6ae2111889b",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T10:31:59.504929",
"agent_id": null,
"agent_name": null
},
{
"id": "log_883883e2-c0de-46ca-92e5-fc9bf92a0dc5",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T10:31:59.506930",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1a94d3af-62bd-421e-8ca6-15f9ff139284",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T10:32:01.725998",
"agent_id": null,
"agent_name": null
},
{
"id": "log_29eb2920-b1fc-4515-8d7a-b55cc167c645",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T10:32:01.732993",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,263 @@
{
"id": "5b9a4087-2335-477f-805d-23a54d5c5c30",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 19:05:28",
"status": "waiting_for_user",
"started_at": "2025-04-04T19:05:28.410317",
"last_activity": "2025-04-04T19:06:32.120827",
"prompt": "please summarize pictures",
"messages": [
{
"id": "msg_499aa0ac-a7bc-42f3-b1bc-d0ba9fc9997b",
"workflow_id": "5b9a4087-2335-477f-805d-23a54d5c5c30",
"parent_message_id": null,
"started_at": "2025-04-04T19:05:28.426106",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 3,
"source": {
"type": "file",
"id": 3,
"name": "LF-Current.png",
"content_type": "image/png",
"size": 126277,
"upload_date": "2025-04-04T19:05:49.282974"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart depicting a product development process divided between the Product Team and the Engineering Team. Here's a detailed description:\n\n### Input\n- **Sources**: Customers, Sales, Our Ideas.\n- **Process**: Inputs are collected and qualified.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas & Inputs.\n - **Qualify**: Analyze and match in the team.\n\n2. **Define**\n - **Structure & Document**: Write specifications, define acceptance criteria.\n - **Explore & Design**: UI Design, Experiments, etc.\n\n3. **Shape**\n - **Roadmap**: Define a roadmap.\n - **Scoping**: Define next version's scope.\n - **Manage**: Tickets in Product.\n\n### Engineering Team\n1. **Build**\n - **Manage**: Track progress in the dashboard.\n - **Factory**: Develop tickets in Engineering for the next version.\n\n2. **Release**\n - **Manage**: Ensure stable changes.\n\n3. **Run & Monitor**\n - **Manage**: Ensure stable operation.\n - **Service & Support**: Deliver 1st level support according to agreed SLA.\n\n4. **Assess**\n - **Manage**: Move assessed tickets to Engineering for future versions.\n - **Estimate**: Assess tickets, define implementation, feasibility, and effort.\n\n### Output\n- **Product**: The final output of the process.\n\n### Tool Integration\n- **Ticketing System**: Includes sections like Inputs & Ideas, Analysis, Cooperation, Future Versions, and Business.\n- **Roadmap** and **Management Dashboards**: Tools for managing the process.\n\nThe flowchart uses arrows to indicate the flow of tasks and responsibilities between the stages and teams."
}
]
},
{
"id": 2,
"source": {
"type": "file",
"id": 2,
"name": "LF-Target.png",
"content_type": "image/png",
"size": 256760,
"upload_date": "2025-04-04T19:05:49.288601"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart depicting a product development process involving multiple teams: Product Team, Q&A Team, Engineering Team, and Operations. Here's a detailed breakdown:\n\n### Input\n- **Sources**: Customers, Sales, Our Ideas\n- These inputs feed into the Product Team's process.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas & Inputs\n - **Qualify**: Analyze and match against business priorities\n\n2. **Define**\n - **Structure & Document**: Write specifications and define acceptance criteria\n - **Explore & Design**: UI Design, Experiments, and reference tickets in ClickUp\n\n3. **Shape**\n - **Roadmap**: Current setup and accelerated market needs\n - **Scoping**: Define next version's scope\n - **Manage**: Tickets in Product\n\n### Engineering Team\n1. **Assess**\n - **Manage**: Move assessed tickets to Engineering for future versions\n - **Estimate**: Assess tickets for implementation, feasibility, and effort\n\n2. **Build**\n - **Manage**: Track progress in the dashboard\n - **Factory**: Develop tickets in Engineering for the next version\n\n### Q&A Team\n1. **Validate**\n - **Testing**: Test functionality against acceptance\n - **Analysis**: Analyze tickets, events, deviations\n\n### Operations\n1. **Release**\n - **Manage**: Ensure stable changes\n\n2. **Run & Monitor**\n - **Manage**: Ensure stable operation\n - **Service & Support**: Deliver 1st Level support according to agreed SLA\n\n### Output\n- **Product**: The final output of the process\n\n### Tool Integration\n- **Ticketing System**: Manages tasks and progress\n- **Roadmap**: Visual timeline of tasks and milestones\n- **Management Dashboards**: Displays metrics and performance data\n\nThe flowchart uses arrows to indicate the flow of tasks and responsibilities between different teams and stages."
}
]
}
],
"content": "please summarize pictures",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Bitte fassen Sie die Informationen aus den bereitgestellten Bildanalysen zusammen. Die Bilder beschreiben Flussdiagramme, die den Produktentwicklungsprozess darstellen. Erstellen Sie eine zusammenfassende Beschreibung der Prozesse, die in den Bildern LF-Current.png und LF-Target.png dargestellt sind.",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-04T19:06:22.556326",
"status": "completed"
},
{
"id": "msg_b6c54c0f-f523-4ec5-865c-7fd630560716",
"workflow_id": "5b9a4087-2335-477f-805d-23a54d5c5c30",
"parent_message_id": null,
"started_at": "2025-04-04T19:06:22.556326",
"finished_at": null,
"sequence_no": 3,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "ja, bitte zusammenfassung",
"agent_type": null
},
{
"id": "msg_9944cbb3-cefb-43d6-8b6e-87d00913f326",
"workflow_id": "5b9a4087-2335-477f-805d-23a54d5c5c30",
"parent_message_id": null,
"started_at": "2025-04-04T19:06:24.717061",
"finished_at": "2025-04-04T19:06:24.717061",
"sequence_no": 4,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "# Bericht - Projektzusammenfassung 2025\n\n## Zusammenfassung\n\nDieses Dokument bietet einen umfassenden Überblick über die strategische Ausrichtung und geplanten Aktivitäten für das Jahr 2025. Es basiert auf den aktuellen Planungsdokumenten und Analysen und dient als Referenz für alle Projektbeteiligten.\n\n## Inhaltsverzeichnis\n\n1. Einleitung und Zielsetzung\n2. Marktanalyse und Strategische Positionierung\n3. Projektplanung und Ressourcenallokation\n4. Budgetierung und Finanzplanung\n5. Meilensteine und Zeitplan\n6. Risikomanagement\n7. Empfehlungen und nächste Schritte\n\n## 1. Einleitung und Zielsetzung\n\nDieses Dokument wurde erstellt, um einen strukturierten Überblick über die geplanten Aktivitäten und strategischen Ziele für das Jahr 2025 zu geben. Die Hauptziele sind:\n\n- Expansion in neue Märkte mit besonderem Fokus auf die APAC-Region\n- Steigerung des Marktanteils in bestehenden Märkten um 5%\n- Entwicklung und Einführung von mindestens zwei neuen Produktlinien\n- Optimierung der Betriebsabläufe zur Kostensenkung um 8%\n\n## 2. Marktanalyse und Strategische Positionierung\n\nDie aktuelle Marktanalyse zeigt folgende Schlüsseltrends:\n\n| Trend | Bedeutung | Implikation |\n|-------|-----------|-------------|\n| Digitalisierung | Hoch | Erhöhte Nachfrage nach integrierten Lösungen |\n| Nachhaltigkeit | Mittel-Hoch | Anpassung von Produkten und Prozessen erforderlich |\n| KI-Integration | Hoch | Wettbewerbsvorteil durch intelligente Produkte |\n\nUnsere strategische Positionierung basiert auf dem Prinzip der differenzierten Qualitätsführerschaft mit starkem Fokus auf Innovationen.\n\n## 3. Projektplanung und Ressourcenallokation\n\nDrei Hauptprojekte wurden für Q2 2025 identifiziert:\n\n1. **Projekt Alpha**: Markteinführung der neuen Produktlinie XYZ\n - Projektleitung: Maria Schmidt\n - Teamgröße: 12 Mitarbeiter\n - Startdatum: 15.04.2025\n\n2. **Projekt Beta**: Implementierung des verbesserten CRM-Systems\n - Projektleitung: Thomas Müller\n - Teamgröße: 8 Mitarbeiter\n - Startdatum: 01.05.2025\n\n3. **Projekt Gamma**: Expansion in die APAC-Region\n - Projektleitung: Sarah Weber\n - Teamgröße: 15 Mitarbeiter\n - Startdatum: 01.06.2025\n\nDie detaillierte Ressourcenallokation ist im Anhang A zu finden.\n\n## 4. Budgetierung und Finanzplanung\n\nDas Gesamtbudget für 2025 beträgt 12,5 Millionen Euro, mit folgender Aufteilung:\n\n- Forschung und Entwicklung: 3,75 Mio. € (30%)\n- Marketing und Vertrieb: 3,125 Mio. € (25%)\n- Betriebskosten: 2,5 Mio. € (20%)\n- Expansion und neue Märkte: 1,875 Mio. € (15%)\n- Reserve und Unvorhergesehenes: 1,25 Mio. € (10%)\n\nDas Budget für Forschung und Entwicklung wurde um 15% im Vergleich zum Vorjahr erhöht.\n\n## 5. Meilensteine und Zeitplan\n\n| Meilenstein | Beschreibung | Termin |\n|-------------|--------------|--------|\n| M1 | Abschluss der Marktforschung für APAC | 31.03.2025 |\n| M2 | Produktprototyp XYZ fertiggestellt | 30.04.2025 |\n| M3 | CRM-System implementiert | 30.06.2025 |\n| M4 | Erste Niederlassung in APAC eröffnet | 31.08.2025 |\n| M5 | Markteinführung Produktlinie XYZ | 30.09.2025 |\n\n## 6. Risikomanagement\n\nIdentifizierte Risiken und Gegenmaßnahmen:\n\n- **Lieferkettenunterbrechungen**\n - Risikostufe: Hoch\n - Maßnahmen: Diversifizierung der Lieferanten, erhöhte Lagerbestände kritischer Komponenten\n\n- **Regulatorische Änderungen**\n - Risikostufe: Mittel\n - Maßnahmen: Kontinuierliches Monitoring, frühzeitige Anpassung der Produkte\n\n- **Verzögerungen bei der Produktentwicklung**\n - Risikostufe: Mittel\n - Maßnahmen: Agile Entwicklungsmethoden, regelmäßige Reviews, Pufferzeiten im Zeitplan\n\n## 7. Empfehlungen und nächste Schritte\n\nBasierend auf der vorliegenden Analyse werden folgende Schritte empfohlen:\n\n1. Sofortige Einberufung der Projektteams und Kick-off-Meetings\n2. Finalisierung der detaillierten Projektpläne bis Ende März\n3. Monatliche Statusberichte an die Geschäftsleitung\n4. Vierteljährliche Review-Meetings mit allen Stakeholdern\n5. Kontinuierliches Monitoring der Marktbedingungen und Anpassung der Strategie bei Bedarf\n\n---\n\n**Dokument-Metadaten:**\n- Erstellt: 30.03.2025\n- Version: 1.0\n- Status: Finaler Entwurf\n- Autor: Dokumentations-Agent",
"agent_type": "documentation",
"agent_id": "documentation_agent",
"agent_name": "Dokumentation"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n### Zusammenfassung der Agentenergebnisse: Projektzusammenfassung 2025\n\n#### Einleitung und Zielsetzung\nDas Dokument bietet einen strukturierten Überblick über die strategischen Ziele und geplanten Aktivitäten für 2025. Hauptziele sind die Expansion in die APAC-Region, eine Marktanteilssteigerung um 5% in bestehenden Märkten, die Einführung von zwei neuen Produktlinien und die Optimierung der Betriebsabläufe zur Kostensenkung um 8%.\n\n#### Marktanalyse und Strategische Positionierung\nDie Marktanalyse identifiziert Digitalisierung, Nachhaltigkeit und KI-Integration als Schlüsseltrends. Die strategische Positionierung basiert auf differenzierter Qualitätsführerschaft mit einem starken Fokus auf Innovationen.\n\n#### Projektplanung und Ressourcenallokation\nFür Q2 2025 sind drei Hauptprojekte geplant:\n1. **Projekt Alpha**: Einführung der Produktlinie XYZ (Leitung: Maria Schmidt, Team: 12 Mitarbeiter, Start: 15.04.2025)\n2. **Projekt Beta**: Implementierung eines verbesserten CRM-Systems (Leitung: Thomas Müller, Team: 8 Mitarbeiter, Start: 01.05.2025)\n3. **Projekt Gamma**: Expansion in die APAC-Region (Leitung: Sarah Weber, Team: 15 Mitarbeiter, Start: 01.06.2025)\n\n#### Budgetierung und Finanzplanung\nDas Gesamtbudget für 2025 beträgt 12,5 Millionen Euro, verteilt auf Forschung und Entwicklung (30%), Marketing und Vertrieb (25%), Betriebskosten (20%), Expansion (15%) und Reserve (10%). Das F&E-Budget wurde um 15% erhöht.\n\n#### Meilensteine und Zeitplan\nWichtige Meilensteine umfassen den Abschluss der Marktforschung für APAC (31.03.2025), die Fertigstellung des Produktprototyps XYZ (30.04.2025), die Implementierung des CRM-Systems (30.06.2025), die Eröffnung der ersten APAC-Niederlassung (31.08.2025) und die Markteinführung der Produktlinie XYZ (30.09.2025).\n\n#### Risikomanagement\nIdentifizierte Risiken umfassen Lieferkettenunterbrechungen (Hoch), regulatorische Änderungen (Mittel) und Verzögerungen bei der Produktentwicklung (Mittel). Gegenmaßnahmen beinhalten Lieferantendiversifizierung, kontinuierliches Monitoring und agile Entwicklungsmethoden.\n\n#### Empfehlungen und nächste Schritte\nEmpfohlene Schritte sind die sofortige Einberufung der Projektteams, die Finalisierung der Projektpläne bis Ende März, monatliche Statusberichte an die Geschäftsleitung, vierteljährliche Review-Meetings mit Stakeholdern und kontinuierliches Monitoring der Marktbedingungen zur strategischen Anpassung.\n\n**Dokument-Metadaten:**\n- Erstellt: 30.03.2025\n- Version: 1.0\n- Status: Finaler Entwurf\n- Autor: Dokumentations-Agent\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_e0722ee1-34f4-4cbf-8ab5-cc0030a82a16",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 25, 2 Dateien",
"type": "info",
"timestamp": "2025-04-04T19:05:28.417505",
"agent_id": null,
"agent_name": null
},
{
"id": "log_20bee139-4d21-4a62-8a26-b1a4d58d862d",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T19:05:28.421594",
"agent_id": null,
"agent_name": null
},
{
"id": "log_63554797-d6a8-4879-ad6d-d63ba4cd748b",
"message": "2 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T19:05:28.427505",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9dee62d4-d57b-4763-b598-1480543c3101",
"message": "Image LF-Current.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-04T19:05:37.821110",
"agent_id": null,
"agent_name": null
},
{
"id": "log_da65e57d-bad8-4210-8095-c78faf7290cb",
"message": "Image LF-Target.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-04T19:05:49.259901",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c389b9cd-4eff-4420-a84b-a656edc724cb",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T19:05:50.986835",
"agent_id": null,
"agent_name": null
},
{
"id": "log_2cf35f24-7569-4c6b-af4a-42403c11628d",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Bitte fassen Sie die Informationen aus den bereitg...",
"type": "info",
"timestamp": "2025-04-04T19:05:50.991834",
"agent_id": null,
"agent_name": null
},
{
"id": "log_30387d30-c142-49ee-9c82-dcd33c48c827",
"message": "Workflow wartet auf Benutzereingabe: Bitte fassen Sie die Informationen aus den bereitg...",
"type": "info",
"timestamp": "2025-04-04T19:05:50.995850",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d442ab73-5123-432e-8612-3c56a78691e1",
"message": "Benutzereingabe empfangen: 25 Zeichen, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T19:06:22.547364",
"agent_id": null,
"agent_name": null
},
{
"id": "log_55f9e985-0db2-432d-9463-80908478af4d",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T19:06:22.551812",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b3e29f8e-15c0-4fe4-84b0-956571e4b339",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T19:06:24.696072",
"agent_id": null,
"agent_name": null
},
{
"id": "log_fe814fb4-d8fa-4e4f-82d9-93c226309b3a",
"message": "Agent documentation_agent wurde ausgewählt mit Aufgabe: Erstelle eine Zusammenfassung basierend auf den ve...",
"type": "info",
"timestamp": "2025-04-04T19:06:24.696072",
"agent_id": null,
"agent_name": null
},
{
"id": "log_327c9e15-3725-4690-ade4-1336f6e566a2",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-04T19:06:24.708608",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0b2a6bd1-7b05-409e-8c87-43225406ba24",
"message": "Agent documentation_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T19:06:24.712142",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4a140d68-1b45-47d9-bf0d-a8c030180724",
"message": "Agent 'documentation_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T19:06:24.717061",
"agent_id": null,
"agent_name": null
},
{
"id": "log_352d6e9f-efd1-4c8b-be5f-a3bd8159d7f3",
"message": "Agent 'documentation_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-04T19:06:24.789773",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b7210290-ea63-4a0f-9b52-e9e61b86394a",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-04T19:06:32.120827",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,447 @@
{
"id": "5dca41fa-903f-4149-b0bc-64a98802bee0",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 12:30:35",
"status": "waiting_for_user",
"started_at": "2025-04-04T12:30:35.952782",
"last_activity": "2025-04-04T12:43:09.821854",
"prompt": "describe",
"messages": [
{
"id": "msg_3925a1b4-df15-451a-86f6-72c50d72a633",
"workflow_id": "5dca41fa-903f-4149-b0bc-64a98802bee0",
"parent_message_id": null,
"started_at": "2025-04-04T12:30:35.964325",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 2,
"source": {
"type": "file",
"id": 2,
"name": "LF-Target.png",
"content_type": "image/png",
"size": 256760,
"upload_date": "2025-04-04T12:30:49.639228"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart depicting a product development and release process involving multiple teams: Product Team, Engineering Team, Q&A Team, and Operations. Here's a detailed breakdown:\n\n### Input\n- **Sources**: Customers, Sales, and Internal Ideas.\n- These inputs feed into the Product Team's processes.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas and inputs are gathered.\n - **Qualify**: Analyzed and matched against business priorities.\n\n2. **Define**\n - **Structure & Document**: Write specifications and define acceptance criteria.\n - **Explore & Design**: UI design and experiments, with references to tickets in ClickUp.\n\n3. **Shape**\n - **Roadmap**: For current setup and accelerated market needs.\n - **Scoping**: Define next version's scope.\n - **Manage**: Tickets in Product.\n\n### Engineering Team\n- **Assess**\n - **Manage**: Move assessed tickets to Engineering for future versions.\n - **Estimate**: Assess tickets for implementation, feasibility, and effort.\n\n- **Build**\n - **Manage**: Track progress in the dashboard.\n - **Factory**: Develop tickets in Engineering for the next version.\n\n### Q&A Team\n- **Validate**\n - **Testing**: Test functionality against acceptance criteria.\n - **Analysis**: Analyze tickets, events, and deviations.\n\n### Operations\n1. **Release**\n - **Manage**: Ensure stable changes.\n\n2. **Run & Monitor**\n - **Manage**: Ensure stable operation.\n - **Service & Support**: Deliver first-level support according to agreed SLA.\n\n### Output\n- The final product is the output of this process.\n\n### Tool Integration\n- **Ticketing System**: Visual representation of ticket management.\n- **Roadmap**: Timeline for product development phases.\n- **Management Dashboards**: Displays metrics and progress data.\n\nThe flowchart uses arrows to indicate the flow of processes and interactions between different teams and stages."
}
]
}
],
"content": "describe",
"agent_type": null
},
{
"id": "msg_4c95154a-aede-48af-bd34-5e2b70eb06d4",
"workflow_id": "5dca41fa-903f-4149-b0bc-64a98802bee0",
"parent_message_id": null,
"started_at": "2025-04-04T12:30:51.385403",
"finished_at": "2025-04-04T12:30:51.387796",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**Datenanalyse:**\n\n1. **Trends:**\n - Die Daten zeigen einen klaren Trend in Bezug auf [spezifischen Trend beschreiben].\n\n2. **Korrelationen:**\n - Es gibt signifikante Korrelationen zwischen [Variable A] und [Variable B], was auf [Erkenntnis oder Schlussfolgerung] hinweist.\n\n3. **Auffälligkeiten:**\n - Besonders auffällig ist [spezifische Auffälligkeit oder Anomalie], was möglicherweise auf [mögliche Ursache oder Bedeutung] hindeutet.\n\n**Empfehlungen:**\n\n- **Maßnahme 1:** [Beschreibung der ersten Maßnahme, die aufgrund der Analyse empfohlen wird].\n- **Maßnahme 2:** [Beschreibung der zweiten Maßnahme, die aufgrund der Analyse empfohlen wird].\n- **Maßnahme 3:** [Beschreibung der dritten Maßnahme, die aufgrund der Analyse empfohlen wird].\n\nDiese strukturierte Zusammenfassung fasst die wesentlichen Erkenntnisse und Empfehlungen der Datenanalyse zusammen, um gezielte Maßnahmen zu ermöglichen.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-04T12:32:56.707742",
"status": "completed"
},
{
"id": "msg_c31d520e-e024-4d52-92d5-b3769e51b1d0",
"workflow_id": "5dca41fa-903f-4149-b0bc-64a98802bee0",
"parent_message_id": null,
"started_at": "2025-04-04T12:32:56.708199",
"finished_at": null,
"sequence_no": 4,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "mach mir eine zusammenfassung",
"agent_type": null
},
{
"id": "msg_cca5bf9d-03ef-4176-94d5-5385b4d4a951",
"workflow_id": "5dca41fa-903f-4149-b0bc-64a98802bee0",
"parent_message_id": null,
"started_at": "2025-04-04T12:32:58.809327",
"finished_at": "2025-04-04T12:32:58.811099",
"sequence_no": 5,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "# Bericht - Projektzusammenfassung 2025\n\n## Zusammenfassung\n\nDieses Dokument bietet einen umfassenden Überblick über die strategische Ausrichtung und geplanten Aktivitäten für das Jahr 2025. Es basiert auf den aktuellen Planungsdokumenten und Analysen und dient als Referenz für alle Projektbeteiligten.\n\n## Inhaltsverzeichnis\n\n1. Einleitung und Zielsetzung\n2. Marktanalyse und Strategische Positionierung\n3. Projektplanung und Ressourcenallokation\n4. Budgetierung und Finanzplanung\n5. Meilensteine und Zeitplan\n6. Risikomanagement\n7. Empfehlungen und nächste Schritte\n\n## 1. Einleitung und Zielsetzung\n\nDieses Dokument wurde erstellt, um einen strukturierten Überblick über die geplanten Aktivitäten und strategischen Ziele für das Jahr 2025 zu geben. Die Hauptziele sind:\n\n- Expansion in neue Märkte mit besonderem Fokus auf die APAC-Region\n- Steigerung des Marktanteils in bestehenden Märkten um 5%\n- Entwicklung und Einführung von mindestens zwei neuen Produktlinien\n- Optimierung der Betriebsabläufe zur Kostensenkung um 8%\n\n## 2. Marktanalyse und Strategische Positionierung\n\nDie aktuelle Marktanalyse zeigt folgende Schlüsseltrends:\n\n| Trend | Bedeutung | Implikation |\n|-------|-----------|-------------|\n| Digitalisierung | Hoch | Erhöhte Nachfrage nach integrierten Lösungen |\n| Nachhaltigkeit | Mittel-Hoch | Anpassung von Produkten und Prozessen erforderlich |\n| KI-Integration | Hoch | Wettbewerbsvorteil durch intelligente Produkte |\n\nUnsere strategische Positionierung basiert auf dem Prinzip der differenzierten Qualitätsführerschaft mit starkem Fokus auf Innovationen.\n\n## 3. Projektplanung und Ressourcenallokation\n\nDrei Hauptprojekte wurden für Q2 2025 identifiziert:\n\n1. **Projekt Alpha**: Markteinführung der neuen Produktlinie XYZ\n - Projektleitung: Maria Schmidt\n - Teamgröße: 12 Mitarbeiter\n - Startdatum: 15.04.2025\n\n2. **Projekt Beta**: Implementierung des verbesserten CRM-Systems\n - Projektleitung: Thomas Müller\n - Teamgröße: 8 Mitarbeiter\n - Startdatum: 01.05.2025\n\n3. **Projekt Gamma**: Expansion in die APAC-Region\n - Projektleitung: Sarah Weber\n - Teamgröße: 15 Mitarbeiter\n - Startdatum: 01.06.2025\n\nDie detaillierte Ressourcenallokation ist im Anhang A zu finden.\n\n## 4. Budgetierung und Finanzplanung\n\nDas Gesamtbudget für 2025 beträgt 12,5 Millionen Euro, mit folgender Aufteilung:\n\n- Forschung und Entwicklung: 3,75 Mio. € (30%)\n- Marketing und Vertrieb: 3,125 Mio. € (25%)\n- Betriebskosten: 2,5 Mio. € (20%)\n- Expansion und neue Märkte: 1,875 Mio. € (15%)\n- Reserve und Unvorhergesehenes: 1,25 Mio. € (10%)\n\nDas Budget für Forschung und Entwicklung wurde um 15% im Vergleich zum Vorjahr erhöht.\n\n## 5. Meilensteine und Zeitplan\n\n| Meilenstein | Beschreibung | Termin |\n|-------------|--------------|--------|\n| M1 | Abschluss der Marktforschung für APAC | 31.03.2025 |\n| M2 | Produktprototyp XYZ fertiggestellt | 30.04.2025 |\n| M3 | CRM-System implementiert | 30.06.2025 |\n| M4 | Erste Niederlassung in APAC eröffnet | 31.08.2025 |\n| M5 | Markteinführung Produktlinie XYZ | 30.09.2025 |\n\n## 6. Risikomanagement\n\nIdentifizierte Risiken und Gegenmaßnahmen:\n\n- **Lieferkettenunterbrechungen**\n - Risikostufe: Hoch\n - Maßnahmen: Diversifizierung der Lieferanten, erhöhte Lagerbestände kritischer Komponenten\n\n- **Regulatorische Änderungen**\n - Risikostufe: Mittel\n - Maßnahmen: Kontinuierliches Monitoring, frühzeitige Anpassung der Produkte\n\n- **Verzögerungen bei der Produktentwicklung**\n - Risikostufe: Mittel\n - Maßnahmen: Agile Entwicklungsmethoden, regelmäßige Reviews, Pufferzeiten im Zeitplan\n\n## 7. Empfehlungen und nächste Schritte\n\nBasierend auf der vorliegenden Analyse werden folgende Schritte empfohlen:\n\n1. Sofortige Einberufung der Projektteams und Kick-off-Meetings\n2. Finalisierung der detaillierten Projektpläne bis Ende März\n3. Monatliche Statusberichte an die Geschäftsleitung\n4. Vierteljährliche Review-Meetings mit allen Stakeholdern\n5. Kontinuierliches Monitoring der Marktbedingungen und Anpassung der Strategie bei Bedarf\n\n---\n\n**Dokument-Metadaten:**\n- Erstellt: 30.03.2025\n- Version: 1.0\n- Status: Finaler Entwurf\n- Autor: Dokumentations-Agent",
"agent_type": "documentation",
"agent_id": "documentation_agent",
"agent_name": "Dokumentation"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n### Zusammenfassung der Agentenergebnisse - Projektzusammenfassung 2025\n\n#### Einleitung und Zielsetzung\nDas Dokument bietet einen strukturierten Überblick über die strategischen Ziele und geplanten Aktivitäten für 2025. Hauptziele sind die Expansion in neue Märkte, insbesondere die APAC-Region, die Steigerung des Marktanteils um 5% in bestehenden Märkten, die Entwicklung von zwei neuen Produktlinien und die Optimierung der Betriebsabläufe zur Kostensenkung um 8%.\n\n#### Marktanalyse und Strategische Positionierung\nDie Marktanalyse identifiziert Digitalisierung, Nachhaltigkeit und KI-Integration als Schlüsseltrends. Die strategische Positionierung fokussiert auf differenzierte Qualitätsführerschaft und Innovation.\n\n#### Projektplanung und Ressourcenallokation\nFür Q2 2025 sind drei Hauptprojekte geplant:\n1. **Projekt Alpha**: Einführung der Produktlinie XYZ (Leitung: Maria Schmidt, Start: 15.04.2025)\n2. **Projekt Beta**: Implementierung eines verbesserten CRM-Systems (Leitung: Thomas Müller, Start: 01.05.2025)\n3. **Projekt Gamma**: Expansion in die APAC-Region (Leitung: Sarah Weber, Start: 01.06.2025)\n\n#### Budgetierung und Finanzplanung\nDas Gesamtbudget für 2025 beträgt 12,5 Millionen Euro, aufgeteilt in Forschung und Entwicklung (30%), Marketing und Vertrieb (25%), Betriebskosten (20%), Expansion (15%) und Reserve (10%). Das F&E-Budget wurde um 15% erhöht.\n\n#### Meilensteine und Zeitplan\nWichtige Meilensteine sind der Abschluss der Marktforschung für APAC (31.03.2025), die Fertigstellung des Produktprototyps XYZ (30.04.2025), die Implementierung des CRM-Systems (30.06.2025), die Eröffnung der ersten Niederlassung in APAC (31.08.2025) und die Markteinführung der Produktlinie XYZ (30.09.2025).\n\n#### Risikomanagement\nIdentifizierte Risiken umfassen Lieferkettenunterbrechungen, regulatorische Änderungen und Verzögerungen bei der Produktentwicklung. Gegenmaßnahmen beinhalten die Diversifizierung der Lieferanten, kontinuierliches Monitoring und agile Entwicklungsmethoden.\n\n#### Empfehlungen und nächste Schritte\nEmpfohlen werden die sofortige Einberufung der Projektteams, die Finalisierung der Projektpläne bis Ende März, monatliche Statusberichte an die Geschäftsleitung, vierteljährliche Review-Meetings mit Stakeholdern und kontinuierliches Monitoring der Marktbedingungen zur strategischen Anpassung.\n\n**Dokument-Metadaten:**\n- Erstellt: 30.03.2025\n- Version: 1.0\n- Status: Finaler Entwurf\n- Autor: Dokumentations-Agent\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-04T12:33:40.573636",
"status": "completed"
},
{
"id": "msg_4ce4c40f-8c30-493c-b8db-86a6f8258613",
"workflow_id": "5dca41fa-903f-4149-b0bc-64a98802bee0",
"parent_message_id": null,
"started_at": "2025-04-04T12:33:40.574638",
"finished_at": null,
"sequence_no": 7,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "danke passt",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-04T12:42:59.735271",
"status": "completed"
},
{
"id": "msg_3636c7f8-ccfd-442e-9f36-62b684c98dd9",
"workflow_id": "5dca41fa-903f-4149-b0bc-64a98802bee0",
"parent_message_id": null,
"started_at": "2025-04-04T12:42:59.736270",
"finished_at": null,
"sequence_no": 9,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 5,
"source": {
"type": "file",
"id": 5,
"name": "auszug_liste_positionen.pdf",
"content_type": "application/pdf",
"size": 299729,
"upload_date": "2025-04-04T12:42:59.825798"
},
"contents": [
{
"type": "text",
"text": "\n\n"
}
]
}
],
"content": "describe",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Bitte geben Sie weitere Details an, was genau beschrieben werden soll. Handelt es sich um den Inhalt der Datei 'auszug_liste_positionen.pdf' oder benötigen Sie eine allgemeine Beschreibung zu einem anderen Thema?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_e0236c2d-5fa8-4850-a16d-3856919545df",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:30:35.956781",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5b89f043-4114-40e8-9ccd-fb09b53ff447",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:30:35.961315",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0d92eeb8-0020-4dbf-af09-321dad7302c9",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T12:30:35.967707",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f5fa4013-a4b3-40d6-862d-589093de946c",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T12:30:51.364528",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a08f0755-71a5-4c95-a1dd-4de73abb87f7",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Analysiere das bereitgestellte Bild 'LF-Target.png...",
"type": "info",
"timestamp": "2025-04-04T12:30:51.369488",
"agent_id": null,
"agent_name": null
},
{
"id": "log_33f63906-58d6-4aa2-938f-a87ffb1ec9c9",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-04T12:30:51.374481",
"agent_id": null,
"agent_name": null
},
{
"id": "log_fdfc63da-c829-4cf0-9b00-878f63695429",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T12:30:51.379013",
"agent_id": null,
"agent_name": null
},
{
"id": "log_edfe08a7-2c5f-4ef5-8c82-19edb68f5614",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T12:30:51.381967",
"agent_id": null,
"agent_name": null
},
{
"id": "log_463e1060-abc2-4270-9ea7-7d292fe691b0",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-04T12:30:51.417627",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f62297c3-9e6a-4a50-9f8c-73b882e9988d",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-04T12:30:54.383219",
"agent_id": null,
"agent_name": null
},
{
"id": "log_67c8e216-fcc2-443d-827f-673ce988a1cf",
"message": "Benutzereingabe empfangen: 29 Zeichen, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:32:56.695928",
"agent_id": null,
"agent_name": null
},
{
"id": "log_cf5be3d1-ca7e-44ab-9f34-0ea8658619e5",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:32:56.703644",
"agent_id": null,
"agent_name": null
},
{
"id": "log_938414fa-f18d-471a-8c04-3e23d8d65952",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T12:32:58.781914",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e98915d3-6532-423d-8297-f2d1a3e396cb",
"message": "Agent documentation_agent wurde ausgewählt mit Aufgabe: Erstelle eine qualitativ hochwertige Zusammenfassu...",
"type": "info",
"timestamp": "2025-04-04T12:32:58.791904",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c1d1f200-5dc6-4014-a8bd-d09587695e80",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-04T12:32:58.794945",
"agent_id": null,
"agent_name": null
},
{
"id": "log_399893d0-36af-4c24-8c8e-72ee327fffca",
"message": "Agent documentation_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T12:32:58.798635",
"agent_id": null,
"agent_name": null
},
{
"id": "log_13841e86-89eb-482a-a2d7-00a29913e7ad",
"message": "Agent 'documentation_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T12:32:58.805398",
"agent_id": null,
"agent_name": null
},
{
"id": "log_601faa15-66c1-41d4-9137-9bfa33523051",
"message": "Agent 'documentation_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-04T12:32:58.871552",
"agent_id": null,
"agent_name": null
},
{
"id": "log_87a82511-46e9-4ffe-9a24-8858094a897e",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-04T12:33:03.838535",
"agent_id": null,
"agent_name": null
},
{
"id": "log_617ce9db-0c39-49e7-91b4-aba831f814ac",
"message": "Benutzereingabe empfangen: 11 Zeichen, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:33:40.564652",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e82c8aef-2432-42ee-a779-a5ffe8d27569",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:33:40.568644",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8038a740-9e80-4b9f-b439-00b81837038a",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T12:33:41.410757",
"agent_id": null,
"agent_name": null
},
{
"id": "log_40b3a4f9-dc2e-4e8d-8b7a-091f6d8a692e",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T12:33:41.428894",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b937d4a2-9e00-490e-9292-83a4dc103cd8",
"message": "Workflow wurde manuell gestoppt",
"type": "info",
"timestamp": "2025-04-04T12:34:16.730060",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c525a207-4996-434d-81ef-66098542f10a",
"message": "Benutzereingabe empfangen: 8 Zeichen, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:42:59.727270",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1f137348-db99-45ba-aad7-688e88e745f1",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:42:59.731273",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ae534cb4-e905-44db-ad5c-e2d31536c651",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T12:42:59.740271",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e9045871-5476-41ed-9398-1a7963055f93",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T12:43:09.813804",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6efc035a-a115-402f-8d00-c52994a37f02",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Bitte geben Sie weitere Details an, was genau besc...",
"type": "info",
"timestamp": "2025-04-04T12:43:09.817942",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8314f0eb-047e-4bd6-b91c-40b5d80d5d32",
"message": "Workflow wartet auf Benutzereingabe: Bitte geben Sie weitere Details an, was genau besc...",
"type": "info",
"timestamp": "2025-04-04T12:43:09.821854",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,135 @@
{
"id": "5dfcf06d-3c21-416e-933f-43d4ebb985ee",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 08:40:39",
"status": "waiting_for_user",
"started_at": "2025-04-04T08:40:40.325539",
"last_activity": "2025-04-04T08:40:45.618927",
"prompt": "bildanalyse",
"messages": [
{
"id": "msg_b350544b-9815-41cd-82a0-61a0dabf9f7c",
"workflow_id": "5dfcf06d-3c21-416e-933f-43d4ebb985ee",
"parent_message_id": null,
"started_at": "2025-04-04T08:40:40.338165",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "bildanalyse",
"agent_type": null
},
{
"id": "msg_ed4d1b9f-a576-423c-9ef8-b31d253eff69",
"workflow_id": "5dfcf06d-3c21-416e-933f-43d4ebb985ee",
"parent_message_id": null,
"started_at": "2025-04-04T08:40:42.271629",
"finished_at": "2025-04-04T08:40:42.274633",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**Analyseergebnisse:**\n1. **Trend:** Die Daten zeigen einen klaren Trend, der auf [genaue Beschreibung des Trends] hinweist.\n2. **Korrelationen:** Es gibt signifikante Korrelationen zwischen [Variablen oder Faktoren], die auf [Erkenntnisse oder Auswirkungen] schließen lassen.\n3. **Auffälligkeiten:** Besonders auffällig ist [Beschreibung der Auffälligkeit], was auf [mögliche Ursachen oder Konsequenzen] hindeutet.\n\n**Empfehlungen:**\n- **Maßnahme 1:** [Beschreibung der Maßnahme 1], um [Ziel oder erwartetes Ergebnis].\n- **Maßnahme 2:** [Beschreibung der Maßnahme 2], um [Ziel oder erwartetes Ergebnis].\n- **Maßnahme 3:** [Beschreibung der Maßnahme 3], um [Ziel oder erwartetes Ergebnis].\n\nDiese strukturierte Zusammenfassung fasst die wesentlichen Erkenntnisse und Empfehlungen der Datenanalyse zusammen und bietet eine klare Grundlage für weitere Entscheidungen oder Maßnahmen.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_41203d3c-4386-4b7d-b565-36d1bd673106",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 11, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T08:40:40.328540",
"agent_id": null,
"agent_name": null
},
{
"id": "log_aeed18b4-24c6-4f36-a4c8-8b538298f120",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T08:40:40.330538",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b06a890b-cea3-465d-881f-1fa5327df761",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T08:40:42.244218",
"agent_id": null,
"agent_name": null
},
{
"id": "log_858e7b8a-46b5-41f5-9c4c-b49d95ca4c2a",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Führe eine detaillierte Bildanalyse durch, indem d...",
"type": "info",
"timestamp": "2025-04-04T08:40:42.250220",
"agent_id": null,
"agent_name": null
},
{
"id": "log_69a35683-86f3-4216-b22a-66f18950ca6d",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-04T08:40:42.255668",
"agent_id": null,
"agent_name": null
},
{
"id": "log_377d1e88-8404-4a1b-8184-055c37c60132",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T08:40:42.261625",
"agent_id": null,
"agent_name": null
},
{
"id": "log_62c96df8-0062-4704-b7bb-c614898119b6",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T08:40:42.266632",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4085ebd3-774f-4235-8992-821de7e28495",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-04T08:40:42.312270",
"agent_id": null,
"agent_name": null
},
{
"id": "log_2dd140ce-9fe1-43bc-b45a-63c3044aa62b",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-04T08:40:45.618927",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "604b510a-b2f9-48c9-ac5a-7414642b56f6",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 08:36:04",
"status": "failed",
"started_at": "2025-04-04T08:36:04.440786",
"last_activity": "2025-04-04T08:36:04.460958",
"prompt": "analysiere das bild",
"messages": [],
"logs": [
{
"id": "log_05752de1-06c2-45a3-a02b-861e085a3d55",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T08:36:04.445222",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e9565e91-1b53-4f46-8d70-6bcf76b56a98",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T08:36:04.446230",
"agent_id": null,
"agent_name": null
},
{
"id": "log_fcb3936f-5e21-452b-8240-993186efe476",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T08:36:04.454315",
"agent_id": null,
"agent_name": null
},
{
"id": "log_00cf3b9f-302b-47f6-8a1b-816013f56440",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T08:36:04.460958",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,255 @@
{
"id": "63786d61-0cb0-4488-8cf1-b6bc99350d47",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 5.4.2025, 00:54:24",
"status": "waiting_for_user",
"started_at": "2025-04-05T00:54:24.866935",
"last_activity": "2025-04-05T00:56:26.418808",
"prompt": "summarize the difference between pictures",
"messages": [
{
"id": "msg_7c42c416-0410-4718-b806-22462129fa1c",
"workflow_id": "63786d61-0cb0-4488-8cf1-b6bc99350d47",
"parent_message_id": null,
"started_at": "2025-04-05T00:54:24.897456",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 3,
"source": {
"type": "file",
"id": 3,
"name": "LF-Current.png",
"content_type": "image/png",
"size": 126277,
"upload_date": "2025-04-05T00:54:48.699130"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart illustrating a product development process involving both a Product Team and an Engineering Team. Here's a detailed breakdown:\n\n### Input\n- **Sources**: Customers, Sales, Our Ideas\n- **Purpose**: To gather initial ideas and inputs for the product development process.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas & Inputs\n - **Qualify**: Analyze and match within the team\n\n2. **Define**\n - **Structure & Document**: Write specifications, define acceptance criteria (Product > Inputs & Ideas)\n - **Explore & Design**: UI Design, Experiments, etc. (using tools like Miro)\n\n3. **Shape**\n - **Roadmap**: Define a roadmap\n - **Scoping**: Define next version's scope\n - **Manage**: Tickets in Product\n\n### Engineering Team\n1. **Build**\n - **Manage**: Track progress in the dashboard\n - **Factory**: Develop tickets in Engineering > Next Version\n\n2. **Release**\n - **Manage**: Ensure stable changes\n\n3. **Run & Monitor**\n - **Manage**: Ensure stable operation\n - **Service & Support**: Deliver 1st Level support according to agreed SLA\n\n4. **Assess**\n - **Manage**: Move assessed tickets to Engineering > Future Versions\n - **Estimate**: Assess tickets in \"Product > Analysis\" to define implementation, feasibility, and effort\n\n### Output\n- **Product**: The final product is the output of this process.\n\n### Tool Integration\n- **Ticketing System**: Used for managing various stages like Inputs & Ideas, Exploration, Analysis, Future Versions, etc.\n- **Roadmap**: For planning\n- **Management Dashboards**: For overseeing the process\n\nThe flowchart uses arrows to indicate the progression and feedback loops between stages, emphasizing a structured and iterative approach to product development."
}
]
},
{
"id": 4,
"source": {
"type": "file",
"id": 4,
"name": "LF-Details.png",
"content_type": "image/png",
"size": 253009,
"upload_date": "2025-04-05T00:54:48.699838"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart illustrating a product development process involving multiple teams: Product Team, Q&A Team, Engineering Team, and Operations. Here's a detailed breakdown:\n\n### Input\n- **Sources**: Customers, Sales, Our Ideas\n- **Process**: Inputs are collected and qualified against business priorities.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas and inputs.\n - **Qualify**: Analyze and match against business priorities.\n\n2. **Define**\n - **Structure & Document**: Write specifications and define acceptance criteria.\n - **Explore & Design**: UI design, experiments, and reference tickets in ClickUp.\n\n3. **Shape**\n - **Roadmap**: Define roadmap to meet opportunities and protect development stability.\n - **Scoping**: Define next version scope.\n - **Manage**: Tickets in Product.\n\n### Engineering Team\n- **Assess**\n - **Manage**: Move assessed tickets to future versions.\n - **Estimate**: Assess implementation, feasibility, and effort.\n\n- **Build**\n - **Manage**: Track progress in the dashboard.\n - **Factory**: Develop tickets in the next version.\n\n### Q&A Team\n- **Validate**\n - **Testing**: Test functionality against acceptance.\n - **Analysis**: Analyze tickets, events, deviations.\n\n### Operations\n1. **Release**\n - **Manage**: Ensure stable changes.\n\n2. **Run & Monitor**\n - **Manage**: Ensure stable operation.\n - **Service & Support**: Deliver 1st level support according to agreed SLA.\n\n### Output\n- **Product**: The final output of the process.\n\n### Tool Integration\n- **Ticketing System**: Visual representation of ticket management.\n- **Roadmap**: Timeline view of project phases.\n- **Management Dashboards**: Visual data and analytics display.\n\nThe flowchart uses arrows to indicate the flow of processes and interactions between different teams and stages."
}
]
}
],
"content": "summarize the difference between pictures",
"agent_type": null
},
{
"id": "msg_ea3442ca-9e0d-46d1-9801-df158a945235",
"workflow_id": "63786d61-0cb0-4488-8cf1-b6bc99350d47",
"parent_message_id": null,
"started_at": "2025-04-05T00:54:50.240558",
"finished_at": "2025-04-05T00:54:50.244397",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**Analyseergebnisse:**\n1. **Trend**: Die Daten zeigen einen klaren Trend, der auf bestimmte Muster oder Entwicklungen hinweist.\n2. **Korrelationen**: Es wurden signifikante Korrelationen zwischen bestimmten Variablen festgestellt, die auf mögliche Zusammenhänge oder Einflussfaktoren hindeuten.\n3. **Auffälligkeiten**: Besonders auffällig ist ein bestimmtes Merkmal oder eine Anomalie in den Daten, die weiter untersucht werden sollte.\n\n**Empfehlungen:**\n1. **Maßnahme 1**: Basierend auf den identifizierten Trends und Korrelationen wird empfohlen, eine spezifische Maßnahme zu ergreifen, um die positiven Entwicklungen zu fördern oder negative Einflüsse zu minimieren.\n2. **Maßnahme 2**: Eine weitere Maßnahme sollte sich auf die Optimierung bestimmter Prozesse oder Strategien konzentrieren, um die Effizienz zu steigern.\n3. **Maßnahme 3**: Es wird empfohlen, zusätzliche Untersuchungen oder Analysen durchzuführen, um die auffälligen Merkmale genauer zu verstehen und entsprechende Anpassungen vorzunehmen.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-05T00:56:25.504941",
"status": "completed"
},
{
"id": "msg_38ad0969-2b5e-4556-8f84-9a4cd35bd997",
"workflow_id": "63786d61-0cb0-4488-8cf1-b6bc99350d47",
"parent_message_id": null,
"started_at": "2025-04-05T00:56:25.505930",
"finished_at": null,
"sequence_no": 4,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "explain",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_2cc99a49-e6a2-4836-9ba1-df9260254a1b",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 41, 2 Dateien",
"type": "info",
"timestamp": "2025-04-05T00:54:24.884500",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d5ac82c2-cb29-4494-be02-7aaa5463f9c5",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-05T00:54:24.890921",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6ec36d51-a983-4389-8d90-75e25efb9918",
"message": "2 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-05T00:54:24.905468",
"agent_id": null,
"agent_name": null
},
{
"id": "log_55a595c2-d7e5-440f-96c5-c698e4c8ac1d",
"message": "Image LF-Current.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-05T00:54:36.561112",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b45b85db-b088-4f7e-a1d0-7a4dafba2b4e",
"message": "Image LF-Details.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-05T00:54:48.683950",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f5deaffb-71a1-4b07-8f2a-9a6f502afd7e",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-05T00:54:50.202945",
"agent_id": null,
"agent_name": null
},
{
"id": "log_271842dc-c4cb-48a0-8610-f0294d15317b",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Vergleiche die beiden bereitgestellten Flussdiagra...",
"type": "info",
"timestamp": "2025-04-05T00:54:50.202945",
"agent_id": null,
"agent_name": null
},
{
"id": "log_939f8604-4696-4067-b821-08b009f6ec69",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:54:50.216864",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ec82f11e-0fa6-4241-8784-fe8177d15d62",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:54:50.224726",
"agent_id": null,
"agent_name": null
},
{
"id": "log_67f34254-00fc-4335-bc47-748f1e1d4583",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:54:50.234031",
"agent_id": null,
"agent_name": null
},
{
"id": "log_aa031aee-a36f-455e-a7b3-ae1aa21c7113",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-05T00:54:50.310788",
"agent_id": null,
"agent_name": null
},
{
"id": "log_152ab1a8-2268-4e58-8856-f31531e63e71",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-05T00:54:54.216258",
"agent_id": null,
"agent_name": null
},
{
"id": "log_fa476706-857b-4804-b626-7078bd8288ab",
"message": "Benutzereingabe empfangen: 7 Zeichen, 0 Dateien",
"type": "info",
"timestamp": "2025-04-05T00:56:25.488863",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8de2ebde-6902-4c24-9e75-d922fb1d0855",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-05T00:56:25.498949",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d11dd7e6-5579-47b0-9f5c-1579c2926d97",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-05T00:56:26.408807",
"agent_id": null,
"agent_name": null
},
{
"id": "log_3c0d2619-9931-4a41-bcc0-eed1d52aa9ef",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-05T00:56:26.418808",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "64112953-2389-40bd-be74-f362083aefa4",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 12:19:45",
"status": "failed",
"started_at": "2025-04-04T12:19:46.195692",
"last_activity": "2025-04-04T12:19:52.771879",
"prompt": "describe",
"messages": [],
"logs": [
{
"id": "log_10ae41d3-0038-4aef-9477-63a98028748c",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:19:46.199692",
"agent_id": null,
"agent_name": null
},
{
"id": "log_738f2c68-3e54-4b44-a46e-9cd7f3bf2318",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:19:46.202693",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b1c306aa-8d64-47c2-a61f-1d8df6e297e3",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T12:19:46.210206",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0912ba5f-5f3f-486b-8c9c-af404fcbf45e",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T12:19:52.771879",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,135 @@
{
"id": "672eb0c0-2899-4d52-b5fd-c13700e06166",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 11:21:08",
"status": "waiting_for_user",
"started_at": "2025-04-06T11:21:08.542845",
"last_activity": "2025-04-06T11:21:11.973078",
"prompt": "bitte mache mir eine webanalyse, wer bei ValueOn AG arbeitet",
"messages": [
{
"id": "msg_49c92277-01db-4df5-93e8-70c36d3a2fbf",
"workflow_id": "672eb0c0-2899-4d52-b5fd-c13700e06166",
"parent_message_id": null,
"started_at": "2025-04-06T11:21:08.563235",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "bitte mache mir eine webanalyse, wer bei ValueOn AG arbeitet",
"agent_type": null
},
{
"id": "msg_4e3f7e37-b965-4b34-8b59-0f5caefd90d9",
"workflow_id": "672eb0c0-2899-4d52-b5fd-c13700e06166",
"parent_message_id": null,
"started_at": "2025-04-06T11:21:10.098850",
"finished_at": "2025-04-06T11:21:10.102850",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "<coroutine object WebcrawlerAgent.get_web_query at 0x00000171C7DF75E0> [STATUS: ERGEBNIS]",
"agent_type": "scraper",
"agent_id": "webcrawler_agent",
"agent_name": "Webscraper"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\nEs scheint, dass die Ergebnisse des Webscrapers nicht korrekt eingefügt wurden, da nur ein Platzhaltertext vorhanden ist. Um eine aussagekräftige Zusammenfassung zu erstellen, benötige ich die tatsächlichen Ergebnisse oder Daten, die der Webscraper gesammelt hat. Bitte stellen Sie sicher, dass die relevanten Informationen bereitgestellt werden, damit ich Ihnen eine strukturierte und prägnante Zusammenfassung bieten kann.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_756d30d3-c592-45e6-ae78-e183e1f4ebe3",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 60, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T11:21:08.549460",
"agent_id": null,
"agent_name": null
},
{
"id": "log_24146d34-fbd0-4966-983e-50af3cc8d523",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T11:21:08.555579",
"agent_id": null,
"agent_name": null
},
{
"id": "log_19daf2c0-e83c-427c-b94e-28b988eae4cd",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T11:21:10.064915",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e03fb9ff-d821-49b1-ab65-2bb416577f5f",
"message": "Agent webcrawler_agent wurde ausgewählt mit Aufgabe: Führe eine Webrecherche durch, um Informationen da...",
"type": "info",
"timestamp": "2025-04-06T11:21:10.071916",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bbfd2df4-b0db-4c19-85e2-4c8924c95192",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:21:10.077675",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6f3ca6b7-91d7-4741-8c7c-11b6f8281631",
"message": "Agent webcrawler_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:21:10.083879",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f0aee81e-d944-4a84-9dac-93fbcffaa56a",
"message": "Agent 'webcrawler_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:21:10.089879",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6193f0ef-9b7e-4bfd-8c25-9dbb76b1fe8b",
"message": "Agent 'webcrawler_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-06T11:21:10.156426",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bb734098-7037-49db-8b0e-a8c0a6d03e25",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-06T11:21:11.973078",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,241 @@
{
"id": "6ed530e1-1db1-44a4-8c15-e8f6ac4c2359",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 00:45:27",
"status": "waiting_for_user",
"started_at": "2025-04-04T00:45:27.550708",
"last_activity": "2025-04-04T00:45:38.824553",
"prompt": "Recherchiere die aktuellen Markttrends und Entwicklungen im Bereich [THEMA]. Sammle Informationen zu führenden Unternehmen, innovativen Produkten oder Dienstleistungen und aktuellen Herausforderungen. Präsentiere die Ergebnisse in einer strukturierten Übersicht mit relevanten Daten und Quellen.",
"messages": [
{
"id": "msg_a493d53d-0340-411c-83e7-35005d59289b",
"workflow_id": "6ed530e1-1db1-44a4-8c15-e8f6ac4c2359",
"parent_message_id": null,
"started_at": "2025-04-04T00:45:27.564674",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Recherchiere die aktuellen Markttrends und Entwicklungen im Bereich [THEMA]. Sammle Informationen zu führenden Unternehmen, innovativen Produkten oder Dienstleistungen und aktuellen Herausforderungen. Präsentiere die Ergebnisse in einer strukturierten Übersicht mit relevanten Daten und Quellen.",
"agent_type": null
},
{
"id": "msg_5068ba2e-0f72-4ab6-95df-4d54390ea346",
"workflow_id": "6ed530e1-1db1-44a4-8c15-e8f6ac4c2359",
"parent_message_id": null,
"started_at": "2025-04-04T00:45:30.550628",
"finished_at": "2025-04-04T00:45:30.552624",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Webscraper folgende Informationen zum Thema recherchiert:\n\n## Überblick der Rechercheergebnisse\n\nBasierend auf der Anfrage habe ich verschiedene Quellen konsultiert und folgende Schlüsselinformationen gefunden:\n\n### Aktuelle Markttrends\n- Der Markt zeigt ein Wachstum von 8,5% im Vergleich zum Vorjahr\n- Führende Unternehmen investieren verstärkt in nachhaltige Technologien\n- Neue regulatorische Anforderungen beeinflussen die Produktentwicklung\n\n### Technologische Entwicklungen\n- KI-basierte Lösungen gewinnen zunehmend an Bedeutung\n- Erhöhte Nachfrage nach integrierten Cloud-Diensten\n- Sicherheitsaspekte werden prioritär behandelt\n\n### Relevante Quellen\n1. Market Research Institute (2025): \"Industry Analysis Report\" - marketresearch.org/report2025\n2. TechInsights Blog (März 2025): \"Technology Trends\" - techinsights.com/trends\n3. Regulatory Commission (Februar 2025): \"New Guidelines\" - regcom.gov/guidelines\n\n## Detaillierte Ergebnisse\n\nDie Recherche zeigt, dass der Markt durch folgende Faktoren beeinflusst wird:\n[...weitere detaillierte Informationen...]\n\n## Fazit und Empfehlungen\n\nBasierend auf den recherchierten Informationen empfehle ich:\n1. Fokussierung auf die Entwicklung nachhaltiger Lösungen\n2. Integration von KI-Funktionalitäten in bestehende Produkte\n3. Anpassung an neue regulatorische Anforderungen",
"agent_type": "scraper",
"agent_id": "webcrawler_agent",
"agent_name": "Webscraper"
},
{
"id": "msg_88a8013a-945c-4e2f-bc59-8d612b365bf1",
"workflow_id": "6ed530e1-1db1-44a4-8c15-e8f6ac4c2359",
"parent_message_id": null,
"started_at": "2025-04-04T00:45:30.607025",
"finished_at": "2025-04-04T00:45:30.609025",
"sequence_no": 3,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"id": "msg_c301c10f-4cc1-4679-9df9-30454734d2cf",
"workflow_id": "6ed530e1-1db1-44a4-8c15-e8f6ac4c2359",
"parent_message_id": null,
"started_at": "2025-04-04T00:45:30.673152",
"finished_at": "2025-04-04T00:45:30.675153",
"sequence_no": 4,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "# Bericht - Projektzusammenfassung 2025\n\n## Zusammenfassung\n\nDieses Dokument bietet einen umfassenden Überblick über die strategische Ausrichtung und geplanten Aktivitäten für das Jahr 2025. Es basiert auf den aktuellen Planungsdokumenten und Analysen und dient als Referenz für alle Projektbeteiligten.\n\n## Inhaltsverzeichnis\n\n1. Einleitung und Zielsetzung\n2. Marktanalyse und Strategische Positionierung\n3. Projektplanung und Ressourcenallokation\n4. Budgetierung und Finanzplanung\n5. Meilensteine und Zeitplan\n6. Risikomanagement\n7. Empfehlungen und nächste Schritte\n\n## 1. Einleitung und Zielsetzung\n\nDieses Dokument wurde erstellt, um einen strukturierten Überblick über die geplanten Aktivitäten und strategischen Ziele für das Jahr 2025 zu geben. Die Hauptziele sind:\n\n- Expansion in neue Märkte mit besonderem Fokus auf die APAC-Region\n- Steigerung des Marktanteils in bestehenden Märkten um 5%\n- Entwicklung und Einführung von mindestens zwei neuen Produktlinien\n- Optimierung der Betriebsabläufe zur Kostensenkung um 8%\n\n## 2. Marktanalyse und Strategische Positionierung\n\nDie aktuelle Marktanalyse zeigt folgende Schlüsseltrends:\n\n| Trend | Bedeutung | Implikation |\n|-------|-----------|-------------|\n| Digitalisierung | Hoch | Erhöhte Nachfrage nach integrierten Lösungen |\n| Nachhaltigkeit | Mittel-Hoch | Anpassung von Produkten und Prozessen erforderlich |\n| KI-Integration | Hoch | Wettbewerbsvorteil durch intelligente Produkte |\n\nUnsere strategische Positionierung basiert auf dem Prinzip der differenzierten Qualitätsführerschaft mit starkem Fokus auf Innovationen.\n\n## 3. Projektplanung und Ressourcenallokation\n\nDrei Hauptprojekte wurden für Q2 2025 identifiziert:\n\n1. **Projekt Alpha**: Markteinführung der neuen Produktlinie XYZ\n - Projektleitung: Maria Schmidt\n - Teamgröße: 12 Mitarbeiter\n - Startdatum: 15.04.2025\n\n2. **Projekt Beta**: Implementierung des verbesserten CRM-Systems\n - Projektleitung: Thomas Müller\n - Teamgröße: 8 Mitarbeiter\n - Startdatum: 01.05.2025\n\n3. **Projekt Gamma**: Expansion in die APAC-Region\n - Projektleitung: Sarah Weber\n - Teamgröße: 15 Mitarbeiter\n - Startdatum: 01.06.2025\n\nDie detaillierte Ressourcenallokation ist im Anhang A zu finden.\n\n## 4. Budgetierung und Finanzplanung\n\nDas Gesamtbudget für 2025 beträgt 12,5 Millionen Euro, mit folgender Aufteilung:\n\n- Forschung und Entwicklung: 3,75 Mio. € (30%)\n- Marketing und Vertrieb: 3,125 Mio. € (25%)\n- Betriebskosten: 2,5 Mio. € (20%)\n- Expansion und neue Märkte: 1,875 Mio. € (15%)\n- Reserve und Unvorhergesehenes: 1,25 Mio. € (10%)\n\nDas Budget für Forschung und Entwicklung wurde um 15% im Vergleich zum Vorjahr erhöht.\n\n## 5. Meilensteine und Zeitplan\n\n| Meilenstein | Beschreibung | Termin |\n|-------------|--------------|--------|\n| M1 | Abschluss der Marktforschung für APAC | 31.03.2025 |\n| M2 | Produktprototyp XYZ fertiggestellt | 30.04.2025 |\n| M3 | CRM-System implementiert | 30.06.2025 |\n| M4 | Erste Niederlassung in APAC eröffnet | 31.08.2025 |\n| M5 | Markteinführung Produktlinie XYZ | 30.09.2025 |\n\n## 6. Risikomanagement\n\nIdentifizierte Risiken und Gegenmaßnahmen:\n\n- **Lieferkettenunterbrechungen**\n - Risikostufe: Hoch\n - Maßnahmen: Diversifizierung der Lieferanten, erhöhte Lagerbestände kritischer Komponenten\n\n- **Regulatorische Änderungen**\n - Risikostufe: Mittel\n - Maßnahmen: Kontinuierliches Monitoring, frühzeitige Anpassung der Produkte\n\n- **Verzögerungen bei der Produktentwicklung**\n - Risikostufe: Mittel\n - Maßnahmen: Agile Entwicklungsmethoden, regelmäßige Reviews, Pufferzeiten im Zeitplan\n\n## 7. Empfehlungen und nächste Schritte\n\nBasierend auf der vorliegenden Analyse werden folgende Schritte empfohlen:\n\n1. Sofortige Einberufung der Projektteams und Kick-off-Meetings\n2. Finalisierung der detaillierten Projektpläne bis Ende März\n3. Monatliche Statusberichte an die Geschäftsleitung\n4. Vierteljährliche Review-Meetings mit allen Stakeholdern\n5. Kontinuierliches Monitoring der Marktbedingungen und Anpassung der Strategie bei Bedarf\n\n---\n\n**Dokument-Metadaten:**\n- Erstellt: 30.03.2025\n- Version: 1.0\n- Status: Finaler Entwurf\n- Autor: Dokumentations-Agent",
"agent_type": "documentation",
"agent_id": "documentation_agent",
"agent_name": "Dokumentation"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n### Zusammenfassung der Agentenergebnisse\n\n#### Webscraper-Ergebnisse\n\n**Markttrends:**\n- Der Markt wächst um 8,5% im Vergleich zum Vorjahr.\n- Unternehmen investieren verstärkt in nachhaltige Technologien.\n- Neue regulatorische Anforderungen beeinflussen die Produktentwicklung.\n\n**Technologische Entwicklungen:**\n- KI-basierte Lösungen gewinnen an Bedeutung.\n- Es gibt eine erhöhte Nachfrage nach integrierten Cloud-Diensten.\n- Sicherheitsaspekte werden prioritär behandelt.\n\n**Empfehlungen:**\n1. Entwicklung nachhaltiger Lösungen.\n2. Integration von KI-Funktionalitäten in bestehende Produkte.\n3. Anpassung an neue regulatorische Anforderungen.\n\n#### Datenanalyst-Ergebnisse\n\n**Analyse:**\n- Die Daten zeigen klare Trends und signifikante Korrelationen.\n- Besondere Auffälligkeiten wurden identifiziert.\n\n**Empfehlungen:**\n- Maßnahme 1: [Details fehlen]\n- Maßnahme 2: [Details fehlen]\n- Maßnahme 3: [Details fehlen]\n\n#### Dokumentationsergebnisse\n\n**Strategische Ziele 2025:**\n- Expansion in neue Märkte, insbesondere APAC.\n- Steigerung des Marktanteils um 5%.\n- Einführung von zwei neuen Produktlinien.\n- Optimierung der Betriebsabläufe zur Kostensenkung um 8%.\n\n**Marktanalyse:**\n- Digitalisierung und KI-Integration sind hochrelevant.\n- Nachhaltigkeit erfordert Anpassungen in Produkten und Prozessen.\n\n**Projektplanung:**\n- Drei Hauptprojekte für Q2 2025: Markteinführung neuer Produktlinie, CRM-System-Implementierung, Expansion in APAC.\n- Detaillierte Ressourcenallokation und Budgetierung sind geplant.\n\n**Budgetierung:**\n- Gesamtbudget: 12,5 Millionen Euro.\n- Erhöhung des F&E-Budgets um 15% im Vergleich zum Vorjahr.\n\n**Meilensteine:**\n- Wichtige Termine für Marktforschung, Produktprototypen und Markteinführungen sind festgelegt.\n\n**Risikomanagement:**\n- Risiken wie Lieferkettenunterbrechungen und regulatorische Änderungen wurden identifiziert und Gegenmaßnahmen geplant.\n\n**Empfohlene Schritte:**\n1. Einberufung der Projektteams und Kick-off-Meetings.\n2. Finalisierung der Projektpläne bis Ende März.\n3. Monatliche Statusberichte und vierteljährliche Review-Meetings.\n4. Kontinuierliches Monitoring der Marktbedingungen.\n\nDiese strukturierte Zusammenfassung bietet einen umfassenden Überblick über die aktuellen Markttrends, technologischen Entwicklungen und strategischen Planungen für das Jahr 2025. Die Empfehlungen und geplanten Maßnahmen sind darauf ausgerichtet, die Wettbewerbsfähigkeit zu steigern und auf Marktveränderungen flexibel zu reagieren.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_3cbd510b-dfa9-48bc-b723-b45c28b1e2ea",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 295, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T00:45:27.553357",
"agent_id": null,
"agent_name": null
},
{
"id": "log_eb9464e3-1098-45b9-9979-da977cac8860",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T00:45:27.558350",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a61b3400-c453-4eaf-838c-f25e9dfe8299",
"message": "Agenten-Entscheidung abgeschlossen: 3 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T00:45:30.504627",
"agent_id": null,
"agent_name": null
},
{
"id": "log_27923a95-8c01-4af5-a605-dbf5b4508c7e",
"message": "Agent webcrawler_agent wurde ausgewählt mit Aufgabe: Recherchiere die aktuellen Markttrends und Entwick...",
"type": "info",
"timestamp": "2025-04-04T00:45:30.511634",
"agent_id": null,
"agent_name": null
},
{
"id": "log_47f3aa2f-72e6-4c6b-a03a-0c4980863959",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Analysiere die gesammelten Informationen zu den ak...",
"type": "info",
"timestamp": "2025-04-04T00:45:30.518629",
"agent_id": null,
"agent_name": null
},
{
"id": "log_be298605-e1ee-4037-a4b6-9cff8c756446",
"message": "Agent documentation_agent wurde ausgewählt mit Aufgabe: Erstelle eine strukturierte Übersicht der Ergebnis...",
"type": "info",
"timestamp": "2025-04-04T00:45:30.525628",
"agent_id": null,
"agent_name": null
},
{
"id": "log_55ae1fd5-b333-4a51-9bbb-904e8b057fcf",
"message": "3 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-04T00:45:30.533628",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8f8f2c2b-bb1c-464d-9c77-f388b43ef838",
"message": "Agent webcrawler_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T00:45:30.540630",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9b3968e8-06c7-4028-972a-395e4e5a6949",
"message": "Agent 'webcrawler_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T00:45:30.545627",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d61bc42d-de4d-4676-a8e9-3e1990491252",
"message": "Agent 'webcrawler_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-04T00:45:30.594489",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9b87cb6e-d92a-4899-b0b7-fa36aff18d06",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T00:45:30.598523",
"agent_id": null,
"agent_name": null
},
{
"id": "log_99d6ee40-013a-4f1f-a3a4-611e9357f8df",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T00:45:30.603020",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0f6a7b3f-0437-4348-b674-41911162ba95",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-04T00:45:30.661810",
"agent_id": null,
"agent_name": null
},
{
"id": "log_872e9560-bd8e-46b9-bb15-7adf9cffe4fe",
"message": "Agent documentation_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T00:45:30.665125",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e1a10c7d-de3e-4c34-8003-8cbbca1529c3",
"message": "Agent 'documentation_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-04T00:45:30.669158",
"agent_id": null,
"agent_name": null
},
{
"id": "log_71bb1ebc-b82c-4a95-837f-3c99e6bbeb89",
"message": "Agent 'documentation_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-04T00:45:30.739265",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9761dcee-1806-410c-a32f-20cb358d0131",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-04T00:45:38.824553",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,129 @@
{
"id": "704e5307-6075-45c4-94eb-8de2a5d3d5ff",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 23:43:44",
"status": "completed",
"started_at": "2025-04-06T23:43:44.430733",
"last_activity": "2025-04-06T23:46:40.231556",
"prompt": "kannst du mir eine websuche machen, wer ki-agentensysteme entwickelt?",
"messages": [
{
"id": "msg_14b97e21-2239-4a20-b8d9-f211bb1db107",
"workflow_id": "704e5307-6075-45c4-94eb-8de2a5d3d5ff",
"parent_message_id": null,
"started_at": "2025-04-06T23:43:44.468477",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "kannst du mir eine websuche machen, wer ki-agentensysteme entwickelt?",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**1. Überblick über KI-Agentensysteme**\n- **Definition und Zweck**: KI-Agentensysteme sind fortschrittliche Softwareprogramme, die repetitive Aufgaben automatisieren, um Effizienz und Produktivität in Unternehmen zu steigern. Sie sind in der Lage, sowohl einfache als auch komplexe Aufgaben zu übernehmen und Entscheidungen ähnlich wie Menschen zu treffen.\n- **Arten von KI-Agenten**: Es gibt autonome, vertikale, aufgabenbezogene und Workflow-Agenten. Autonome Agenten agieren unabhängig, vertikale Agenten sind branchenspezifisch, aufgabenbezogene Agenten sind flexibel und kostengünstig, während Workflow-Agenten Prozesse automatisieren.\n\n**2. Führende Unternehmen und Plattformen**\n- **Operaide AI**: Spezialisiert auf die Entwicklung von KI-Agentensystemen zur Optimierung von Unternehmensprozessen. Die Plattform ist skalierbar und in bestehende IT-Systeme integrierbar.\n- **LangChain, LlamaIndex, Botpress**: Bieten spezialisierte Lösungen für kontextbezogene Agenten, Datenintegration und Kundeninteraktionen.\n- **Große Technologieunternehmen**: Google, Amazon, Microsoft und IBM treiben die Entwicklung von KI-Agenten voran, mit Plattformen wie Google Assistant, Amazon Alexa und IBM Watson.\n- **Europäische Unternehmen**: DeepMind und Aleph Alpha zeichnen sich durch ethische Standards und Datenschutz aus.\n\n**3. Anwendungsbereiche und Vorteile**\n- **Branchenübergreifende Anwendungen**: KI-Agenten werden in Kundendienst, Vertrieb, Marketing, Logistik, Gesundheitswesen und Finanzsektor eingesetzt.\n- **Vorteile**: Sie bieten gesteigerte Effizienz, verbesserte Kundenerlebnisse und die Fähigkeit, in großem Umfang zu arbeiten. Sie helfen, Arbeitsabläufe zu optimieren und datengesteuerte Einblicke zu gewinnen.\n\n**4. Herausforderungen und Empfehlungen**\n- **Herausforderungen**: Die Implementierung erfordert sorgfältige Planung, kontinuierliche Optimierung und die Einhaltung ethischer Standards.\n- **Empfehlungen**: Unternehmen sollten ihre spezifischen Bedürfnisse ermitteln, geeignete Plattformen auswählen und die Agenten entsprechend trainieren und testen. Die Integration von KI-Agenten sollte strategisch erfolgen, um Wettbewerbsvorteile zu sichern.\n\n**5. Zukünftige Entwicklungen**\n- **Prognosen**: Analysten erwarten, dass KI-Agenten bis 2025 einen \"Chat-GPT-Moment\" erleben werden, was einen bedeutenden Wendepunkt für die Technologie darstellt.\n- **Innovationen**: Unternehmen wie OpenAI und Google entwickeln autonome Agenten, die ohne menschliches Eingreifen arbeiten können. Die dritte Welle der KI wird durch solche autonomen Agenten geprägt sein.\n\nInsgesamt zeigt sich, dass KI-Agentensysteme eine bedeutende Rolle in der Zukunft der Unternehmensprozesse spielen werden, indem sie Aufgaben automatisieren und die Effizienz steigern. Unternehmen sollten jetzt beginnen, diese Technologien zu integrieren, um von den zahlreichen Vorteilen zu profitieren.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"workflow_complete": true
}
],
"logs": [
{
"id": "log_13d449df-fc67-434a-8edf-b8d75a0c5a91",
"message": "Neuer Benutzereingabe erhalten - Vorherigen Workflow beenden",
"type": "info",
"timestamp": "2025-04-06T23:43:44.448502",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9853f05b-acd0-460b-8fc4-4e3a79d39336",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 69, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T23:43:44.456608",
"agent_id": null,
"agent_name": null
},
{
"id": "log_dd6861d8-d7a3-4408-ae91-0baa131a5330",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T23:43:44.466441",
"agent_id": null,
"agent_name": null
},
{
"id": "log_07385429-1a77-4271-b6cb-2e020898312a",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T23:43:46.441699",
"agent_id": null,
"agent_name": null
},
{
"id": "log_fabff88b-685d-4fa7-9100-b4cdee98f752",
"message": "Agent webcrawler_agent wurde ausgewählt mit Aufgabe: Führe eine Websuche durch, um herauszufinden, welc...",
"type": "info",
"timestamp": "2025-04-06T23:43:46.451924",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9d0470d7-175a-4d6e-a061-acf7a2b0a681",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-06T23:43:46.459288",
"agent_id": null,
"agent_name": null
},
{
"id": "log_440148a4-0c4a-4732-b19e-68607f0c589e",
"message": "Agent webcrawler_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T23:43:46.459288",
"agent_id": null,
"agent_name": null
},
{
"id": "log_96e96f86-5b2f-4b5e-bad9-b07010bdcdc6",
"message": "Agent 'webcrawler_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T23:43:46.476894",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bfe68502-a4d4-4547-b3f6-610dc26c7cbb",
"message": "Agent 'webcrawler_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-06T23:45:44.435037",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f346b486-6aaf-4374-a948-c756c78590fb",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-06T23:45:52.862712",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4f2bb582-4e87-4a8f-8830-a437f10c8bff",
"message": "Nachricht gelöscht: assistant - msg_433a...",
"type": "info",
"timestamp": "2025-04-06T23:46:40.231556",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,45 @@
{
"id": "7066c7f2-1a34-4dfe-942d-fa3a5af617f8",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 10:51:14",
"status": "failed",
"started_at": "2025-04-04T10:51:14.582719",
"last_activity": "2025-04-04T10:51:14.604493",
"prompt": "beschreibe das bild",
"messages": [],
"logs": [
{
"id": "log_557e2590-7129-476f-9d44-96e9eb6ac945",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T10:51:14.588234",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d09b30f3-1057-452e-9046-0f3d67f87f1a",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T10:51:14.589269",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c4ea02d9-e166-47e0-92e0-dafadfea39dc",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T10:51:14.594712",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b0f97a38-5f68-48b6-900b-581a5bd9eae5",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T10:51:14.604493",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,108 @@
{
"id": "797cd4c1-4335-4f22-baa5-a67568707bb0",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 5.4.2025, 00:21:31",
"status": "waiting_for_user",
"started_at": "2025-04-05T00:21:32.038793",
"last_activity": "2025-04-05T00:21:45.592010",
"prompt": "describe picture",
"messages": [
{
"id": "msg_75423ce9-f107-4bde-966a-02fba72f7bf1",
"workflow_id": "797cd4c1-4335-4f22-baa5-a67568707bb0",
"parent_message_id": null,
"started_at": "2025-04-05T00:21:32.056389",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 4,
"source": {
"type": "file",
"id": 4,
"name": "LF-Details.png",
"content_type": "image/png",
"size": 253009,
"upload_date": "2025-04-05T00:21:44.812027"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart illustrating a product development process involving multiple teams: Product Team, Q&A Team, Engineering Team, and Operations. Here's a detailed breakdown:\n\n### Input\n- **Sources**: Customers, Sales, and Internal Ideas.\n- **Process**: Inputs are collected and qualified.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas and inputs.\n - **Qualify**: Analyze and match against business priorities.\n\n2. **Define**\n - **Structure & Document**: Write specifications, define acceptance criteria.\n - **Explore & Design**: UI design, experiments, and reference tickets.\n\n3. **Shape**\n - **Roadmap**: Define roadmap to meet opportunities and ensure stability.\n - **Scoping**: Define next version scope.\n - **Manage**: Tickets in the product.\n\n### Engineering Team\n- **Assess**\n - **Manage**: Move assessed tickets to future versions.\n - **Estimate**: Assess implementation, feasibility, and effort.\n\n- **Build**\n - **Manage**: Track progress in the dashboard.\n - **Factory**: Develop tickets for the next version.\n\n### Q&A Team\n- **Validate**\n - **Testing**: Test functionality against acceptance.\n - **Analysis**: Analyze tickets, events, deviations.\n\n### Operations\n1. **Release**\n - **Manage**: Ensure stable changes.\n\n2. **Run & Monitor**\n - **Manage**: Ensure stable operation.\n - **Service & Support**: Deliver first-level support according to SLA.\n\n### Output\n- **Product**: The final output of the process.\n\n### Tool Integration\n- **Ticketing System**: Visual representation of ticket management.\n- **Roadmap**: Timeline of product development phases.\n- **Management Dashboards**: Display of metrics and progress tracking.\n\nThe flowchart uses arrows to show the flow of tasks and responsibilities between different teams and stages, emphasizing collaboration and integration across the product development lifecycle."
}
]
}
],
"content": "describe picture",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_7e27599e-df41-4884-96b2-d76d0550d280",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 16, 1 Dateien",
"type": "info",
"timestamp": "2025-04-05T00:21:32.043764",
"agent_id": null,
"agent_name": null
},
{
"id": "log_519f8be3-7f60-471a-b620-7e06866c1c0d",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-05T00:21:32.050242",
"agent_id": null,
"agent_name": null
},
{
"id": "log_2f1a5c49-1a95-472f-b47a-574034fa9d67",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-05T00:21:32.066146",
"agent_id": null,
"agent_name": null
},
{
"id": "log_2a5956d0-9c9b-4145-a9ff-aaba0cd2a44c",
"message": "Image LF-Details.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-05T00:21:44.805019",
"agent_id": null,
"agent_name": null
},
{
"id": "log_02354881-c98b-4238-a296-3fd558422ce3",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-05T00:21:45.579309",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1cd4a2b8-b760-4640-8744-dff1b85b6d0e",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-05T00:21:45.592010",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "7a71e36b-ffcd-4c73-8b68-c48426913c45",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 12:25:29",
"status": "failed",
"started_at": "2025-04-04T12:25:29.468579",
"last_activity": "2025-04-04T12:25:35.596269",
"prompt": "describe",
"messages": [],
"logs": [
{
"id": "log_c992c0d5-457d-46f7-b06b-cea6090ee743",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:25:29.471577",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5b3e3327-6982-4390-81d6-64ef092be062",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:25:29.476579",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6e21bb91-0365-4828-b1b4-966f5fd31cbe",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T12:25:29.483097",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8713da5c-fa0f-4b39-9291-d4699619a761",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T12:25:35.596269",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,203 @@
{
"id": "7ea1d65e-fb16-42ef-a14f-804aa3a3205f",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 13:29:47",
"status": "waiting_for_user",
"started_at": "2025-04-04T13:29:48.745358",
"last_activity": "2025-04-04T13:31:01.949138",
"prompt": "describe",
"messages": [
{
"id": "msg_1ec124b5-120f-477d-8e53-12b576dd52d2",
"workflow_id": "7ea1d65e-fb16-42ef-a14f-804aa3a3205f",
"parent_message_id": null,
"started_at": "2025-04-04T13:29:48.759266",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 4,
"source": {
"type": "file",
"id": 4,
"name": "LF-Details.png",
"content_type": "image/png",
"size": 253009,
"upload_date": "2025-04-04T13:30:01.970503"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart illustrating a product development process involving multiple teams: Product Team, Q&A Team, Engineering Team, and Operations. Here's a detailed breakdown:\n\n### Input\n- **Sources**: Customers, Sales, Our Ideas\n- **Flow**: Inputs are collected and fed into the Product Team.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas & Inputs\n - **Qualify**: Analyze and match against business priorities\n\n2. **Define**\n - **Structure & Document**: Write specifications, define acceptance criteria\n - **Explore & Design**: UI Design, Experiments, etc.\n\n3. **Shape**\n - **Roadmap**: Define roadmap to meet opportunities and protect development stability\n - **Scoping**: Define next version's scope\n - **Manage**: Tickets in Product\n\n### Q&A Team\n4. **Validate**\n - **Testing**: Test functionality against acceptance\n - **Analysis**: Analyze tickets, events, deviations\n\n### Engineering Team\n5. **Assess**\n - **Manage**: Move assessed tickets to Engineering for future versions\n - **Estimate**: Define implementation, feasibility, and effort\n\n6. **Build**\n - **Manage**: Track progress in the dashboard\n - **Factory**: Develop tickets in Engineering for the next version\n\n### Operations\n7. **Release**\n - **Manage**: Ensure stable changes\n\n8. **Run & Monitor**\n - **Manage**: Ensure stable operation\n - **Service & Support**: Deliver 1st level support according to agreed SLA\n\n### Output\n- **Product**: The final product is delivered as the output.\n\n### Tool Integration\n- **Ticketing System**: Visual representation of ticket management.\n- **Roadmap**: Timeline view of project phases.\n- **Management Dashboards**: Visual data displays for tracking metrics.\n\nThe flowchart uses arrows to indicate the process flow between different stages and teams, emphasizing collaboration and integration across the product lifecycle."
}
]
}
],
"content": "describe",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Bitte beschreibe den Inhalt und die Bedeutung des bereitgestellten Bildes 'LF-Details.png', das einen Flussdiagramm des Produktentwicklungsprozesses darstellt.",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-04T13:30:51.610004",
"status": "completed"
},
{
"id": "msg_396133df-c522-4680-9034-e23aee363aba",
"workflow_id": "7ea1d65e-fb16-42ef-a14f-804aa3a3205f",
"parent_message_id": null,
"started_at": "2025-04-04T13:30:51.610004",
"finished_at": null,
"sequence_no": 3,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 1,
"source": {
"type": "file",
"id": 1,
"name": "LF-Nutshell.png",
"content_type": "image/png",
"size": 52108,
"upload_date": "2025-04-04T13:31:00.557314"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart titled \"In a nutshell,\" illustrating a product development process. It consists of several components:\n\n1. **Inputs**: Represented by an inverted triangle at the top left, indicating the starting point of the process.\n\n2. **Product Team**: A rectangular box below the inputs, labeled \"Discover - Define - Shape,\" showing the initial phase where the product team works on conceptualizing the product.\n\n3. **Engineering Team**: Next to the product team, another box labeled \"Assess & Build,\" indicating the phase where the engineering team evaluates and constructs the product.\n\n4. **Q&A Team**: Following the engineering team, a box labeled \"Validate,\" representing the quality assurance phase where the product is tested.\n\n5. **Operations**: The final box in the sequence, labeled \"Release, Run & Monitor,\" showing the operations phase where the product is launched and maintained.\n\n6. **Roadmap**: A horizontal arrow labeled \"Roadmap\" connects the product team to the subsequent phases, indicating the planning and direction of the product development.\n\n7. **Product**: Three consecutive boxes labeled \"Product\" follow the roadmap, representing the final product stages.\n\nThe overall layout is structured to show a linear progression from inputs to the final product, with each team playing a specific role in the development process. The color scheme includes shades of olive green and white, set against a light gray background."
}
]
}
],
"content": "describe",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Bitte beschreibe das Bild LF-Nutshell.png, das einen Flussdiagramm mit dem Titel 'In a nutshell' zeigt, und erkläre den Produktentwicklungsprozess, der darin dargestellt wird.",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_f9cafcae-2a5e-4358-8e0e-e4ce3e504d16",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T13:29:48.750365",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1c0a30e1-5a76-4d52-a6d3-d1b48fc40809",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T13:29:48.754364",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f18429af-bd92-4003-b155-807213851ac7",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T13:29:48.764301",
"agent_id": null,
"agent_name": null
},
{
"id": "log_48611c37-6b5e-43c4-8bd7-657573e4e6d9",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T13:30:03.481902",
"agent_id": null,
"agent_name": null
},
{
"id": "log_dedeee58-59d4-4fea-8aa6-344e41b852f5",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Bitte beschreibe den Inhalt und die Bedeutung des ...",
"type": "info",
"timestamp": "2025-04-04T13:30:03.487898",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f4ecd1d9-62cd-4526-b1ab-43ea8de9f779",
"message": "Workflow wartet auf Benutzereingabe: Bitte beschreibe den Inhalt und die Bedeutung des ...",
"type": "info",
"timestamp": "2025-04-04T13:30:03.491899",
"agent_id": null,
"agent_name": null
},
{
"id": "log_fb2b3f09-b03d-4797-9fda-23d70d9c9b4c",
"message": "Benutzereingabe empfangen: 8 Zeichen, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T13:30:51.601002",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a0da0c6f-a8a1-4c53-bdc9-fd15cdb114df",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T13:30:51.605004",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9c75f5bd-f51f-4b00-9a98-b02536d2a54f",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T13:30:51.614008",
"agent_id": null,
"agent_name": null
},
{
"id": "log_57022a05-cca8-4fea-82aa-a7e1ae882057",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T13:31:01.940141",
"agent_id": null,
"agent_name": null
},
{
"id": "log_39124fb8-5ec5-42ed-8212-f9872b9f5b29",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Bitte beschreibe das Bild LF-Nutshell.png, das ein...",
"type": "info",
"timestamp": "2025-04-04T13:31:01.945139",
"agent_id": null,
"agent_name": null
},
{
"id": "log_cd2a4ad3-5340-4ebf-a78e-9fe34421a793",
"message": "Workflow wartet auf Benutzereingabe: Bitte beschreibe das Bild LF-Nutshell.png, das ein...",
"type": "info",
"timestamp": "2025-04-04T13:31:01.949138",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,272 @@
{
"id": "7fbd496e-d684-46c4-81a1-5c033a690fc8",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 5.4.2025, 00:47:39",
"status": "waiting_for_user",
"started_at": "2025-04-05T00:47:39.540380",
"last_activity": "2025-04-05T00:49:09.119612",
"prompt": "summarize the table",
"messages": [
{
"id": "msg_04d01ab9-2801-4a2f-918e-c6f090db1677",
"workflow_id": "7fbd496e-d684-46c4-81a1-5c033a690fc8",
"parent_message_id": null,
"started_at": "2025-04-05T00:47:39.558372",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 5,
"source": {
"type": "file",
"id": 5,
"name": "auszug_liste_positionen.pdf",
"content_type": "application/pdf",
"size": 299729,
"upload_date": "2025-04-05T00:47:39.579424"
},
"contents": [
{
"type": "text",
"text": "\n\n"
}
]
}
],
"content": "summarize the table",
"agent_type": null
},
{
"id": "msg_7ee278dc-ff6f-41ec-aaa5-26f82c5eb111",
"workflow_id": "7fbd496e-d684-46c4-81a1-5c033a690fc8",
"parent_message_id": null,
"started_at": "2025-04-05T00:47:41.698208",
"finished_at": "2025-04-05T00:47:41.702209",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**Datenanalyse:**\n\n1. **Trends:** \n - Die Daten zeigen einen klaren Trend, der auf [spezifische Erkenntnis] hinweist.\n\n2. **Korrelationen:** \n - Es gibt signifikante Korrelationen zwischen [Variable A] und [Variable B], was auf [Interpretation der Korrelation] hindeutet.\n\n3. **Auffälligkeiten:** \n - Besonders auffällig ist [spezifische Beobachtung], was möglicherweise auf [Ursache oder Konsequenz] zurückzuführen ist.\n\n**Empfehlungen:**\n\n- **Maßnahme 1:** [Beschreibung der Maßnahme 1], um [Ziel oder erwartetes Ergebnis] zu erreichen.\n- **Maßnahme 2:** [Beschreibung der Maßnahme 2], um [Ziel oder erwartetes Ergebnis] zu unterstützen.\n- **Maßnahme 3:** [Beschreibung der Maßnahme 3], um [Ziel oder erwartetes Ergebnis] zu fördern.\n\nDiese strukturierte Zusammenfassung bietet einen klaren Überblick über die wichtigsten Erkenntnisse und Empfehlungen aus der Datenanalyse.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-05T00:49:00.676535",
"status": "completed"
},
{
"id": "msg_a221238c-bd0a-466f-b52d-0fe8ed469d00",
"workflow_id": "7fbd496e-d684-46c4-81a1-5c033a690fc8",
"parent_message_id": null,
"started_at": "2025-04-05T00:49:00.677518",
"finished_at": null,
"sequence_no": 4,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 5,
"source": {
"type": "file",
"id": 5,
"name": "auszug_liste_positionen.pdf",
"content_type": "application/pdf",
"size": 299729,
"upload_date": "2025-04-05T00:49:00.697757"
},
"contents": [
{
"type": "text",
"text": "\n\n"
}
]
}
],
"content": "übersetzte auf deutsch",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Bitte klären Sie, welchen Inhalt Sie auf Deutsch übersetzen möchten. Bezieht sich Ihre Anfrage auf die Datei 'auszug_liste_positionen.pdf'? Wenn ja, geben Sie bitte an, welche Teile übersetzt werden sollen.",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_73071dd7-5a5c-4bd6-baef-b09814263735",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 1 Dateien",
"type": "info",
"timestamp": "2025-04-05T00:47:39.547366",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0d33f0ba-57ab-46ec-b48e-58f96a5a0fbd",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-05T00:47:39.552373",
"agent_id": null,
"agent_name": null
},
{
"id": "log_92e6492a-29d0-4e01-a62a-f4ae78823476",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-05T00:47:39.563311",
"agent_id": null,
"agent_name": null
},
{
"id": "log_3cfe41f7-96c1-4c8a-90a2-9e5968a2df4c",
"message": "File auszug_liste_positionen.pdf read successfully",
"type": "info",
"timestamp": "2025-04-05T00:47:39.572460",
"agent_id": null,
"agent_name": null
},
{
"id": "log_90ef878d-1a6f-4289-a335-246ddb551aa6",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-05T00:47:41.668650",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1b46ca4d-157f-4436-a5a5-a2ddf4798543",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Analysiere die Tabelle in der Datei 'auszug_liste_...",
"type": "info",
"timestamp": "2025-04-05T00:47:41.675646",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bf17880e-5751-4d62-91cf-c52ec751b380",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:47:41.680694",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5e9bf11c-c89a-49e9-8696-11babcb8910f",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:47:41.687207",
"agent_id": null,
"agent_name": null
},
{
"id": "log_cb726a1e-d875-449c-bd7c-843032272c72",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:47:41.692242",
"agent_id": null,
"agent_name": null
},
{
"id": "log_da291ff9-2ff4-44ee-ae9d-3eafd237991e",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-05T00:47:41.761514",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a9d6b7ff-5cd4-47bd-b5ee-a56d4bab7f99",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-05T00:47:45.328631",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6a27143f-b5f2-4abe-a12c-ff8d877d4b0d",
"message": "Benutzereingabe empfangen: 22 Zeichen, 1 Dateien",
"type": "info",
"timestamp": "2025-04-05T00:49:00.656020",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ff4c4b43-ddfd-4516-acdb-c944953dcd18",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-05T00:49:00.656020",
"agent_id": null,
"agent_name": null
},
{
"id": "log_18ccc3e8-e029-4ec1-a7fe-4ec73c5c677a",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-05T00:49:00.682128",
"agent_id": null,
"agent_name": null
},
{
"id": "log_fdddd98e-c14a-4df5-baaf-f3a609e301bf",
"message": "File auszug_liste_positionen.pdf read successfully",
"type": "info",
"timestamp": "2025-04-05T00:49:00.690758",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ea72d851-7310-43c1-9b5e-7640f3ede2d4",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-05T00:49:09.105263",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6de25693-c0df-4b9b-869d-84252e689f55",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Bitte klären Sie, welchen Inhalt Sie auf Deutsch ü...",
"type": "info",
"timestamp": "2025-04-05T00:49:09.110566",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6342896a-9ac5-4b5e-860c-e54948b4a621",
"message": "Workflow wartet auf Benutzereingabe: Bitte klären Sie, welchen Inhalt Sie auf Deutsch ü...",
"type": "info",
"timestamp": "2025-04-05T00:49:09.119612",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "87a60338-9e04-439e-b6fd-7268b5d77e18",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 00:38:17",
"status": "failed",
"started_at": "2025-04-04T00:38:17.884318",
"last_activity": "2025-04-04T00:38:17.900533",
"prompt": "Analysiere den beigefügten Datensatz und mache zusammenfassung",
"messages": [],
"logs": [
{
"id": "log_86fb8f11-72fb-44fd-b5bc-efecf96454fc",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 62, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T00:38:17.887318",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5b620f25-d034-4509-8d7c-27804be47c70",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T00:38:17.891119",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d8933d36-c1c1-4cac-b596-9a93fa9e4413",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T00:38:17.896030",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e35658d9-d3cf-43de-b9d4-a82bdb55b2ca",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T00:38:17.900533",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,21 @@
{
"id": "89199727-f69e-47df-aca3-8eb4791e5a81",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 23:16:25",
"status": "stopped",
"started_at": "2025-04-06T23:16:25.547907",
"last_activity": "2025-04-06T23:17:12.804297",
"prompt": "kannst du mir im web suchen, welche firmen glasssühle anbieten?",
"messages": [],
"logs": [
{
"id": "log_db967cf6-9037-4a08-aa08-8e1866f7c931",
"message": "Workflow wurde manuell gestoppt",
"type": "info",
"timestamp": "2025-04-06T23:17:12.804297",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,45 @@
{
"id": "8f457d7e-6e0b-450e-8f12-6304400610a3",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 11:03:13",
"status": "failed",
"started_at": "2025-04-04T11:03:13.833340",
"last_activity": "2025-04-04T11:03:13.847289",
"prompt": "analyse image",
"messages": [],
"logs": [
{
"id": "log_e3a0a580-e686-4f4d-a41b-a5e54696d4fe",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 13, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T11:03:13.837482",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a06464e6-357a-400d-bb8b-6db948148b9b",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T11:03:13.839371",
"agent_id": null,
"agent_name": null
},
{
"id": "log_8900ef0c-0bae-481a-970e-29c1a14b2209",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T11:03:13.844328",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b8d555dc-dc23-4cc1-a353-2b80ff0b90cc",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T11:03:13.847289",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,45 @@
{
"id": "91a9d821-3a1d-487b-8510-6b492cfec6f8",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 11:06:11",
"status": "failed",
"started_at": "2025-04-04T11:06:11.600577",
"last_activity": "2025-04-04T11:06:11.614537",
"prompt": "analyse image",
"messages": [],
"logs": [
{
"id": "log_3a17353c-a7d8-44a8-b1f1-96a01a504cbc",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 13, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T11:06:11.603582",
"agent_id": null,
"agent_name": null
},
{
"id": "log_cdd0d8a1-8cbc-4773-9068-b00e30df3e8f",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T11:06:11.605617",
"agent_id": null,
"agent_name": null
},
{
"id": "log_56bc7136-b1ad-4884-895e-726d321a079c",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T11:06:11.609579",
"agent_id": null,
"agent_name": null
},
{
"id": "log_63b98be8-4f31-457a-9867-0b522ce426d2",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T11:06:11.614537",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,74 @@
{
"id": "98248069-50f6-4d15-b554-fff31845ac60",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 10:09:01",
"status": "waiting_for_user",
"started_at": "2025-04-04T10:09:02.801739",
"last_activity": "2025-04-04T10:09:04.405802",
"prompt": "beschreibe das bild",
"messages": [
{
"id": "msg_50309ac2-915e-4efa-aec9-e91d86c8a8cb",
"workflow_id": "98248069-50f6-4d15-b554-fff31845ac60",
"parent_message_id": null,
"started_at": "2025-04-04T10:09:02.807346",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "beschreibe das bild",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_5c9b045b-77fd-4533-9147-beba21cae91b",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T10:09:02.806176",
"agent_id": null,
"agent_name": null
},
{
"id": "log_41b7aa97-1ae5-440e-bd21-3cc020320026",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T10:09:02.807346",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b0517342-88e5-4ce0-abda-45c433a54310",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T10:09:04.403809",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4ad31a59-4a01-46fb-a9f4-499810e63521",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T10:09:04.405802",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,82 @@
{
"id": "9e32e62d-f874-4fc3-9d13-0d2c454ac918",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 23:36:43",
"status": "waiting_for_user",
"started_at": "2025-04-04T23:36:43.803889",
"last_activity": "2025-04-04T23:36:45.518758",
"prompt": "wieviele primzahlen gibt es?",
"messages": [
{
"id": "msg_b158f42e-b86b-424b-8051-c4163e906557",
"workflow_id": "9e32e62d-f874-4fc3-9d13-0d2c454ac918",
"parent_message_id": null,
"started_at": "2025-04-04T23:36:43.818325",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "wieviele primzahlen gibt es?",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Erkläre dem Benutzer, dass es unendlich viele Primzahlen gibt. Primzahlen sind natürliche Zahlen größer als 1, die nur durch 1 und sich selbst teilbar sind. Diese Eigenschaft führt dazu, dass es keine obere Grenze für die Anzahl der Primzahlen gibt.",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_5eb58d09-e999-4be7-bf51-59f8d7ea6958",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 28, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T23:36:43.808340",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4e6e8063-0600-44a6-8549-39d06f532c4f",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T23:36:43.813458",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d174588a-3fa4-4c84-b74f-7d58f940d505",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T23:36:45.495249",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c30a9c40-eab3-41e6-a7d9-44e9653d0770",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Erkläre dem Benutzer, dass es unendlich viele Prim...",
"type": "info",
"timestamp": "2025-04-04T23:36:45.513751",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4d75aff8-77b3-482c-848f-ef49a497fb51",
"message": "Workflow wartet auf Benutzereingabe: Erkläre dem Benutzer, dass es unendlich viele Prim...",
"type": "info",
"timestamp": "2025-04-04T23:36:45.518758",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,74 @@
{
"id": "a32a5b46-b5d3-4a86-b281-b9eebb1ca27b",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 12:08:40",
"status": "waiting_for_user",
"started_at": "2025-04-04T12:08:41.015789",
"last_activity": "2025-04-04T12:08:41.755299",
"prompt": "describe",
"messages": [
{
"id": "msg_11070940-296e-485f-9c0b-fa2af3249b87",
"workflow_id": "a32a5b46-b5d3-4a86-b281-b9eebb1ca27b",
"parent_message_id": null,
"started_at": "2025-04-04T12:08:41.027097",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "describe",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_7de1d027-c5d7-4cdf-a7f6-3c650d864e5b",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:08:41.020377",
"agent_id": null,
"agent_name": null
},
{
"id": "log_16dd9fa2-b7dc-4112-a78d-ba6b4b1e1a1a",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:08:41.023380",
"agent_id": null,
"agent_name": null
},
{
"id": "log_606d1401-7618-4a9d-9b9d-1424e75ce5bc",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T12:08:41.752297",
"agent_id": null,
"agent_name": null
},
{
"id": "log_429d9d58-fabe-4cc8-8de3-5c5c8869245b",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T12:08:41.755299",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,135 @@
{
"id": "a3b515e1-5c4f-4f37-89bc-2c50c82ab781",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 11:29:20",
"status": "waiting_for_user",
"started_at": "2025-04-06T11:29:21.076373",
"last_activity": "2025-04-06T11:29:29.516878",
"prompt": "bitte um websuche, wer bei ValueOn AG arbeitet",
"messages": [
{
"id": "msg_a8d7d075-26f0-4fa1-ba2e-d657a7d0faa8",
"workflow_id": "a3b515e1-5c4f-4f37-89bc-2c50c82ab781",
"parent_message_id": null,
"started_at": "2025-04-06T11:29:21.093538",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "bitte um websuche, wer bei ValueOn AG arbeitet",
"agent_type": null
},
{
"id": "msg_a900d6a3-82ac-436f-9b77-be8e7b66787b",
"workflow_id": "a3b515e1-5c4f-4f37-89bc-2c50c82ab781",
"parent_message_id": null,
"started_at": "2025-04-06T11:29:22.743024",
"finished_at": "2025-04-06T11:29:22.746962",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "",
"agent_type": "scraper",
"agent_id": "webcrawler_agent",
"agent_name": "Webscraper"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\nUm eine aussagekräftige Zusammenfassung der Agentenergebnisse zu erstellen, ist es wichtig, die Informationen klar und strukturiert zu präsentieren. Da die spezifischen Ergebnisse des Webscrapers nicht bereitgestellt wurden, werde ich ein allgemeines Format für die Zusammenfassung vorschlagen, das Sie anpassen können, sobald Sie die detaillierten Ergebnisse haben:\n\n### Zusammenfassung der Agentenergebnisse\n\n#### 1. **Zielsetzung und Kontext**\n- **Ziel des Webscrapings**: Beschreiben Sie, warum der Webscraper eingesetzt wurde. Was war das Hauptziel der Datenerhebung?\n- **Kontext**: In welchem Umfeld oder für welches Projekt wurden die Daten gesammelt?\n\n#### 2. **Methodik**\n- **Technologie und Tools**: Welche Technologien und Tools wurden für das Webscraping verwendet?\n- **Datenquellen**: Welche Websites oder Plattformen wurden gescrapt?\n- **Zeitraum**: Wann wurde das Scraping durchgeführt?\n\n#### 3. **Ergebnisse**\n- **Datenvolumen**: Wie viele Datenpunkte wurden gesammelt?\n- **Datenqualität**: Bewertung der Qualität und Vollständigkeit der gesammelten Daten.\n- **Hauptbefunde**: Welche wesentlichen Erkenntnisse wurden aus den Daten gewonnen?\n\n#### 4. **Analyse und Interpretation**\n- **Trends**: Welche Trends oder Muster wurden in den Daten identifiziert?\n- **Vergleiche**: Gibt es relevante Vergleiche zu früheren Daten oder Benchmarks?\n- **Anomalien**: Wurden ungewöhnliche oder unerwartete Ergebnisse festgestellt?\n\n#### 5. **Empfehlungen**\n- **Strategische Empfehlungen**: Welche strategischen Schritte sollten basierend auf den Ergebnissen unternommen werden?\n- **Operative Maßnahmen**: Welche konkreten Maßnahmen werden zur Verbesserung oder Optimierung vorgeschlagen?\n- **Weiterführende Untersuchungen**: Gibt es Bereiche, die einer tieferen Analyse bedürfen?\n\n#### 6. **Herausforderungen und Einschränkungen**\n- **Technische Herausforderungen**: Gab es technische Schwierigkeiten beim Scraping?\n- **Einschränkungen der Daten**: Welche Einschränkungen gibt es hinsichtlich der Datenverfügbarkeit oder -genauigkeit?\n\n#### 7. **Schlussfolgerung**\n- **Zusammenfassung der wichtigsten Erkenntnisse**: Eine kurze Zusammenfassung der wichtigsten Punkte.\n- **Ausblick**: Welche nächsten Schritte werden empfohlen?\n\nPassen Sie diese Struktur an die spezifischen Ergebnisse Ihres Webscrapers an, um eine umfassende und prägnante Zusammenfassung zu erstellen.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_9b99cacc-8da8-406a-a4f0-82439ba9d915",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 46, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T11:29:21.080377",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0abb7bfa-5e20-46a3-b8ed-4f3ceaf581f2",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T11:29:21.086372",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bd80d577-edbe-4657-ab44-1bdac90bb311",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T11:29:22.711089",
"agent_id": null,
"agent_name": null
},
{
"id": "log_43c0a31b-50b3-4074-99a4-a0309d93ab38",
"message": "Agent webcrawler_agent wurde ausgewählt mit Aufgabe: Führe eine Websuche durch, um Informationen darübe...",
"type": "info",
"timestamp": "2025-04-06T11:29:22.718088",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ffeb519e-34e6-4389-92e1-e969398c9305",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:29:22.724138",
"agent_id": null,
"agent_name": null
},
{
"id": "log_699366a4-7c4a-4cbf-94f9-b87d7d40cb60",
"message": "Agent webcrawler_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:29:22.730997",
"agent_id": null,
"agent_name": null
},
{
"id": "log_35d1a65a-31b0-4843-b328-a192580cad5f",
"message": "Agent 'webcrawler_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:29:22.736374",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0b910c5f-5a38-462d-801d-fe358b790b16",
"message": "Agent 'webcrawler_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-06T11:29:22.799837",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c42ee6be-d5e4-4409-a2a8-ac49fdb03053",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-06T11:29:29.516878",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "a74fe6d3-c6bd-423b-b095-b4cd74a23e4e",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 12:09:17",
"status": "failed",
"started_at": "2025-04-04T12:09:17.786866",
"last_activity": "2025-04-04T12:09:17.811838",
"prompt": "describe",
"messages": [],
"logs": [
{
"id": "log_5a5d091a-7349-4264-80e1-680c67c485ee",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:09:17.793645",
"agent_id": null,
"agent_name": null
},
{
"id": "log_3520f813-9fd8-4b8c-b458-92050eb8e594",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:09:17.797285",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b0ae511c-0f42-4d2a-8f3b-b8505ab6870a",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T12:09:17.805423",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1049593d-ab3a-448d-81f8-9c49a6e2b5d7",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T12:09:17.811838",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,296 @@
{
"id": "ae8bc11b-4bbf-4cbe-96e3-f5a801647f20",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 5.4.2025, 00:31:39",
"status": "waiting_for_user",
"started_at": "2025-04-05T00:31:39.916794",
"last_activity": "2025-04-05T00:33:46.408961",
"prompt": "analyse picture",
"messages": [
{
"id": "msg_4d9367ee-c309-4c64-98a4-a66ae953ea8c",
"workflow_id": "ae8bc11b-4bbf-4cbe-96e3-f5a801647f20",
"parent_message_id": null,
"started_at": "2025-04-05T00:32:32.946849",
"finished_at": "2025-04-05T00:32:32.950147",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**Analyseergebnisse:**\n1. **Trend:** Die Daten weisen einen klaren Trend auf, der auf eine bestimmte Entwicklung hinweist.\n2. **Korrelationen:** Es wurden signifikante Korrelationen zwischen bestimmten Variablen festgestellt, die auf mögliche Zusammenhänge oder Einflussfaktoren hinweisen.\n3. **Besondere Auffälligkeiten:** Ein bestimmtes Muster oder eine Anomalie in den Daten ist besonders hervorzuheben.\n\n**Empfehlungen:**\n1. **Maßnahme 1:** Basierend auf den identifizierten Trends und Korrelationen wird diese Maßnahme vorgeschlagen, um die positiven Entwicklungen zu fördern oder negative Einflüsse zu minimieren.\n2. **Maßnahme 2:** Diese Maßnahme zielt darauf ab, die identifizierten Korrelationen weiter zu untersuchen oder zu nutzen.\n3. **Maßnahme 3:** Eine weitere Handlungsempfehlung, die sich aus den besonderen Auffälligkeiten in den Daten ableitet, um mögliche Risiken zu adressieren oder Chancen zu nutzen.\n\nDiese strukturierte Zusammenfassung fasst die wesentlichen Erkenntnisse und Empfehlungen der Datenanalyse zusammen, ohne Redundanzen zu enthalten.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-05T00:33:30.532251",
"status": "completed"
},
{
"id": "msg_bc3b2fb9-940f-42d5-8578-912d8a425a6e",
"workflow_id": "ae8bc11b-4bbf-4cbe-96e3-f5a801647f20",
"parent_message_id": null,
"started_at": "2025-04-05T00:33:30.532251",
"finished_at": null,
"sequence_no": 3,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 1,
"source": {
"type": "file",
"id": 1,
"name": "LF-Nutshell.png",
"content_type": "image/png",
"size": 52108,
"upload_date": "2025-04-05T00:33:39.731816"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart titled \"In a nutshell,\" illustrating a product development process. It consists of several components:\n\n1. **Inputs**: Represented by an inverted triangle funneling into the process.\n\n2. **Product Team**: A rectangular box labeled \"Discover - Define - Shape,\" indicating the initial phase where the product team works on conceptualizing and shaping the product.\n\n3. **Engineering Team**: A box labeled \"Assess & Build,\" showing the phase where the engineering team evaluates and constructs the product.\n\n4. **Q&A Team**: A box labeled \"Validate,\" representing the quality assurance phase where the product is tested and validated.\n\n5. **Operations**: A box labeled \"Release, Run & Monitor,\" indicating the final phase where the product is released, operated, and monitored.\n\n6. **Roadmap**: A horizontal arrow connecting the Product Team to the subsequent phases, labeled \"Roadmap,\" indicating the planning and strategic direction.\n\n7. **Product**: Three consecutive boxes labeled \"Product,\" representing the final output or deliverables of the process.\n\nThe overall layout is linear, showing a progression from inputs to the final product, with each team contributing to different stages of development. The color scheme includes shades of olive green and white, set against a light gray background."
}
]
}
],
"content": "bitte analysiere dies",
"agent_type": null
},
{
"id": "msg_e206a174-a9d9-40a5-afa3-133e15aadb06",
"workflow_id": "ae8bc11b-4bbf-4cbe-96e3-f5a801647f20",
"parent_message_id": null,
"started_at": "2025-04-05T00:33:41.826579",
"finished_at": "2025-04-05T00:33:41.830900",
"sequence_no": 4,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**Datenanalyse:**\n\n1. **Trends:** Die Analyse der bereitgestellten Daten zeigt einen klaren Trend, der auf bestimmte Muster oder Entwicklungen hinweist.\n \n2. **Korrelationen:** Es wurden signifikante Korrelationen zwischen verschiedenen Variablen festgestellt, die auf mögliche Zusammenhänge oder Einflussfaktoren hindeuten.\n\n3. **Auffälligkeiten:** Besonders auffällig ist ein bestimmtes Merkmal oder eine Anomalie in den Daten, die weiter untersucht werden sollte.\n\n**Empfehlungen:**\n\n- **Maßnahme 1:** Basierend auf den identifizierten Trends und Korrelationen wird empfohlen, eine spezifische Maßnahme zu ergreifen, um die positiven Entwicklungen zu fördern oder negative Einflüsse zu minimieren.\n\n- **Maßnahme 2:** Eine weitere Maßnahme sollte darauf abzielen, die festgestellten Korrelationen zu nutzen oder zu adressieren, um die Effizienz oder Effektivität zu steigern.\n\n- **Maßnahme 3:** Schließlich wird empfohlen, die auffälligen Merkmale oder Anomalien genauer zu untersuchen und entsprechende Schritte einzuleiten, um deren Auswirkungen zu verstehen und zu steuern.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_536b81c0-1f29-4433-ae20-b8cd03d36646",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 15, 1 Dateien",
"type": "info",
"timestamp": "2025-04-05T00:31:39.929533",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ec54b9e1-87b5-43ad-9450-95fb55902d58",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-05T00:31:39.935951",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6291d83b-17c6-4474-9333-04dd9e81e3f8",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-05T00:31:39.946726",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c0bcbe6c-d4ac-47b0-a517-532fd8e76d7c",
"message": "Image LF-Current.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-05T00:32:31.182182",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d1685ab4-5319-4809-a8e1-d4f35c915e8c",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-05T00:32:32.920450",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bd804b71-9593-49c3-8f6c-b463eba52fa5",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Analysiere das Bild 'LF-Current.png', das einen Fl...",
"type": "info",
"timestamp": "2025-04-05T00:32:32.925641",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1a42a212-85bd-45e7-9ef1-b6b7b3bb6538",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:32:32.931463",
"agent_id": null,
"agent_name": null
},
{
"id": "log_3c6e9636-f32b-4104-b659-c7bb7710089d",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:32:32.936982",
"agent_id": null,
"agent_name": null
},
{
"id": "log_141ab822-2b68-4d04-aa50-b5c907f761ce",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:32:32.941982",
"agent_id": null,
"agent_name": null
},
{
"id": "log_52b0d049-ce80-4c33-8e38-cef5d3e09da4",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-05T00:32:33.010246",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4e1c76a7-9d30-4351-b0b9-e31a7c85245d",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-05T00:32:40.150558",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d942f10f-57a2-4cbc-a6da-592be10a7ac7",
"message": "Nachricht gelöscht: user - msg_2f03...",
"type": "info",
"timestamp": "2025-04-05T00:33:13.368593",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a9862175-4a7e-4897-ab8f-b4d3cf8941cc",
"message": "Benutzereingabe empfangen: 21 Zeichen, 1 Dateien",
"type": "info",
"timestamp": "2025-04-05T00:33:30.519160",
"agent_id": null,
"agent_name": null
},
{
"id": "log_448db47d-e153-4c42-8b24-8eb637434670",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-05T00:33:30.519160",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5251679c-2bf9-46fe-90ce-2169108c3b57",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-05T00:33:30.537424",
"agent_id": null,
"agent_name": null
},
{
"id": "log_7ab631f8-b435-4867-8f81-1f18712bf71f",
"message": "Image LF-Nutshell.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-05T00:33:39.717738",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c896c562-e689-4ae4-a288-e54b19f50fd3",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-05T00:33:41.798544",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c02e2852-3c36-4866-99a9-e57ca7691f5e",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Analysiere das Bild 'LF-Nutshell.png', das einen F...",
"type": "info",
"timestamp": "2025-04-05T00:33:41.805335",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1d4e3990-f966-4537-a662-42677879c502",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:33:41.811053",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f1fb80b3-6f87-4314-bb46-a4221016f101",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:33:41.816542",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5aa5bf6f-3c9d-45c3-bed1-c2a9e92c4d57",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-05T00:33:41.821921",
"agent_id": null,
"agent_name": null
},
{
"id": "log_470fcc74-f839-426a-8e0b-19a5b582dc2a",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-05T00:33:41.932599",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c49d520a-105d-48c6-9179-187ad274ef8d",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-05T00:33:46.408961",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,249 @@
{
"id": "c449765b-6b7a-4002-aee7-3064ea70a8a1",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 10:54:15",
"status": "waiting_for_user",
"started_at": "2025-04-06T10:54:15.969769",
"last_activity": "2025-04-06T10:55:41.976361",
"prompt": "mach eine webanalyse, wer bei ValueOn AG arbeitet",
"messages": [
{
"id": "msg_3c657903-65d7-43af-a5f1-98279d5e420f",
"workflow_id": "c449765b-6b7a-4002-aee7-3064ea70a8a1",
"parent_message_id": null,
"started_at": "2025-04-06T10:54:15.987680",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "mach eine webanalyse, wer bei ValueOn AG arbeitet",
"agent_type": null
},
{
"id": "msg_03680202-1d19-47c4-8c5b-c3b0df652e31",
"workflow_id": "c449765b-6b7a-4002-aee7-3064ea70a8a1",
"parent_message_id": null,
"started_at": "2025-04-06T10:54:18.270398",
"finished_at": "2025-04-06T10:54:18.273396",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "<coroutine object WebcrawlerAgent.get_web_query at 0x00000171C7DF7060> [STATUS: ERGEBNIS]",
"agent_type": "scraper",
"agent_id": "webcrawler_agent",
"agent_name": "Webscraper"
},
{
"id": "msg_cd94010f-be25-4c20-a20e-cd6ce6f904bd",
"workflow_id": "c449765b-6b7a-4002-aee7-3064ea70a8a1",
"parent_message_id": null,
"started_at": "2025-04-06T10:54:18.350527",
"finished_at": "2025-04-06T10:54:18.353532",
"sequence_no": 3,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "Ich habe als Datenanalyst eine Analyse der bereitgestellten Daten durchgeführt.\n\nHier ist meine detaillierte Analyse:\n1. Die Daten zeigen einen klaren Trend...\n2. Es gibt signifikante Korrelationen zwischen...\n3. Besonders auffällig ist...\n\nMeine Empfehlungen basierend auf der Analyse:\n- Maßnahme 1: ...\n- Maßnahme 2: ...\n- Maßnahme 3: ...",
"agent_type": "analyzer",
"agent_id": "analyst_agent",
"agent_name": "Datenanalyst"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\n**Zusammenfassung der Agentenergebnisse**\n\n**Webscraper**\n- Der Webscraper-Status zeigt, dass das Ergebnis der Webabfrage noch nicht abgeschlossen ist oder nicht verfügbar ist. Daher liegen keine spezifischen Informationen oder Erkenntnisse aus diesem Agenten vor.\n\n**Datenanalyst**\n- **Analyseergebnisse:**\n 1. **Trend:** Die Daten zeigen einen klaren Trend, der auf bestimmte Muster oder Entwicklungen hinweist.\n 2. **Korrelationen:** Es gibt signifikante Korrelationen zwischen verschiedenen Variablen, die auf mögliche Zusammenhänge oder Einflussfaktoren hinweisen.\n 3. **Besondere Auffälligkeiten:** Bestimmte Datenpunkte oder Muster sind besonders auffällig und könnten auf Anomalien oder besondere Ereignisse hinweisen.\n\n- **Empfehlungen:**\n - **Maßnahme 1:** Eine spezifische Handlung oder Strategie, die auf den identifizierten Trend reagiert.\n - **Maßnahme 2:** Eine weitere Handlung, die die signifikanten Korrelationen adressiert oder nutzt.\n - **Maßnahme 3:** Eine zusätzliche Maßnahme, die auf die besonderen Auffälligkeiten eingeht.\n\nDiese strukturierte Zusammenfassung fasst die wesentlichen Erkenntnisse und Empfehlungen der Datenanalyse zusammen, während die Ergebnisse des Webscrapers derzeit nicht verfügbar sind.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-06T10:55:41.069805",
"status": "completed"
},
{
"id": "msg_e03de58f-4476-4edf-af00-292fdaf29e0c",
"workflow_id": "c449765b-6b7a-4002-aee7-3064ea70a8a1",
"parent_message_id": null,
"started_at": "2025-04-06T10:55:41.069805",
"finished_at": null,
"sequence_no": 5,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "bitte gib mir die antwort des webcrawlers zurück",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_403f7ccf-ed42-45bf-9dd2-46fe785c7e14",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 49, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T10:54:15.975629",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1094e7fe-69e8-4b2d-b441-89fe800645e8",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T10:54:15.980554",
"agent_id": null,
"agent_name": null
},
{
"id": "log_854ca26b-0766-41bb-b626-e14c8c8a513f",
"message": "Agenten-Entscheidung abgeschlossen: 2 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T10:54:18.229624",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b29b56dc-95ea-4e62-9e24-db0209763a50",
"message": "Agent webcrawler_agent wurde ausgewählt mit Aufgabe: Führe eine Webrecherche durch, um Informationen da...",
"type": "info",
"timestamp": "2025-04-06T10:54:18.236976",
"agent_id": null,
"agent_name": null
},
{
"id": "log_59bc13cb-e943-4c39-b44d-1863fb241134",
"message": "Agent analyst_agent wurde ausgewählt mit Aufgabe: Analysiere die gesammelten Daten über die Mitarbei...",
"type": "info",
"timestamp": "2025-04-06T10:54:18.243007",
"agent_id": null,
"agent_name": null
},
{
"id": "log_14c1136c-2be3-4f84-b701-041d2323865f",
"message": "2 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-06T10:54:18.249007",
"agent_id": null,
"agent_name": null
},
{
"id": "log_29a63741-cbf9-4188-a199-4f250e098908",
"message": "Agent webcrawler_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T10:54:18.255013",
"agent_id": null,
"agent_name": null
},
{
"id": "log_7856e8b6-d06c-4c24-945c-b51530b0b26f",
"message": "Agent 'webcrawler_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T10:54:18.261201",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c8b1b0d9-ec50-416d-8b41-8210470fada8",
"message": "Agent 'webcrawler_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-06T10:54:18.332907",
"agent_id": null,
"agent_name": null
},
{
"id": "log_83c404d7-e768-48f3-8ee6-08b343d91944",
"message": "Agent analyst_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T10:54:18.338911",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a3d13452-368f-4d49-a0f7-42ca8f0e09ac",
"message": "Agent 'analyst_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T10:54:18.344528",
"agent_id": null,
"agent_name": null
},
{
"id": "log_2cd4307e-cb95-4437-a2cf-4994863685e3",
"message": "Agent 'analyst_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-06T10:54:18.421038",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0da09051-5186-454b-a7de-53f4155debd9",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-06T10:54:21.899245",
"agent_id": null,
"agent_name": null
},
{
"id": "log_388584fc-115c-43ba-a139-d2e09f628933",
"message": "Benutzereingabe empfangen: 48 Zeichen, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T10:55:41.055030",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bfb98fc8-12db-4239-af6a-2623ecfb0ce9",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T10:55:41.057269",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f1dad879-73de-4a04-abea-601257f09791",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T10:55:41.959388",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bf3ab895-07fb-4359-8149-0f38a9ddfc15",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-06T10:55:41.976361",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,135 @@
{
"id": "c7bf1c32-e8be-4c9c-85f3-640bb5df5673",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 6.4.2025, 11:51:38",
"status": "waiting_for_user",
"started_at": "2025-04-06T11:51:39.277041",
"last_activity": "2025-04-06T11:51:50.006970",
"prompt": "mache eine websuche, wer bei ValueOn AG arbeitet",
"messages": [
{
"id": "msg_60090c88-9870-47d4-9579-08efcc62cd04",
"workflow_id": "c7bf1c32-e8be-4c9c-85f3-640bb5df5673",
"parent_message_id": null,
"started_at": "2025-04-06T11:51:39.296540",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "mache eine websuche, wer bei ValueOn AG arbeitet",
"agent_type": null
},
{
"id": "msg_41106885-6a6f-4765-9a46-c15f11abbf0d",
"workflow_id": "c7bf1c32-e8be-4c9c-85f3-640bb5df5673",
"parent_message_id": null,
"started_at": "2025-04-06T11:51:43.600212",
"finished_at": "2025-04-06T11:51:43.606217",
"sequence_no": 2,
"status": "completed",
"role": "assistant",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "",
"agent_type": "scraper",
"agent_id": "webcrawler_agent",
"agent_name": "Webscraper"
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben ihre Aufgaben abgeschlossen. Hier ist eine Zusammenfassung der Ergebnisse:\n\nUm eine aussagekräftige Zusammenfassung der Agentenergebnisse des Webscrapers zu erstellen, wäre es hilfreich, die spezifischen Ergebnisse und Erkenntnisse zu kennen, die der Webscraper geliefert hat. Da diese Informationen nicht bereitgestellt wurden, kann ich eine allgemeine Struktur vorschlagen, wie eine solche Zusammenfassung organisiert werden könnte:\n\n### Zusammenfassung der Webscraper-Ergebnisse\n\n#### 1. **Zielsetzung und Umfang**\n- **Ziel des Webscrapings**: Beschreibung des Zwecks, z.B. Datensammlung für Marktanalyse, Trendbeobachtung, etc.\n- **Umfang der Daten**: Anzahl der gescrapten Webseiten, Datenmenge, relevante Branchen oder Themen.\n\n#### 2. **Methodik**\n- **Technische Details**: Verwendete Technologien und Tools, z.B. Python, BeautifulSoup, Scrapy.\n- **Datenquellen**: Auflistung der gescrapten Webseiten und Plattformen.\n- **Zeitlicher Rahmen**: Zeitraum, in dem das Scraping durchgeführt wurde.\n\n#### 3. **Ergebnisse**\n- **Datenanalyse**: Wichtige Muster und Trends, die aus den gesammelten Daten hervorgegangen sind.\n- **Statistische Erkenntnisse**: Quantitative Ergebnisse, z.B. Häufigkeiten, Durchschnittswerte.\n- **Qualitative Erkenntnisse**: Beobachtungen zu Inhalten, z.B. häufige Themen oder Diskurse.\n\n#### 4. **Wichtige Erkenntnisse**\n- **Markttrends**: Identifizierte Trends und Entwicklungen in der Branche.\n- **Kundenverhalten**: Erkenntnisse über das Verhalten oder die Präferenzen der Zielgruppe.\n- **Wettbewerbsanalyse**: Informationen über Wettbewerber und deren Marktposition.\n\n#### 5. **Empfehlungen**\n- **Strategische Empfehlungen**: Vorschläge zur Anpassung der Geschäftsstrategie basierend auf den Ergebnissen.\n- **Operative Maßnahmen**: Konkrete Schritte zur Verbesserung von Prozessen oder Angeboten.\n- **Weiterführende Analysen**: Vorschläge für zusätzliche Untersuchungen oder Datenquellen.\n\n#### 6. **Herausforderungen und Einschränkungen**\n- **Technische Herausforderungen**: Probleme, die während des Scrapings aufgetreten sind.\n- **Datenqualität**: Bewertung der Zuverlässigkeit und Vollständigkeit der gesammelten Daten.\n- **Rechtliche Aspekte**: Berücksichtigung von Datenschutz und rechtlichen Rahmenbedingungen.\n\n#### 7. **Fazit**\n- **Zusammenfassung der wichtigsten Punkte**: Kurze Wiederholung der zentralen Erkenntnisse und Empfehlungen.\n- **Ausblick**: Mögliche zukünftige Entwicklungen und nächste Schritte.\n\nDiese Struktur hilft dabei, die Ergebnisse des Webscrapings klar und prägnant darzustellen, wobei alle wichtigen Erkenntnisse und Empfehlungen berücksichtigt werden.\n\nBenötigen Sie weitere Informationen oder haben Sie Fragen dazu?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_ff84c519-18cc-4f07-b956-926691b03501",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 48, 0 Dateien",
"type": "info",
"timestamp": "2025-04-06T11:51:39.280048",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ba66ea60-4e60-4e75-a8e0-b431e1c961b7",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-06T11:51:39.288048",
"agent_id": null,
"agent_name": null
},
{
"id": "log_e0ac4d8d-44d2-4a0c-aaac-4c361f92a1cc",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-06T11:51:40.413009",
"agent_id": null,
"agent_name": null
},
{
"id": "log_cf617d5d-529f-420e-a29d-c406445736f6",
"message": "Agent webcrawler_agent wurde ausgewählt mit Aufgabe: Führe eine Websuche durch, um herauszufinden, wer ...",
"type": "info",
"timestamp": "2025-04-06T11:51:40.420245",
"agent_id": null,
"agent_name": null
},
{
"id": "log_23e8fd49-2924-44e5-8f06-af330593386d",
"message": "1 System-Agenten werden ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:51:40.427252",
"agent_id": null,
"agent_name": null
},
{
"id": "log_66323f93-078c-4068-8ef1-388bbdac33d6",
"message": "Agent webcrawler_agent wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:51:40.433468",
"agent_id": null,
"agent_name": null
},
{
"id": "log_77390a76-3ca4-4d39-bb01-bca630cdef25",
"message": "Agent 'webcrawler_agent' wird ausgeführt",
"type": "info",
"timestamp": "2025-04-06T11:51:40.448195",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ca4120fc-d8f5-495b-bbf8-113d3c01e0dd",
"message": "Agent 'webcrawler_agent' hat geantwortet",
"type": "info",
"timestamp": "2025-04-06T11:51:43.678155",
"agent_id": null,
"agent_name": null
},
{
"id": "log_c4736f69-ba82-47d0-8ab2-c2b320e14f59",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben ihre Aufgaben abgeschlossen. Hie...",
"type": "info",
"timestamp": "2025-04-06T11:51:50.006970",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "ca4f0862-6f53-4728-a5ff-bedf4858af70",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 11:42:26",
"status": "failed",
"started_at": "2025-04-04T11:42:26.581374",
"last_activity": "2025-04-04T11:42:28.456874",
"prompt": "describe",
"messages": [],
"logs": [
{
"id": "log_31ecab1f-5746-4674-b337-55d0c28edf75",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T11:42:26.587148",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4f293eda-9cd4-41a1-83b2-92a4f6dd3330",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T11:42:26.589152",
"agent_id": null,
"agent_name": null
},
{
"id": "log_3a05b685-6731-4755-aa88-74d9f93385ae",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T11:42:26.595136",
"agent_id": null,
"agent_name": null
},
{
"id": "log_89faad78-32eb-42d3-a125-8d7dbc01ef68",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T11:42:28.456874",
"agent_id": null,
"agent_name": null
}
]
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,108 @@
{
"id": "cbeaf9a2-37e9-4c1e-865b-4db41fee8089",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 11:55:55",
"status": "failed",
"started_at": "2025-04-04T11:55:55.828301",
"last_activity": "2025-04-04T11:56:04.143077",
"prompt": "describe",
"messages": [
{
"id": "msg_20192add-367e-4fcd-be58-d2cbde51b8f5",
"workflow_id": "cbeaf9a2-37e9-4c1e-865b-4db41fee8089",
"parent_message_id": null,
"started_at": "2025-04-04T11:55:55.839364",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "describe",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true,
"finished_at": "2025-04-04T11:56:04.136548",
"status": "completed"
}
],
"logs": [
{
"id": "log_8469e064-f4a7-4eed-bfbc-890117ab472a",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T11:55:55.833303",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1a1e3e99-586d-4e08-bc6d-00d6566251f3",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T11:55:55.835851",
"agent_id": null,
"agent_name": null
},
{
"id": "log_072c853b-6a6a-4ad2-83db-512abfeec8ff",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T11:55:56.552867",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0e8c8f2d-f945-4ad2-836d-2fd35e5c05f2",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T11:55:56.554866",
"agent_id": null,
"agent_name": null
},
{
"id": "log_27da6b33-fbe0-4247-95c3-6e51f6d3db93",
"message": "Benutzereingabe empfangen: 8 Zeichen, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T11:56:04.131550",
"agent_id": null,
"agent_name": null
},
{
"id": "log_696589b0-7a13-4cc2-8b9b-557a2d082a11",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T11:56:04.133575",
"agent_id": null,
"agent_name": null
},
{
"id": "log_55329bc3-ac94-4adb-b60a-83ad0fa05a52",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T11:56:04.138556",
"agent_id": null,
"agent_name": null
},
{
"id": "log_f9d8f5a2-291a-465e-bb7d-ef898a826dab",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T11:56:04.143077",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": false
}

View file

@ -0,0 +1,45 @@
{
"id": "cfb78b63-b90e-487f-8e4f-b06d2eb3c897",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 10:53:33",
"status": "failed",
"started_at": "2025-04-04T10:53:33.539227",
"last_activity": "2025-04-04T10:53:33.559733",
"prompt": "describe image",
"messages": [],
"logs": [
{
"id": "log_810e8e9a-86f4-41fe-9222-4ec40e321076",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 14, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T10:53:33.543218",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b0cf36e8-c220-4fea-b165-d9621508fb4b",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T10:53:33.545224",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4da8eed1-3eff-4f73-8050-00609e479bf8",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T10:53:33.549224",
"agent_id": null,
"agent_name": null
},
{
"id": "log_cdf0f053-66d1-407e-b64e-c7e8fa717c99",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T10:53:33.559733",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,45 @@
{
"id": "d75da571-8d77-4f08-93ec-408094897b7c",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 11:32:47",
"status": "failed",
"started_at": "2025-04-04T11:32:47.709973",
"last_activity": "2025-04-04T11:32:49.418963",
"prompt": "analyse image",
"messages": [],
"logs": [
{
"id": "log_fba016a7-9dfa-4f6d-beb5-add358f74b0b",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 13, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T11:32:47.713975",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1a02934f-4d47-4556-9c1a-6e8933d5f229",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T11:32:47.715977",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a588a9e9-d960-4e75-ae0c-242d6b726c21",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T11:32:47.720976",
"agent_id": null,
"agent_name": null
},
{
"id": "log_35942ad8-552e-4f17-b1af-dffb63abfa03",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T11:32:49.418963",
"agent_id": null,
"agent_name": null
}
]
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,45 @@
{
"id": "d853b5b0-bb4a-4cbd-a237-16d692aaec21",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 10:43:48",
"status": "failed",
"started_at": "2025-04-04T10:43:49.135644",
"last_activity": "2025-04-04T10:43:49.156669",
"prompt": "beschreibe das bild",
"messages": [],
"logs": [
{
"id": "log_43f9273a-5cbe-48b7-9fec-50dd68d314e0",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T10:43:49.139362",
"agent_id": null,
"agent_name": null
},
{
"id": "log_478f46e0-5443-48b4-bd75-6078d47d4a01",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T10:43:49.142520",
"agent_id": null,
"agent_name": null
},
{
"id": "log_eb8f07bb-25b0-4213-9149-03bcd2a3ca55",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T10:43:49.144684",
"agent_id": null,
"agent_name": null
},
{
"id": "log_4531ad57-6894-45c2-a431-9431bbac2c07",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T10:43:49.156669",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,74 @@
{
"id": "df4fcfa4-1ddf-4abf-a7cd-2d9d8cc21c44",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 08:48:35",
"status": "waiting_for_user",
"started_at": "2025-04-04T08:48:36.258254",
"last_activity": "2025-04-04T08:48:38.345464",
"prompt": "beschreibe das bild",
"messages": [
{
"id": "msg_efa3a758-d057-49eb-bf22-6821f4d8b558",
"workflow_id": "df4fcfa4-1ddf-4abf-a7cd-2d9d8cc21c44",
"parent_message_id": null,
"started_at": "2025-04-04T08:48:36.268796",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "beschreibe das bild",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_13b82c90-1861-44d2-8d87-970286c6876c",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 19, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T08:48:36.260280",
"agent_id": null,
"agent_name": null
},
{
"id": "log_93d37a77-96cc-4026-8683-dc8fb96ae42c",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T08:48:36.264259",
"agent_id": null,
"agent_name": null
},
{
"id": "log_737b6fe7-8d8e-46b0-a83b-992b75a077e5",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T08:48:38.339928",
"agent_id": null,
"agent_name": null
},
{
"id": "log_2dfdc235-25f7-4404-8545-480946f03d07",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T08:48:38.345464",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "e4e995d7-2243-495e-b7f4-b52d1f98fcae",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 12:00:41",
"status": "failed",
"started_at": "2025-04-04T12:00:41.893373",
"last_activity": "2025-04-04T12:00:41.908371",
"prompt": "describe",
"messages": [],
"logs": [
{
"id": "log_dcbdb4a0-7b27-4f18-a4aa-abb4d4ffc10f",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:00:41.896371",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9ae77147-6f2b-4807-b269-193361489bac",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:00:41.898369",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bbcc9588-7ef9-4fef-9878-18ab45eb7dd4",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T12:00:41.904370",
"agent_id": null,
"agent_name": null
},
{
"id": "log_89d401b8-9308-4e9b-b85d-9195383b6871",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T12:00:41.908371",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,45 @@
{
"id": "e944d10b-39ea-44e2-beb5-7fad79916ee6",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 10:54:26",
"status": "failed",
"started_at": "2025-04-04T10:54:27.155016",
"last_activity": "2025-04-04T10:54:27.177590",
"prompt": "describe image",
"messages": [],
"logs": [
{
"id": "log_246be801-f3a1-415b-a944-ec96f3be0b28",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 14, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T10:54:27.158016",
"agent_id": null,
"agent_name": null
},
{
"id": "log_5c711d66-d5ce-4c17-b632-af1e9d96d2ca",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T10:54:27.160019",
"agent_id": null,
"agent_name": null
},
{
"id": "log_bd8c9005-f084-4b38-8282-e303f0c3c2ad",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T10:54:27.163530",
"agent_id": null,
"agent_name": null
},
{
"id": "log_0299a558-01da-410b-9a02-1f444345ad15",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T10:54:27.177590",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,124 @@
{
"id": "f19ddc45-e789-47ad-a889-f0e10ec009e6",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 23:55:08",
"status": "waiting_for_user",
"started_at": "2025-04-04T23:55:08.781208",
"last_activity": "2025-04-04T23:55:29.122218",
"prompt": "beschreibe dieses bild",
"messages": [
{
"id": "msg_250dfbc0-a2e9-4cef-bccb-54bfc1109386",
"workflow_id": "f19ddc45-e789-47ad-a889-f0e10ec009e6",
"parent_message_id": null,
"started_at": "2025-04-04T23:55:08.801758",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [
{
"id": 3,
"source": {
"type": "file",
"id": 3,
"name": "LF-Current.png",
"content_type": "image/png",
"size": 126277,
"upload_date": "2025-04-04T23:55:27.716376"
},
"contents": [
{
"type": "text",
"text": "Image Analysis:\nThe image is a flowchart depicting a product development process divided between a Product Team and an Engineering Team. Here's a detailed breakdown:\n\n### Input\n- **Sources**: Customers, Sales, Our ideas.\n- These inputs feed into the Product Team.\n\n### Product Team\n1. **Discover**\n - **Collect**: Ideas & Inputs.\n - **Qualify**: Analyze and match within the team.\n\n2. **Define**\n - **Structure & Document**: Write specifications, define acceptance criteria.\n - **Explore & Design**: UI Design, Experiments, etc.\n\n3. **Shape**\n - **Roadmap**: Define a roadmap.\n - **Scoping**: Define the next version's scope.\n - **Manage**: Tickets in Product.\n\n### Engineering Team\n1. **Build**\n - **Manage**: Track progress in the dashboard.\n - **Factory**: Develop tickets in Engineering for the next version.\n\n2. **Release**\n - **Manage**: Ensure stable changes.\n\n3. **Run & Monitor**\n - **Manage**: Ensure stable operation.\n - **Service & Support**: Deliver 1st level support according to agreed SLA.\n\n4. **Assess**\n - **Manage**: Move assessed tickets to Engineering for future versions.\n - **Estimate**: Assess tickets in \"Product > Analysis\" to define implementation, feasibility, and effort.\n\n### Output\n- **Product**: The final output of the process.\n\n### Tool Integration\n- **Ticketing System**: Includes categories like Inputs & Ideas, Exploration, Analysis, Future Versions, etc.\n- **Roadmap** and **Management Dashboards**: Mentioned as part of the tool integration.\n\nThe flowchart uses arrows to indicate the flow of processes and responsibilities between the Product and Engineering teams, emphasizing collaboration and iterative development."
}
]
}
],
"content": "beschreibe dieses bild",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Bitte beschreibe das Bild 'LF-Current.png', das einen Flussdiagramm des Produktentwicklungsprozesses zwischen einem Produktteam und einem Ingenieurteam darstellt. Achte darauf, die Details und die Struktur des Flussdiagramms zu erläutern.",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_f2620db8-763e-4609-84e2-2cc1cad4323c",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 22, 2 Dateien",
"type": "info",
"timestamp": "2025-04-04T23:55:08.791776",
"agent_id": null,
"agent_name": null
},
{
"id": "log_daf9820e-8030-46ce-827c-d57cdb676285",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T23:55:08.796758",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ad86adfa-4523-4316-9517-140a88db1e71",
"message": "2 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T23:55:08.807757",
"agent_id": null,
"agent_name": null
},
{
"id": "log_51b71efc-0313-45e4-9e27-d96fe1bdaadc",
"message": "Image LF-Current.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-04T23:55:17.896584",
"agent_id": null,
"agent_name": null
},
{
"id": "log_9e73c385-8b44-4cdf-9c08-ab57d0505e3d",
"message": "Image LF-Current.png analyzed successfully",
"type": "info",
"timestamp": "2025-04-04T23:55:27.692734",
"agent_id": null,
"agent_name": null
},
{
"id": "log_69d11e62-ca97-4bd5-b60a-17c5f2b6aa73",
"message": "Agenten-Entscheidung abgeschlossen: 1 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T23:55:29.108265",
"agent_id": null,
"agent_name": null
},
{
"id": "log_155358cc-1df4-4eed-8f96-cfff4cf4d52d",
"message": "Agent user_agent wurde ausgewählt mit Aufgabe: Bitte beschreibe das Bild 'LF-Current.png', das ei...",
"type": "info",
"timestamp": "2025-04-04T23:55:29.112728",
"agent_id": null,
"agent_name": null
},
{
"id": "log_eb26e218-5507-484a-b553-ae952511619e",
"message": "Workflow wartet auf Benutzereingabe: Bitte beschreibe das Bild 'LF-Current.png', das ei...",
"type": "info",
"timestamp": "2025-04-04T23:55:29.122218",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "f3114b43-2601-4398-8f22-cdf2e83088b0",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 12:14:21",
"status": "failed",
"started_at": "2025-04-04T12:14:22.098558",
"last_activity": "2025-04-04T12:14:22.115124",
"prompt": "describe",
"messages": [],
"logs": [
{
"id": "log_6c188381-ce0f-4383-9787-166d29f7dc2e",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T12:14:22.102064",
"agent_id": null,
"agent_name": null
},
{
"id": "log_ea1118ba-0b1e-45cf-ae5a-a331f172f75c",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T12:14:22.105072",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1eb71ac8-f9b8-4268-8150-362677da1a82",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T12:14:22.111073",
"agent_id": null,
"agent_name": null
},
{
"id": "log_d79c62cb-062d-4de8-8656-eb4f7c5c21a2",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T12:14:22.115124",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,45 @@
{
"id": "fc58c41b-706c-4912-a342-7ad55aa1db4a",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 11:52:40",
"status": "failed",
"started_at": "2025-04-04T11:52:41.079026",
"last_activity": "2025-04-04T11:52:41.093434",
"prompt": "describe",
"messages": [],
"logs": [
{
"id": "log_d73c68df-0354-40a8-bfff-63db9121ea15",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 8, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T11:52:41.082193",
"agent_id": null,
"agent_name": null
},
{
"id": "log_48fbafc5-c18f-429e-af83-1f9cdb3c25eb",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T11:52:41.083520",
"agent_id": null,
"agent_name": null
},
{
"id": "log_53a22960-e50e-457c-ae34-7264e3f22275",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T11:52:41.090436",
"agent_id": null,
"agent_name": null
},
{
"id": "log_6a7c7c65-ef4b-4b2d-b86a-9fcc9bf846f2",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T11:52:41.093434",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -0,0 +1,74 @@
{
"id": "fec08098-c1c7-464a-866f-f9190b294d29",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 00:46:05",
"status": "waiting_for_user",
"started_at": "2025-04-04T00:46:06.617567",
"last_activity": "2025-04-04T00:46:07.431241",
"prompt": "analysiere die datei im anhang",
"messages": [
{
"id": "msg_a3d404f0-d563-4dc6-a373-e1ce75e42384",
"workflow_id": "fec08098-c1c7-464a-866f-f9190b294d29",
"parent_message_id": null,
"started_at": "2025-04-04T00:46:06.635910",
"finished_at": null,
"sequence_no": 1,
"status": "pending",
"role": "user",
"data_stats": {
"processing_time": 0.0,
"token_count": 0,
"bytes_sent": 0,
"bytes_received": 0
},
"documents": [],
"content": "analysiere die datei im anhang",
"agent_type": null
},
{
"role": "assistant",
"content": "[Moderator zu User Agent] Die Agenten haben keine spezifischen Aufgaben durchgeführt. Gibt es etwas, wobei ich Ihnen helfen kann?",
"agent_type": "moderator",
"agent_id": "moderator",
"agent_name": "Moderator",
"waiting_for_user": true
}
],
"logs": [
{
"id": "log_d299f1a7-2a4e-4f8e-8036-0076f54f9801",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 30, 0 Dateien",
"type": "info",
"timestamp": "2025-04-04T00:46:06.627370",
"agent_id": null,
"agent_name": null
},
{
"id": "log_dc1c0f19-c30e-44a7-a8a1-db1ce1fb4f23",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T00:46:06.631923",
"agent_id": null,
"agent_name": null
},
{
"id": "log_1702dafb-3e38-4376-ba39-7c51f7c105f1",
"message": "Agenten-Entscheidung abgeschlossen: 0 Aufgaben zugewiesen",
"type": "info",
"timestamp": "2025-04-04T00:46:07.422639",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a7f09481-77b5-41ae-bcaf-52f44b059c71",
"message": "Workflow wartet auf Benutzereingabe: Die Agenten haben keine spezifischen Aufgaben durc...",
"type": "info",
"timestamp": "2025-04-04T00:46:07.431241",
"agent_id": null,
"agent_name": null
}
],
"waiting_for_user": true
}

View file

@ -0,0 +1,45 @@
{
"id": "ff6f56c9-6c59-44c1-95e1-f16c09c729b7",
"mandate_id": 1,
"user_id": 1,
"name": "Workflow 4.4.2025, 10:56:30",
"status": "failed",
"started_at": "2025-04-04T10:56:30.982873",
"last_activity": "2025-04-04T10:56:30.995604",
"prompt": "analyse image",
"messages": [],
"logs": [
{
"id": "log_b0eb9431-cace-4702-89fc-6b9c32dbee8d",
"message": "Starte Workflow-Ausführung, Nachrichtenlänge: 13, 1 Dateien",
"type": "info",
"timestamp": "2025-04-04T10:56:30.982873",
"agent_id": null,
"agent_name": null
},
{
"id": "log_b7326804-734a-4710-94e1-71c024720242",
"message": "Workflow nach Benutzereingabe fortgesetzt",
"type": "info",
"timestamp": "2025-04-04T10:56:30.987415",
"agent_id": null,
"agent_name": null
},
{
"id": "log_83cc006b-97e7-42b1-a75a-f63925e68329",
"message": "1 Dateien werden verarbeitet",
"type": "info",
"timestamp": "2025-04-04T10:56:30.992889",
"agent_id": null,
"agent_name": null
},
{
"id": "log_a9ac8fe7-a392-4523-bd5d-4951cb15534d",
"message": "Fehler bei der Workflow-Ausführung: 'str' object does not support item assignment",
"type": "error",
"timestamp": "2025-04-04T10:56:30.995604",
"agent_id": null,
"agent_name": null
}
]
}

View file

@ -1,3 +1,6 @@
import os
os.environ["NUMEXPR_MAX_THREADS"] = "12"
from fastapi import FastAPI, HTTPException, Depends, Body, status, Response from fastapi import FastAPI, HTTPException, Depends, Body, status, Response
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse, FileResponse from fastapi.responses import JSONResponse, FileResponse
@ -6,15 +9,12 @@ from fastapi.security import OAuth2PasswordRequestForm
import uvicorn import uvicorn
from typing import Dict, Any from typing import Dict, Any
import os
import logging import logging
from datetime import timedelta from datetime import timedelta
import pathlib import pathlib
# Import interfaces # Import interfaces
from modules.gateway_interface import get_gateway_interface from modules.gateway_interface import get_gateway_interface
from modules.lucydom_interface import get_lucydom_interface
from modules.agentservice_interface import AgentService
# Import auth module # Import auth module
from auth import ( from auth import (
@ -24,8 +24,9 @@ from auth import (
ACCESS_TOKEN_EXPIRE_MINUTES ACCESS_TOKEN_EXPIRE_MINUTES
) )
# Import models - generisch importieren # Import models - generisch importieren zur INITIALISIERUNG, auch wenn dummy!
import modules.gateway_model as gateway_model import modules.gateway_model as gateway_model
import modules.lucydom_interface as lucydom_model
# Konfiguration des Loggers # Konfiguration des Loggers
logging.basicConfig( logging.basicConfig(
@ -109,21 +110,15 @@ async def read_user_me(current_user: Dict[str, Any] = Depends(get_current_active
return current_user return current_user
# Alle Router einbinden # Alle Router einbinden
from routes.attributes import router as attributes_router
app.include_router(attributes_router)
from routes.mandates import router as mandate_router from routes.mandates import router as mandate_router
app.include_router(mandate_router) app.include_router(mandate_router)
from routes.users import router as user_router from routes.users import router as user_router
app.include_router(user_router) app.include_router(user_router)
from routes.attributes import router as attributes_router
app.include_router(attributes_router)
from routes.workspaces import router as workspace_router
app.include_router(workspace_router)
from routes.agents import router as agent_router
app.include_router(agent_router)
from routes.files import router as file_router from routes.files import router as file_router
app.include_router(file_router) app.include_router(file_router)

View file

@ -1,5 +1,5 @@
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from typing import Optional, Dict, Any from typing import Optional, Dict, Any, Tuple
from fastapi import Depends, HTTPException, status from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer from fastapi.security import OAuth2PasswordBearer
from jose import JWTError, jwt from jose import JWTError, jwt
@ -118,17 +118,44 @@ async def get_current_active_user(current_user: Dict[str, Any] = Depends(get_cur
return current_user return current_user
async def get_user_context(current_user: Dict[str, Any] = Depends(get_current_active_user)) -> tuple: async def get_user_context(current_user: Dict[str, Any]) -> Tuple[int, int]:
""" """
Extrahiert den Benutzerkontext (Mandanten-ID und Benutzer-ID). Extrahiert die Mandanten-ID und Benutzer-ID aus dem aktuellen Benutzer.
Enhanced with better logging.
Args: Args:
current_user: Aktuelle Benutzerdaten current_user: Der aktuelle Benutzer
Returns: Returns:
Tuple mit (mandate_id, user_id) Tuple von (mandate_id, user_id)
""" """
mandate_id = current_user.get("mandate_id", 1) # Standard: Root-Mandant # Default values
user_id = current_user.get("id") default_mandate_id = 0
default_user_id = 0
# Extract mandate_id
mandate_id = current_user.get("mandate_id", None)
if mandate_id is None:
logger.warning(f"No mandate_id found in current_user, using default: {default_mandate_id}")
mandate_id = default_mandate_id
else:
try:
mandate_id = int(mandate_id)
except (ValueError, TypeError):
logger.error(f"Invalid mandate_id value: {mandate_id}, using default: {default_mandate_id}")
mandate_id = default_mandate_id
# Extract user_id
user_id = current_user.get("id", None)
if user_id is None:
logger.warning(f"No user_id found in current_user, using default: {default_user_id}")
user_id = default_user_id
else:
try:
user_id = int(user_id)
except (ValueError, TypeError):
logger.error(f"Invalid user_id value: {user_id}, using default: {default_user_id}")
user_id = default_user_id
# logger.info(f"User context: mandate_id={mandate_id}, user_id={user_id}")
return mandate_id, user_id return mandate_id, user_id

View file

@ -1,435 +0,0 @@
import os
import json
import logging
import httpx
import base64
import mimetypes
from typing import Dict, Any, List, Optional
from fastapi import HTTPException
import configload as configload
# Logger konfigurieren
logger = logging.getLogger(__name__)
# Konfigurationsdaten laden
def load_config_data():
config = configload.load_config()
return {
"api_key": config.get('Connector_AiAnthropic', 'API_KEY'),
"api_url": config.get('Connector_AiAnthropic', 'API_URL'),
"model_name": config.get('Connector_AiAnthropic', 'MODEL_NAME'),
"temperature": float(config.get('Connector_AiAnthropic', 'TEMPERATURE')),
"max_tokens": int(config.get('Connector_AiAnthropic', 'MAX_TOKENS'))
}
class ChatService:
"""
Connector für die Kommunikation mit der Anthropic API.
"""
def __init__(self):
# Konfiguration laden
self.config = load_config_data()
self.api_key = self.config["api_key"]
self.api_url = self.config["api_url"]
self.model_name = self.config["model_name"]
# HttpClient für API-Aufrufe
self.http_client = httpx.AsyncClient(
timeout=120.0, # Längeres Timeout für komplexe Anfragen
headers={
"x-api-key": self.api_key,
"anthropic-version": "2023-06-01", # Anthropic API Version
"Content-Type": "application/json"
}
)
logger.info(f"Anthropic Connector initialisiert mit Modell: {self.model_name}")
async def call_api(self, messages: List[Dict[str, Any]], temperature: float = None, max_tokens: int = None) -> Dict[str, Any]:
"""
Ruft die Anthropic API mit den gegebenen Nachrichten auf.
Args:
messages: Liste von Nachrichten im OpenAI-Format (role, content)
temperature: Temperatur für die Antwortgenerierung (0.0-1.0)
max_tokens: Maximale Anzahl der Token in der Antwort
Returns:
Die Antwort umgewandelt ins OpenAI-Format
Raises:
HTTPException: Bei Fehlern in der API-Kommunikation
"""
try:
# OpenAI-Format in Anthropic-Format umwandeln
formatted_messages = self._convert_to_anthropic_format(messages)
# Verwende Parameter aus der Konfiguration, falls keine überschrieben wurden
if temperature is None:
temperature = self.config.get("temperature", 0.2)
if max_tokens is None:
max_tokens = self.config.get("max_tokens", 2000)
# Anthropic API Payload erstellen
payload = {
"model": self.model_name,
"messages": formatted_messages,
"temperature": temperature,
"max_tokens": max_tokens
}
response = await self.http_client.post(
self.api_url,
json=payload
)
if response.status_code != 200:
logger.error(f"Anthropic API-Fehler: {response.status_code} - {response.text}")
raise HTTPException(status_code=500, detail="Fehler bei der Kommunikation mit Anthropic API")
# Antwort im Anthropic-Format in OpenAI-Format umwandeln
anthropic_response = response.json()
openai_formatted_response = self._convert_to_openai_format(anthropic_response)
return openai_formatted_response
except Exception as e:
logger.error(f"Fehler beim Aufruf der Anthropic API: {str(e)}")
raise HTTPException(status_code=500, detail=f"Fehler beim Aufruf der Anthropic API: {str(e)}")
def _convert_to_anthropic_format(self, openai_messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
"""
Konvertiert Nachrichten vom OpenAI-Format ins Anthropic-Format.
OpenAI verwendet:
[{"role": "system", "content": "..."},
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}]
Anthropic verwendet:
[{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}]
Anmerkung: Anthropic hat kein direktes System-Message-Äquivalent,
daher fügen wir System-Nachrichten in die erste User-Nachricht ein.
"""
anthropic_messages = []
system_content = ""
# Extrahiere zuerst alle System-Nachrichten
for msg in openai_messages:
if msg.get("role") == "system":
system_content += msg.get("content", "") + "\n\n"
# Konvertiere die restlichen Nachrichten
for i, msg in enumerate(openai_messages):
role = msg.get("role")
content = msg.get("content", "")
# System-Nachrichten überspringen (bereits extrahiert)
if role == "system":
continue
# Für die erste User-Nachricht: System-Inhalte voranstellen, falls vorhanden
if role == "user" and system_content and not any(m.get("role") == "user" for m in anthropic_messages):
if isinstance(content, str):
content = system_content + content
elif isinstance(content, list):
# Wenn content ein Array ist (für Multimodal-Nachrichten)
text_parts = []
for part in content:
if part.get("type") == "text":
text_parts.append(part)
if text_parts:
text_parts[0]["text"] = system_content + text_parts[0].get("text", "")
# Anthropic unterstützt nur "user" und "assistant" als Rollen
if role not in ["user", "assistant"]:
role = "user"
anthropic_messages.append({"role": role, "content": content})
return anthropic_messages
def _convert_to_openai_format(self, anthropic_response: Dict[str, Any]) -> Dict[str, Any]:
"""
Konvertiert eine Antwort vom Anthropic-Format ins OpenAI-Format.
Anthropic gibt zurück:
{
"id": "msg_...",
"content": [{"type": "text", "text": "Antworttext"}],
"model": "claude-...",
...
}
OpenAI gibt zurück:
{
"id": "chatcmpl-...",
"object": "chat.completion",
"choices": [
{
"message": {
"role": "assistant",
"content": "Antworttext"
},
"index": 0,
"finish_reason": "stop"
}
],
"model": "gpt-...",
...
}
"""
# Extrahiere Inhalt aus Anthropic-Antwort
content = ""
if "content" in anthropic_response:
if isinstance(anthropic_response["content"], list):
# Inhalt ist eine Liste von Teilen (bei neueren API-Versionen)
for part in anthropic_response["content"]:
if part.get("type") == "text":
content += part.get("text", "")
else:
# Direkter Inhalt als String (bei älteren API-Versionen)
content = anthropic_response["content"]
# Erstelle OpenAI-formatierte Antwort
return {
"id": anthropic_response.get("id", ""),
"object": "chat.completion",
"created": anthropic_response.get("created", 0),
"model": anthropic_response.get("model", self.model_name),
"choices": [
{
"message": {
"role": "assistant",
"content": content
},
"index": 0,
"finish_reason": "stop"
}
]
}
def prepare_file_message_content(self, prompt_text: str, file_paths: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
"""
Bereitet eine Nachricht mit Dateien für Anthropic API vor.
Args:
prompt_text: Der Text-Prompt
file_paths: Liste von Dateipfaden mit Metadaten (Dict mit id, name, type, path)
Returns:
Eine für Anthropic-API formatierte content-Liste
"""
message_content = [
{
"type": "text",
"text": prompt_text
}
]
# Füge Dateien als Anhänge hinzu
for file_info in file_paths:
file_path = file_info.get("path", "")
if file_path and os.path.exists(file_path):
try:
# Datei als Base64 codieren
with open(file_path, "rb") as f:
file_data = f.read()
base64_data = base64.b64encode(file_data).decode('utf-8')
# MIME-Typ bestimmen
mime_type, _ = mimetypes.guess_type(file_path)
if not mime_type:
mime_type = "application/octet-stream"
# Content-Type bestimmen (image oder document)
content_type = "image" if mime_type.startswith("image/") else "document"
# Füge die Datei als Anhang hinzu
message_content.append({
"type": content_type,
"source": {
"type": "base64",
"media_type": mime_type,
"data": base64_data
}
})
logger.info(f"Datei {file_info.get('name', 'Unbekannt')} als {content_type} hinzugefügt")
except Exception as e:
logger.error(f"Fehler beim Hinzufügen der Datei {file_info.get('name', 'Unbekannt')}: {str(e)}")
return message_content
def parse_filedata(self, file_paths: List[Dict[str, Any]], prompt_text: str = "", file_contents: Dict[str, str] = None) -> Dict[str, Any]:
"""
Bereitet Dateien für die Anthropic API vor und erstellt ein einheitliches Message-Objekt.
Args:
file_paths: Liste von Dateipfaden mit Metadaten (Dict mit id, name, type, path)
prompt_text: Der Text-Prompt, der zusammen mit den Dateien gesendet werden soll
file_contents: Optional vorgelesene Dateiinhalte als Dict[file_id, content]
Returns:
Ein standardisiertes Message-Objekt, das für beide API-Typen verwendet werden kann
"""
# Basisstruktur für die Nachricht
message = {
"role": "user",
"content": []
}
# Text-Prompt hinzufügen
if prompt_text:
message["content"].append({
"type": "text",
"text": prompt_text
})
# Dateien als Anhänge hinzufügen
for file_info in file_paths:
file_path = file_info.get("path", "")
file_name = file_info.get("name", "")
file_id = file_info.get("id", "")
# Prüfen, ob Dateiinhalt bereits vorhanden ist
if file_contents and file_id in file_contents:
# Nur Kontext-Information hinzufügen
message["content"].append({
"type": "text",
"text": f"Datei: {file_name}\n{file_contents[file_id]}"
})
logger.info(f"Vorverarbeiteter Inhalt für Datei {file_name} verwendet")
continue
# Sonst Datei direkt verarbeiten
if file_path and os.path.exists(file_path):
try:
# Datei als Base64 codieren
with open(file_path, "rb") as f:
file_data = f.read()
base64_data = base64.b64encode(file_data).decode('utf-8')
# MIME-Typ bestimmen mit python-magic, wenn verfügbar
try:
import magic
mime_type = magic.from_buffer(file_data, mime=True)
except ImportError:
# Fallback auf mimetypes, wenn python-magic nicht verfügbar ist
mime_type, _ = mimetypes.guess_type(file_path)
if not mime_type:
# Fallback auf Dateierweiterung
extension = os.path.splitext(file_path)[1].lower()[1:]
mime_type = get_mime_type_from_extension(extension)
# Content-Type bestimmen (image, document, oder allgemein file)
content_type, _ = determine_content_structure(mime_type)
# Füge die Datei als Anhang hinzu
message["content"].append({
"type": content_type,
"source": {
"type": "base64",
"media_type": mime_type,
"data": base64_data
}
})
logger.info(f"Datei {file_name} als {content_type} hinzugefügt")
except Exception as e:
logger.error(f"Fehler beim Hinzufügen der Datei {file_name}: {str(e)}")
message["content"].append({
"type": "text",
"text": f"[Fehler beim Laden der Datei {file_name}: {str(e)}]"
})
else:
# Datei nicht gefunden - Hinweis einfügen
message["content"].append({
"type": "text",
"text": f"[Datei {file_name} nicht verfügbar]"
})
return message
async def close(self):
"""Schließt den HTTP-Client beim Beenden der Anwendung"""
await self.http_client.aclose()
def determine_content_structure(mime_type: str) -> tuple:
"""
Bestimmt den richtigen content_type und die Nachrichtenstruktur basierend auf dem MIME-Typ.
Args:
mime_type: Der MIME-Typ der Datei
Returns:
Tuple mit (content_type, message_structure)
"""
# Bildtypen
if mime_type.startswith("image/"):
return "image", "image"
# Dokumenttypen
document_types = [
"application/pdf",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document", # docx
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", # xlsx
"application/vnd.openxmlformats-officedocument.presentationml.presentation", # pptx
"application/vnd.ms-excel",
"application/vnd.ms-powerpoint",
"application/msword",
"text/csv",
"text/plain",
"application/json",
"application/xml",
"text/html"
]
if any(mime_type.startswith(dt) for dt in document_types) or mime_type in document_types:
return "document", "document"
# Fallback für unbekannte Typen
return "file", "file"
def get_mime_type_from_extension(extension: str) -> str:
"""
Bestimmt den MIME-Typ basierend auf der Dateiendung.
Args:
extension: Die Dateiendung ohne Punkt
Returns:
Der entsprechende MIME-Typ
"""
extension_to_mime = {
"pdf": "application/pdf",
"docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"doc": "application/msword",
"xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"xls": "application/vnd.ms-excel",
"pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
"ppt": "application/vnd.ms-powerpoint",
"csv": "text/csv",
"txt": "text/plain",
"json": "application/json",
"xml": "application/xml",
"html": "text/html",
"htm": "text/html",
"jpg": "image/jpeg",
"jpeg": "image/jpeg",
"png": "image/png",
"gif": "image/gif",
"webp": "image/webp",
"svg": "image/svg+xml"
}
return extension_to_mime.get(extension, "application/octet-stream")

View file

@ -1,423 +0,0 @@
import io
import os
import json
import uuid
import logging
import httpx
import base64
import mimetypes
from typing import Dict, Any, List, Optional
from fastapi import HTTPException
import configload as configload
import pandas as pd
from PIL import Image
import PyPDF2
import fitz
# Logger konfigurieren
logger = logging.getLogger(__name__)
# Konfigurationsdaten laden
def load_config_data():
config = configload.load_config()
return {
"api_key": config.get('Connector_AiOpenai', 'API_KEY'),
"api_url": config.get('Connector_AiOpenai', 'API_URL'),
"model_name": config.get('Connector_AiOpenai', 'MODEL_NAME'),
"temperature": float(config.get('Connector_AiOpenai', 'TEMPERATURE')),
"max_tokens": int(config.get('Connector_AiOpenai', 'MAX_TOKENS'))
}
class ChatService:
"""
Connector für die Kommunikation mit der OpenAI API.
"""
def __init__(self):
# Konfiguration laden
self.config = load_config_data()
self.api_key = self.config["api_key"]
self.api_url = self.config["api_url"]
self.model_name = self.config["model_name"]
# HttpClient für API-Aufrufe
self.http_client = httpx.AsyncClient(
timeout=120.0, # Längeres Timeout für komplexe Anfragen
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
)
logger.info(f"OpenAI Connector initialisiert mit Modell: {self.model_name}")
async def call_api(self, messages: List[Dict[str, Any]], temperature: float = None, max_tokens: int = None) -> Dict[str, Any]:
"""
Ruft die OpenAI API mit den gegebenen Nachrichten auf.
Args:
messages: Liste von Nachrichten im OpenAI-Format (role, content)
temperature: Temperatur für die Antwortgenerierung (0.0-1.0)
max_tokens: Maximale Anzahl der Token in der Antwort
Returns:
Die Antwort der OpenAI API
Raises:
HTTPException: Bei Fehlern in der API-Kommunikation
"""
try:
# Verwende Parameter aus der Konfiguration, falls keine überschrieben wurden
if temperature is None:
temperature = self.config.get("temperature", 0.2)
if max_tokens is None:
max_tokens = self.config.get("max_tokens", 2000)
payload = {
"model": self.model_name,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens
}
response = await self.http_client.post(
self.api_url,
json=payload
)
if response.status_code != 200:
logger.error(f"OpenAI API-Fehler: {response.status_code} - {response.text}")
raise HTTPException(status_code=500, detail="Fehler bei der Kommunikation mit OpenAI API")
return response.json()
except Exception as e:
logger.error(f"Fehler beim Aufruf der OpenAI API: {str(e)}")
raise HTTPException(status_code=500, detail=f"Fehler beim Aufruf der OpenAI API: {str(e)}")
async def close(self):
"""Schließt den HTTP-Client beim Beenden der Anwendung"""
await self.http_client.close()
async def analyze_image(self, image_path: str, prompt: str) -> str:
"""
Analysiert ein Bild mit der OpenAI Vision API.
Args:
image_path: Pfad zum Bild
prompt: Der Prompt für die Analyse
Returns:
Die Antwort der OpenAI Vision API als Text
"""
try:
# Bild einlesen und als Base64 kodieren
with open(image_path, "rb") as f:
image_data = f.read()
# In Base64-String konvertieren
base64_data = base64.b64encode(image_data).decode('utf-8')
# MIME-Typ bestimmen
mime_type, _ = mimetypes.guess_type(image_path)
if not mime_type:
# Standard ist PNG, wenn Typ nicht bestimmt werden kann
mime_type = "image/png"
# Vision-fähiges Modell für die Anfrage verwenden
vision_model = "gpt-4o" # oder aus der Konfiguration holen
# Bereite den Payload für die Vision API vor
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{
"type": "image_url",
"image_url": {
"url": f"data:{mime_type};base64,{base64_data}"
}
}
]
}
]
# Verwende die bestehende call_api Funktion mit dem Vision-Modell
response = await self.call_api(messages)
# Inhalt extrahieren und zurückgeben
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Fehler bei der Bildanalyse {image_path}: {str(e)}", exc_info=True)
return f"[Fehler bei der Bildanalyse: {str(e)}]"
async def extract_and_analyze_pdf_images(self, pdf_path: str, prompt: str) -> List[Dict[str, Any]]:
"""
Extrahiert Bilder aus einer PDF-Datei mit PyMuPDF und analysiert sie mit der Vision API.
Args:
pdf_path: Pfad zur PDF-Datei
prompt: Der Prompt für die Bildanalyse
Returns:
Eine Liste mit Analyseergebnissen für jedes Bild
"""
import uuid
import os
image_responses = []
try:
# PDF öffnen
doc = fitz.open(pdf_path)
logger.info(f"PDF geöffnet: {pdf_path} mit {len(doc)} Seiten")
for page_num, page in enumerate(doc, 1):
# Alle Bilder auf der Seite finden
image_list = page.get_images(full=True)
if image_list:
logger.info(f"Seite {page_num}: {len(image_list)} Bilder gefunden")
for img_index, img in enumerate(image_list):
try:
# Bild-Referenz
xref = img[0]
# Bild und Metadaten extrahieren
base_image = doc.extract_image(xref)
image_bytes = base_image["image"] # Tatsächliche Bilddaten
image_ext = base_image["ext"] # Dateiendung (jpg, png, etc.)
# Speichere als temporäre Datei
unique_id = uuid.uuid4()
temp_img_path = f"temp_img_{page_num}_{img_index}_{unique_id}.{image_ext}"
with open(temp_img_path, "wb") as img_file:
img_file.write(image_bytes)
logger.debug(f"Bild temporär gespeichert: {temp_img_path}")
# Analysiere mit Vision API
try:
analysis_result = await self.analyze_image(temp_img_path, prompt)
logger.debug(f"Bildanalyse für Bild {img_index} auf Seite {page_num} abgeschlossen")
except Exception as analyze_error:
logger.error(f"Fehler bei der Bildanalyse: {str(analyze_error)}")
analysis_result = f"[Fehler bei der Bildanalyse: {str(analyze_error)}]"
# Ergebnis speichern
try:
# Versuche zuerst, die Größe aus base_image zu bekommen
if 'width' in base_image and 'height' in base_image:
image_size = f"{base_image['width']}x{base_image['height']}"
else:
# Alternative: Öffne das temporäre Bild, um die Größe zu bestimmen
with Image.open(temp_img_path) as img:
width, height = img.size
image_size = f"{width}x{height}"
except Exception as e:
logger.warning(f"Konnte Bildgröße nicht ermitteln: {str(e)}")
image_size = "unbekannt"
image_responses.append({
"page": page_num,
"image_index": img_index,
"format": image_ext,
"image_size": image_size, # Der key wird immer gesetzt, entweder mit tatsächlicher Größe oder "unbekannt"
"response": analysis_result
})
# Temporäre Datei löschen
try:
if os.path.exists(temp_img_path):
os.remove(temp_img_path)
logger.debug(f"Temporäre Bilddatei entfernt: {temp_img_path}")
except Exception as cleanup_error:
logger.warning(f"Temporäre Datei konnte nicht entfernt werden: {cleanup_error}")
except Exception as e:
logger.warning(f"Fehler bei der Extraktion von Bild {img_index} auf Seite {page_num}: {str(e)}")
continue
logger.info(f"Extrahiert und analysiert: {len(image_responses)} Bilder aus PDF {os.path.basename(pdf_path)}")
except ImportError:
logger.error("PyMuPDF (fitz) ist nicht installiert. Installiere es mit 'pip install pymupdf'")
except Exception as e:
logger.error(f"Fehler beim Extrahieren von PDF-Bildern: {str(e)}")
return image_responses
async def parse_filedata(self, file_contexts: List[Dict[str, Any]], prompt_text: str, file_contents: Dict[str, str] = None) -> Dict[str, Any]:
"""
Bereitet eine vollständige Nachricht mit allen Dateiinhalten für das AI-Modell vor.
Args:
file_contexts: Liste der Dateikontexte mit Metadaten
prompt_text: Der Text-Prompt
file_contents: Dictionary mit bereits geladenen Dateiinhalten
Returns:
Eine vollständig formatierte Nachricht für das AI-Modell
"""
# Basisstruktur für die Nachricht in OpenAI-Format
message = {
"role": "user",
"content": []
}
# Text-Prompt hinzufügen
if prompt_text:
message["content"].append({
"type": "text",
"text": prompt_text
})
if not file_contents:
file_contents = {}
# Dateien als Anhänge hinzufügen
for file_info in file_contexts:
file_path = file_info.get("path", "")
file_name = file_info.get("name", "")
file_id = file_info.get("id", "")
file_type = file_info.get("type", "")
# Prüfen, ob Dateiinhalt bereits vorhanden ist
if file_id in file_contents:
content = file_contents[file_id]
# Problematische Unicode-Zeichen ersetzen
if isinstance(content, str):
content = content.encode('utf-8', errors='replace').decode('utf-8')
else:
content = str(content)
# Besondere Verarbeitung für PDF-Dateien mit Bildern
if file_name.endswith('.pdf') and file_path and os.path.exists(file_path):
try:
# Bildanalyse der PDF durchführen
image_prompt = prompt_text or "Beschreibe detailliert, was du in diesem Bild siehst."
image_responses = await self.extract_and_analyze_pdf_images(file_path, image_prompt)
# Nur wenn Bilder gefunden wurden, füge die Analyse hinzu
if image_responses:
image_details = "\n\n".join([
f"Bild auf Seite {resp['page']} (Größe: {resp['image_size']}): {resp['response']}"
for resp in image_responses
])
logger.debug("Image description: "+image_details)
message["content"].append({
"type": "text",
"text": f"PDF-Bildanalyse für {file_name}:\n{image_details}"
})
except Exception as e:
logger.error(f"Fehler bei der PDF-Bildanalyse für {file_name}: {str(e)}")
# Text zur Nachricht hinzufügen
message["content"].append({
"type": "text",
"text": f"--- DATEI: {file_name} ---\n\n{content}"
})
logger.info(f"Inhalt für Datei {file_name} zur Nachricht hinzugefügt")
continue
# Wenn kein Inhalt vorhanden ist, füge einen Hinweis hinzu
if not file_path or not os.path.exists(file_path):
message["content"].append({
"type": "text",
"text": f"[Datei {file_name} wurde nicht gefunden oder ist nicht zugänglich]"
})
logger.warning(f"Datei {file_name} nicht gefunden: {file_path}")
continue
# Direktes Hinzufügen von Bildern bei OpenAI (für Bilder außerhalb von PDFs)
if file_type == "image" or file_name.lower().endswith(('.jpg', '.jpeg', '.png', '.gif', '.webp')):
try:
# Bild als Base64 kodieren
with open(file_path, "rb") as f:
file_data = f.read()
base64_data = base64.b64encode(file_data).decode('utf-8')
# MIME-Typ bestimmen
mime_type, _ = mimetypes.guess_type(file_path)
if not mime_type:
mime_type = "application/octet-stream"
# Bild zur Nachricht hinzufügen
if mime_type.startswith("image/"):
# Füge zunächst die Bildanalyse als Text hinzu
image_prompt = prompt_text or "Beschreibe detailliert, was du in diesem Bild siehst."
analysis_result = await self.analyze_image(file_path, image_prompt)
message["content"].append({
"type": "text",
"text": f"Bildanalyse für {file_name}:\n{analysis_result}"
})
# Dann füge das Bild selbst hinzu
message["content"].append({
"type": "image_url",
"image_url": {
"url": f"data:{mime_type};base64,{base64_data}"
}
})
logger.info(f"Bild {file_name} analysiert und zur Nachricht hinzugefügt")
except Exception as e:
logger.error(f"Fehler beim Hinzufügen des Bildes {file_name}: {str(e)}")
message["content"].append({
"type": "text",
"text": f"[Fehler beim Laden des Bildes {file_name}: {str(e)}]"
})
# Optimiere das Message-Format für die API basierend auf dem Inhalt
if not message["content"]:
# Leerer Inhalt - setze auf leeren String
message["content"] = prompt_text or ""
elif len(message["content"]) == 1 and message["content"][0]["type"] == "text":
# Nur ein Text-Element - vereinfache die Struktur
message["content"] = message["content"][0]["text"]
# Bei komplizierten Inhalten (Mischung aus Text und Bildern) wird das Array-Format beibehalten
logger.debug(f"Message-Objekt für OpenAI erstellt mit {len(message['content']) if isinstance(message['content'], list) else 'String'}-Inhalt")
return message
def get_mime_type_from_extension(extension: str) -> str:
"""
Bestimmt den MIME-Typ basierend auf der Dateiendung.
Args:
extension: Die Dateiendung ohne Punkt
Returns:
Der entsprechende MIME-Typ
"""
extension_to_mime = {
"pdf": "application/pdf",
"docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"doc": "application/msword",
"xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"xls": "application/vnd.ms-excel",
"pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
"ppt": "application/vnd.ms-powerpoint",
"csv": "text/csv",
"txt": "text/plain",
"json": "application/json",
"xml": "application/xml",
"html": "text/html",
"htm": "text/html",
"jpg": "image/jpeg",
"jpeg": "image/jpeg",
"png": "image/png",
"gif": "image/gif",
"webp": "image/webp",
"svg": "image/svg+xml"
}
return extension_to_mime.get(extension, "application/octet-stream")

View file

@ -1,501 +0,0 @@
import logging
import re
import requests
from typing import List, Dict, Any, Optional, Tuple
from bs4 import BeautifulSoup
import json
import os
import configload as configload
import urllib.parse
import time
import random
import pandas as pd
# Logger konfigurieren
logger = logging.getLogger(__name__)
# Konfigurationsdaten laden
def load_config_data():
config = configload.load_config()
# Get search engines as comma-separated list
search_engines_str = config.get('Connector_AiWebscraping', 'SEARCH_ENGINES')
search_engines = [engine.strip() for engine in search_engines_str.split(',')]
# Get excluded domains as comma-separated list
excluded_domains_str = config.get('Connector_AiWebscraping', 'EXCLUDED_DOMAINS')
excluded_domains = [domain.strip() for domain in excluded_domains_str.split(',')]
return {
"timeout": int(config.get('Connector_AiWebscraping', 'TIMEOUT')),
"max_urls": int(config.get('Connector_AiWebscraping', 'MAX_URLS')),
"max_content_length": int(config.get('Connector_AiWebscraping', 'MAX_CONTENT_LENGTH')),
"user_agent": config.get('Connector_AiWebscraping', 'USER_AGENT'),
"search_engines": search_engines,
"min_delay": float(config.get('Connector_AiWebscraping', 'MIN_DELAY')),
"max_delay": float(config.get('Connector_AiWebscraping', 'MAX_DELAY')),
"excluded_domains": excluded_domains,
"max_search_results": int(config.get('Connector_AiWebscraping', 'MAX_SEARCH_RESULTS'))
}
class WebScrapingService:
"""
Connector für Web-Scraping-Funktionalitäten.
"""
def __init__(self):
# Konfiguration laden
self.config = load_config_data()
# Konfigurationswerte zu Instance-Attributen zuweisen
self.timeout = self.config["timeout"]
self.max_urls = self.config["max_urls"]
self.max_content_length = self.config["max_content_length"]
self.user_agent = self.config["user_agent"]
self.min_delay = self.config["min_delay"]
self.max_delay = self.config["max_delay"]
self.excluded_domains = self.config["excluded_domains"]
self.max_search_results = self.config["max_search_results"]
# Initialize search engines based on config
self.search_engines = {}
if "google" in self.config["search_engines"]:
self.search_engines["google"] = "https://www.google.com/search?q={query}"
if "bing" in self.config["search_engines"]:
self.search_engines["bing"] = "https://www.bing.com/search?q={query}"
# Headers for requests
self.headers = {
'User-Agent': self.user_agent,
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Referer': 'https://www.google.com/',
'DNT': '1',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
}
logger.info(f"WebScraping Connector initialisiert mit Timeout: {self.timeout}s")
def scrape_url(self, url: str) -> str:
"""
Scrapt den Inhalt einer URL und extrahiert den relevanten Text.
Args:
url: Die zu scrapende URL
Returns:
Der extrahierte Inhalt
Raises:
Exception: Bei Fehlern im Scraping-Prozess
"""
try:
logger.info(f"Requesting URL: {url}")
response = requests.get(url, headers=self.headers, timeout=self.timeout)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# Get page title
title = soup.title.string if soup.title else "No title"
# Remove unwanted elements
for element in soup.select('script, style, meta, noscript, iframe, nav, footer, header, aside'):
element.extract()
# Try to find main content
main_content = ""
# Common content containers
content_selectors = [
'main', '#main', '.main',
'article', '.article',
'#content', '.content',
'.post', '#post',
'.entry-content', '.post-content',
'.page-content', '.article-content'
]
# Try each selector
for selector in content_selectors:
elements = soup.select(selector)
if elements:
main_content = elements[0].get_text(separator='\n', strip=True)
logger.info(f"Found content using selector: {selector}")
break
# If no main content found, use body text
if not main_content:
main_content = soup.body.get_text(separator='\n', strip=True)
logger.info("Using body text as no main content container found")
# Clean up the text
lines = []
for line in main_content.split('\n'):
line = line.strip()
if line and len(line) > 15: # Skip very short lines
lines.append(line)
main_content = '\n'.join(lines)
# Truncate if too long
if len(main_content) > self.max_content_length:
main_content = main_content[:self.max_content_length] + "...\n[Inhalt gekürzt]"
# Add metadata
result = f"# {title}\nURL: {url}\n\n{main_content}"
return result.strip()
except Exception as e:
logger.error(f"Fehler beim Scrapen von {url}: {str(e)}")
return f"[Fehler beim Scrapen von {url}: {str(e)}]"
def extract_urls_from_search_results(self, html_content: str) -> List[str]:
"""
Extrahiert URLs aus den Suchergebnissen.
Args:
html_content: HTML der Suchergebnisseite
Returns:
Liste der gefundenen URLs
"""
soup = BeautifulSoup(html_content, 'html.parser')
urls = []
# Different search engines have different HTML structures
# Google links
for a_tag in soup.select('a[href^="/url?"]'):
href = a_tag.get('href', '')
if '/url?q=' in href:
url = href.split('/url?q=')[1].split('&')[0]
url = urllib.parse.unquote(url)
if url.startswith('http') and url not in urls:
urls.append(url)
# Bing links
for a_tag in soup.select('a[href^="http"]'):
url = a_tag.get('href', '')
if (url.startswith('http') and
not any(domain in url for domain in self.excluded_domains) and
url not in urls):
urls.append(url)
# If no URLs found, try a more generic approach
if not urls:
for a_tag in soup.find_all('a', href=True):
url = a_tag['href']
if (url.startswith('http') and
not any(domain in url for domain in self.excluded_domains) and
url not in urls):
urls.append(url)
return urls[:self.max_search_results] # Limit to max_search_results
def extract_urls(self, text: str) -> List[str]:
"""
Extrahiert URLs aus einem Text.
Args:
text: Der zu analysierende Text
Returns:
Liste der gefundenen URLs
"""
# URL pattern with improved regex
url_pattern = re.compile(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+(?:/[^)\s]*)?')
found_urls = url_pattern.findall(text)
# Basic URL cleanup and validation
valid_urls = []
for url in found_urls:
# Remove trailing punctuation
url = re.sub(r'[.,;:!?]$', '', url)
# Skip excluded domains
if not any(domain in url for domain in self.excluded_domains):
valid_urls.append(url)
return valid_urls[:self.max_urls] # Limit to max_urls
def extract_keywords(self, text: str) -> str:
"""
Extrahiert Schlüsselwörter aus einem Text.
Args:
text: Der zu analysierende Text
Returns:
Extrahierte Schlüsselwörter als String
"""
# Define German stopwords
stopwords = [
"der", "die", "das", "den", "dem", "des",
"ein", "eine", "einer", "eines", "einem", "einen",
"und", "oder", "aber", "wenn", "weil", "obwohl",
"für", "mit", "von", "zu", "aus", "bei", "nach",
"über", "unter", "vor", "hinter", "neben", "zwischen",
"nicht", "kein", "keine", "keiner", "keines", "keinem", "keinen",
"ist", "sind", "war", "waren", "wird", "werden", "wurde", "wurden",
"kann", "können", "darf", "dürfen", "soll", "sollen", "muss", "müssen",
"hat", "haben", "dass", "noch", "schon", "auch", "nur", "sehr", "mehr",
"durch", "gegen", "ohne", "um", "heute", "morgen", "gestern"
]
# Normalize text
text = text.lower()
# Remove special characters and replace them with spaces
text = re.sub(r'[^\w\s]', ' ', text)
# Split into words
words = text.split()
# Filter words
filtered_words = []
for word in words:
if (len(word) > 3 and # Skip very short words
word not in stopwords and
not word.isdigit()): # Skip numbers
filtered_words.append(word)
# Get common words by frequency
word_freq = {}
for word in filtered_words:
if word in word_freq:
word_freq[word] += 1
else:
word_freq[word] = 1
# Sort by frequency
sorted_words = sorted(word_freq.items(), key=lambda x: x[1], reverse=True)
# Take top 10 words
keywords = [word for word, freq in sorted_words[:10]]
return " ".join(keywords)
async def search_web(self, query: str) -> List[str]:
"""
Führt eine Websuche mit den gegebenen Suchbegriffen durch.
Args:
query: Suchbegriffe
Returns:
Liste der gefundenen URLs
"""
# Choose a random search engine
engine_name = random.choice(list(self.search_engines.keys()))
search_url = self.search_engines[engine_name].format(query=urllib.parse.quote(query))
logger.info(f"Searching with {engine_name}: {query}")
try:
# Add a slight delay to avoid being blocked
time.sleep(random.uniform(self.min_delay, self.max_delay))
response = requests.get(
search_url,
headers=self.headers,
timeout=self.timeout
)
if response.status_code == 200:
# Extract URLs from search results
urls = self.extract_urls_from_search_results(response.text)
logger.info(f"Found {len(urls)} URLs from search results")
return urls
else:
logger.warning(f"Search request failed with status code: {response.status_code}")
return []
except Exception as e:
logger.error(f"Error during web search: {e}")
return []
# Enhanced connector_aiweb_webscraping.py modifications
# Focus on the scrape_web_data method to ensure consistent behavior
async def scrape_web_data(self, prompt: str) -> str:
"""
Enhanced web scraping function that ensures consistent behavior.
Always performs scraping for prompts and returns structured results.
Args:
prompt: The user prompt
Returns:
Scraped web data as text
"""
try:
# Ensure prompt is a string
if isinstance(prompt, list):
prompt = " ".join(prompt) if all(isinstance(item, str) for item in prompt) else str(prompt)
elif not isinstance(prompt, str):
prompt = str(prompt)
# Log the scraping attempt
logger.info(f"Starting web scraping with prompt: {prompt[:400]}...")
# First check for explicit URLs in the prompt
explicit_urls = self.extract_urls(prompt)
# Always perform search, even if explicit URLs are found
# This ensures more comprehensive results
keywords = self.extract_keywords(prompt)
logger.info(f"Using keywords for search: {keywords}")
# Search for relevant URLs
search_urls = await self.search_web(keywords)
# Combine explicit URLs with search results, prioritizing explicit URLs
urls = []
# Add explicit URLs first
for url in explicit_urls:
if url not in urls:
urls.append(url)
# Then add search results, avoiding duplicates
for url in search_urls:
if url not in urls:
urls.append(url)
# If no URLs found after both methods, try a simplified search
if not urls:
simplified_query = " ".join(prompt.split()[:8]) # Use first 8 words
simplified_urls = await self.search_web(simplified_query)
for url in simplified_urls:
if url not in urls:
urls.append(url)
# Scrape content from URLs
results = []
scraped_count = 0
if urls:
logger.info(f"Found {len(urls)} URLs to scrape")
for url in urls[:self.max_urls]:
try:
# Add a delay between requests
time.sleep(random.uniform(self.min_delay, self.max_delay))
content = self.scrape_url(url)
if content and len(content) > 100: # Ensure meaningful content
results.append(content)
scraped_count += 1
logger.info(f"Successfully scraped: {url}")
else:
logger.warning(f"Insufficient content from: {url}")
except Exception as e:
logger.error(f"Error scraping {url}: {e}")
# Create the final result with improved structure
if results:
logger.info(f"Successfully scraped {scraped_count} pages")
# Format the results in a structured way for better agent understanding
structured_result = f"# Web Scraping Results\n\nScraped {scraped_count} web sources based on: \"{prompt}\"\n\n"
for i, result in enumerate(results):
structured_result += f"## Source {i+1}\n\n{result}\n\n---\n\n"
return structured_result.strip()
else:
# If no real content was scraped, provide simulated data with clear indication
logger.warning("No content scraped, using simulated data")
simulated_data = f"""
# Simulated Web Research Results for: {prompt}
## Notice
The web scraping system was unable to retrieve real data from the web.
The following information is provided as a placeholder to continue the workflow.
## Market Trends and Developments
- Latest analyses show significant growth in digital transformation
- Experts continue to forecast positive development for cloud-based solutions
- Current technologies improve efficiency by an average of 23%
## Leading Companies in the Sector
1. TechInnovators GmbH - Market share 28%
2. FutureWave AG - Market share 22%
3. ProgressTech Ltd. - Market share 17%
## Innovations and New Products
- Smart integration solutions for existing systems
- AI-powered automation processes
- Improved sustainability standards through new materials
*Note: This is simulated data provided because no actual web scraping was possible.*
""".strip()
return simulated_data
except Exception as e:
logger.error(f"Error during web scraping: {e}")
error_message = f"Web scraping could not be performed: {str(e)}"
return error_message.strip()
# Additional helper method to ensure the scraper agent always triggers web scraping
async def ensure_scraper_agent_scraping(agent_type: str, moderator_text: str, prompt: str, aiweb_scraper) -> Tuple[bool, str]:
"""
Helper function to ensure scraper agent always triggers web scraping.
To be called from the _run_moderator_cycle method when a scraper agent is selected.
Args:
agent_type: Type of the selected agent
moderator_text: Text from the moderator
prompt: The original prompt
aiweb_scraper: Web scraper service instance
Returns:
Tuple of (was_scraping_performed, scraped_data)
"""
if agent_type != "scraper":
return False, ""
try:
# Log that web scraping is being performed for scraper agent
logger.info(f"Ensuring web scraping for scraper agent with prompt: {prompt[:100]}...")
# Extract a search query from the moderator text if possible
search_query = prompt
if moderator_text:
# Try to extract a more specific query from moderator instructions
query_patterns = [
r"search for [\"'](.+?)[\"']",
r"find information about [\"'](.+?)[\"']",
r"research [\"'](.+?)[\"']",
r"look up [\"'](.+?)[\"']"
]
for pattern in query_patterns:
match = re.search(pattern, moderator_text, re.IGNORECASE)
if match:
extracted_query = match.group(1)
if len(extracted_query) > 10: # Ensure it's a meaningful query
search_query = extracted_query
logger.info(f"Extracted search query from moderator: {search_query}")
break
# Always perform the web scraping
scraped_data = await aiweb_scraper.scrape_web_data(search_query)
# Mark that scraping was performed
return True, scraped_data
except Exception as e:
logger.error(f"Error ensuring web scraping for scraper agent: {e}")
return True, f"Web scraping failed: {str(e)}"
async def close(self):
"""
Schließt alle offenen Ressourcen.
"""
# Currently no resources to close
pass

View file

@ -0,0 +1,239 @@
import logging
import httpx
from typing import Dict, Any, List, Optional, Union
from fastapi import HTTPException
import configload
# Logger konfigurieren
logger = logging.getLogger(__name__)
# Konfigurationsdaten laden
def load_config_data():
config = configload.load_config()
return {
"api_key": config.get('Connector_AiAnthropic', 'API_KEY'),
"api_url": config.get('Connector_AiAnthropic', 'API_URL'),
"model_name": config.get('Connector_AiAnthropic', 'MODEL_NAME'),
"temperature": float(config.get('Connector_AiAnthropic', 'TEMPERATURE')),
"max_tokens": int(config.get('Connector_AiAnthropic', 'MAX_TOKENS'))
}
class ChatService:
"""
Connector für die Kommunikation mit der Anthropic API.
"""
def __init__(self):
# Konfiguration laden
self.config = load_config_data()
self.api_key = self.config["api_key"]
self.api_url = self.config["api_url"]
self.model_name = self.config["model_name"]
# HttpClient für API-Aufrufe
self.http_client = httpx.AsyncClient(
timeout=120.0, # Längeres Timeout für komplexe Anfragen
headers={
"x-api-key": self.api_key,
"anthropic-version": "2023-06-01", # Anthropic API Version
"Content-Type": "application/json"
}
)
logger.info(f"Anthropic Connector initialisiert mit Modell: {self.model_name}")
async def call_api(self, messages: List[Dict[str, Any]], temperature: float = None, max_tokens: int = None) -> Dict[str, Any]:
"""
Ruft die Anthropic API mit den gegebenen Nachrichten auf.
Args:
messages: Liste von Nachrichten im OpenAI-Format (role, content)
temperature: Temperatur für die Antwortgenerierung (0.0-1.0)
max_tokens: Maximale Anzahl der Token in der Antwort
Returns:
Die Antwort umgewandelt ins OpenAI-Format
Raises:
HTTPException: Bei Fehlern in der API-Kommunikation
"""
try:
# OpenAI-Format in Anthropic-Format umwandeln
formatted_messages = self._convert_to_anthropic_format(messages)
# Verwende Parameter aus der Konfiguration, falls keine überschrieben wurden
if temperature is None:
temperature = self.config.get("temperature", 0.2)
if max_tokens is None:
max_tokens = self.config.get("max_tokens", 2000)
# Anthropic API Payload erstellen
payload = {
"model": self.model_name,
"messages": formatted_messages,
"temperature": temperature,
"max_tokens": max_tokens
}
response = await self.http_client.post(
self.api_url,
json=payload
)
if response.status_code != 200:
logger.error(f"Anthropic API-Fehler: {response.status_code} - {response.text}")
raise HTTPException(status_code=500, detail="Fehler bei der Kommunikation mit Anthropic API")
# Antwort im Anthropic-Format in OpenAI-Format umwandeln
anthropic_response = response.json()
openai_formatted_response = self._convert_to_openai_format(anthropic_response)
return openai_formatted_response
except Exception as e:
logger.error(f"Fehler beim Aufruf der Anthropic API: {str(e)}")
raise HTTPException(status_code=500, detail=f"Fehler beim Aufruf der Anthropic API: {str(e)}")
def _convert_to_anthropic_format(self, openai_messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
"""
Konvertiert Nachrichten vom OpenAI-Format ins Anthropic-Format.
OpenAI verwendet:
[{"role": "system", "content": "..."},
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}]
Anthropic verwendet:
[{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}]
Anmerkung: Anthropic hat kein direktes System-Message-Äquivalent,
daher fügen wir System-Nachrichten in die erste User-Nachricht ein.
"""
anthropic_messages = []
system_content = ""
# Extrahiere zuerst alle System-Nachrichten
for msg in openai_messages:
if msg.get("role") == "system":
system_content += msg.get("content", "") + "\n\n"
# Konvertiere die restlichen Nachrichten
for i, msg in enumerate(openai_messages):
role = msg.get("role")
content = msg.get("content", "")
# System-Nachrichten überspringen (bereits extrahiert)
if role == "system":
continue
# Für die erste User-Nachricht: System-Inhalte voranstellen, falls vorhanden
if role == "user" and system_content and not any(m.get("role") == "user" for m in anthropic_messages):
if isinstance(content, str):
content = system_content + content
elif isinstance(content, list):
# Wenn content ein Array ist (für Multimodal-Nachrichten)
text_parts = []
for part in content:
if part.get("type") == "text":
text_parts.append(part)
if text_parts:
text_parts[0]["text"] = system_content + text_parts[0].get("text", "")
# Anthropic unterstützt nur "user" und "assistant" als Rollen
if role not in ["user", "assistant"]:
role = "user"
anthropic_messages.append({"role": role, "content": content})
return anthropic_messages
def _convert_to_openai_format(self, anthropic_response: Dict[str, Any]) -> Dict[str, Any]:
"""
Konvertiert eine Antwort vom Anthropic-Format ins OpenAI-Format.
"""
# Extrahiere Inhalt aus Anthropic-Antwort
content = ""
if "content" in anthropic_response:
if isinstance(anthropic_response["content"], list):
# Inhalt ist eine Liste von Teilen (bei neueren API-Versionen)
for part in anthropic_response["content"]:
if part.get("type") == "text":
content += part.get("text", "")
else:
# Direkter Inhalt als String (bei älteren API-Versionen)
content = anthropic_response["content"]
# Erstelle OpenAI-formatierte Antwort
return {
"id": anthropic_response.get("id", ""),
"object": "chat.completion",
"created": anthropic_response.get("created", 0),
"model": anthropic_response.get("model", self.model_name),
"choices": [
{
"message": {
"role": "assistant",
"content": content
},
"index": 0,
"finish_reason": "stop"
}
]
}
async def analyze_image(self, image_data: Union[str, bytes], mime_type: str = None, prompt: str = "Describe this image") -> str:
"""
Analysiert ein Bild mit der OpenAI Vision API.
Args:
image_data: Entweder ein Dateipfad (str) oder Bilddaten (bytes)
mime_type: Der MIME-Typ des Bildes (optional, nur für Binärdaten)
prompt: Der Prompt für die Analyse
Returns:
Die Antwort der OpenAI Vision API als Text
"""
try:
# Unterscheide zwischen Dateipfad und Binärdaten
if isinstance(image_data, str):
# Es ist ein Dateipfad - importiere filehandling nur bei Bedarf
from modules import agentservice_filehandling as file_handler
base64_data, auto_mime_type = file_handler.encode_file_to_base64(image_data)
mime_type = mime_type or auto_mime_type
else:
# Es sind Binärdaten
import base64
base64_data = base64.b64encode(image_data).decode('utf-8')
# MIME-Typ muss angegeben sein für Binärdaten
if not mime_type:
# Fallback auf generischen Bildtyp
mime_type = "image/png"
# Bereite den Payload für die Vision API vor
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{
"type": "image_url",
"image_url": {
"url": f"data:{mime_type};base64,{base64_data}"
}
}
]
}
]
# Verwende die bestehende call_api Funktion mit dem Vision-Modell
response = await self.call_api(messages)
# Inhalt extrahieren und zurückgeben
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Fehler bei der Bildanalyse: {str(e)}", exc_info=True)
return f"[Fehler bei der Bildanalyse: {str(e)}]"

View file

@ -0,0 +1,148 @@
import logging
import httpx
from typing import Dict, Any, List, Optional, Union
from fastapi import HTTPException
import configload
# Logger konfigurieren
logger = logging.getLogger(__name__)
# Konfigurationsdaten laden
def load_config_data():
config = configload.load_config()
return {
"api_key": config.get('Connector_AiOpenai', 'API_KEY'),
"api_url": config.get('Connector_AiOpenai', 'API_URL'),
"model_name": config.get('Connector_AiOpenai', 'MODEL_NAME'),
"temperature": float(config.get('Connector_AiOpenai', 'TEMPERATURE')),
"max_tokens": int(config.get('Connector_AiOpenai', 'MAX_TOKENS'))
}
class ChatService:
"""
Connector für die Kommunikation mit der OpenAI API.
"""
def __init__(self):
# Konfiguration laden
self.config = load_config_data()
self.api_key = self.config["api_key"]
self.api_url = self.config["api_url"]
self.model_name = self.config["model_name"]
# HttpClient für API-Aufrufe
self.http_client = httpx.AsyncClient(
timeout=120.0, # Längeres Timeout für komplexe Anfragen
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
)
logger.info(f"OpenAI Connector initialisiert mit Modell: {self.model_name}")
async def call_api(self, messages: List[Dict[str, Any]], temperature: float = None, max_tokens: int = None) -> str:
"""
Ruft die OpenAI API mit den gegebenen Nachrichten auf.
Args:
messages: Liste von Nachrichten im OpenAI-Format (role, content)
temperature: Temperatur für die Antwortgenerierung (0.0-1.0)
max_tokens: Maximale Anzahl der Token in der Antwort
Returns:
Die Antwort der OpenAI API
Raises:
HTTPException: Bei Fehlern in der API-Kommunikation
"""
try:
# Verwende Parameter aus der Konfiguration, falls keine überschrieben wurden
if temperature is None:
temperature = self.config.get("temperature", 0.2)
if max_tokens is None:
max_tokens = self.config.get("max_tokens", 2000)
payload = {
"model": self.model_name,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens
}
response = await self.http_client.post(
self.api_url,
json=payload
)
if response.status_code != 200:
logger.error(f"OpenAI API-Fehler: {response.status_code} - {response.text}")
raise HTTPException(status_code=500, detail="Fehler bei der Kommunikation mit OpenAI API")
response_json = response.json()
content = response_json["choices"][0]["message"]["content"]
return content
except Exception as e:
logger.error(f"Fehler beim Aufruf der OpenAI API: {str(e)}")
raise HTTPException(status_code=500, detail=f"Fehler beim Aufruf der OpenAI API: {str(e)}")
async def close(self):
"""Schließt den HTTP-Client beim Beenden der Anwendung"""
await self.http_client.aclose()
async def analyze_image(self, image_data: Union[str, bytes], mime_type: str = None, prompt: str = "Describe this image") -> str:
"""
Analysiert ein Bild mit der OpenAI Vision API.
Args:
image_data: Entweder ein Dateipfad (str) oder Bilddaten (bytes)
mime_type: Der MIME-Typ des Bildes (optional, nur für Binärdaten)
prompt: Der Prompt für die Analyse
Returns:
Die Antwort der OpenAI Vision API als Text
"""
try:
logger.debug("Starting image analysis...")
# Unterscheide zwischen Dateipfad und Binärdaten
if isinstance(image_data, str):
# Es ist ein Dateipfad - importiere filehandling nur bei Bedarf
from modules import agentservice_filehandling as file_handler
base64_data, auto_mime_type = file_handler.encode_file_to_base64(image_data)
mime_type = mime_type or auto_mime_type
else:
# Es sind Binärdaten
import base64
base64_data = base64.b64encode(image_data).decode('utf-8')
# MIME-Typ muss angegeben sein für Binärdaten
if not mime_type:
# Fallback auf generischen Bildtyp
mime_type = "image/png"
# Bereite den Payload für die Vision API vor
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{
"type": "image_url",
"image_url": {
"url": f"data:{mime_type};base64,{base64_data}"
}
}
]
}
]
# Verwende die bestehende call_api Funktion mit dem Vision-Modell
response = await self.call_api(messages)
# Inhalt extrahieren und zurückgeben
return response["choices"][0]["message"]["content"]
except Exception as e:
logger.error(f"Fehler bei der Bildanalyse: {str(e)}", exc_info=True)
return f"[Fehler bei der Bildanalyse: {str(e)}]"

View file

@ -66,7 +66,7 @@ class DatabaseConnector:
self.user_id = self._user_id self.user_id = self._user_id
logger.info(f"DatabaseConnector initialisiert für Verzeichnis: {db_folder}") logger.info(f"DatabaseConnector initialisiert für Verzeichnis: {db_folder}")
logger.info(f"Kontext: mandate_id={self.mandate_id}, user_id={self.user_id}") logger.debug(f"Kontext: mandate_id={self.mandate_id}, user_id={self.user_id}")
def _initialize_system_table(self): def _initialize_system_table(self):
"""Initialisiert die System-Tabelle, falls sie noch nicht existiert.""" """Initialisiert die System-Tabelle, falls sie noch nicht existiert."""
@ -114,13 +114,13 @@ class DatabaseConnector:
# Wenn die Tabelle bereits im Cache ist, verwende den Cache # Wenn die Tabelle bereits im Cache ist, verwende den Cache
if table in self._tables_cache: if table in self._tables_cache:
logger.info(f"Lade Tabelle {table} aus Cache") # logger.info(f"Lade Tabelle {table} aus Cache")
return self._tables_cache[table] return self._tables_cache[table]
# Ansonsten lade die Datei # Ansonsten lade die Datei
try: try:
if os.path.exists(path): if os.path.exists(path):
logger.info(f"Lade Tabelle {table} aus JSON {path}") # logger.info(f"Lade Tabelle {table} aus JSON {path}")
with open(path, 'r', encoding='utf-8') as f: with open(path, 'r', encoding='utf-8') as f:
data = json.load(f) data = json.load(f)
self._tables_cache[table] = data self._tables_cache[table] = data

View file

@ -0,0 +1,189 @@
"""
Datenanalyst-Agent für die Analyse und Interpretation von Daten.
"""
import logging
from typing import List, Dict, Any, Optional
from modules.agentservice_base import BaseAgent
from connectors.connector_aichat_openai import ChatService
logger = logging.getLogger(__name__)
class AnalystAgent(BaseAgent):
"""Agent für die Analyse und Interpretation von Daten"""
_instance = None
@classmethod
def get_instance(cls):
"""Gibt eine Singleton-Instanz zurück"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
"""Initialisiert den Datenanalyst-Agenten"""
super().__init__()
self.id = "analyst_agent"
self.name = "Datenanalyst"
self.type = "analyzer"
self.description = "Analysiert und interpretiert Daten"
self.capabilities = "Datenanalyse, Mustererkennung, Statistik und Bewertung"
self.instructions = """
Du bist der Datenanalyseagent. Deine Aufgabe:
1. Vorliegende Daten untersuchen und interpretieren
2. Erkenntnisse aus Informationen gewinnen
3. Trends identifizieren und Zusammenhänge prüfen
4. Daten visualisieren und Konzepte erklären
5. Datenqualität bewerten und Handlungsempfehlungen geben
"""
def get_prompt(self, message_context: Dict[str, Any]) -> str:
"""
Generiert einen angepassten Prompt für den Datenanalysten.
Args:
message_context: Kontext der Nachricht
Returns:
Formatierter Prompt für den Datenanalysten
"""
# Basis-Prompt
prompt = f"""
Du bist {self.name}, ein {self.type} Agent.
{self.description}
Fähigkeiten: {self.capabilities}
{self.instructions}
Analysiere die vorliegenden Daten. Präsentiere klar strukturierte Ergebnisse
mit einer Zusammenfassung, Detailanalyse und Handlungsempfehlungen.
Formatiere mit [STATUS: ERGEBNIS/TEILWEISE/PLAN] am Ende.
"""
# Dateitypspezifische Anweisungen hinzufügen (verkürzt)
document_types = self._get_document_types(message_context)
if "csv" in document_types or "excel" in document_types:
prompt += "\nTABELLENDATEN: Identifiziere wichtige Spalten, Korrelationen und Trends."
if "pdf" in document_types or "doc" in document_types:
prompt += "\nTEXTDATEN: Extrahiere zentrale Fakten und Schlüsselthemen."
if "image" in document_types:
prompt += "\nBILDDATEN: Beschreibe und interpretiere dargestellte Informationen."
return prompt.strip()
def _get_document_types(self, message_context: Dict[str, Any]) -> List[str]:
"""
Extrahiert die Dateitypen aus dem Nachrichtenkontext.
Args:
message_context: Kontext der Nachricht
Returns:
Liste der Dateitypen
"""
document_types = []
# Versuche Dokumente aus dem Kontext zu extrahieren
documents = message_context.get("documents", [])
for doc in documents:
source = doc.get("source", {})
name = source.get("name", "").lower()
content_type = source.get("content_type", "").lower()
# Dateityp aus Namen oder Content-Type ableiten
if name.endswith(".csv") or "csv" in content_type:
document_types.append("csv")
elif name.endswith((".xls", ".xlsx")) or "excel" in content_type or "spreadsheet" in content_type:
document_types.append("excel")
elif name.endswith(".pdf") or "pdf" in content_type:
document_types.append("pdf")
elif name.endswith((".doc", ".docx")) or "word" in content_type:
document_types.append("doc")
elif name.endswith((".jpg", ".jpeg", ".png", ".gif")) or "image" in content_type:
document_types.append("image")
return document_types
async def process_message(self, message: Dict[str, Any], context: Dict[str, Any] = None) -> Dict[str, Any]:
"""
Verarbeitet eine Nachricht und führt eine Datenanalyse durch.
Args:
message: Die zu verarbeitende Nachricht
context: Zusätzlicher Kontext (optional)
Returns:
Die generierte Antwort mit der Datenanalyse
"""
try:
# Prompt generieren
message_context = {"documents": context.get("documents", [])} if context else {}
prompt = self.get_prompt(message_context)
# OpenAI ChatService initialisieren
chat_service = ChatService()
# Nachrichten für die API vorbereiten
messages = [
{"role": "system", "content": prompt},
{"role": "user", "content": message.get("content", "")}
]
# Kontext-Nachrichten hinzufügen, falls vorhanden
if context and "history" in context:
for history_item in context["history"]:
messages.append({
"role": history_item.get("role", "user"),
"content": history_item.get("content", "")
})
# API aufrufen
response_content = await chat_service.call_api(messages)
# Verbindung schließen
await chat_service.close()
# Antwort-Objekt erstellen
analysis_response = {
"role": "assistant",
"content": response_content,
"agent_type": self.type
}
# Extrahiere den Status aus der Antwort und aktualisiere den Inhalt
content, status = self.extract_status(analysis_response["content"])
analysis_response["content"] = content
# Setze den Status im Kontext, falls vorhanden
if context is not None:
context["status"] = status
return analysis_response
except Exception as e:
logger.error(f"Fehler bei der Verarbeitung der Anfrage: {str(e)}", exc_info=True)
# Fehlerantwort zurückgeben
return {
"role": "assistant",
"content": f"Bei der Datenanalyse ist ein Fehler aufgetreten: {str(e)}",
"agent_type": self.type
}
# Singleton-Instanz
_analyst_agent = None
def get_analyst_agent():
"""Gibt eine Singleton-Instanz des Datenanalyst-Agenten zurück"""
global _analyst_agent
if _analyst_agent is None:
_analyst_agent = AnalystAgent()
return _analyst_agent

View file

@ -0,0 +1,233 @@
"""
Coder-Agent für die Entwicklung und Implementierung von Code.
"""
import logging
from typing import List, Dict, Any, Optional
from modules.agentservice_base import BaseAgent
logger = logging.getLogger(__name__)
class CoderAgent(BaseAgent):
"""Agent für die Entwicklung und Implementierung von Code"""
_instance = None
@classmethod
def get_instance(cls):
"""Gibt eine Singleton-Instanz zurück"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
"""Initialisiert den Coder-Agenten"""
super().__init__()
self.id = "coder_agent"
self.name = "Entwickler"
self.type = "coder"
self.description = "Programmiert und führt Code aus"
self.capabilities = "Programmierung, Softwareentwicklung, technische Problemlösung und Implementierung von Algorithmen"
self.instructions = """
Du bist der Codeentwicklungsagent, ein Spezialist für die Erstellung von Softwarelösungen und technischen Implementierungen. Deine Aufgabe ist es:
1. Technische Anforderungen in funktionierenden, effizienten Code zu übersetzen
2. Geeignete Programmiersprachen, Frameworks und Bibliotheken für spezifische Aufgaben auszuwählen
3. Algorithmen und Datenstrukturen für die optimale Lösung von Problemen zu entwickeln
4. Lesbaren, gut dokumentierten und wartbaren Code zu schreiben
5. Sicherheitsaspekte und Best Practices in der Softwareentwicklung zu berücksichtigen
6. Potenzielle technische Schwierigkeiten vorherzusehen und Lösungen vorzuschlagen
7. APIs und Integrationen mit anderen Systemen zu konzipieren und implementieren
Bei der Präsentation deiner Softwarelösungen:
- Erkläre zunächst den Lösungsansatz und die gewählte Technologie
- Stelle den Code in logischen, gut kommentierten Abschnitten dar
- Erläutere kritische oder komplexe Teile des Codes im Detail
- Beschreibe Annahmen und getroffene Designentscheidungen
- Gib Hinweise zur Installation, Konfiguration und Verwendung
- Erwähne mögliche Erweiterungen und Verbesserungsmöglichkeiten
- Adressiere potenzielle Einschränkungen oder bekannte Probleme
Dein Code sollte nicht nur funktional, sondern auch effizient, sicher und gut strukturiert sein. Achte auf Lesbarkeit, Performance und Skalierbarkeit deiner Lösungen. Verwende moderne Entwicklungspraktiken und orientiere dich an etablierten Standards der jeweiligen Programmiersprache.
"""
def get_prompt(self, message_context: Dict[str, Any]) -> str:
"""
Generiert einen angepassten Prompt für den Coder-Agenten.
Args:
message_context: Kontext der Nachricht
Returns:
Formatierter Prompt für den Coder-Agenten
"""
# Basis-Prompt vom BaseAgent holen
base_prompt = super().get_prompt(message_context)
# Zusätzliche Anweisungen für Coding
coding_instructions = """
CODING-RICHTLINIEN:
1. Wähle die geeignete Programmiersprache basierend auf den Anforderungen
2. Verfolge einen modularen, gut strukturierten Ansatz
3. Füge ausreichend Kommentare und Dokumentation hinzu
4. Beachte Sicherheitsaspekte und Best Practices
5. Behandle mögliche Fehler und Ausnahmefälle
6. Stelle sicher, dass der Code vollständig und ausführbar ist
7. Teste deine Implementierung mit Beispieldaten
Für jede Code-Implementierung:
- Beginne mit einer kurzen Erklärung des Lösungsansatzes
- Strukturiere den Code in logische Funktionen/Klassen
- Erkläre komplexe Teile durch inline-Kommentare
- Gib am Ende Hinweise zur Verwendung oder Erweiterung
"""
# Prüfen, ob bestimmte Dateitypen vorhanden sind und spezifische Anweisungen hinzufügen
document_types = self._get_document_types(message_context)
file_specific_instructions = ""
if "csv" in document_types or "excel" in document_types:
file_specific_instructions += """
DATENVERARBEITUNG:
- Verwende geeignete Bibliotheken für Datenverarbeitung (pandas, numpy, etc.)
- Berücksichtige Speichereffizienz und Performance bei großen Datensätzen
- Implementiere robustes Fehler-Handling für verschiedene Datenformate
"""
if "py" in document_types or "js" in document_types or "java" in document_types:
file_specific_instructions += """
CODE-ANALYSE:
- Analysiere den vorhandenen Code auf Struktur und Funktionalität
- Identifiziere Verbesserungspotenziale und mögliche Fehler
- Schlage konkrete Refactoring-Maßnahmen vor
- Erweitere den Code gemäß den neuen Anforderungen
"""
# Task aus dem Kontext extrahieren
task = message_context.get("task", "")
task_instructions = f"\nAKTUELLE AUFGABE:\n{task}\n" if task else ""
# Vollständigen Prompt zusammenbauen
complete_prompt = f"{base_prompt}\n\n{coding_instructions}\n\n{file_specific_instructions}\n{task_instructions}"
return complete_prompt.strip()
def _get_document_types(self, message_context: Dict[str, Any]) -> List[str]:
"""
Extrahiert die Dateitypen aus dem Nachrichtenkontext.
Args:
message_context: Kontext der Nachricht
Returns:
Liste der Dateitypen
"""
document_types = []
# Versuche Dokumente aus dem Kontext zu extrahieren
documents = message_context.get("documents", [])
for doc in documents:
source = doc.get("source", {})
name = source.get("name", "").lower()
content_type = source.get("content_type", "").lower()
# Dateityp aus Namen oder Content-Type ableiten
if name.endswith(".py"):
document_types.append("py")
elif name.endswith((".js", ".ts")):
document_types.append("js")
elif name.endswith((".java", ".kt")):
document_types.append("java")
elif name.endswith(".csv") or "csv" in content_type:
document_types.append("csv")
elif name.endswith((".xls", ".xlsx")) or "excel" in content_type:
document_types.append("excel")
return document_types
async def process_message(self, message: Dict[str, Any], context: Dict[str, Any] = None) -> Dict[str, Any]:
"""
Verarbeitet eine Nachricht und generiert Code.
Args:
message: Die zu verarbeitende Nachricht
context: Zusätzlicher Kontext
Returns:
Die generierte Antwort mit Code
"""
# In einer realen Implementierung würde hier die Verbindung zum KI-Service hergestellt
# und die eigentliche Code-Generierung durchgeführt werden.
# Als Beispiel geben wir eine Standardantwort zurück
coding_response = {
"role": "assistant",
"content": f"""Ich habe als {self.name} die Anforderungen analysiert und folgenden Code entwickelt:
```python
def process_data(input_file, output_file):
\"\"\"
Verarbeitet Daten aus einer Eingabedatei und speichert die Ergebnisse.
Args:
input_file: Pfad zur Eingabedatei
output_file: Pfad zur Ausgabedatei
\"\"\"
import pandas as pd
# Daten einlesen
df = pd.read_csv(input_file)
# Daten verarbeiten
# Hier würde die eigentliche Datenverarbeitung stattfinden
processed_df = df.copy()
# Beispiel: Spalten filtern und transformieren
if 'data' in processed_df.columns:
processed_df['transformed'] = processed_df['data'] * 2
# Ergebnis speichern
processed_df.to_csv(output_file, index=False)
return len(processed_df)
# Beispielaufruf
if __name__ == "__main__":
result = process_data("input.csv", "output.csv")
print(f"Verarbeitet: result Datensätze")
```
Der Code liest eine CSV-Datei ein, führt eine einfache Transformation durch und speichert das Ergebnis.
Die Hauptfunktion `process_data` ist modular gestaltet und kann leicht erweitert werden.
Zur Verwendung:
1. Stelle sicher, dass pandas installiert ist (`pip install pandas`)
2. Passe die Dateipfade im Beispielaufruf an
3. Erweitere die Verarbeitung je nach deinen spezifischen Anforderungen
[STATUS: ERGEBNIS]""",
"agent_type": self.type
}
# Extrahiere den Status aus der Antwort und aktualisiere den Inhalt
content, status = self.extract_status(coding_response["content"])
coding_response["content"] = content
# Setze den Status im Kontext, falls vorhanden
if context is not None:
context["status"] = status
return coding_response
# Singleton-Instanz
_coder_agent = None
def get_coder_agent():
"""Gibt eine Singleton-Instanz des Coder-Agenten zurück"""
global _coder_agent
if _coder_agent is None:
_coder_agent = CoderAgent()
return _coder_agent

View file

@ -0,0 +1,420 @@
"""
Dokumentations-Agent für die Erstellung von Dokumentation, Berichten und strukturierten Inhalten.
Verwendet einen strukturierten mehrstufigen Prozess zur Erstellung hochwertiger Dokumentation.
"""
import logging
from typing import List, Dict, Any, Optional, Tuple
from modules.agentservice_base import BaseAgent
from connectors.connector_aichat_openai import ChatService
logger = logging.getLogger(__name__)
class DocumentationAgent(BaseAgent):
"""Agent für die Erstellung von Dokumentation und strukturierten Inhalten"""
_instance = None
@classmethod
def get_instance(cls):
"""Gibt eine Singleton-Instanz zurück"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
"""Initialisiert den Dokumentations-Agenten"""
super().__init__()
self.id = "documentation_agent"
self.name = "Dokumentation"
self.type = "documentation"
self.description = "Erstellt Dokumentation und strukturierte Inhalte"
self.capabilities = "Berichte, Dokumentation, Zusammenfassungen und Erklärungen"
self.instructions = """
Du bist der Dokumentations-Agent. Deine Aufgabe:
1. Komplexe Informationen in klare, strukturierte Dokumente umsetzen
2. Verschiedene Dokumentformate erstellen
3. Informationen aus verschiedenen Quellen strukturieren
4. Technische Konzepte verständlich erklären
5. Konsistente Formatierung sicherstellen
"""
# Chat-Service initialisieren
self.chat_service = None
def get_base_prompt(self, document_type: str = "") -> str:
"""
Generiert einen Basis-Prompt für den Dokumentations-Agenten.
Args:
document_type: Typ des zu erstellenden Dokuments
Returns:
Basis-Prompt für den Dokumentations-Agenten
"""
# Basis-Prompt
prompt = f"""
Du bist {self.name}, ein {self.type} Agent.
{self.description}
Fähigkeiten: {self.capabilities}
{self.instructions}
"""
# Dokumenttyp-spezifische Anweisungen hinzufügen
if document_type:
prompt += self._get_document_type_instructions(document_type)
return prompt.strip()
def _get_document_type_instructions(self, document_type: str) -> str:
"""
Gibt spezifische Anweisungen für einen bestimmten Dokumenttyp zurück.
Args:
document_type: Typ des Dokuments
Returns:
Spezifische Anweisungen für den Dokumenttyp
"""
document_type = document_type.lower()
if "handbuch" in document_type or "anleitung" in document_type or "guide" in document_type:
return "\n\nHANDBUCH: Beginne mit Zweckbeschreibung, strukturiere in logische Schritte, verwende direkte Anweisungen."
elif "bericht" in document_type or "report" in document_type:
return "\n\nBERICHT: Beginne mit Executive Summary, strukturiere in thematische Abschnitte, halte professionellen Ton."
elif "prozess" in document_type or "process" in document_type:
return "\n\nPROZESS: Beschreibe Zweck, Ziele, Beteiligte, sequenzielle Schritte, Inputs/Outputs und Verantwortlichkeiten."
elif "präsentation" in document_type or "presentation" in document_type:
return "\n\nPRÄSENTATION: Klare Hauptpunkte, visuelle Elemente, Einleitung-Hauptteil-Schluss Struktur."
else:
return "\n\nDOKUMENT: Erstelle ein gut strukturiertes Dokument mit klarer Gliederung und präziser Sprache."
def _detect_document_type(self, message: str) -> str:
"""
Erkennt den Dokumenttyp aus der Nachricht.
Args:
message: Nachricht des Benutzers
Returns:
Erkannter Dokumenttyp
"""
message = message.lower()
if "handbuch" in message or "anleitung" in message or "guide" in message:
return "handbuch"
elif "bericht" in message or "report" in message:
return "bericht"
elif "prozess" in message or "process" in message or "ablauf" in message:
return "prozess"
elif "präsentation" in message or "presentation" in message or "folien" in message:
return "präsentation"
else:
return "dokument"
async def generate_title(self, task: str, document_type: str) -> str:
"""
Generiert einen Titel für das Dokument.
Args:
task: Die Aufgabe/Anfrage
document_type: Typ des Dokuments
Returns:
Generierter Titel
"""
prompt = f"""
Erstelle einen prägnanten, professionellen Titel für folgendes {document_type.capitalize()}:
AUFTRAG: {task}
Gib NUR den Titel zurück, ohne weitere Erklärungen oder Formatierungen.
"""
messages = [
{"role": "system", "content": "Du bist ein Experte für die Erstellung von Dokumenttiteln."},
{"role": "user", "content": prompt}
]
title = await self.chat_service.call_api(messages)
# Bereinige den Titel von Anführungszeichen und Überschriften-Symbolen
title = title.strip('"\'#*- \n\t')
return title
async def generate_summary(self, task: str, document_type: str, title: str) -> str:
"""
Generiert eine Zusammenfassung für das Dokument.
Args:
task: Die Aufgabe/Anfrage
document_type: Typ des Dokuments
title: Titel des Dokuments
Returns:
Generierte Zusammenfassung
"""
prompt = f"""
Erstelle eine prägnante Zusammenfassung für folgendes Dokument:
TITEL: {title}
TYP: {document_type.capitalize()}
AUFTRAG: {task}
Die Zusammenfassung soll einen Überblick über den Zweck und die Hauptinhalte des Dokuments geben.
Sie sollte etwa 3-5 Sätze umfassen und als eigenständiger Abschnitt funktionieren.
"""
messages = [
{"role": "system", "content": "Du bist ein Experte für die Erstellung prägnanter Dokumentzusammenfassungen."},
{"role": "user", "content": prompt}
]
summary = await self.chat_service.call_api(messages)
return summary.strip()
async def generate_toc_with_prompts(self, task: str, document_type: str, title: str, summary: str) -> Dict[str, str]:
"""
Generiert ein Inhaltsverzeichnis mit Prompts für die einzelnen Kapitel.
Args:
task: Die Aufgabe/Anfrage
document_type: Typ des Dokuments
title: Titel des Dokuments
summary: Zusammenfassung des Dokuments
Returns:
Dict mit Kapiteltiteln als Schlüssel und Prompts als Werte
"""
prompt = f"""
Erstelle ein strukturiertes Inhaltsverzeichnis für folgendes Dokument:
TITEL: {title}
TYP: {document_type.capitalize()}
AUFTRAG: {task}
ZUSAMMENFASSUNG: {summary}
Für jedes Kapitel gib auch einen kurzen Prompt an, der beschreibt, was in diesem Kapitel behandelt werden soll.
Formatiere deine Antwort als JSON-Objekt mit folgendem Format:
{{
"Kapitel 1: Titel": "Prompt für Kapitel 1",
"Kapitel 2: Titel": "Prompt für Kapitel 2",
...
}}
Beschränke dich auf 5-7 sinnvolle Kapitel, die das Thema umfassend behandeln.
"""
messages = [
{"role": "system", "content": "Du bist ein Experte für die Strukturierung von Dokumenten und die Erstellung von Inhaltsverzeichnissen."},
{"role": "user", "content": prompt}
]
toc_response = await self.chat_service.call_api(messages)
# JSON aus der Antwort extrahieren
import json
import re
# Markdown-Code-Blöcke entfernen, falls vorhanden
toc_response = re.sub(r'```json\s*|\s*```', '', toc_response)
try:
toc_with_prompts = json.loads(toc_response)
return toc_with_prompts
except json.JSONDecodeError as e:
logger.error(f"Fehler beim Parsen des Inhaltsverzeichnisses: {str(e)}")
logger.error(f"Rohe Antwort: {toc_response}")
# Notfall-Fallback
return {
"1. Einleitung": "Einführung in das Thema und Überblick",
"2. Hauptteil": "Hauptinhalte des Dokuments",
"3. Schlussfolgerung": "Zusammenfassung und nächste Schritte"
}
async def generate_chapter_content(self, chapter_title: str, chapter_prompt: str,
task: str, document_type: str, title: str, summary: str) -> str:
"""
Generiert den Inhalt für ein bestimmtes Kapitel.
Args:
chapter_title: Titel des Kapitels
chapter_prompt: Prompt für das Kapitel
task: Die Aufgabe/Anfrage
document_type: Typ des Dokuments
title: Titel des Dokuments
summary: Zusammenfassung des Dokuments
Returns:
Generierter Kapitelinhalt
"""
prompt = f"""
Erstelle detaillierten Inhalt für folgendes Kapitel eines {document_type}s:
DOKUMENT-TITEL: {title}
AUFGABE: {task}
KAPITEL: {chapter_title}
ANWEISUNG FÜR DIESES KAPITEL: {chapter_prompt}
Der Inhalt sollte detailliert, informativ und gut strukturiert sein.
Verwende bei Bedarf Unterüberschriften, Aufzählungen und Tabellen zur besseren Strukturierung.
Der Inhalt sollte direkt mit dem Kapiteltext beginnen, ohne den Kapiteltitel zu wiederholen.
"""
messages = [
{"role": "system", "content": "Du bist ein Experte für die Erstellung hochwertiger Dokumentationsinhalte."},
{"role": "user", "content": prompt}
]
chapter_content = await self.chat_service.call_api(messages)
return chapter_content.strip()
def _format_final_document(self, title: str, summary: str, toc: Dict[str, str], chapter_contents: Dict[str, str]) -> str:
"""
Formatiert das endgültige Dokument aus allen Teilen.
Args:
title: Titel des Dokuments
summary: Zusammenfassung
toc: Inhaltsverzeichnis (Dict mit Kapiteltiteln als Schlüssel)
chapter_contents: Kapitelinhalte (Dict mit Kapiteltiteln als Schlüssel und Inhalten als Werte)
Returns:
Formatiertes Dokument
"""
# Titel formatieren
doc = f"# {title}\n\n"
# Zusammenfassung hinzufügen
doc += f"## Zusammenfassung\n\n{summary}\n\n"
# Inhaltsverzeichnis hinzufügen
doc += "## Inhaltsverzeichnis\n\n"
for idx, chapter in enumerate(toc.keys(), 1):
# Extrahiere den reinen Kapitelnamen (entferne Nummerierung, falls vorhanden)
clean_chapter = chapter
if chapter.strip().startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) and '. ' in chapter:
clean_chapter = chapter.split('. ', 1)[1]
doc += f"{idx}. {clean_chapter}\n"
doc += "\n"
# Kapitelinhalte hinzufügen
for idx, (chapter, content) in enumerate(chapter_contents.items(), 1):
# Extrahiere den reinen Kapitelnamen (entferne Nummerierung, falls vorhanden)
clean_chapter = chapter
if chapter.strip().startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) and '. ' in chapter:
clean_chapter = chapter.split('. ', 1)[1]
doc += f"## {idx}. {clean_chapter}\n\n{content}\n\n"
# Metadaten hinzufügen
doc += "---\n\n"
doc += f"**Erstellt durch:** {self.name}\n"
return doc
async def process_message(self, message: Dict[str, Any], context: Dict[str, Any] = None) -> Dict[str, Any]:
"""
Verarbeitet eine Nachricht und erstellt Dokumentation in einem strukturierten Prozess.
Args:
message: Die zu verarbeitende Nachricht
context: Zusätzlicher Kontext
Returns:
Die generierte Dokumentation
"""
try:
# Chat-Service initialisieren, falls noch nicht geschehen
if self.chat_service is None:
self.chat_service = ChatService()
# Task aus der Nachricht extrahieren
task = message.get("content", "")
if context and "task" in context:
task = context["task"]
# Dokumenttyp erkennen
document_type = self._detect_document_type(task)
logger.info(f"Starte Dokumentationserstellung für Typ: {document_type}")
# Schritt 1: Titel generieren
title = await self.generate_title(task, document_type)
logger.info(f"Titel generiert: {title}")
# Schritt 2: Zusammenfassung generieren
summary = await self.generate_summary(task, document_type, title)
logger.info("Zusammenfassung generiert")
# Schritt 3: Inhaltsverzeichnis mit Prompts generieren
toc_with_prompts = await self.generate_toc_with_prompts(task, document_type, title, summary)
logger.info(f"Inhaltsverzeichnis mit {len(toc_with_prompts)} Kapiteln generiert")
# Schritt 4: Kapitelinhalte in einer Schleife generieren
chapter_contents = {}
for chapter_title, chapter_prompt in toc_with_prompts.items():
logger.info(f"Generiere Inhalt für Kapitel: {chapter_title}")
content = await self.generate_chapter_content(
chapter_title, chapter_prompt, task, document_type, title, summary
)
chapter_contents[chapter_title] = content
# Schritt 5: Dokument zusammenführen
final_document = self._format_final_document(title, summary, toc_with_prompts, chapter_contents)
logger.info(f"Dokument fertiggestellt mit {len(final_document)} Zeichen")
# Schritt 6: Antwort zurückgeben
documentation_response = {
"role": "assistant",
"content": f"{final_document}\n\n[STATUS: ERGEBNIS]",
"agent_type": self.type
}
# Extrahiere den Status aus der Antwort und aktualisiere den Inhalt
content, status = self.extract_status(documentation_response["content"])
documentation_response["content"] = content
# Setze den Status im Kontext, falls vorhanden
if context is not None:
context["status"] = status
# Chat-Service schließen
await self.chat_service.close()
self.chat_service = None
return documentation_response
except Exception as e:
logger.error(f"Fehler bei der Dokumentationserstellung: {str(e)}", exc_info=True)
# Chat-Service schließen bei Fehler
if self.chat_service:
try:
await self.chat_service.close()
except:
pass
self.chat_service = None
# Fehlerantwort zurückgeben
return {
"role": "assistant",
"content": f"Bei der Erstellung der Dokumentation ist ein Fehler aufgetreten: {str(e)}",
"agent_type": self.type
}
# Singleton-Instanz
_documentation_agent = None
def get_documentation_agent():
"""Gibt eine Singleton-Instanz des Dokumentations-Agenten zurück"""
global _documentation_agent
if _documentation_agent is None:
_documentation_agent = DocumentationAgent()
return _documentation_agent

View file

@ -0,0 +1,173 @@
"""
SharePoint-Agent für die Interaktion mit SharePoint-Ressourcen und Dokumenten.
"""
import logging
from typing import List, Dict, Any, Optional
from modules.agentservice_base import BaseAgent
logger = logging.getLogger(__name__)
class SharepointAgent(BaseAgent):
"""Agent für den Zugriff auf und die Arbeit mit SharePoint-Ressourcen"""
_instance = None
@classmethod
def get_instance(cls):
"""Gibt eine Singleton-Instanz zurück"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
"""Initialisiert den SharePoint-Agenten"""
super().__init__()
self.id = "sharepoint_agent"
self.name = "SharePoint-Agent"
self.type = "sharepoint"
self.description = "Zugriff auf und Arbeit mit SharePoint-Ressourcen"
self.capabilities = "Suche und Abruf von Dokumenten aus SharePoint, Dokumentenverwaltung, Metadaten-Extraktion und Integration von SharePoint-Inhalten"
self.instructions = """
Du bist der SharePoint-Agent, ein Spezialist für die Interaktion mit Microsoft SharePoint. Deine Aufgabe ist es:
1. SharePoint-Dokumente und -Ressourcen zu durchsuchen und abzurufen
2. Metadaten aus SharePoint-Dokumenten zu extrahieren und zu analysieren
3. Strukturierte Informationen aus SharePoint-Bibliotheken zu sammeln
4. Dokumente basierend auf Metadaten zu filtern und zu organisieren
5. Inhalte aus verschiedenen SharePoint-Quellen zu integrieren und zusammenzuführen
6. Informationen aus SharePoint-Listen und -Dokumentbibliotheken zu extrahieren
7. Zusammenfassungen und Analysen von SharePoint-Inhalten zu erstellen
Bei der Darstellung deiner Ergebnisse:
- Strukturiere die Informationen klar und übersichtlich
- Gib den Ursprung und die Metadaten der Dokumente an
- Zeige Beziehungen zwischen verschiedenen Dokumenten und Ressourcen auf
- Hebe wichtige Erkenntnisse und Muster hervor
- Biete Kontext und Relevanz für die gefundenen Informationen
"""
def get_prompt(self, message_context: Dict[str, Any]) -> str:
"""
Generiert einen angepassten Prompt für den SharePoint-Agenten.
Args:
message_context: Kontext der Nachricht
Returns:
Formatierter Prompt für den SharePoint-Agenten
"""
# Basis-Prompt vom BaseAgent holen
base_prompt = super().get_prompt(message_context)
# Zusätzliche Anweisungen für SharePoint-Interaktion
sharepoint_instructions = """
SHAREPOINT-INTERAKTIONS-RICHTLINIEN:
1. Präzisiere die Suchkriterien für SharePoint-Ressourcen
2. Identifiziere relevante Bibliotheken, Listen und Standorte
3. Definiere benötigte Metadaten und Inhalte
4. Berücksichtige Berechtigungsanforderungen
5. Priorisiere aktuelle und relevante Dokumente
6. Stelle eine strukturierte Darstellung der Ergebnisse sicher
Für eine gute SharePoint-Integration:
- Gib detaillierte Pfade und Standorte an
- Berücksichtige verschiedene Dokumenttypen und Formate
- Zeige Metadaten und Dokumenteigenschaften
- Biete Kontext zu den gefundenen Ressourcen
- Berücksichtige Versionsinformationen
"""
# Task aus dem Kontext extrahieren
task = message_context.get("task", "")
task_instructions = f"\nSHAREPOINT-AUFTRAG:\n{task}\n" if task else ""
# Vollständigen Prompt zusammenbauen
complete_prompt = f"{base_prompt}\n\n{sharepoint_instructions}\n{task_instructions}"
return complete_prompt.strip()
async def process_message(self, message: Dict[str, Any], context: Dict[str, Any] = None) -> Dict[str, Any]:
"""
Verarbeitet eine Nachricht und interagiert mit SharePoint.
Args:
message: Die zu verarbeitende Nachricht
context: Zusätzlicher Kontext
Returns:
Die generierte Antwort mit SharePoint-Inhalten
"""
# Hier würde die tatsächliche Interaktion mit SharePoint stattfinden
# In der finalen Implementierung würde ein SharePoint-Connector verwendet werden
# Als Beispiel geben wir eine Standardantwort zurück
sharepoint_response = {
"role": "assistant",
"content": f"""Ich habe als {self.name} die SharePoint-Ressourcen durchsucht und folgende Ergebnisse gefunden:
## SharePoint-Suchergebnisse
Basierend auf deiner Anfrage habe ich folgende relevante Dokumente identifiziert:
### Dokumente
1. **Projektplan_2025.docx** (Letzte Änderung: 15.03.2025)
- Standort: Projekte/Strategische Planung
- Autor: Maria Schmidt
- Schlüsselinhalt: Zeitplan für Q2-Q4 2025, Ressourcenplanung, Meilensteine
2. **Marktanalyse_Q1_2025.pptx** (Letzte Änderung: 22.02.2025)
- Standort: Marketing/Marktforschung
- Autor: Thomas Müller
- Schlüsselinhalt: Aktuelle Markttrends, Wettbewerbsanalyse, Chancen und Risiken
3. **Budgetplanung_2025.xlsx** (Letzte Änderung: 01.03.2025)
- Standort: Finanzen/Planung
- Autor: Sarah Weber
- Schlüsselinhalt: Detaillierte Budgetaufschlüsselung nach Abteilungen und Quartalen
### SharePoint-Listen
1. **Projektstatusliste**
- 12 Einträge mit relevanten Projektstatusinformationen
- Letzte Aktualisierung: 25.03.2025
## Zusammenfassung der Inhalte
Die gefundenen Dokumente zeigen übereinstimmend, dass:
- Der Fokus im Jahr 2025 auf der Expansion in neue Märkte liegt
- Das Budget für Forschung und Entwicklung um 15% erhöht wurde
- Drei neue Hauptprojekte im zweiten Quartal starten werden
## Empfehlungen
Basierend auf den gefundenen Informationen empfehle ich:
1. Die Projektpläne für Q2 mit besonderem Fokus auf die neuen Hauptprojekte zu prüfen
2. Die Ressourcenzuweisung entsprechend der Budgeterhöhung anzupassen
3. Die Marktanalyse als Grundlage für die Expansionsstrategie zu verwenden
Die Dokumente sind alle aktuell und wurden von den verantwortlichen Fachabteilungen erstellt.
[STATUS: ERGEBNIS]""",
"agent_type": self.type
}
# Extrahiere den Status aus der Antwort und aktualisiere den Inhalt
content, status = self.extract_status(sharepoint_response["content"])
sharepoint_response["content"] = content
# Setze den Status im Kontext, falls vorhanden
if context is not None:
context["status"] = status
return sharepoint_response
# Singleton-Instanz
_sharepoint_agent = None
def get_sharepoint_agent():
"""Gibt eine Singleton-Instanz des SharePoint-Agenten zurück"""
global _sharepoint_agent
if _sharepoint_agent is None:
_sharepoint_agent = SharepointAgent()
return _sharepoint_agent

View file

@ -0,0 +1,133 @@
"""
User-Agent für die Interaktion mit dem Benutzer im Agentservice.
Repräsentiert den menschlichen Benutzer im Workflow und ermöglicht die Kommunikation.
Angepasste Version für das neue User-Input-Handling.
"""
import logging
from typing import List, Dict, Any, Optional
from modules.agentservice_base import BaseAgent
logger = logging.getLogger(__name__)
class UserAgent(BaseAgent):
"""Agent für die Interaktion mit dem Benutzer"""
_instance = None
@classmethod
def get_instance(cls):
"""Gibt eine Singleton-Instanz zurück"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
"""Initialisiert den User-Agenten"""
super().__init__()
self.id = "user_agent"
self.name = "User Agent"
self.type = "user"
self.description = "Repräsentiert den Benutzer im Workflow"
self.capabilities = "Beantwortung von Fragen, Bereitstellung zusätzlicher Informationen, Entscheidungsfindung"
def get_agent_info(self) -> Dict[str, Any]:
"""
Gibt Informationen über den User-Agenten zurück.
Returns:
Dict mit Agenten-Informationen
"""
return {
"id": self.id,
"name": self.name,
"type": self.type,
"description": self.description,
"capabilities": self.capabilities,
"used": False,
"last_result_status": None
}
async def process_message(self, message: Dict[str, Any], context: Dict[str, Any] = None) -> Dict[str, Any]:
"""
Verarbeitet eine Nachricht und bereitet die Frontend-Interaktion vor.
Args:
message: Die zu verarbeitende Nachricht
context: Zusätzlicher Kontext
Returns:
Die Nachricht an den Benutzer
"""
# Task aus dem Kontext extrahieren (falls vorhanden)
task = context.get("task", "") if context else ""
# Aus der Nachricht übernehmen, falls kein Kontext
if not task and message and "content" in message:
task = message["content"]
# Explizites Moderator-Prefix für die Nachricht
moderator_prefix = "[Moderator zu User Agent] "
formatted_task = moderator_prefix + task.strip()
# Erweiterte Nachricht mit expliziten Flags für das Frontend
user_request = {
"role": "assistant",
"content": formatted_task,
"agent_type": "moderator", # Explizit als Moderator markieren
"agent_id": "moderator",
"agent_name": "Moderator",
}
# Log-Eintrag
logger.info(f"User-Agent wird aufgerufen, Workflow wartet auf Benutzereingabe: {task[:50]}...")
return user_request
def extract_status(self, content: str) -> tuple:
"""
Bei User-Agent wird kein Status extrahiert, da der Benutzer keinen Status angibt.
Args:
content: Inhalt der Nachricht
Returns:
Tuple mit (Originalinhalt, "USER_INPUT")
"""
# User-Agent setzt immer Status "USER_INPUT"
return content, "USER_INPUT"
def format_user_response(self, message: Dict[str, Any]) -> Dict[str, Any]:
"""
Formatiert eine Benutzerantwort für die Workflow-Verarbeitung.
Args:
message: Die vom Benutzer gesendete Nachricht
Returns:
Die formatierte Nachricht
"""
# Basisformat für die Antwort
formatted_response = {
"role": "user",
"content": message.get("content", ""),
"agent_type": "user",
"agent_id": self.id,
"agent_name": self.name
}
# Dateien übernehmen, falls vorhanden
if "documents" in message:
formatted_response["documents"] = message["documents"]
return formatted_response
# Singleton-Instanz
_user_agent = None
def get_user_agent():
"""Gibt eine Singleton-Instanz des User-Agenten zurück"""
global _user_agent
if _user_agent is None:
_user_agent = UserAgent()
return _user_agent

View file

@ -0,0 +1,511 @@
"""
WebCrawler-Agent für die Recherche und Beschaffung von Informationen aus dem Web.
"""
import json
import logging
import random
import time
from typing import List, Dict, Any, Optional
import urllib
from urllib.parse import quote_plus, unquote
from bs4 import BeautifulSoup
import requests
from modules.agentservice_base import BaseAgent
from connectors.connector_aichat_openai import ChatService
logger = logging.getLogger(__name__)
class WebcrawlerAgent(BaseAgent):
"""Agent für Web-Recherche und Informationsbeschaffung"""
_instance = None
chat_service = ChatService()
#INIT --> should go to config
max_url=3
max_key=3
max_result=3
timeout = 10
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Referer': 'https://www.google.com/',
'DNT': '1',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
}
max_urls = 10
max_content_length=100000
@classmethod
def get_instance(cls):
"""Gibt eine Singleton-Instanz zurück"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
"""Initialisiert den WebCrawler-Agenten"""
super().__init__()
self.id = "webcrawler_agent"
self.name = "Webscraper"
self.type = "scraper"
self.description = "Recherchiert Informationen im Web"
self.capabilities = "Informationsrecherche, Datenbeschaffung aus dem Web, Quellenbewertung und Zusammenführung von Online-Informationen"
self.instructions = ""
async def process_message(self, message: Dict[str, Any], context: Dict[str, Any] = None) -> Dict[str, Any]:
try:
# Führe die Web-Recherche durch und warte auf das Ergebnis mit await
web_query_result = await self.get_web_query(message)
# Antwort-Objekt erstellen
response = {
"role": "assistant",
"content": f"{web_query_result} [STATUS: ERGEBNIS]",
"agent_type": self.type
}
# Extrahiere den Status aus der Antwort und aktualisiere den Inhalt
content, status = self.extract_status(response["content"])
response["content"] = content
# Setze den Status im Kontext, falls vorhanden
if context is not None:
context["status"] = status
return response
except Exception as e:
logger.error(f"Fehler bei der Web-Recherche: {str(e)}", exc_info=True)
# Fehlerantwort zurückgeben
return {
"role": "assistant",
"content": f"Bei der Web-Recherche ist ein Fehler aufgetreten: {str(e)}",
"agent_type": self.type
}
async def get_web_query(self, message_context: Dict[str, Any]) -> str:
prompt = await self.get_prompt(message_context)
result_json = await self.run_web_query(prompt)
result_data = ""
summary_src = ""
logger.info(f"Web analysis prompt '{prompt}' delivers {len(result_json)} results.")
if isinstance(result_json, list):
for i, result in enumerate(result_json, 1):
web_answer_instructions = f"""
Fass das Resultat gemäss dem Auftrag zusammen in maximal rund 2000 Zeichen. Auftrag = '{prompt.replace("'","")}'
Fasse die wichtigsten Erkenntnisse zusammen und setze sie in Bezug zur ursprünglichen Anfrage. Die Einleitung kannst Du weglassen.
Achte darauf, nur relevante und qualitativ hochwertige Informationen zu extrahieren, welche einen Bezug zum Auftrag haben, und übersichtlich zu präsentieren. Vermittle ein ausgewogenes Bild der recherchierten Informationen.
Dies ist das Resultat:
{result['data']}
"""
# Zusätzliche Anweisungen für Web-Recherche
content_text = await self.chat_service.call_api(
messages=[
{
"role": "system",
"content": "Du bist ein Informationsanalyst, der Webinhalte präzise und relevant zusammenfasst."
},
{
"role": "user",
"content": web_answer_instructions
}
]
)
result_data += f"\n\n[{i}] {result['title']}\nURL: {result['url']}\nSnippet: {result['snippet']}\nContent: {content_text}"
summary_src+=f"\n{content_text}"
else:
result_data = "no data received"
logger.info(f"Web analysis result sent {len(result_data)}B")
# Zusätzliche Zusammenfassung
summary=""
if len(summary_src)>1:
summary = await self.chat_service.call_api(
messages=[
{
"role": "system",
"content": "Du erstellst prägnante Zusammenfassungen von Rechercheergbnissen."
},
{
"role": "user",
"content": f"Bitte fasse diese Erkenntnisse in maximal 5-6 Sätzen zusammen: {summary_src}\n"
}
]
)
result = f"{summary}\n\n{result_data}"
return result
async def get_prompt(self, message_context: Dict[str, Any]) -> str:
task = message_context.get("content", "")
return task.strip()
async def run_web_query(self, prompt: str) -> List[Dict]:
if prompt=="":
return []
ptext=f"""Create a comprehensive web research strategy for the task = '{prompt.replace("'","")}'. Return the results as a Python dictionary with these specific keys. If specific url are provided and the task requires analysis only on the provided url, then leave 'skey' open.
'url': A list of maximum {self.max_url} specific URLs extracted from the task string.
'skey': A list of maximum {self.max_key} key sentences to search for on the web. These should be precise, diverse, and targeted to get the most relevant information.
Format your response as a valid json object with these two keys. Do not include any explanatory text or markdown outside of the object definition.
"""
content_text = await self.chat_service.call_api(
messages=[
{
"role": "system",
"content": "Du bist ein Webrecherche-Experte, der präzise Suchstrategien entwickelt."
},
{
"role": "user",
"content": ptext
} ]
)
# Remove markdown formatting if present
if content_text.startswith("```json"):
# Find the end of the JSON block
end_marker = "```"
end_index = content_text.rfind(end_marker)
if end_index != -1:
# Extract the JSON content without the markdown markers
content_text = content_text[7:end_index].strip()
# Now parse the JSON
try:
logger.info(f"Valid json received: {str(content_text)}")
pjson = json.loads(content_text)
# Now call scrape_json with the parsed dictionary
result_json = await self.scrape_json(pjson)
return result_json
except json.JSONDecodeError as e:
logger.error(f"Failed to parse JSON: {e}")
logger.error(f"Cleaned content: {content_text[:100]}...")
return []
async def scrape_json(self, research_strategy: Dict[str, List]) -> List[Dict]:
"""
Scrapes web content based on a research strategy JSON.
Args:
research_strategy: A dictionary containing:
- 'skey': List of search keywords
- 'url': List of direct URLs to scrape
Returns:
Dictionary with URLs as keys and scraped content as values
"""
logger.info("Starting JSON-based web scraping")
results = []
# Validate input structure
if not isinstance(research_strategy, dict):
logger.error("Invalid research_strategy format: not a dictionary")
return {"error": "Invalid research_strategy format: not a dictionary"}
keys = research_strategy.get("skey", [])
direct_urls = research_strategy.get("url", [])
if not isinstance(keys, list) or not isinstance(direct_urls, list):
logger.error("Invalid research_strategy format: keys, or url is not a list")
return {"error": "Invalid research_strategy format: keys, or url is not a list"}
# Process search keywords through search engine
for keyword in keys:
logger.info(f"Processing keyword: {keyword}")
found_results = self.search_web(keyword) # List with Dict: title,url,snippet,data
logger.info(f"... {len(found_results)} results found")
results.extend(found_results)
# Process direct URLs
logger.info(f"Processing {len(direct_urls)} direct URLs")
for url in direct_urls:
if url in results:
logger.info(f"Skipping already scraped URL: {url}")
continue
soup=self.read_url(url)
# Extract title from the page if it exists
if isinstance(soup, BeautifulSoup):
title_tag = soup.find('title')
title = title_tag.text.strip() if title_tag else "No title"
# Alternative: You could also look for h1 tags if the title tag is missing
if title == "No title":
h1_tag = soup.find('h1')
if h1_tag:
title = h1_tag.text.strip()
else:
# Handle the case where soup is an error message string
title = "Error fetching page"
results.append(self.parse_result(soup,"No title",url))
logger.info(f"JSON scraping completed. Scraped {len(results)} URLs in total")
return results
def search_web(self, query: str) -> List[Dict]:
formatted_query = quote_plus(query)
url = f"https://html.duckduckgo.com/html/?q={formatted_query}"
search_results_soup = self.read_url(url)
if not search_results_soup or search_results_soup.select('.result') is None or len(search_results_soup.select('.result')) == 0:
logger.warning(f"Keine Suchergebnisse gefunden für: {query}")
return []
# Extract search results
results = []
# Find all result containers
result_elements = search_results_soup.select('.result')
for result in result_elements:
# Extract title
title_element = result.select_one('.result__a')
title = title_element.text.strip() if title_element else 'No title'
# Extract URL (DuckDuckGo uses redirects, need to extract from href param)
url_element = title_element.get('href') if title_element else ''
extracted_url = 'No URL'
if url_element:
# Extract the actual URL from DuckDuckGo's redirect
if url_element.startswith('/d.js?q='):
start = url_element.find('?q=') + 3 # Skip '?q='
end = url_element.find('&', start) if '&' in url_element[start:] else None
extracted_url = unquote(url_element[start:end])
# Make sure the URL has the correct protocol prefix
if not extracted_url.startswith(('http://', 'https://')):
if not extracted_url.startswith('//'):
extracted_url = 'https://' + extracted_url
else:
extracted_url = 'https:' + extracted_url
else:
extracted_url = url_element
# Extract snippet directly from search results page
snippet_element = result.select_one('.result__snippet')
snippet = snippet_element.text.strip() if snippet_element else 'No description'
# Now fetch the actual page content for the data field
target_page_soup = self.read_url(extracted_url)
results.append({
'title': title,
'url': extracted_url,
'snippet': snippet,
'data': str(target_page_soup) if isinstance(target_page_soup, BeautifulSoup) else "Error fetching page"
})
# Limit the number of results if needed
if len(results) >= self.max_result:
break
return results
def read_url(self, url: str) -> BeautifulSoup:
"""
Liest eine URL und gibt einen BeautifulSoup-Parser für den Inhalt zurück.
Bei Fehlern wird ein leeres BeautifulSoup-Objekt zurückgegeben.
Args:
url: Die zu lesende URL
Returns:
BeautifulSoup-Objekt mit dem Inhalt oder leer bei Fehlern
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml',
'Accept-Language': 'en-US,en;q=0.9',
}
try:
import time
# Initialer Request
response = requests.get(url, headers=headers, timeout=10)
# Polling für Status 202
if response.status_code == 202:
# Maximal 3 Versuche mit steigenden Intervallen
backoff_times = [0.5, 1.0, 2.0, 5.0] # 0.5s, dann 1s, dann 2s
for wait_time in backoff_times:
time.sleep(wait_time) # Warten mit steigender Zeit
response = requests.get(url, headers=headers, timeout=10)
# Wenn kein 202 mehr, dann abbrechen
if response.status_code != 202:
break
# Für andere Fehler-Status einen Fehler auslösen
response.raise_for_status()
# HTML parsen
return BeautifulSoup(response.text, 'html.parser')
except Exception as e:
# Leeres BeautifulSoup-Objekt erstellen
return BeautifulSoup("<html><body></body></html>", 'html.parser')
def parse_result(self, data: BeautifulSoup, title: str, url: str) -> Dict[str, str]:
# Extract snippet/description
snippet_element = data.select_one('.result__snippet')
snippet = snippet_element.text.strip() if snippet_element else 'No description'
result={
'title': title,
'url': url,
'snippet': snippet,
'data': data.prettify()
}
return result
def _old_scrape_url(self, url: str) -> str:
try:
logger.info(f"Requesting URL: {url}")
response = requests.get(url, headers=self.headers, timeout=self.timeout)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.title.string if soup.title else "No title"
for element in soup.select('script, style, meta, noscript, iframe, nav, footer, header, aside'):
element.extract()
main_content = ""
# Common content containers
content_selectors = [
'main', '#main', '.main',
'article', '.article',
'#content', '.content',
'.post', '#post',
'.entry-content', '.post-content',
'.page-content', '.article-content'
]
# Try each selector
for selector in content_selectors:
elements = soup.select(selector)
if elements:
main_content = elements[0].get_text(separator='\n', strip=True)
logger.info(f"Found content using selector: {selector}")
break
# If no main content found, use body text
if not main_content:
main_content = soup.body.get_text(separator='\n', strip=True)
logger.info("Using body text as no main content container found")
# Clean up the text
lines = []
for line in main_content.split('\n'):
line = line.strip()
if line and len(line) > 15: # Skip very short lines
lines.append(line)
main_content = '\n'.join(lines)
# Truncate if too long
if len(main_content) > self.max_content_length:
main_content = main_content[:self.max_content_length] + "...\n[Inhalt gekürzt]"
return main_content.strip()
except Exception as e:
logger.error(f"Fehler beim Scrapen von {url}: {str(e)}")
return f"[Fehler beim Scrapen von {url}: {str(e)}]"
def _old_extract_urls_from_search_results(self, html_content: str) -> List[str]:
"""
Extracts URLs from search engine results.
Args:
html_content: HTML content of the search results page
Returns:
List of extracted URLs
"""
soup = BeautifulSoup(html_content, 'html.parser')
urls = []
# Different search engines have different HTML structures
# Google links
for a_tag in soup.select('a[href^="/url?"]'):
href = a_tag.get('href', '')
if '/url?q=' in href:
url = href.split('/url?q=')[1].split('&')[0]
url = urllib.parse.unquote(url)
if url.startswith('http') and url not in urls:
urls.append(url)
# Bing links
for a_tag in soup.select('a[href^="http"]'):
url = a_tag.get('href', '')
excluded_domains = getattr(self, 'excluded_domains', [])
if (url.startswith('http') and
not any(domain in url for domain in excluded_domains) and
url not in urls):
urls.append(url)
# Yahoo links
for a_tag in soup.select('a.d-ib'):
url = a_tag.get('href', '')
if url.startswith('http') and url not in urls:
urls.append(url)
# If no URLs found, try a more generic approach
if not urls:
for a_tag in soup.find_all('a', href=True):
url = a_tag['href']
excluded_domains = getattr(self, 'excluded_domains', [])
if (url.startswith('http') and
not any(domain in url for domain in excluded_domains) and
url not in urls):
urls.append(url)
# Limit the number of results
return urls[:self.max_urls]
# Singleton-Instanz
_webcrawler_agent = None
def get_webcrawler_agent():
"""Gibt eine Singleton-Instanz des WebCrawler-Agenten zurück"""
global _webcrawler_agent
if _webcrawler_agent is None:
_webcrawler_agent = WebcrawlerAgent()
return _webcrawler_agent

View file

@ -0,0 +1,118 @@
"""
Basisklasse für Agenten im Agentservice.
Dieser Modul stellt eine Basis-Agent-Klasse für spezialisierte Agenten zur Verfügung.
"""
import logging
from typing import List, Dict, Any, Optional, Tuple
logger = logging.getLogger(__name__)
class BaseAgent:
"""Basisklasse für alle Agenten im System"""
def __init__(self):
"""Initialisiert den Basis-Agenten"""
self.id = "base_agent"
self.name = "Base Agent"
self.type = "base"
self.description = "Basisagent als Vorlage für spezialisierte Agenten"
self.capabilities = "Grundlegende Agentenoperationen"
self.instructions = """
Als Basis-Agent kannst du grundlegende Aufgaben erledigen.
Diese Anweisungen sollten von spezialisierten Agenten überschrieben werden.
"""
def get_agent_info(self) -> Dict[str, Any]:
"""
Gibt Informationen über den Agenten zurück.
Returns:
Dict mit Agenten-Informationen
"""
return {
"id": self.id,
"name": self.name,
"type": self.type,
"description": self.description,
"capabilities": self.capabilities,
"instructions": self.instructions,
"used": False, # Wird zur Laufzeit aktualisiert
"last_result_status": None # Wird zur Laufzeit aktualisiert
}
def get_prompt(self, message_context: Dict[str, Any]) -> str:
"""
Generiert einen an den Agenten angepassten Prompt basierend auf Kontext.
Args:
message_context: Kontext der Nachricht
Returns:
Formatierter Prompt für den Agenten
"""
# Basis-Prompt, der von spezialisierten Agenten überschrieben werden kann
base_prompt = f"""
Du bist {self.name}, ein {self.type} Agent.
{self.description}
Deine Fähigkeiten: {self.capabilities}
{self.instructions}
Formatiere deine Antwort klar und strukturiert. Beantworte alle Aspekte der Anfrage.
Deklariere am Ende deiner Antwort den Status deines Ergebnisses:
[STATUS: ERGEBNIS] - Wenn du ein vollständiges, konkretes Ergebnis geliefert hast
[STATUS: TEILWEISE] - Wenn du ein teilweises Ergebnis geliefert hast
[STATUS: PLAN] - Wenn du nur einen Plan vorgeschlagen hast
"""
return base_prompt.strip()
async def process_message(self, message: Dict[str, Any], context: Dict[str, Any] = None) -> Dict[str, Any]:
"""
Verarbeitet eine Nachricht und generiert eine Antwort.
Sollte von spezialisierten Agenten überschrieben werden.
Args:
message: Die zu verarbeitende Nachricht
context: Zusätzlicher Kontext (optional)
Returns:
Die generierte Antwort
"""
# Basis-Implementierung, die einfach eine Standardantwort zurückgibt
return {
"role": "assistant",
"content": f"Ich bin {self.name} und habe deine Anfrage erhalten. Allerdings bin ich nur eine Basisimplementierung ohne spezifische Funktionalität. [STATUS: PLAN]",
"agent_type": self.type
}
def extract_status(self, content: str) -> Tuple[str, str]:
"""
Extrahiert den Status aus dem Inhalt der Antwort.
Args:
content: Inhalt der Antwort
Returns:
Tuple mit (bereinigter Text, Status)
"""
import re
# Standard-Status, falls keine Deklaration gefunden wird
status = "UNBEKANNT"
# Suche nach Status-Deklaration
status_pattern = r'\[STATUS:\s*(ERGEBNIS|TEILWEISE|PLAN)\]'
match = re.search(status_pattern, content, re.IGNORECASE)
if match:
# Extrahiere den Status
status = match.group(1).upper()
# Entferne die Status-Deklaration aus dem Text
content = re.sub(status_pattern, '', content, flags=re.IGNORECASE).strip()
return content, status

View file

@ -0,0 +1,518 @@
"""
Zentrales Filehandling-Modul für den Agentservice.
Enthält alle Funktionen für das Verarbeiten von Dateien.
Angepasst, um mit LucyDOMInterface als zentrale Datei-Autorität zu arbeiten.
"""
import os
import logging
import base64
import json
import uuid
from datetime import datetime
from typing import Dict, Any, List, Optional, Tuple, Union, BinaryIO
from io import BytesIO # Import BytesIO at the top level
# Bibliotheken für Dateiverarbeitung
try:
import pandas as pd
except ImportError:
pd = None
logger = logging.getLogger(__name__)
# Custom exception für das File-Handling
class FileProcessingError(Exception):
"""Basisklasse für Fehler bei der Dateiverarbeitung im AgentService."""
pass
class FileExtractionError(FileProcessingError):
"""Fehler bei der Textextraktion aus Dateien."""
pass
class FileAnalysisError(FileProcessingError):
"""Fehler bei der Analyse von Dateien."""
pass
def encode_to_base64(content: bytes, mime_type: str = None) -> str:
"""
Kodiert Binärdaten als Base64-String.
Args:
content: Die zu kodierenden Binärdaten
mime_type: Optionaler MIME-Typ für das Encoding
Returns:
Base64-kodierter String
"""
base64_data = base64.b64encode(content).decode('utf-8')
return base64_data
def prepare_file_contexts(files: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
"""
Bereitet die Dateikontexte basierend auf Metadaten vor.
Akzeptiert keine Pfade mehr, sondern nur Metadaten aus der Datenbank.
Args:
files: Liste von Dateien mit Metadaten (Dict mit id, name, type, content_type)
Returns:
Liste von Dateikontexten für die Verarbeitung
"""
file_contexts = []
logger.info(f"Preparing file contexts for {len(files)} files")
for file in files:
file_id = file.get("id")
file_name = file.get("name")
file_type = file.get("type")
# Create a comprehensive context with all available metadata
context = {
"id": file_id,
"name": file_name,
"type": file_type,
"size": file.get("size", "Unbekannt"),
"content_type": file.get("content_type"),
"path": file.get("path"),
"upload_date": file.get("upload_date"),
"hash": file.get("hash"),
"mandate_id": file.get("mandate_id"),
"user_id": file.get("user_id")
}
# Log for debugging
logger.info(f"Created file context: {file_name} (ID: {file_id}, Type: {file_type})")
file_contexts.append(context)
return file_contexts
def extract_text_from_file_content(file_content: bytes, file_name: str, content_type: str = None) -> str:
"""
Extrahiert Text aus verschiedenen Dateiformaten basierend auf dem Binärinhalt.
Args:
file_content: Binärinhalt der Datei
file_name: Name der Datei für die Erkennung des Formats
content_type: Optional MIME-Typ der Datei
Returns:
Extrahierter Text oder Fehlermeldung
"""
try:
# Einfache Textdateien
if file_name.endswith(('.txt', '.md', '.json', '.xml', '.html', '.htm', '.css', '.js', '.py')):
try:
return file_content.decode('utf-8')
except UnicodeDecodeError:
try:
return file_content.decode('latin1')
except:
return file_content.decode('cp1252', errors='replace')
# Excel-Dateien
elif file_name.endswith(('.xlsx', '.xls')):
if pd is not None:
# Temporäre Datei im Speicher erstellen
file_obj = BytesIO(file_content)
df = pd.read_excel(file_obj)
result = f"Excel file with {len(df)} rows and {len(df.columns)} columns.\n"
result += f"Columns: {', '.join(df.columns.tolist())}\n\n"
result += df.to_string(index=False)
return result
else:
return f"[Excel-Datei: {file_name} - pandas nicht installiert]"
# CSV-Dateien
elif file_name.endswith('.csv'):
if pd is not None:
try:
# Temporäre Datei im Speicher erstellen
file_obj = BytesIO(file_content)
df = pd.read_csv(file_obj, encoding='utf-8')
except UnicodeDecodeError:
file_obj = BytesIO(file_content)
try:
df = pd.read_csv(file_obj, encoding='latin1')
except:
file_obj = BytesIO(file_content)
df = pd.read_csv(file_obj, encoding='cp1252')
result = f"CSV file with {len(df)} rows and {len(df.columns)} columns.\n"
result += f"Columns: {', '.join(df.columns.tolist())}\n\n"
result += df.to_string(index=False)
return result
else:
return f"[CSV-Datei: {file_name} - pandas nicht installiert]"
# PDF-Dateien
elif file_name.endswith('.pdf'):
try:
try:
from PyPDF2 import PdfReader
# BytesIO is already imported at the top level
reader = PdfReader(BytesIO(file_content))
text = ""
for page in reader.pages:
text += page.extract_text() + "\n\n"
return text
except ImportError:
try:
import fitz # PyMuPDF
# BytesIO is already imported at the top level
doc = fitz.open(stream=file_content, filetype="pdf")
text = ""
for page in doc:
text += page.get_text() + "\n\n"
return text
except ImportError:
return f"[PDF: {file_name} - Keine PDF-Bibliothek installiert]"
except Exception as e:
raise FileExtractionError(f"Fehler beim Lesen der PDF-Datei {file_name}: {str(e)}")
# Sonstige Dateien
else:
return f"[Datei: {file_name} - Textextraktion nicht unterstützt]"
except Exception as e:
logger.error(f"Fehler beim Extrahieren von Text aus {file_name}: {str(e)}")
raise FileExtractionError(f"Fehler beim Extrahieren von Text aus {file_name}: {str(e)}")
async def extract_and_analyze_pdf_images(
pdf_content: bytes,
prompt: str,
ai_service
) -> List[Dict[str, Any]]:
"""
Extrahiert Bilder aus einer PDF-Datei und analysiert sie.
Arbeitet mit Binärdaten statt Dateipfaden.
Args:
pdf_content: Binärdaten der PDF-Datei
prompt: Prompt für die Bildanalyse
ai_service: AI-Service für die Bildanalyse
Returns:
Liste mit Analyseergebnissen für jedes Bild
"""
image_responses = []
temp_files = [] # Liste der temporären Dateien zur Bereinigung
try:
# PDF mit PyMuPDF öffnen
import fitz # PyMuPDF
# BytesIO is already imported at the top level
import tempfile
# PDF im Speicher öffnen
doc = fitz.open(stream=pdf_content, filetype="pdf")
logger.info(f"PDF geöffnet mit {len(doc)} Seiten")
for page_num, page in enumerate(doc, 1):
# Alle Bilder auf der Seite finden
image_list = page.get_images(full=True)
if image_list:
logger.info(f"Seite {page_num}: {len(image_list)} Bilder gefunden")
for img_index, img in enumerate(image_list):
try:
# Bild-Referenz
xref = img[0]
# Bild und Metadaten extrahieren
base_image = doc.extract_image(xref)
image_bytes = base_image["image"] # Tatsächliche Bilddaten
image_ext = base_image["ext"] # Dateiendung (jpg, png, etc.)
# Erstelle temporäre Datei
fd, temp_img_path = tempfile.mkstemp(suffix=f".{image_ext}")
temp_files.append(temp_img_path) # Zur Bereinigungsliste hinzufügen
with os.fdopen(fd, 'wb') as img_file:
img_file.write(image_bytes)
logger.debug(f"Bild temporär gespeichert: {temp_img_path}")
# Analysiere mit AI-Service
try:
analysis_result = await ai_service.analyze_image(
image_data=image_bytes, # Direktes Übergeben der Bilddaten
prompt=prompt,
mime_type=f"image/{image_ext}"
)
logger.debug(f"Bildanalyse für Bild {img_index} auf Seite {page_num} abgeschlossen")
except Exception as analyze_error:
logger.error(f"Fehler bei der Bildanalyse: {str(analyze_error)}")
analysis_result = f"[Fehler bei der Bildanalyse: {str(analyze_error)}]"
# Ergebnis speichern
try:
# Versuche zuerst, die Größe aus base_image zu bekommen
if 'width' in base_image and 'height' in base_image:
image_size = f"{base_image['width']}x{base_image['height']}"
else:
# Alternative: Öffne das temporäre Bild, um die Größe zu bestimmen
from PIL import Image
with Image.open(temp_img_path) as img:
width, height = img.size
image_size = f"{width}x{height}"
except Exception as e:
logger.warning(f"Konnte Bildgröße nicht ermitteln: {str(e)}")
image_size = "unbekannt"
image_responses.append({
"page": page_num,
"image_index": img_index,
"format": image_ext,
"image_size": image_size,
"response": analysis_result
})
except Exception as e:
logger.warning(f"Fehler bei der Extraktion von Bild {img_index} auf Seite {page_num}: {str(e)}")
continue
logger.info(f"Extrahiert und analysiert: {len(image_responses)} Bilder aus PDF")
except ImportError:
logger.error("PyMuPDF (fitz) ist nicht installiert. Installiere es mit 'pip install pymupdf'")
raise FileExtractionError("PyMuPDF (fitz) ist nicht installiert")
except Exception as e:
logger.error(f"Fehler beim Extrahieren von PDF-Bildern: {str(e)}")
raise FileExtractionError(f"Fehler beim Extrahieren von PDF-Bildern: {str(e)}")
finally:
# Bereinige alle temporären Dateien
for temp_file in temp_files:
try:
if os.path.exists(temp_file):
os.remove(temp_file)
except Exception as e:
logger.warning(f"Konnte temporäre Datei nicht entfernen: {temp_file} - {str(e)}")
return image_responses
def add_file_to_message(message: Dict[str, Any], file_data: Dict[str, Any]) -> Dict[str, Any]:
"""
Fügt eine Datei zu einer Nachricht hinzu.
Funktion für Workflow-Manager und interne Verwendung.
Args:
message: Die zu erweiternde Nachricht
file_data: Dateimetadaten und Inhalt
Returns:
Die aktualisierte Nachricht mit der Datei
"""
# Detailed logging for debugging
logger.info(f"Adding file to message: {file_data.get('name', 'unnamed_file')} (ID: {file_data.get('id', 'unknown')})")
# Initialize documents array if needed
if "documents" not in message:
message["documents"] = []
logger.debug("Initialized empty documents array in message")
# Create a unique ID for the document if not provided
doc_id = file_data.get("id", f"file_{uuid.uuid4()}")
# Extract file size if available
file_size = file_data.get("size")
if isinstance(file_size, str) and file_size.isdigit():
file_size = int(file_size)
elif file_size is None and file_data.get("content"):
# Estimate size from content if not provided
file_size = len(file_data.get("content", ""))
# Create standard document structure that matches the data model
document = {
"id": doc_id, # Add an ID to the document itself
"source": {
"type": "file",
"id": file_data.get("id", doc_id),
"name": file_data.get("name", "unnamed_file"),
"content_type": file_data.get("content_type"),
"size": file_size,
"upload_date": file_data.get("upload_date", datetime.now().isoformat())
},
"contents": [
{
"type": "text",
"text": file_data.get("content", "No content available")
}
]
}
# Log document structure for debugging
logger.debug(f"Created document structure: {json.dumps({k: v for k, v in document.items() if k != 'contents'})}")
# Check if file is already in the message to avoid duplicates
file_already_added = any(
doc.get("source", {}).get("id") == file_data.get("id")
for doc in message.get("documents", [])
)
if not file_already_added:
message["documents"].append(document)
logger.info(f"File {file_data.get('name')} successfully added to message (total: {len(message.get('documents', []))} files)")
else:
logger.info(f"File {file_data.get('name')} already exists in message, skipping")
return message
def extract_files_from_message(message: Dict[str, Any]) -> List[Dict[str, Any]]:
"""
Extrahiert Dateiinformationen aus einer Nachricht.
Funktion für Workflow-Manager und interne Verwendung.
Args:
message: Die Nachricht, aus der Dateien extrahiert werden sollen
Returns:
Liste der extrahierten Dateiinformationen
"""
files = []
if "documents" not in message:
logger.debug("No documents found in message")
return files
# Log for debugging
logger.debug(f"Extracting files from message with {len(message.get('documents', []))} documents")
for doc in message.get("documents", []):
doc_source = doc.get("source", {})
# Nur Dateien extrahieren
if doc_source.get("type") == "file":
file_info = {
"id": doc_source.get("id", f"file_{uuid.uuid4()}"),
"name": doc_source.get("name", "unnamed_file"),
"content_type": doc_source.get("content_type"),
"size": doc_source.get("size")
}
# Inhalt extrahieren, falls vorhanden
doc_contents = doc.get("contents", [])
for content in doc_contents:
if content.get("type") == "text":
file_info["content"] = content.get("text", "")
break
logger.debug(f"Extracted file: {file_info.get('name')} (ID: {file_info.get('id')})")
files.append(file_info)
else:
logger.debug(f"Skipping non-file document of type: {doc_source.get('type')}")
logger.info(f"Extracted {len(files)} files from message")
return files
async def read_file_contents(
file_contexts: List[Dict[str, Any]],
lucydom_interface,
workflow_id: str = None,
add_log_func = None,
ai_service = None # AI service parameter for image analysis
) -> Dict[str, str]:
"""
Liest den Inhalt aller Dateien und führt bei Bildern und Dokumenten Analysen durch.
Verwendet LucyDOM-Interface statt direkter Dateizugriffe.
Args:
file_contexts: Liste der Dateikontexte mit Metadaten
lucydom_interface: LucyDOM-Interface für Dateizugriffe
workflow_id: Optionale ID des Workflows für Logging
add_log_func: Optionale Funktion für das Hinzufügen von Logs
ai_service: Optionaler AI-Service für die Bildanalyse
Returns:
Dictionary mit Dateiinhalten (file_id -> content)
"""
file_contents = {}
# Add debug logging
logger.info(f"Reading contents of {len(file_contexts)} files for workflow {workflow_id}")
for file in file_contexts:
file_id = file["id"]
file_name = file["name"]
file_type = file.get("type", "unknown")
try:
# Dateiinhalt über LucyDOM-Interface abrufen
file_data = await lucydom_interface.read_file_content(file_id)
if not file_data:
_log(add_log_func, workflow_id, f"Datei {file_name} nicht gefunden", "warning")
file_contents[file_id] = f"File content not available (File not found)"
continue
logger.info(f"Successfully read file: {file_name} (ID: {file_id}, Type: {file_type})")
# Image files - always perform image analysis if AI service is available
if file_type == "image" or file_name.lower().endswith(('.jpg', '.jpeg', '.png', '.gif', '.webp')):
if ai_service:
try:
#_log(add_log_func, workflow_id, f"Analyzing image {file_name} {len(file_data)}B...", "info")
logger.info(f"ai_service type: {type(ai_service)}")
logger.info(f"ai_service methods: {dir(ai_service)}")
logger.info(f"ai_service has analyze_image method: {'analyze_image' in dir(ai_service)}")
image_analysis = await ai_service.analyze_image(
image_data=file_data,
prompt="Describe this image in detail",
mime_type=file.get("content_type")
)
logger.debug(f"Image analysis successfully generated for {file_name}")
file_contents[file_id] = f"Image Analysis:\n{image_analysis}"
_log(add_log_func, workflow_id, f"Image {file_name} analyzed successfully", "info")
except Exception as e:
logger.error(f"Error analyzing image {file_name}: {str(e)}")
_log(add_log_func, workflow_id, f"Error analyzing image {file_name}: {str(e)}", "error")
file_contents[file_id] = f"Image file: {file_name} (Analysis failed: {str(e)})"
else:
file_contents[file_id] = f"Image file: {file_name} (AI analysis not available)"
# Document files
elif file_type == "document" or not file_type:
# Verwende die zentrale Textextraktionsfunktion mit Dateiinhalt
content = extract_text_from_file_content(file_data, file_name, file.get("content_type"))
file_contents[file_id] = content
_log(add_log_func, workflow_id, f"File {file_name} read successfully", "info")
# Other file types - just store metadata
else:
file_contents[file_id] = f"File: {file_name} (Type: {file_type}, content not available)"
_log(add_log_func, workflow_id, f"Unsupported file type: {file_type} for {file_name}", "warning")
except Exception as e:
logger.error(f"Error reading file {file_name}: {str(e)}")
_log(add_log_func, workflow_id, f"Error reading file {file_name}: {str(e)}", "error")
file_contents[file_id] = f"File content not available (Error: {str(e)})"
return file_contents
def _log(add_log_func, workflow_id, message, log_type, agent_id=None, agent_name=None):
"""Hilfsfunktion zum Loggen mit unterschiedlichen Log-Funktionen"""
# Log über die Logger-Instanz
if log_type == "error":
logger.error(message)
elif log_type == "warning":
logger.warning(message)
else:
logger.info(message)
# Log über die bereitgestellte Log-Funktion (falls vorhanden)
if add_log_func and workflow_id:
add_log_func(workflow_id, message, log_type, agent_id, agent_name)

File diff suppressed because it is too large Load diff

View file

@ -1,421 +0,0 @@
import os
import json
import logging
import re
from typing import Dict, Any, List, Optional, Tuple
# Logger konfigurieren
logger = logging.getLogger(__name__)
def get_agent_instructions(agent_type: str, agent: Dict[str, Any] = None, file_contexts: List[Dict[str, Any]] = None) -> str:
"""
Liefert Anweisungen für einen Agenten basierend auf seinen Attributen.
Diese Version fügt explizite Informationen zu Datei-IDs hinzu.
Args:
agent_type: Typ des Agenten
agent: Agent-Konfiguration mit allen Attributen
file_contexts: Liste der verfügbaren Dateien
Returns:
Formatierte Anweisungen für den Agenten
"""
# Basis-Instruktionen aus dem Agenten-Profil extrahieren
base_instructions = ""
if agent:
if agent.get("instructions"):
base_instructions += agent.get("instructions").strip() + "\n\n"
if agent.get("description"):
base_instructions += "Kontext: " + agent.get("description").strip() + "\n\n"
if agent.get("capabilities"):
base_instructions += "Deine Fähigkeiten: " + agent.get("capabilities").strip() + "\n\n"
# Wenn keine Instruktionen gefunden wurden, verwende eine generische Anweisung
if not base_instructions:
base_instructions = """
Analysiere die Anfrage gründlich und liefere ein konkretes, nützliches Ergebnis.
Strukturiere deine Antwort klar und beantworte alle Aspekte der Anfrage.
"""
# Anweisung zur Selbstdeklaration des Ergebnisstatus hinzufügen
status_declaration = """
WICHTIG: Deklariere am Ende deiner Antwort den Status deines Ergebnisses mit einem der folgenden Tags:
[STATUS: ERGEBNIS] - Wenn du ein konkretes, vollständiges Ergebnis geliefert hast
[STATUS: TEILWEISE] - Wenn du ein teilweises Ergebnis geliefert hast, das noch ergänzt werden sollte
[STATUS: PLAN] - Wenn du hauptsächlich einen Plan oder eine Vorgehensweise vorgeschlagen hast
Diese Deklaration hilft dem Moderator zu entscheiden, ob weitere Agentenarbeit erforderlich ist.
"""
# Konkrete Dateiinformationen bereitstellen
file_info = ""
if file_contexts:
file_info = "Verfügbare Dateien:\n"
for file in file_contexts:
file_info += f"- {file['name']} (Typ: {file.get('type', 'unbekannt')}, ID: {file['id']})\n"
file_info += "\n"
# Hinweise zum Dateiaufrufen
file_access = f"""
{file_info}
Um mehr Dateiinhalte anzufordern, verwende einen der folgenden Befehle:
[[FILE:load_file(file_id=DATEI_ID, complete=true)]] - für den vollständigen Dateiinhalt
[[FILE:load_file(file_id=DATEI_ID, pages=[1,2,3])]] - für spezifische Seiten einer PDF
[[FILE:load_file(file_id=DATEI_ID, start=0, end=5000)]] - für Textabschnitte
Ersetze DATEI_ID mit der tatsächlichen ID aus der Dateiliste oben (nur die ID-Nummer, keine Anführungszeichen).
"""
return base_instructions + status_declaration + file_access
def get_default_agent_instructions() -> str:
"""
Gibt Standard-Anweisungen für einen Agenten zurück,
wenn keine spezifischen Anweisungen verfügbar sind.
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
WICHTIG: Deklariere am Ende deiner Antwort den Status deines Ergebnisses:
[STATUS: ERGEBNIS], [STATUS: TEILWEISE] oder [STATUS: PLAN]
"""
def initialize_agents(agents: List[Dict[str, Any]]) -> Dict[str, Dict[str, Any]]:
"""
Initialisiert die Agenten mit ihren Fähigkeiten und Status
Args:
agents: Liste der Agenten aus dem Workflow
Returns:
Dictionary mit Agent-IDs als Schlüssel und Agent-Informationen
"""
available_agents = {}
for agent in agents:
agent_id = agent["id"]
agent_name = agent["name"]
agent_type = agent["type"]
agent_capabilities = agent.get("capabilities", "")
# Kopiere alle Felder vom Original-Agenten und füge used-Status hinzu
agent_data = agent.copy()
agent_data["used"] = False
agent_data["last_result_status"] = None # Für die Speicherung des Ergebnisstatus
available_agents[agent_id] = agent_data
# Log agent data for debugging
logger.debug(f"Initialized agent: {agent_name} (Type: {agent_type})")
if "instructions" in agent_data:
logger.debug(f"Agent {agent_name} has instructions of length: {len(agent_data['instructions'])}")
logger.info(f"Initialized {len(available_agents)} agents for workflow")
return available_agents
def get_moderator_prompt(available_agents: Dict[str, Dict[str, Any]]) -> str:
"""
Erstellt einen Moderator-Prompt, der die Status-Deklarationen der Agenten berücksichtigt.
Der User Agent wird nur aufgerufen, wenn es Inputs von ihm benötigt.
Args:
available_agents: Dictionary mit verfügbaren Agenten
Returns:
Formatierter Prompt für den Moderator
"""
# Prüfen, ob der User Agent bereits verwendet wurde
user_agent_used = False
user_agent_confirmed = False
if "user_agent" in available_agents:
user_agent_used = available_agents["user_agent"].get("used", False)
# Prüfe, ob der User Agent eine explizite Bestätigung gegeben hat
if user_agent_used:
for chat_entry in available_agents["user_agent"].get("chat_entries", []):
if any(confirmation in chat_entry.lower() for confirmation in ["ja", "bestätige", "stimme zu", "akzeptiere"]):
user_agent_confirmed = True
break
base = """Du bist Moderator eines Multi-Agent-Systems. Deine Aufgabe ist es, die Agenten zu koordinieren,
um die Anfrage vollständig zu erfüllen und ein konkretes Endergebnis zu liefern. Der User wird nur aufgerufen, wenn es Inputs von ihm braucht, welche die anderen Agenten nicht liefern können. Somit immer zuerst die anderen Agenten fragen, zuletzt den User.
WICHTIG: Der Workflow darf erst beendet werden, wenn TATSÄCHLICHE ERGEBNISSE geliefert wurden"""
# Unterschiedliche Bedingungen für das Beenden des Workflows
if not user_agent_confirmed:
base += """ UND der User Agent explizit mit einem 'JA' bestätigt hat, dass er mit dem Ergebnis zufrieden ist.
KRITISCH WICHTIG: Bevor du den Workflow beendest, MUSST du den User Agent befragen, ob er mit den Ergebnissen zufrieden ist,
und er muss EXPLIZIT mit 'JA' oder einer eindeutigen Zustimmung antworten!"""
agents_list = "\nVerfügbare Agenten:\n"
for agent_id, agent in available_agents.items():
status = "✓ Bereits verwendet" if agent["used"] else "✗ Noch nicht verwendet"
result_status = ""
if agent["used"] and agent.get("last_result_status"):
result_status = f" (Letzte Antwort: {agent.get('last_result_status')})"
description = agent.get("description", "")
capabilities = agent.get("capabilities", "")
agents_list += f"- {agent['name']} ({agent['type']}): {capabilities}\n {description}\n Status: {status}{result_status}\n"
instructions = """
Berücksichtige die STATUS-Deklarationen der Agenten bei deiner Entscheidung:
- [STATUS: ERGEBNIS] - Der Agent hat ein vollständiges Ergebnis geliefert
- [STATUS: TEILWEISE] - Der Agent hat ein teilweises Ergebnis geliefert, weitere Arbeit ist nötig
- [STATUS: PLAN] - Der Agent hat einen Plan geliefert, keine konkreten Ergebnisse
Mögliche Entscheidungen:
- Bei Agent-Auswahl: "Ich wähle [Agentname], um [konkrete Aufgabe]"
"""
if not user_agent_confirmed:
instructions += """- Bei Abschluss (nur wenn [STATUS: ERGEBNIS] vorliegt): DU MUSST ZUERST den User Agent explizit fragen, ob er mit den Ergebnissen zufrieden ist.
Der User Agent MUSS mit "JA" oder einer eindeutigen Zustimmung antworten, bevor der Workflow beendet werden kann!
WICHTIG: Du darfst den Workflow NICHT beenden, bevor der User Agent explizit mit "JA" bestätigt hat!
Stelle dem User Agent eine KLARE, DIREKTE Frage, ob er mit dem Ergebnis zufrieden ist oder ob er weitere Informationen benötigt.
"""
else:
instructions += """- Bei Abschluss (nur wenn [STATUS: ERGEBNIS] vorliegt und der User Agent mit "JA" bestätigt hat): "Workflow beenden - vollständiges Ergebnis erreicht"
WICHTIG: Da der User Agent bereits seine Zustimmung gegeben hat, kannst du den Workflow jetzt beenden, wenn ein Agent ein konkretes [STATUS: ERGEBNIS] geliefert hat!
"""
return base + agents_list + instructions
def track_user_agent_response(available_agents: Dict[str, Dict[str, Any]], message_content: str) -> None:
"""
Verfolgt die Antworten des User Agents, um eine explizite Bestätigung zu erkennen.
Args:
available_agents: Dictionary mit verfügbaren Agenten
message_content: Inhalt der Nachricht des User Agents
"""
if "user_agent" not in available_agents:
return
# Initialisiere das chat_entries Array, falls es noch nicht existiert
if "chat_entries" not in available_agents["user_agent"]:
available_agents["user_agent"]["chat_entries"] = []
# Füge die aktuelle Nachricht hinzu
available_agents["user_agent"]["chat_entries"].append(message_content)
# Prüfe, ob die Nachricht eine explizite Bestätigung enthält
confirmation_phrases = ["ja", "bestätige", "stimme zu", "akzeptiere", "einverstanden", "passt", "okay", "ok"]
has_confirmation = any(phrase in message_content.lower() for phrase in confirmation_phrases)
# Setze das confirmed-Flag entsprechend
available_agents["user_agent"]["confirmed"] = has_confirmation
# Loggen der Erkennung
if has_confirmation:
logger.info("User Agent hat explizit mit 'Ja' bestätigt")
else:
logger.info("User Agent hat keine eindeutige Bestätigung gegeben")
def create_agent_prompt(agent: Dict[str, Any], agent_instructions: str, file_contexts: List[Dict[str, Any]] = None) -> Dict[str, str]:
"""Verbesserter Agent-Prompt mit Datei-IDs"""
# Füge Datei-ID-Infos hinzu, wenn verfügbar
file_info = ""
if file_contexts:
file_info = "\nVerfügbare Dateien:\n"
for file in file_contexts:
file_info += f"- {file['name']} (ID: {file['id']})\n"
content = f"""
Du bist Agent {agent['name']} ({agent['type']}).
{agent_instructions}
{file_info}
Format: [Agent: {agent['name']}] Deine Antwort...
""".strip()
return {"role": "system", "content": content}
def find_next_agent(moderator_text: str, available_agents: Dict[str, Dict[str, Any]]) -> Optional[str]:
"""
Findet den nächsten Agenten basierend auf der Moderator-Entscheidung.
Berücksichtigt die Anweisung zum Workflow-Abschluss nur, wenn ein Ergebnis vorliegt
und der User Agent explizit mit "JA" bestätigt hat.
Args:
moderator_text: Text der Moderator-Entscheidung
available_agents: Dictionary mit verfügbaren Agenten
Returns:
ID des nächsten Agenten oder "WORKFLOW_COMPLETE" zum Beenden
"""
text = moderator_text.lower()
# Prüfe, ob der Workflow beendet werden soll - nur wenn vollständige Ergebnisse vorliegen
workflow_complete_phrases = [
"workflow beenden - vollständiges ergebnis erreicht",
"workflow beenden - vollständiges ergebnis",
"vollständiges ergebnis erreicht"
]
# Prüfen, ob ein Agent ein Ergebnis geliefert hat
result_exists = False
for agent_id, agent in available_agents.items():
if agent.get("used") and agent.get("last_result_status") == "ERGEBNIS":
result_exists = True
break
# Prüfen, ob der User Agent bereits befragt wurde und mit "JA" bestätigt hat
user_agent_confirmed = False
if "user_agent" in available_agents and available_agents["user_agent"].get("used", False):
# Prüfe die letzte Nachricht des User Agents auf explizite Bestätigung
for chat_entry in available_agents["user_agent"].get("chat_entries", []):
if any(confirmation in chat_entry.lower() for confirmation in ["ja", "bestätige", "stimme zu", "akzeptiere"]):
user_agent_confirmed = True
break
# Suche nach exakten Phrasen für Workflow-Beendigung
if "workflow beenden" in text:
# Wenn ein eindeutiges Ergebnis vorliegt und der User Agent explizit bestätigt hat
if result_exists and user_agent_confirmed:
if any(phrase in text for phrase in workflow_complete_phrases):
return "WORKFLOW_COMPLETE"
# Sonst: In den Logs warnen, dass Bedingungen für Beendigung nicht erfüllt sind
else:
if not result_exists:
logger.warning("Moderator versuchte, Workflow ohne vollständiges Ergebnis zu beenden")
if not user_agent_confirmed:
logger.warning("Moderator versuchte, Workflow ohne explizite Bestätigung des User Agents zu beenden")
# Wähle den User Agent aus, um eine explizite Bestätigung zu erhalten
if "user_agent" in available_agents:
return "user_agent"
# Suche nach "ich wähle" Pattern für Agentenwahl
if "ich wähle" in text:
for agent_id, agent in available_agents.items():
agent_name_lower = agent["name"].lower()
if agent_name_lower in text:
return agent_id
# Fallback: Direktes Name-Matching
for agent_id, agent in available_agents.items():
agent_name_lower = agent["name"].lower()
if agent_name_lower in text or f"agent {agent_name_lower}" in text:
return agent_id
# Wenn kein Agent explizit gewählt wurde und User Agent noch nicht befragt wurde
# oder keine explizite Bestätigung gegeben hat, priorisiere den User Agent
if result_exists and (not "user_agent" in available_agents or
not available_agents["user_agent"].get("used", False) or
not user_agent_confirmed):
if "user_agent" in available_agents:
return "user_agent"
# Wenn kein Agent explizit gewählt wurde: Wähle den ersten unbenutzten Agenten
for agent_id, agent in available_agents.items():
if not agent["used"]:
return agent_id
# Letzter Ausweg: Ersten Agenten wiederverwenden
if available_agents:
return list(available_agents.keys())[0]
return None
def update_agent_results_with_status(content: str) -> Tuple[str, str]:
"""
Extrahiert den deklarierten Status aus einem Agenten-Ergebnis.
Args:
content: Der vom Agenten gelieferte Ergebnistext
Returns:
Tuple mit (bereinigter Text, Status)
"""
# Standard-Status, falls keine Deklaration gefunden wird
status = "UNBEKANNT"
# Suche nach Status-Deklaration
status_pattern = r'\[STATUS:\s*(ERGEBNIS|TEILWEISE|PLAN)\]'
match = re.search(status_pattern, content, re.IGNORECASE)
if match:
# Extrahiere den Status
status = match.group(1).upper()
# Entferne die Status-Deklaration aus dem Text
content = re.sub(status_pattern, '', content, flags=re.IGNORECASE).strip()
return content, status
def extract_summary(text: str, max_length: int = 200) -> str:
"""
Extrahiert eine kurze Zusammenfassung aus einem Text.
Args:
text: Der zu extrahierende Text
max_length: Maximale Länge der Zusammenfassung
Returns:
Eine kurze Zusammenfassung des Textes
"""
# Erste Zeilen oder Absätze extrahieren
lines = text.split('\n')
paragraphs = []
current_para = []
for line in lines:
line = line.strip()
if not line:
if current_para:
paragraphs.append(' '.join(current_para))
current_para = []
else:
current_para.append(line)
if current_para:
paragraphs.append(' '.join(current_para))
# Versuche, den ersten oder zweiten Absatz als Zusammenfassung zu verwenden
if paragraphs:
summary = paragraphs[0]
# Falls der erste Absatz zu kurz ist, versuche den zweiten hinzuzufügen
if len(summary) < 100 and len(paragraphs) > 1:
summary += " " + paragraphs[1]
# Kürze auf die maximale Länge
if len(summary) > max_length:
summary = summary[:max_length-3] + "..."
return summary
# Fallback auf die ersten Zeichen des Textes
if text:
return text[:max_length-3] + "..." if len(text) > max_length else text
return "Keine Zusammenfassung verfügbar"

View file

@ -1,376 +0,0 @@
import os
import logging
import pandas as pd
from typing import Dict, Any, List, Optional, Tuple
# Logger konfigurieren
logger = logging.getLogger(__name__)
async def read_file_contents(
file_contexts: List[Dict[str, Any]],
upload_dir: str,
workflow_id: str = None,
add_log_func = None,
ai_service = None # Added AI service parameter for image analysis
) -> Dict[str, str]:
"""
Enhanced function to read the contents of all files with proper image and document analysis.
Args:
file_contexts: List of file contexts with metadata
upload_dir: Directory for uploads
workflow_id: Optional ID of the workflow for logging
add_log_func: Optional function for adding logs
ai_service: Optional AI service for image analysis
Returns:
Dictionary with file contents (file_id -> content)
"""
file_contents = {}
for file in file_contexts:
file_id = file["id"]
file_name = file["name"]
file_type = file.get("type", "unknown")
file_path = file.get("path", "")
# If path is not set, try to derive it from the upload directory
if not file_path and file_name:
possible_path = os.path.join(upload_dir, file_name)
if os.path.exists(possible_path):
file_path = possible_path
file["path"] = file_path # Update the path in context
logger.debug(f"Found path for file {file_name}: {file_path}")
# Read file content if path is available
if file_path and os.path.exists(file_path):
try:
# Image files - always perform image analysis if AI service is available
if file_type == "image" or file_name.lower().endswith(('.jpg', '.jpeg', '.png', '.gif', '.webp')):
if ai_service:
try:
_log(add_log_func, workflow_id, f"Analyzing image {file_name}...", "info")
image_analysis = await ai_service.analyze_image(file_path, "Describe this image in detail")
file_contents[file_id] = f"Image Analysis:\n{image_analysis}"
_log(add_log_func, workflow_id, f"Image {file_name} analyzed successfully", "info")
except Exception as e:
logger.error(f"Error analyzing image {file_name}: {str(e)}")
_log(add_log_func, workflow_id, f"Error analyzing image {file_name}: {str(e)}", "error")
file_contents[file_id] = f"Image file: {file_name} (Analysis failed: {str(e)})"
else:
file_contents[file_id] = f"Image file: {file_name} (AI analysis not available)"
# Document files
elif file_type == "document" or not file_type:
# Simple text files
if file_name.endswith(('.txt', '.md', '.json', '.xml', '.html', '.htm', '.css', '.js')):
with open(file_path, 'r', encoding='utf-8', errors='replace') as f:
content = f.read()
file_contents[file_id] = content
_log(add_log_func, workflow_id, f"Text file {file_name} read successfully", "info")
# Excel files
elif file_name.endswith(('.xlsx', '.xls')):
try:
df = pd.read_excel(file_path)
file_contents[file_id] = f"Excel file with {len(df)} rows and {len(df.columns)} columns.\n"
file_contents[file_id] += f"Columns: {', '.join(df.columns.tolist())}\n\n"
file_contents[file_id] += df.to_string(index=False) # Full table
_log(add_log_func, workflow_id, f"Excel file {file_name} read successfully", "info")
except Exception as e:
logger.error(f"Error reading Excel file {file_name}: {str(e)}")
_log(add_log_func, workflow_id, f"Error reading Excel file {file_name}: {str(e)}", "error")
file_contents[file_id] = f"Excel file: {file_name} (Reading failed: {str(e)})"
# CSV files
elif file_name.endswith('.csv'):
try:
# Try various encodings and delimiters for robust CSV parsing
try:
df = pd.read_csv(file_path, encoding='utf-8')
except UnicodeDecodeError:
try:
df = pd.read_csv(file_path, encoding='latin1')
except:
df = pd.read_csv(file_path, encoding='cp1252')
file_contents[file_id] = f"CSV file with {len(df)} rows and {len(df.columns)} columns.\n"
file_contents[file_id] += f"Columns: {', '.join(df.columns.tolist())}\n\n"
file_contents[file_id] += df.to_string(index=False) # Full table
_log(add_log_func, workflow_id, f"CSV file {file_name} read successfully", "info")
except Exception as e:
logger.error(f"Error reading CSV file {file_name}: {str(e)}")
_log(add_log_func, workflow_id, f"Error reading CSV file {file_name}: {str(e)}", "error")
file_contents[file_id] = f"CSV file: {file_name} (Reading failed: {str(e)})"
# PDF files - with enhanced extraction and AI analysis
elif file_name.endswith('.pdf'):
try:
# Try PyPDF2 first
try:
from PyPDF2 import PdfReader
reader = PdfReader(file_path)
num_pages = len(reader.pages)
text = ""
for page in reader.pages:
text += page.extract_text() + "\n\n"
# If AI service is available, also analyze images in PDF
if ai_service:
_log(add_log_func, workflow_id, f"Analyzing PDF images in {file_name}...", "info")
try:
image_analysis_results = await ai_service.extract_and_analyze_pdf_images(
file_path,
"Describe this image in the context of the document"
)
if image_analysis_results:
image_analysis_text = "\n\n=== PDF IMAGE ANALYSIS ===\n"
for result in image_analysis_results:
image_analysis_text += f"\nImage on page {result['page']}: {result['response']}\n"
text += image_analysis_text
_log(add_log_func, workflow_id,
f"Successfully analyzed {len(image_analysis_results)} images in PDF",
"info")
except Exception as img_error:
logger.error(f"Error analyzing PDF images: {str(img_error)}")
_log(add_log_func, workflow_id,
f"Error analyzing PDF images: {str(img_error)}",
"warning")
file_contents[file_id] = f"PDF with {num_pages} pages.\nContent:\n{text}"
_log(add_log_func, workflow_id, f"PDF file {file_name} read successfully", "info")
except ImportError:
# Try to use a different PDF library if available
try:
import fitz # PyMuPDF
doc = fitz.open(file_path)
text = ""
for page in doc:
text += page.get_text() + "\n\n"
file_contents[file_id] = f"PDF with {len(doc)} pages.\nContent:\n{text}"
_log(add_log_func, workflow_id, f"PDF file {file_name} read with PyMuPDF", "info")
except ImportError:
_log(add_log_func, workflow_id,
"No PDF library installed. Cannot extract PDF content.", "warning")
file_contents[file_id] = f"PDF file (content not available, PDF libraries missing)"
except Exception as e:
logger.error(f"Error reading PDF file {file_name}: {str(e)}")
_log(add_log_func, workflow_id, f"Error reading PDF file {file_name}: {str(e)}", "error")
file_contents[file_id] = f"PDF file: {file_name} (Reading failed: {str(e)})"
# Other document types
else:
try:
# Try to read as binary first to check file type
with open(file_path, 'rb') as f:
first_bytes = f.read(8) # Read first few bytes to identify file type
# Try to read as text if it appears to be text-based
try:
with open(file_path, 'r', encoding='utf-8', errors='replace') as f:
content = f.read()
file_contents[file_id] = content
_log(add_log_func, workflow_id, f"File {file_name} read as text", "info")
except Exception:
file_contents[file_id] = f"File content not available (Binary or unsupported format)"
_log(add_log_func, workflow_id, f"File {file_name} appears to be binary or has unknown format", "warning")
except Exception as e:
logger.error(f"Error processing file {file_name}: {str(e)}")
_log(add_log_func, workflow_id, f"Error processing file {file_name}: {str(e)}", "error")
file_contents[file_id] = f"File content not available (Error: {str(e)})"
# Other file types - just store metadata
else:
file_contents[file_id] = f"File: {file_name} (Type: {file_type}, content not available)"
_log(add_log_func, workflow_id, f"Unsupported file type: {file_type} for {file_name}", "warning")
except Exception as e:
logger.error(f"Error reading file {file_name}: {str(e)}")
_log(add_log_func, workflow_id, f"Error reading file {file_name}: {str(e)}", "error")
file_contents[file_id] = f"File content not available (Error: {str(e)})"
else:
if file_path:
_log(add_log_func, workflow_id, f"File {file_name} not found: {file_path}", "warning")
else:
_log(add_log_func, workflow_id, f"No path available for file {file_name}", "warning")
file_contents[file_id] = f"File content not available (File not found)"
return file_contents
def format_file_context_text(file_contexts: List[Dict[str, Any]], file_contents: Dict[str, str]) -> str:
"""
Erstellt eine formatierte Textdarstellung aller Dateien und ihrer Inhalte
Args:
file_contexts: Liste der Dateikontexte mit Metadaten
file_contents: Dictionary mit Dateiinhalten
Returns:
Formatierter Text mit Dateiliste und Inhaltsauszügen
"""
# Erstelle einen Kontext mit Dateiliste und Inhalten für leichteren Zugriff
file_context_text = "Verfügbare Dateien:\n" + "\n".join([
f"- {file['name']} ({file['type']}, {file['size']}, ID: {file['id']})"
for file in file_contexts
])
# Füge Dateiinhalte hinzu (ohne Längenbegrenzung)
for file_id, content in file_contents.items():
file_name = next((f['name'] for f in file_contexts if f['id'] == file_id), "Unbekannte Datei")
file_context_text += f"\n\n==== DATEIINHALT: {file_name} (ID: {file_id}) ====\n"
file_context_text += content
return file_context_text
def prepare_file_contexts(files: List[Dict[str, Any]], upload_dir: str) -> List[Dict[str, Any]]:
"""
Bereitet die Dateikontexte vor und ermittelt die vollen Dateipfade
Args:
files: Liste von Dateien mit Metadaten (Dict mit id, name, type)
upload_dir: Verzeichnis für Uploads
Returns:
Liste von Dateikontexten mit vollständigen Pfaden
"""
file_contexts = []
for file in files:
file_id = file["id"]
file_name = file["name"]
file_type = file["type"]
file_path = file.get("path", "")
# Wenn kein Pfad angegeben ist, versuche, ihn aus dem Upload-Verzeichnis abzuleiten
if not file_path and file_name:
possible_path = os.path.join(upload_dir, file_name)
if os.path.exists(possible_path):
file_path = possible_path
logger.debug(f"Pfad für Datei {file_name} gefunden: {file_path}")
file_contexts.append({
"id": file_id,
"name": file_name,
"type": file_type,
"size": file.get("size", "Unbekannt"),
"path": file_path
})
return file_contexts
async def prepare_message_for_ai(
file_contexts: List[Dict[str, Any]],
prompt_text: str,
file_contents: Dict[str, str],
service_aichat
) -> Dict[str, Any]:
"""
Enhanced function to prepare a complete message with all file contents for the AI model.
Ensures proper file content integration and handles image analysis results.
Args:
file_contexts: List of file contexts with metadata
prompt_text: The text prompt
file_contents: Dictionary with file contents
service_aichat: The AI service instance for special analyses
Returns:
A fully formatted message for the AI model
"""
# Use the AI connector to create the message
try:
message = await service_aichat.parse_filedata(file_contexts, prompt_text, file_contents)
# Ensure file contents are correctly integrated
if isinstance(message, dict) and message.get("content") and isinstance(message["content"], list):
# For each file context, ensure its content is included
for file_context in file_contexts:
file_id = file_context["id"]
file_name = file_context["name"]
# Check if file content is already included
file_mentioned = False
for content_item in message["content"]:
if isinstance(content_item, dict) and content_item.get("type") == "text":
if file_name in content_item.get("text", ""):
file_mentioned = True
break
# If file is not mentioned but we have its content, add it
if not file_mentioned and file_id in file_contents:
content = file_contents[file_id]
message["content"].append({
"type": "text",
"text": f"--- FILE: {file_name} ---\n\n{content}"
})
logger.info(f"Added missing file content for {file_name} to message")
return message
except Exception as e:
logger.error(f"Error preparing message for AI: {str(e)}")
# Create a basic message structure if the AI connector fails
message = {
"role": "user",
"content": prompt_text + "\n\n"
}
# Manually add file contents
if file_contents:
file_content_text = "\n\n=== FILE CONTENTS ===\n\n"
for file_id, content in file_contents.items():
# Find file name from contexts
file_name = next((f["name"] for f in file_contexts if f["id"] == file_id), f"File {file_id}")
file_content_text += f"--- FILE: {file_name} ---\n\n{content}\n\n"
# Append to message
if isinstance(message["content"], str):
message["content"] += file_content_text
elif isinstance(message["content"], list):
message["content"].append({
"type": "text",
"text": file_content_text
})
return message
def _log(add_log_func, workflow_id, message, log_type, agent_id=None, agent_name=None):
"""Hilfsfunktion zum Loggen mit unterschiedlichen Log-Funktionen"""
# Log über die Logger-Instanz
if log_type == "error":
logger.error(message)
elif log_type == "warning":
logger.warning(message)
else:
logger.info(message)
# Log über die bereitgestellte Log-Funktion (falls vorhanden)
if add_log_func and workflow_id:
add_log_func(workflow_id, message, log_type, agent_id, agent_name)
# Die folgenden Funktionen werden nicht mehr benötigt, da partielle Dateiladungen entfallen
# Sie sind hier auskommentiert, könnten später aber wieder aktiviert werden
"""
def parse_file_access_commands(agent_text: str) -> List[Dict[str, Any]]:
# Diese Funktion wird vorerst nicht benötigt
return []
def load_additional_file_content(
workflow_id: str,
file_id: str,
file_contents: Dict[str, str],
file_contexts: List[Dict[str, Any]],
add_log_func = None,
read_complete: bool = False,
start_pos: int = None,
end_pos: int = None,
page_numbers: List[int] = None
) -> Optional[str]:
# Diese Funktion wird vorerst nicht benötigt
return None
"""

View file

@ -1,214 +0,0 @@
import os
import json
import logging
import uuid
from datetime import datetime
from typing import Dict, Any, List, Optional
# Logger konfigurieren
logger = logging.getLogger(__name__)
def create_agent_result(
workflow_id: str,
agent: Dict[str, Any],
index: int,
prompt: str,
file_contexts: List[Dict[str, Any]],
content: str,
mandate_id: int = None,
user_id: int = None
) -> Dict[str, Any]:
"""
Erstellt ein Ergebnisobjekt basierend auf dem Agententyp und der API-Antwort.
Diese Version berücksichtigt die Status-Deklaration des Agenten.
Args:
workflow_id: ID des Workflows
agent: Agent-Informationen
index: Index des Ergebnisses
prompt: Ursprünglicher Prompt
file_contexts: Liste der Dateikontexte
content: Inhalt der Agent-Antwort
mandate_id: Optional ID des Mandanten
user_id: Optional ID des Benutzers
Returns:
Ein Ergebnisobjekt für den Workflow
"""
# Importiere die Hilfsfunktionen aus dem agents-Modul
from modules.agentservice_part_agents import update_agent_results_with_status, extract_summary
agent_type = agent["type"]
agent_id = agent["id"]
agent_name = agent["name"]
# Extrahiere den Status aus dem Ergebnis
cleaned_content, result_status = update_agent_results_with_status(content)
# Speichere den Status im Agenten für späteren Zugriff
agent["last_result_status"] = result_status
# Entferne Agent-Präfix aus der Antwort, falls vorhanden
agent_prefix = f"[Agent: {agent_name}]"
if cleaned_content.startswith(agent_prefix):
cleaned_content = cleaned_content[len(agent_prefix):].strip()
# Titel basierend auf Agent-Type und deklariertem Status erstellen
title_prefix = {
"ERGEBNIS": "Ergebnis",
"TEILWEISE": "Teilweises Ergebnis",
"PLAN": "Vorgeschlagener Plan",
"UNBEKANNT": "Antwort"
}.get(result_status, "Antwort")
# Titel basierend auf Agent-Attributen erstellen
agent_desc = agent.get("description", f"Agent {agent_name}")
title = f"{title_prefix}: {agent_desc}"
# Extrahiere Dateinamen für die Metadaten
file_names = [file["name"] for file in file_contexts]
# Grundlegende Ergebnisstruktur
result = {
"id": f"result_{workflow_id}_{index}",
"mandate_id": mandate_id,
"user_id": user_id,
"agent_id": agent_id,
"agent_name": agent_name,
"timestamp": datetime.now().isoformat(),
"type": "text", # Standardtyp
"title": title,
"content": cleaned_content,
"summary": extract_summary(cleaned_content, max_length=200),
"metadata": {
"files_processed": file_names,
"prompt": prompt,
"agent_type": agent_type,
"result_status": result_status,
"capabilities": agent.get("capabilities", "")
}
}
return result
def add_log(
workflows: Dict[str, Dict[str, Any]],
workflow_id: str,
message: str,
log_type: str,
agent_id: Optional[str] = None,
agent_name: Optional[str] = None,
mandate_id: int = None,
user_id: int = None
) -> None:
"""
Fügt einen Protokolleintrag zum Workflow hinzu
Args:
workflows: Dictionary mit Workflow-Informationen
workflow_id: ID des Workflows
message: Log-Nachricht
log_type: Typ des Logs (info, warning, error, etc.)
agent_id: Optional ID des Agenten
agent_name: Optional Name des Agenten
mandate_id: Optional ID des Mandanten
user_id: Optional ID des Benutzers
"""
log_entry = {
"id": f"log_{uuid.uuid4()}",
"mandate_id": mandate_id,
"user_id": user_id,
"message": message,
"type": log_type,
"timestamp": datetime.now().isoformat(),
"agent_id": agent_id,
"agent_name": agent_name
}
workflow = workflows.get(workflow_id)
if workflow:
workflow["logs"].append(log_entry)
logger.info(f"Workflow {workflow_id}: {message}")
else:
logger.warning(f"Versuch, einem nicht existierenden Workflow Logs hinzuzufügen: {workflow_id}")
def save_workflow_results(workflows: Dict[str, Dict[str, Any]], workflow_id: str, results_dir: str) -> None:
"""
Speichert die Workflow-Ergebnisse in einer Datei
Args:
workflows: Dictionary mit Workflow-Informationen
workflow_id: ID des Workflows
results_dir: Verzeichnis für Ergebnisse
"""
workflow = workflows.get(workflow_id)
if workflow:
try:
file_path = os.path.join(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}")
else:
logger.error(f"Workflow nicht gefunden: {workflow_id}")
def get_workflow_status(workflows: Dict[str, Dict[str, Any]], workflow_id: str) -> Optional[Dict[str, Any]]:
"""
Gibt den Status eines Workflows zurück
Args:
workflows: Dictionary mit Workflow-Informationen
workflow_id: ID des Workflows
Returns:
Ein Dictionary mit Statusinformationen oder None, wenn der Workflow nicht existiert
"""
workflow = 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(workflows: Dict[str, Dict[str, Any]], workflow_id: str) -> Optional[List[Dict[str, Any]]]:
"""
Gibt die Protokolle eines Workflows zurück
Args:
workflows: Dictionary mit Workflow-Informationen
workflow_id: ID des Workflows
Returns:
Eine Liste mit Logs oder None, wenn der Workflow nicht existiert
"""
workflow = workflows.get(workflow_id)
if not workflow:
return None
return workflow["logs"]
def get_workflow_results(workflows: Dict[str, Dict[str, Any]], workflow_id: str) -> Optional[List[Dict[str, Any]]]:
"""
Gibt die Ergebnisse eines Workflows zurück
Args:
workflows: Dictionary mit Workflow-Informationen
workflow_id: ID des Workflows
Returns:
Eine Liste mit Ergebnissen oder None, wenn der Workflow nicht existiert
"""
workflow = workflows.get(workflow_id)
if not workflow:
return None
return workflow["results"]

View file

@ -0,0 +1,136 @@
"""
Registry für alle verfügbaren Agenten im System.
Verwaltet die Agenten-Instanzen und stellt sie für den Workflow zur Verfügung.
"""
import logging
import importlib
from typing import Dict, Any, List, Optional
# Import direkt bekannter Agent-Module
# Andere Module werden dynamisch importiert
from modules.agentservice_base import BaseAgent
logger = logging.getLogger(__name__)
class AgentRegistry:
"""Registry für alle verfügbaren Agenten im System"""
_instance = None
@classmethod
def get_instance(cls):
"""Gibt eine Singleton-Instanz der Agent-Registry zurück"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
"""Initialisiert die Agent-Registry"""
if AgentRegistry._instance is not None:
raise RuntimeError("Singleton-Instanz existiert bereits - nutze get_instance()")
self.agents = {}
self._load_agents()
def _load_agents(self):
"""Lädt alle verfügbaren Agenten"""
# Liste aller zu ladenden Agenten-Module
agent_modules = [
"agentservice_agent_user",
"agentservice_agent_coder",
"agentservice_agent_analyst",
"agentservice_agent_webcrawler",
"agentservice_agent_sharepoint",
"agentservice_agent_documentation"
]
for module_name in agent_modules:
try:
# Importiere das Modul
try:
module = importlib.import_module(f"modules.{module_name}")
except ImportError:
module = importlib.import_module(module_name)
# Suche nach der Agent-Klasse statt nach getter-Funktion
agent_type = module_name.split('_')[-1]
class_name = f"{agent_type.capitalize()}Agent"
if hasattr(module, class_name):
# Instanziiere den Agenten direkt
agent_class = getattr(module, class_name)
agent = agent_class()
# Registriere den Agenten
self.register_agent(agent)
logger.info(f"Agent '{agent.name}' (Typ: {agent.type}) wurde geladen")
else:
logger.warning(f"Keine {class_name} Klasse in Modul {module_name} gefunden")
except ImportError as e:
logger.warning(f"Modul {module_name} konnte nicht importiert werden: {e}")
except Exception as e:
logger.error(f"Fehler beim Laden des Agenten aus Modul {module_name}: {e}")
def register_agent(self, agent: BaseAgent):
"""Registriert einen Agenten in der Registry."""
agent_type = agent.type
self.agents[agent_type] = agent
# Zusätzlich nach ID registrieren
self.agents[agent.id] = agent
logger.debug(f"Agent '{agent.name}' (Typ: {agent_type}) wurde registriert")
def get_agent(self, agent_identifier: str) -> Optional[BaseAgent]:
"""
Gibt eine Instanz eines Agenten nach ID oder Typ zurück.
Args:
agent_identifier: ID oder Typ des gewünschten Agenten
Returns:
Agent-Instanz oder None, wenn nicht gefunden
"""
# Versuche, direkt nach Typ zu finden
if agent_identifier in self.agents:
return self.agents[agent_identifier]
# Wenn nicht gefunden, versuche verschiedene Varianten des Namens
variants = [
agent_identifier,
agent_identifier.replace('_agent', ''),
f"{agent_identifier}_agent"
]
for variant in variants:
if variant in self.agents:
return self.agents[variant]
logger.warning(f"Agent mit Identifier '{agent_identifier}' nicht gefunden")
return None
def get_all_agents(self) -> Dict[str, BaseAgent]:
"""Gibt alle registrierten Agenten zurück."""
return self.agents
def get_agent_infos(self) -> List[Dict[str, Any]]:
"""Gibt Informationen zu allen registrierten Agenten zurück."""
agent_infos = []
# Nur einmal pro Agent-Instanz (da wir sowohl nach Typ als auch nach ID registrieren)
seen_agents = set()
for agent in self.agents.values():
if agent not in seen_agents:
agent_infos.append(agent.get_agent_info())
seen_agents.add(agent)
return agent_infos
def initialize_agents_for_workflow(self) -> Dict[str, Dict[str, Any]]:
"""Initialisiert Agenten für einen Workflow."""
initialized_agents = {}
seen_agents = set()
for agent in self.agents.values():
if agent not in seen_agents:
agent_info = agent.get_agent_info()
agent_id = agent_info["id"]
initialized_agents[agent_id] = agent_info
seen_agents.add(agent)
return initialized_agents

File diff suppressed because it is too large Load diff

View file

@ -1,285 +0,0 @@
import logging
from typing import Dict, Any, List
# Logger konfigurieren
logger = logging.getLogger(__name__)
def convert_to_anthropic_format(openai_messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
"""
Konvertiert Nachrichten vom OpenAI-Format ins Anthropic-Format.
OpenAI verwendet:
[{"role": "system", "content": "..."},
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}]
Anthropic verwendet:
[{"role": "user", "content": [{"type": "text", "text": "..."}]},
{"role": "assistant", "content": [{"type": "text", "text": "..."}]}]
Anmerkung: Anthropic hat kein direktes System-Message-Äquivalent,
daher fügen wir System-Nachrichten in die erste User-Nachricht ein.
"""
anthropic_messages = []
system_content = ""
# Extrahiere zuerst alle System-Nachrichten
for msg in openai_messages:
if msg.get("role") == "system":
if isinstance(msg.get("content"), str):
system_content += msg.get("content", "") + "\n\n"
# Falls content bereits ein Array ist (selten bei system messages)
elif isinstance(msg.get("content"), list):
for part in msg.get("content", []):
if part.get("type") == "text":
system_content += part.get("text", "") + "\n\n"
# Konvertiere die restlichen Nachrichten
for i, msg in enumerate(openai_messages):
role = msg.get("role")
content = msg.get("content", "")
# System-Nachrichten überspringen (bereits extrahiert)
if role == "system":
continue
# Anthropic unterstützt nur "user" und "assistant" als Rollen
if role not in ["user", "assistant"]:
role = "user"
# Standardisiertes Nachrichtenformat erstellen
anthropic_msg = {"role": role}
# Content-Formatierung
if isinstance(content, str):
# String in ein Anthropic-kompatibles Array umwandeln
# Für die erste User-Nachricht: System-Inhalte voranstellen, falls vorhanden
if role == "user" and system_content and not any(m.get("role") == "user" for m in anthropic_messages):
text_content = system_content + content
else:
text_content = content
anthropic_msg["content"] = [{"type": "text", "text": text_content}]
elif isinstance(content, list):
# Bei Array-Content (multimodal)
transformed_content = []
# Für die erste User-Nachricht: System-Inhalte dem ersten Text-Element voranstellen
if role == "user" and system_content and not any(m.get("role") == "user" for m in anthropic_messages):
first_text_added = False
for part in content:
if part.get("type") == "text" and not first_text_added:
transformed_content.append({
"type": "text",
"text": system_content + part.get("text", "")
})
first_text_added = True
elif part.get("type") == "image_url":
# OpenAI image_url in Anthropic image umwandeln
image_url = part.get("image_url", {}).get("url", "")
if image_url.startswith("data:"):
# Base64-kodiertes Bild
parts = image_url.split(",", 1)
if len(parts) == 2:
media_type = parts[0].split(":")[1].split(";")[0]
base64_data = parts[1]
transformed_content.append({
"type": "image",
"source": {
"type": "base64",
"media_type": media_type,
"data": base64_data
}
})
else:
# URL-Bild - nicht direkt unterstützt von Anthropic in dieser Form
logger.warning("Externe Bild-URLs werden von Anthropic nicht direkt unterstützt")
else:
transformed_content.append(part)
# Falls kein Text-Element gefunden wurde, füge System-Content als separates Element hinzu
if system_content and not first_text_added:
transformed_content.insert(0, {"type": "text", "text": system_content})
else:
# Wenn es nicht die erste User-Nachricht ist oder kein System-Content vorhanden ist
for part in content:
if part.get("type") == "image_url":
# OpenAI image_url in Anthropic image umwandeln
image_url = part.get("image_url", {}).get("url", "")
if image_url.startswith("data:"):
# Base64-kodiertes Bild
parts = image_url.split(",", 1)
if len(parts) == 2:
media_type = parts[0].split(":")[1].split(";")[0]
base64_data = parts[1]
transformed_content.append({
"type": "image",
"source": {
"type": "base64",
"media_type": media_type,
"data": base64_data
}
})
else:
# URL-Bild - nicht direkt unterstützt von Anthropic in dieser Form
logger.warning("Externe Bild-URLs werden von Anthropic nicht direkt unterstützt")
else:
transformed_content.append(part)
anthropic_msg["content"] = transformed_content
anthropic_messages.append(anthropic_msg)
return anthropic_messages
def convert_to_openai_format(anthropic_messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
"""
Konvertiert Nachrichten vom Anthropic-Format ins OpenAI-Format.
Anthropic:
[{"role": "user", "content": [{"type": "text", "text": "..."}]},
{"role": "assistant", "content": [{"type": "text", "text": "..."}]}]
OpenAI:
[{"role": "system", "content": "..."},
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}]
"""
openai_messages = []
for msg in anthropic_messages:
role = msg.get("role", "user")
content = msg.get("content", [])
# Erstelle OpenAI-Message
openai_msg = {"role": role}
# Content-Behandlung
if isinstance(content, list):
# Multimodaler Inhalt von Anthropic
if all(isinstance(part, dict) and part.get("type") == "text" for part in content):
# Wenn alle Elemente Text sind, vereinfache zu einem einzelnen String
openai_msg["content"] = "\n".join(part.get("text", "") for part in content if part.get("type") == "text")
else:
# Mischung aus Text und Bildern/Dokumenten
openai_content = []
for part in content:
part_type = part.get("type", "")
if part_type == "text":
openai_content.append({
"type": "text",
"text": part.get("text", "")
})
elif part_type == "image":
# Anthropic image in OpenAI image_url umwandeln
source = part.get("source", {})
if source.get("type") == "base64":
media_type = source.get("media_type", "image/jpeg")
base64_data = source.get("data", "")
openai_content.append({
"type": "image_url",
"image_url": {
"url": f"data:{media_type};base64,{base64_data}"
}
})
# Anthropic Dokumente können nicht direkt in OpenAI-Format übersetzt werden
elif part_type == "document":
# Versuche, Dokumente als Text zu behandeln
openai_content.append({
"type": "text",
"text": f"[Dokument wurde übermittelt, kann aber nicht direkt in OpenAI-Format konvertiert werden]"
})
openai_msg["content"] = openai_content
else:
# Einfacher String-Inhalt
openai_msg["content"] = content
openai_messages.append(openai_msg)
return openai_messages
def convert_anthropic_response_to_openai_format(anthropic_response: Dict[str, Any]) -> Dict[str, Any]:
"""
Konvertiert eine Antwort vom Anthropic-Format ins OpenAI-Format.
Args:
anthropic_response: Antwort im Anthropic-Format
Returns:
Die Antwort im OpenAI-Format
"""
# Extrahiere Inhalt aus Anthropic-Antwort
content = ""
if "content" in anthropic_response:
if isinstance(anthropic_response["content"], list):
# Inhalt ist eine Liste von Teilen (bei neueren API-Versionen)
for part in anthropic_response["content"]:
if part.get("type") == "text":
content += part.get("text", "")
else:
# Direkter Inhalt als String (bei älteren API-Versionen)
content = anthropic_response["content"]
# Erstelle OpenAI-formatierte Antwort
return {
"id": anthropic_response.get("id", ""),
"object": "chat.completion",
"created": anthropic_response.get("created", 0),
"model": anthropic_response.get("model", ""),
"choices": [
{
"message": {
"role": "assistant",
"content": content
},
"index": 0,
"finish_reason": "stop"
}
]
}
def convert_openai_response_to_anthropic_format(openai_response: Dict[str, Any]) -> Dict[str, Any]:
"""
Konvertiert eine Antwort vom OpenAI-Format ins Anthropic-Format.
Args:
openai_response: Antwort im OpenAI-Format
Returns:
Die Antwort im Anthropic-Format (nur die relevanten Felder)
"""
# Extrahiere Inhalt aus OpenAI-Antwort
content = []
if "choices" in openai_response and openai_response["choices"]:
choice = openai_response["choices"][0]
message = choice.get("message", {})
message_content = message.get("content", "")
if isinstance(message_content, str):
content.append({
"type": "text",
"text": message_content
})
elif isinstance(message_content, list):
# Multimodaler Inhalt (selten in Antworten)
for part in message_content:
if part.get("type") == "text":
content.append({
"type": "text",
"text": part.get("text", "")
})
# Bilder in Antworten würden hier auch verarbeitet werden
# Erstelle Anthropic-formatierte Antwort
return {
"id": openai_response.get("id", ""),
"model": openai_response.get("model", ""),
"content": content,
"type": "message",
"role": "assistant"
}

Some files were not shown because too many files have changed in this diff Show more