MVP1 rev2
This commit is contained in:
parent
4845f70a1e
commit
d5b84127f7
146 changed files with 15061 additions and 22312 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -160,3 +160,7 @@ cython_debug/
|
|||
# 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.
|
||||
#.idea/
|
||||
|
||||
# local data
|
||||
gwserver/_database*
|
||||
gwserver/results/*
|
||||
230
changelog.txt
230
changelog.txt
|
|
@ -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
|
||||
|
||||
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
{
|
||||
"mandates": 1,
|
||||
"users": 1
|
||||
"users": 1,
|
||||
"mandates": 1
|
||||
}
|
||||
|
|
@ -12,5 +12,19 @@
|
|||
"mandate_id": 1,
|
||||
"user_id": 1,
|
||||
"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
|
||||
}
|
||||
]
|
||||
|
|
@ -22,5 +22,29 @@
|
|||
"hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$eg/BWIuRkjJmDOGcU+qd0w$QJTabCxu/ssu1MpLn/gBsOw7nBbfEHUlIJ76xuTKXSM",
|
||||
"user_id": 1,
|
||||
"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
|
||||
}
|
||||
]
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"workspaces": 1,
|
||||
"agents": 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"
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
|
|
@ -2,45 +2,49 @@
|
|||
{
|
||||
"mandate_id": 1,
|
||||
"user_id": 1,
|
||||
"name": "test.pdf",
|
||||
"type": "document",
|
||||
"content_type": "application/pdf",
|
||||
"size": 299729,
|
||||
"path": "./_uploads\\587069d1-a14c-48c9-a911-233608668870.pdf",
|
||||
"upload_date": "2025-03-24T16:44:13.751746",
|
||||
"name": "LF-Nutshell.png",
|
||||
"type": "image",
|
||||
"content_type": "image/png",
|
||||
"size": 52108,
|
||||
"path": "./_uploads\\1\\file_f4cd9e8d-158f-450e-91b1-6b1231fb0900_LF-Nutshell.png",
|
||||
"hash": "30640f00e9e123f6fecbddb9da7f0c399e89caedd186aa96a40f7201c2f9aba5",
|
||||
"upload_date": "2025-04-04T08:54:37.031189",
|
||||
"id": 1
|
||||
},
|
||||
{
|
||||
"mandate_id": 1,
|
||||
"user_id": 1,
|
||||
"name": "legende_schema.pdf",
|
||||
"type": "document",
|
||||
"content_type": "application/pdf",
|
||||
"size": 299729,
|
||||
"path": "./_uploads\\b73afc5a-131a-4db8-9572-be2a00c71d91.pdf",
|
||||
"upload_date": "2025-03-25T17:42:03.548097",
|
||||
"name": "LF-Target.png",
|
||||
"type": "image",
|
||||
"content_type": "image/png",
|
||||
"size": 256760,
|
||||
"path": "./_uploads\\1\\file_208023f5-1e31-4981-8481-18c317a53c63_LF-Target.png",
|
||||
"hash": "36feef589c28364729551ed89b1ca70034a557860ac71768b640ff55a8eae160",
|
||||
"upload_date": "2025-04-04T09:40:03.517248",
|
||||
"id": 2
|
||||
},
|
||||
{
|
||||
"mandate_id": 1,
|
||||
"user_id": 1,
|
||||
"name": "20240419_093309.jpg",
|
||||
"name": "LF-Current.png",
|
||||
"type": "image",
|
||||
"content_type": "image/jpeg",
|
||||
"size": 286163,
|
||||
"path": "./_uploads\\46a65f6f-a30c-4cf2-b0e2-c24709c3282e.jpg",
|
||||
"upload_date": "2025-03-25T18:52:16.203894",
|
||||
"content_type": "image/png",
|
||||
"size": 126277,
|
||||
"path": "./_uploads\\1\\file_ba127a2b-52fb-4230-aee3-95019deab986_LF-Current.png",
|
||||
"hash": "bdaec5c6442cb4922dd701432d47cfaaa3e044d0d8b179ff16f56ee01fb501ce",
|
||||
"upload_date": "2025-04-04T09:58:18.805036",
|
||||
"id": 3
|
||||
},
|
||||
{
|
||||
"mandate_id": 1,
|
||||
"user_id": 1,
|
||||
"name": "20240419_093309.jpg",
|
||||
"name": "LF-Details.png",
|
||||
"type": "image",
|
||||
"content_type": "image/jpeg",
|
||||
"size": 286163,
|
||||
"path": "./_uploads\\e4400d0e-62e3-489a-aaad-2226da4e59f1.jpg",
|
||||
"upload_date": "2025-03-28T13:55:28.542449",
|
||||
"content_type": "image/png",
|
||||
"size": 253009,
|
||||
"path": "./_uploads\\1\\file_002dfba0-9984-43b5-8ee9-d240830b56ea_LF-Details.png",
|
||||
"hash": "b54b3af60771dd373e1ddc0a3682023250fa056a9a72b7ee41dc628489b553b2",
|
||||
"upload_date": "2025-04-04T10:08:52.784966",
|
||||
"id": 4
|
||||
},
|
||||
{
|
||||
|
|
@ -50,8 +54,33 @@
|
|||
"type": "document",
|
||||
"content_type": "application/pdf",
|
||||
"size": 299729,
|
||||
"path": "./_uploads\\fdef0779-4894-4f84-9d5c-99c0c217f4e9.pdf",
|
||||
"upload_date": "2025-03-28T14:19:27.876175",
|
||||
"path": "./_uploads\\1\\file_b7e4d19a-7225-427b-bbaa-08ea1e5abb80_auszug_liste_positionen.pdf",
|
||||
"hash": "fa9b47b19581a2dc6380b66592245270e648971a6a5671ddfc6e9073377a6612",
|
||||
"upload_date": "2025-04-04T12:42:55.018650",
|
||||
"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
|
||||
}
|
||||
]
|
||||
|
|
@ -3,8 +3,6 @@
|
|||
"mandate_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.",
|
||||
"workspace_id": 1,
|
||||
"created_at": "2025-03-26T09:49:59.028815",
|
||||
"name": "Web Research: Marktforschung",
|
||||
"id": 1
|
||||
},
|
||||
|
|
@ -12,8 +10,6 @@
|
|||
"mandate_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.",
|
||||
"workspace_id": 1,
|
||||
"created_at": "2025-03-26T09:49:59.029794",
|
||||
"name": "Analyse: Datenanalyse",
|
||||
"id": 2
|
||||
},
|
||||
|
|
@ -21,8 +17,6 @@
|
|||
"mandate_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.",
|
||||
"workspace_id": 1,
|
||||
"created_at": "2025-03-26T09:49:59.029794",
|
||||
"name": "Protokoll: Besprechungsprotokoll",
|
||||
"id": 3
|
||||
},
|
||||
|
|
@ -30,8 +24,6 @@
|
|||
"mandate_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.",
|
||||
"workspace_id": 1,
|
||||
"created_at": "2025-03-26T09:49:59.029794",
|
||||
"name": "Design: UI/UX Design",
|
||||
"id": 4
|
||||
},
|
||||
|
|
@ -39,8 +31,6 @@
|
|||
"mandate_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.",
|
||||
"workspace_id": 1,
|
||||
"created_at": "2025-03-26T09:50:02.181566",
|
||||
"name": "Web Research: Marktforschung",
|
||||
"id": 5
|
||||
},
|
||||
|
|
@ -48,8 +38,6 @@
|
|||
"mandate_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.",
|
||||
"workspace_id": 1,
|
||||
"created_at": "2025-03-26T09:50:02.182566",
|
||||
"name": "Analyse: Datenanalyse",
|
||||
"id": 6
|
||||
},
|
||||
|
|
@ -57,18 +45,14 @@
|
|||
"mandate_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.",
|
||||
"workspace_id": 1,
|
||||
"created_at": "2025-03-26T09:50:02.182566",
|
||||
"name": "Protokoll: Besprechungsprotokoll",
|
||||
"id": 7
|
||||
},
|
||||
{
|
||||
"mandate_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.",
|
||||
"workspace_id": 2,
|
||||
"created_at": "2025-03-26T09:50:02.182566",
|
||||
"name": "Offertanafrage",
|
||||
"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.",
|
||||
"name": "Design: UI/UX Design",
|
||||
"id": 8
|
||||
}
|
||||
]
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
4
gwserver/_results/.gitignore
vendored
4
gwserver/_results/.gitignore
vendored
|
|
@ -1,4 +0,0 @@
|
|||
# Ignore everything in this directory
|
||||
*
|
||||
# Except this file
|
||||
!.gitignore
|
||||
|
|
@ -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
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -1,3 +1,6 @@
|
|||
import os
|
||||
os.environ["NUMEXPR_MAX_THREADS"] = "12"
|
||||
|
||||
from fastapi import FastAPI, HTTPException, Depends, Body, status, Response
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.responses import JSONResponse, FileResponse
|
||||
|
|
@ -6,15 +9,12 @@ from fastapi.security import OAuth2PasswordRequestForm
|
|||
|
||||
import uvicorn
|
||||
from typing import Dict, Any
|
||||
import os
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
import pathlib
|
||||
|
||||
# Import interfaces
|
||||
from modules.gateway_interface import get_gateway_interface
|
||||
from modules.lucydom_interface import get_lucydom_interface
|
||||
from modules.agentservice_interface import AgentService
|
||||
|
||||
# Import auth module
|
||||
from auth import (
|
||||
|
|
@ -24,8 +24,9 @@ from auth import (
|
|||
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.lucydom_interface as lucydom_model
|
||||
|
||||
# Konfiguration des Loggers
|
||||
logging.basicConfig(
|
||||
|
|
@ -109,21 +110,15 @@ async def read_user_me(current_user: Dict[str, Any] = Depends(get_current_active
|
|||
return current_user
|
||||
|
||||
# Alle Router einbinden
|
||||
from routes.attributes import router as attributes_router
|
||||
app.include_router(attributes_router)
|
||||
|
||||
from routes.mandates import router as mandate_router
|
||||
app.include_router(mandate_router)
|
||||
|
||||
from routes.users import router as 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
|
||||
app.include_router(file_router)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
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.security import OAuth2PasswordBearer
|
||||
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
|
||||
|
||||
|
||||
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:
|
||||
current_user: Aktuelle Benutzerdaten
|
||||
current_user: Der aktuelle Benutzer
|
||||
|
||||
Returns:
|
||||
Tuple mit (mandate_id, user_id)
|
||||
Tuple von (mandate_id, user_id)
|
||||
"""
|
||||
mandate_id = current_user.get("mandate_id", 1) # Standard: Root-Mandant
|
||||
user_id = current_user.get("id")
|
||||
# Default values
|
||||
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
|
||||
|
|
@ -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")
|
||||
|
|
@ -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")
|
||||
|
|
@ -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
|
||||
239
gwserver/connectors/connector_aichat_anthropic.py
Normal file
239
gwserver/connectors/connector_aichat_anthropic.py
Normal 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)}]"
|
||||
148
gwserver/connectors/connector_aichat_openai.py
Normal file
148
gwserver/connectors/connector_aichat_openai.py
Normal 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)}]"
|
||||
|
|
@ -66,7 +66,7 @@ class DatabaseConnector:
|
|||
self.user_id = self._user_id
|
||||
|
||||
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):
|
||||
"""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
|
||||
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]
|
||||
|
||||
# Ansonsten lade die Datei
|
||||
try:
|
||||
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:
|
||||
data = json.load(f)
|
||||
self._tables_cache[table] = data
|
||||
189
gwserver/modules/agentservice_agent_analyst.py
Normal file
189
gwserver/modules/agentservice_agent_analyst.py
Normal 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
|
||||
233
gwserver/modules/agentservice_agent_coder.py
Normal file
233
gwserver/modules/agentservice_agent_coder.py
Normal 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
|
||||
420
gwserver/modules/agentservice_agent_documentation.py
Normal file
420
gwserver/modules/agentservice_agent_documentation.py
Normal 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
|
||||
173
gwserver/modules/agentservice_agent_sharepoint.py
Normal file
173
gwserver/modules/agentservice_agent_sharepoint.py
Normal 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
|
||||
133
gwserver/modules/agentservice_agent_user.py
Normal file
133
gwserver/modules/agentservice_agent_user.py
Normal 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
|
||||
511
gwserver/modules/agentservice_agent_webcrawler.py
Normal file
511
gwserver/modules/agentservice_agent_webcrawler.py
Normal 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
|
||||
118
gwserver/modules/agentservice_base.py
Normal file
118
gwserver/modules/agentservice_base.py
Normal 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
|
||||
518
gwserver/modules/agentservice_filehandling.py
Normal file
518
gwserver/modules/agentservice_filehandling.py
Normal 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
|
|
@ -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"
|
||||
|
|
@ -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
|
||||
"""
|
||||
|
|
@ -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"]
|
||||
136
gwserver/modules/agentservice_registry.py
Normal file
136
gwserver/modules/agentservice_registry.py
Normal 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
|
||||
1221
gwserver/modules/agentservice_workflow_manager.py
Normal file
1221
gwserver/modules/agentservice_workflow_manager.py
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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
Loading…
Reference in a new issue