U
z;&`tb>gB+xSGQyBiLdddgz^8!D5U`@AOHd&00JNY0w4eaAOHd&00JQJhzQ{Q{}F+O
zTMz&N5C8!X009sH0T2KI5C8!Xc#H_({r@ql3`hY15C8!X009sH0T2KI5C8!X0D(tD
z0Pp{g2rS%!00@8p2!H?xfB*=900@8p2!Oz2L;&yqk5Oen3J8Dz2!H?xfB*=900@8p
z2!H?xJR$-i^6MAh^N8OO|3Umq@sGv#X#+nX00JNY0w4eaAOHd&00JNY0w4eakBGpe
z-{(2`l<}9?8pgj*4f;H@r;NYM(Y(8(H7x6+KA&f5iv5`Y_9qQOUfPn_7XR)369cq4
z!#2&oLohD*Jkm-2XH4i%#%R@M{Vsd|_l!NFkl+>sKmY_l00ck)1V8`;KmY_l00cnb
zu^?cX|1Ulkf*=9}KmY_l00ck)1V8`;KmY_l00cnbp%bvY|37r!a0mh*00JNY0w4ea
SAOHd&00JNY0wC~s5cogMRiNtt
diff --git a/backend/models.py b/backend/models.py
new file mode 100644
index 00000000..b3ba9909
--- /dev/null
+++ b/backend/models.py
@@ -0,0 +1,80 @@
+from pydantic import BaseModel, Field
+from typing import List, Dict, Any, Optional
+from datetime import datetime
+
+class Agent(BaseModel):
+ """Datenmodell für einen Agenten"""
+ id: str
+ name: str
+ type: str
+ capabilities: List[str] = []
+ description: Optional[str] = None
+
+class DataObject(BaseModel):
+ """Datenmodell für ein Datenobjekt"""
+ id: str
+ name: str
+ type: str # 'document', 'image', etc.
+ size: Optional[str] = None
+ upload_date: Optional[str] = None
+ content_type: Optional[str] = None
+ path: Optional[str] = None
+
+class Prompt(BaseModel):
+ """Datenmodell für einen Prompt"""
+ id: str
+ content: str
+ created_at: str
+
+class Workspace(BaseModel):
+ """Datenmodell für einen Workspace"""
+ id: str
+ name: str
+ created_at: str
+ prompts: List[Prompt] = []
+ agents: List[Agent] = []
+ dataObjectReferences: List[str] = []
+
+class WorkflowRequest(BaseModel):
+ """Anforderung zur Ausführung eines Workflows"""
+ workspace_id: str
+ prompt: str
+ agents: List[str] # Liste von Agent-IDs
+ files: List[str] # Liste von Datei-IDs
+ workflow_name: Optional[str] = None
+
+class WorkflowResponse(BaseModel):
+ """Antwort nach dem Start eines Workflows"""
+ workflow_id: str
+ status: str
+ message: str
+
+class LogEntry(BaseModel):
+ """Protokolleintrag während der Workflow-Ausführung"""
+ id: str
+ message: str
+ type: str # 'info', 'error', 'start', 'complete', 'success'
+ timestamp: str
+ agent_id: Optional[str] = None
+ agent_name: Optional[str] = None
+
+class Result(BaseModel):
+ """Ergebnis eines Agenten während der Workflow-Ausführung"""
+ id: str
+ title: str
+ agent_id: str
+ agent_name: str
+ type: str # 'text', 'chart', 'image', etc.
+ content: str
+ timestamp: str
+ metadata: Optional[Dict[str, Any]] = None
+
+class WorkflowStatus(BaseModel):
+ """Status eines Workflows"""
+ id: str
+ name: Optional[str] = None
+ status: str # 'running', 'completed', 'failed'
+ progress: float # 0.0 - 1.0
+ started_at: str
+ completed_at: Optional[str] = None
+ agent_statuses: Optional[Dict[str, str]] = None
\ No newline at end of file
diff --git a/backend/results/.gitignore b/backend/results/.gitignore
new file mode 100644
index 00000000..86d0cb27
--- /dev/null
+++ b/backend/results/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
\ No newline at end of file
diff --git a/backend/static/.gitignore b/backend/static/.gitignore
new file mode 100644
index 00000000..86d0cb27
--- /dev/null
+++ b/backend/static/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
\ No newline at end of file
diff --git a/backend/uploads/.gitignore b/backend/uploads/.gitignore
new file mode 100644
index 00000000..86d0cb27
--- /dev/null
+++ b/backend/uploads/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
\ No newline at end of file
diff --git a/frontend/frontend/.env b/frontend/frontend/.env
deleted file mode 100644
index 294190f6..00000000
--- a/frontend/frontend/.env
+++ /dev/null
@@ -1 +0,0 @@
-REACT_APP_API_URL=https://volucy-gateway-e3d2bzbxdeaaayhz.westeurope-01.azurewebsites.net
diff --git a/frontend/index.html b/frontend/index.html
new file mode 100644
index 00000000..e3458bd3
--- /dev/null
+++ b/frontend/index.html
@@ -0,0 +1,204 @@
+
+
+
+
+
+ Data Platform - Multi-Agent Service
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Meine Prompts
+
+
Gespeicherte Prompts
+
+
+
+
+
+
+
+
+
+
Meine Agents
+
+
Verfügbare Agents
+
+
+
+
+
+
+
+
+
+
+
Workflow-Konfiguration
+
+
+
+
1. Dateien auswählen
+
+
+
+
+
+
Ausgewählte Dateien
+
+
+
+ Keine Dateien ausgewählt
+
+
+
+
+
+
+
+
+
+
2. Prompt eingeben
+
+
+
+
+
+
3. Agenten auswählen
+
+
+
+
+
+
+
+
+
+
+
+
+
Ausführung & Ergebnisse
+
+
+
+
Ausführungsprotokoll
+
+
Workflow noch nicht gestartet. Protokoll wird hier angezeigt.
+
+
+
+
+
+
Ergebnisse
+
+
+
Keine Ergebnisse verfügbar
+
Führen Sie einen Workflow aus, um Ergebnisse zu sehen
+
+
+
+
+
+
+
+
+
+
+
+
Meine Daten
+
+
Verfügbare Dateien
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/script.js b/frontend/script.js
new file mode 100644
index 00000000..77ceeabd
--- /dev/null
+++ b/frontend/script.js
@@ -0,0 +1,654 @@
+document.addEventListener('DOMContentLoaded', function() {
+ // Backend API Basis-URL
+ const API_BASE_URL = 'http://localhost:8000';
+
+ // Status-Management
+ let state = {
+ workspaces: [],
+ files: [],
+ currentWorkspace: null,
+ selectedFiles: [],
+ selectedAgents: [],
+ prompt: "",
+ logs: [],
+ results: [],
+ isRunning: false,
+ currentWorkflowId: null
+ };
+ let activeView = 'workflow'; // Standard-Ansicht beim Start
+
+ // DOM-Elemente für Menüpunkte
+ const workflowLink = document.querySelector('a[href="#workflow"]').parentElement;
+ const dataLink = document.querySelector('a[href="#data"]').parentElement;
+ const promptsLink = document.querySelector('a[href="#prompts"]').parentElement;
+ const agentsLink = document.querySelector('a[href="#agents"]').parentElement;
+
+ // DOM-Elemente für die Ansichten
+ const workflowView = document.querySelector('.workflow-container');
+ const dataView = document.getElementById('data-view');
+ const promptsView = document.getElementById('prompts-view');
+ const agentsView = document.getElementById('agents-view');
+
+ // DOM-Elemente
+ const workspaceList = document.getElementById('workspace-list');
+ const availableFiles = document.getElementById('available-files');
+ const selectedFiles = document.getElementById('selected-files');
+ const emptyFilesState = document.getElementById('empty-files-state');
+ const fileInput = document.getElementById('file-input');
+ const uploadBtn = document.getElementById('upload-btn');
+ const promptInput = document.getElementById('prompt-input');
+ const agentList = document.getElementById('agent-list');
+ const resetBtn = document.getElementById('reset-btn');
+ const startWorkflowBtn = document.getElementById('start-workflow-btn');
+ const executionLog = document.getElementById('execution-log');
+ const resultsContainer = document.getElementById('results-container');
+ const emptyResultsState = document.getElementById('empty-results-state');
+ const resultsList = document.getElementById('results-list');
+
+ // API-Funktionen
+ async function fetchWorkspaces() {
+ try {
+ const response = await fetch(`${API_BASE_URL}/workspaces`);
+ if (!response.ok) throw new Error('Fehler beim Abrufen der Workspaces');
+
+ const workspaces = await response.json();
+ state.workspaces = workspaces;
+
+ if (workspaces.length > 0) {
+ state.currentWorkspace = workspaces[0];
+ }
+
+ renderWorkspaces();
+ return workspaces;
+ } catch (error) {
+ console.error('Fehler beim Abrufen der Workspaces:', error);
+ return [];
+ }
+ }
+
+ async function fetchFiles() {
+ try {
+ const response = await fetch(`${API_BASE_URL}/files`);
+ if (!response.ok) throw new Error('Fehler beim Abrufen der Dateien');
+
+ const files = await response.json();
+ state.files = files;
+
+ renderFiles();
+ return files;
+ } catch (error) {
+ console.error('Fehler beim Abrufen der Dateien:', error);
+ return [];
+ }
+ }
+
+ async function uploadFile(file) {
+ try {
+ const formData = new FormData();
+ formData.append('file', file);
+
+ const response = await fetch(`${API_BASE_URL}/files/upload`, {
+ method: 'POST',
+ body: formData
+ });
+
+ if (!response.ok) throw new Error('Fehler beim Hochladen der Datei');
+
+ const newFile = await response.json();
+ return newFile;
+ } catch (error) {
+ console.error('Fehler beim Hochladen der Datei:', error);
+ return null;
+ }
+ }
+
+ async function runWorkflowAPI(workflowData) {
+ try {
+ const response = await fetch(`${API_BASE_URL}/workflow/run`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(workflowData)
+ });
+
+ if (!response.ok) throw new Error('Fehler beim Starten des Workflows');
+
+ const result = await response.json();
+ return result;
+ } catch (error) {
+ console.error('Fehler beim Starten des Workflows:', error);
+ return null;
+ }
+ }
+
+ async function fetchWorkflowStatus(workflowId) {
+ try {
+ const response = await fetch(`${API_BASE_URL}/workflow/${workflowId}/status`);
+ if (!response.ok) throw new Error('Fehler beim Abrufen des Workflow-Status');
+
+ const status = await response.json();
+ return status;
+ } catch (error) {
+ console.error('Fehler beim Abrufen des Workflow-Status:', error);
+ return null;
+ }
+ }
+
+ async function fetchWorkflowLogs(workflowId) {
+ try {
+ const response = await fetch(`${API_BASE_URL}/workflow/${workflowId}/logs`);
+ if (!response.ok) throw new Error('Fehler beim Abrufen der Workflow-Logs');
+
+ const logs = await response.json();
+ return logs;
+ } catch (error) {
+ console.error('Fehler beim Abrufen der Workflow-Logs:', error);
+ return [];
+ }
+ }
+
+ async function fetchWorkflowResults(workflowId) {
+ try {
+ const response = await fetch(`${API_BASE_URL}/workflow/${workflowId}/results`);
+ if (!response.ok) throw new Error('Fehler beim Abrufen der Workflow-Ergebnisse');
+
+ const results = await response.json();
+ return results;
+ } catch (error) {
+ console.error('Fehler beim Abrufen der Workflow-Ergebnisse:', error);
+ return [];
+ }
+ }
+
+ // Funktion zum Wechseln der Ansicht
+ function setActiveView(view) {
+ // Aktive Klasse von allen Menüpunkten entfernen
+ workflowLink.classList.remove('active');
+ dataLink.classList.remove('active');
+ promptsLink.classList.remove('active');
+ agentsLink.classList.remove('active');
+
+ // Alle Ansichten ausblenden
+ workflowView.style.display = 'none';
+ dataView.style.display = 'none';
+ promptsView.style.display = 'none';
+ agentsView.style.display = 'none';
+
+ // Aktive Ansicht und Menüpunkt setzen
+ activeView = view;
+
+ switch (view) {
+ case 'workflow':
+ workflowLink.classList.add('active');
+ workflowView.style.display = 'flex';
+ break;
+ case 'data':
+ dataLink.classList.add('active');
+ dataView.style.display = 'block';
+ // Aktualisiere Daten bei Ansichtswechsel
+ fetchFiles();
+ break;
+ case 'prompts':
+ promptsLink.classList.add('active');
+ promptsView.style.display = 'block';
+ // Prompts laden wenn wir die Ansicht wechseln
+ if (state.currentWorkspace) {
+ renderPrompts();
+ }
+ break;
+ case 'agents':
+ agentsLink.classList.add('active');
+ agentsView.style.display = 'block';
+ // Agenten laden wenn wir die Ansicht wechseln
+ if (state.currentWorkspace) {
+ renderAgentsList();
+ }
+ break;
+ }
+ }
+
+ // Workspaces rendern
+ function renderWorkspaces() {
+ workspaceList.innerHTML = '';
+ state.workspaces.forEach(workspace => {
+ const li = document.createElement('li');
+ li.className = `workspace-item ${workspace.id === state.currentWorkspace?.id ? 'active' : ''}`;
+ li.innerHTML = `
+
+ ${workspace.name}
+ `;
+ li.addEventListener('click', async () => {
+ state.currentWorkspace = workspace;
+ state.selectedFiles = [];
+ state.selectedAgents = [];
+ state.prompt = "";
+
+ renderWorkspaces();
+ renderFiles();
+ renderSelectedFiles();
+ renderAgents();
+ });
+ workspaceList.appendChild(li);
+ });
+ }
+
+ // Verfügbare Dateien rendern
+ function renderFiles() {
+ availableFiles.innerHTML = '';
+ state.files.forEach(file => {
+ const li = document.createElement('li');
+ li.className = 'file-item';
+ const isSelected = state.selectedFiles.some(f => f.id === file.id);
+ li.innerHTML = `
+
+
+
+
+ ${file.size || ''}
+ `;
+ const checkbox = li.querySelector(`#file-${file.id}`);
+ checkbox.addEventListener('change', () => {
+ if (checkbox.checked) {
+ state.selectedFiles.push(file);
+ } else {
+ state.selectedFiles = state.selectedFiles.filter(f => f.id !== file.id);
+ }
+ renderSelectedFiles();
+ });
+ availableFiles.appendChild(li);
+ });
+ }
+
+ // Ausgewählte Dateien rendern
+ function renderSelectedFiles() {
+ if (state.selectedFiles.length === 0) {
+ emptyFilesState.style.display = 'flex';
+ selectedFiles.innerHTML = '';
+ } else {
+ emptyFilesState.style.display = 'none';
+ selectedFiles.innerHTML = '';
+ state.selectedFiles.forEach(file => {
+ const li = document.createElement('li');
+ li.className = 'selected-file-item';
+ li.innerHTML = `
+
+
+ ${file.name}
+
+
+ `;
+ selectedFiles.appendChild(li);
+ });
+
+ // Event-Listener für Entfernen-Buttons
+ document.querySelectorAll('.remove-file-btn').forEach(btn => {
+ btn.addEventListener('click', () => {
+ const fileId = btn.getAttribute('data-id');
+ state.selectedFiles = state.selectedFiles.filter(f => f.id !== fileId);
+ renderSelectedFiles();
+ renderFiles();
+ });
+ });
+ }
+ }
+
+ // Prompts rendern
+ function renderPrompts() {
+ const promptsContainer = document.getElementById('prompts-list');
+ if (!promptsContainer) return;
+
+ promptsContainer.innerHTML = '';
+
+ if (!state.currentWorkspace || !state.currentWorkspace.prompts || state.currentWorkspace.prompts.length === 0) {
+ promptsContainer.innerHTML = 'Keine Prompts im aktuellen Workspace verfügbar.
';
+ return;
+ }
+
+ state.currentWorkspace.prompts.forEach(prompt => {
+ const promptItem = document.createElement('div');
+ promptItem.className = 'prompt-item';
+ promptItem.innerHTML = `
+ ${prompt.content}
+ Erstellt am: ${new Date(prompt.created_at).toLocaleString()}
+
+
+
+ `;
+
+ // Event-Listener für "Verwenden"-Button
+ const useBtn = promptItem.querySelector('.use-prompt-btn');
+ useBtn.addEventListener('click', () => {
+ // Prompt zum aktuellen Workflow hinzufügen
+ promptInput.value = prompt.content;
+ state.prompt = prompt.content;
+ setActiveView('workflow');
+ });
+
+ promptsContainer.appendChild(promptItem);
+ });
+ }
+
+ // Agentenliste rendern
+ function renderAgentsList() {
+ const agentsContainer = document.getElementById('agents-list-container');
+ if (!agentsContainer) return;
+
+ agentsContainer.innerHTML = '';
+
+ if (!state.currentWorkspace || !state.currentWorkspace.agents || state.currentWorkspace.agents.length === 0) {
+ agentsContainer.innerHTML = 'Keine Agenten im aktuellen Workspace verfügbar.
';
+ return;
+ }
+
+ state.currentWorkspace.agents.forEach(agent => {
+ const agentItem = document.createElement('div');
+ agentItem.className = 'agent-list-item';
+ agentItem.innerHTML = `
+
+ ${agent.description || ''}
+
+ ${agent.capabilities ? agent.capabilities.map(cap => `${cap}`).join('') : ''}
+
+ `;
+ agentsContainer.appendChild(agentItem);
+ });
+ }
+
+ // Agenten für Workflow rendern
+ function renderAgents() {
+ agentList.innerHTML = '';
+ if (!state.currentWorkspace || !state.currentWorkspace.agents || state.currentWorkspace.agents.length === 0) {
+ agentList.innerHTML = 'Keine Agenten im ausgewählten Workspace verfügbar.
';
+ return;
+ }
+
+ state.currentWorkspace.agents.forEach(agent => {
+ const li = document.createElement('li');
+ li.className = 'agent-item';
+ const isSelected = state.selectedAgents.some(a => a.id === agent.id);
+ li.innerHTML = `
+
+ ${agent.description || ''}
+ `;
+ const checkbox = li.querySelector(`#agent-${agent.id}`);
+ checkbox.addEventListener('change', () => {
+ if (checkbox.checked) {
+ state.selectedAgents.push(agent);
+ } else {
+ state.selectedAgents = state.selectedAgents.filter(a => a.id !== agent.id);
+ }
+ });
+ agentList.appendChild(li);
+ });
+ }
+
+ // Ausführungsprotokoll aktualisieren und rendern
+ function updateLogs(logs) {
+ state.logs = logs;
+ renderLogs();
+ }
+
+ // Protokoll rendern
+ function renderLogs() {
+ if (state.logs.length === 0) {
+ executionLog.innerHTML = 'Workflow noch nicht gestartet. Protokoll wird hier angezeigt.
';
+ return;
+ }
+
+ executionLog.innerHTML = '';
+ state.logs.forEach(log => {
+ const logEntry = document.createElement('div');
+ logEntry.className = 'log-entry';
+ logEntry.innerHTML = `
+ [${new Date(log.timestamp).toLocaleTimeString()}]
+ ${log.message}
+ `;
+ executionLog.appendChild(logEntry);
+ });
+
+ // Zum Ende scrollen
+ executionLog.scrollTop = executionLog.scrollHeight;
+ }
+
+ // Ergebnisse aktualisieren und rendern
+ function updateResults(results) {
+ state.results = results;
+ renderResults();
+ }
+
+ // Ergebnisse rendern
+ function renderResults() {
+ if (state.results.length === 0) {
+ emptyResultsState.style.display = 'flex';
+ resultsList.style.display = 'none';
+ return;
+ }
+
+ emptyResultsState.style.display = 'none';
+ resultsList.style.display = 'block';
+ resultsList.innerHTML = '';
+
+ state.results.forEach(result => {
+ const resultItem = document.createElement('div');
+ resultItem.className = 'result-item';
+
+ if (result.type === 'text') {
+ resultItem.innerHTML = `
+
+ ${result.content}
+ `;
+ } else if (result.type === 'chart') {
+ resultItem.innerHTML = `
+
+
+
Umsatzentwicklung nach Quartal
+
${result.content}
+
+ `;
+ }
+
+ resultsList.appendChild(resultItem);
+ });
+ }
+
+ // Workflow-Ausführung
+ async function runWorkflow() {
+ if (state.selectedFiles.length === 0 || state.selectedAgents.length === 0 || !promptInput.value.trim()) {
+ alert("Bitte wählen Sie Dateien und Agenten aus und geben Sie einen Prompt ein.");
+ return;
+ }
+
+ state.isRunning = true;
+ state.prompt = promptInput.value;
+ state.logs = [];
+ state.results = [];
+
+ startWorkflowBtn.textContent = 'Wird ausgeführt...';
+ startWorkflowBtn.classList.add('running');
+ startWorkflowBtn.disabled = true;
+
+ renderLogs();
+ renderResults();
+
+ // API-Aufruf an das Backend
+ const workflowData = {
+ workspace_id: state.currentWorkspace.id,
+ files: state.selectedFiles.map(file => file.id),
+ agents: state.selectedAgents.map(agent => agent.id),
+ prompt: state.prompt,
+ workflow_name: "Workflow " + new Date().toLocaleString()
+ };
+
+ try {
+ // Workflow starten
+ const response = await runWorkflowAPI(workflowData);
+
+ if (response && response.workflow_id) {
+ state.currentWorkflowId = response.workflow_id;
+
+ // Polling für Status, Logs und Ergebnisse
+ pollWorkflowStatus();
+ } else {
+ throw new Error("Workflow konnte nicht gestartet werden");
+ }
+ } catch (error) {
+ console.error("Fehler beim Starten des Workflows:", error);
+ state.isRunning = false;
+ startWorkflowBtn.textContent = 'Workflow starten';
+ startWorkflowBtn.classList.remove('running');
+ startWorkflowBtn.disabled = false;
+
+ alert("Fehler beim Starten des Workflows: " + error.message);
+ }
+ }
+
+ // Polling für Workflow-Status, Logs und Ergebnisse
+ async function pollWorkflowStatus() {
+ if (!state.currentWorkflowId || !state.isRunning) return;
+
+ try {
+ // Status abrufen
+ const status = await fetchWorkflowStatus(state.currentWorkflowId);
+
+ // Logs abrufen und anzeigen
+ const logs = await fetchWorkflowLogs(state.currentWorkflowId);
+ updateLogs(logs);
+
+ // Wenn der Workflow abgeschlossen ist, Ergebnisse abrufen
+ if (status && (status.status === 'completed' || status.status === 'failed')) {
+ const results = await fetchWorkflowResults(state.currentWorkflowId);
+ updateResults(results);
+
+ state.isRunning = false;
+ startWorkflowBtn.textContent = 'Workflow starten';
+ startWorkflowBtn.classList.remove('running');
+ startWorkflowBtn.disabled = false;
+
+ return; // Polling beenden
+ }
+
+ // Weiteres Polling nach kurzer Verzögerung
+ setTimeout(pollWorkflowStatus, 2000);
+ } catch (error) {
+ console.error("Fehler beim Abrufen des Workflow-Status:", error);
+ state.isRunning = false;
+ startWorkflowBtn.textContent = 'Workflow starten';
+ startWorkflowBtn.classList.remove('running');
+ startWorkflowBtn.disabled = false;
+ }
+ }
+
+ // Zurücksetzen
+ function resetWorkflow() {
+ state.selectedFiles = [];
+ state.selectedAgents = [];
+ promptInput.value = "";
+ state.prompt = "";
+
+ renderFiles();
+ renderSelectedFiles();
+ renderAgents();
+ }
+
+ // Event-Listener für Menüpunkte
+ workflowLink.addEventListener('click', function(e) {
+ e.preventDefault();
+ setActiveView('workflow');
+ });
+
+ dataLink.addEventListener('click', function(e) {
+ e.preventDefault();
+ setActiveView('data');
+ });
+
+ promptsLink.addEventListener('click', function(e) {
+ e.preventDefault();
+ setActiveView('prompts');
+ });
+
+ agentsLink.addEventListener('click', function(e) {
+ e.preventDefault();
+ setActiveView('agents');
+ });
+
+ // Event-Listener
+ uploadBtn.addEventListener('click', () => fileInput.click());
+
+ fileInput.addEventListener('change', async (e) => {
+ if (e.target.files.length > 0) {
+ // Dateien hochladen
+ for (const file of e.target.files) {
+ try {
+ const newFile = await uploadFile(file);
+ if (newFile) {
+ state.files.push(newFile);
+ state.selectedFiles.push(newFile);
+ }
+ } catch (error) {
+ console.error("Fehler beim Hochladen der Datei:", error);
+ }
+ }
+
+ renderFiles();
+ renderSelectedFiles();
+ fileInput.value = "";
+ }
+ });
+
+ promptInput.addEventListener('input', (e) => {
+ state.prompt = e.target.value;
+ });
+
+ resetBtn.addEventListener('click', resetWorkflow);
+ startWorkflowBtn.addEventListener('click', runWorkflow);
+
+ // Initialisierung
+ async function init() {
+ // Daten vom Backend laden
+ await fetchWorkspaces();
+ await fetchFiles();
+
+ // UI initialisieren
+ renderFiles();
+ renderSelectedFiles();
+ renderAgents();
+ renderLogs();
+ renderResults();
+
+ // Initial die Standard-Ansicht setzen
+ setActiveView(activeView);
+ }
+
+ // Anwendung initialisieren
+ init();
+});
\ No newline at end of file
diff --git a/frontend/styles.css b/frontend/styles.css
new file mode 100644
index 00000000..1f419be2
--- /dev/null
+++ b/frontend/styles.css
@@ -0,0 +1,555 @@
+/* Grundlegende Resets und Fonts */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ background-color: #f0f2f5;
+ color: #333;
+ line-height: 1.6;
+}
+
+ul {
+ list-style: none;
+}
+
+a {
+ text-decoration: none;
+ color: inherit;
+}
+
+button {
+ cursor: pointer;
+ border: none;
+ background: none;
+ font-family: inherit;
+}
+
+/* Navbar */
+.navbar {
+ background-color: #2563eb;
+ color: white;
+ padding: 1rem;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.navbar-container {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ max-width: 1800px;
+ margin: 0 auto;
+}
+
+.navbar-logo {
+ font-size: 1.5rem;
+ font-weight: 600;
+}
+
+.navbar-user {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+}
+
+.icon-button {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 2rem;
+ height: 2rem;
+ border-radius: 50%;
+ color: white;
+ transition: background-color 0.2s;
+}
+
+.icon-button:hover {
+ background-color: rgba(255, 255, 255, 0.2);
+}
+
+/* App Container Layout */
+.app-container {
+ display: flex;
+ max-width: 1800px;
+ margin: 0 auto;
+ min-height: calc(100vh - 4rem);
+}
+
+/* Sidebar */
+.sidebar {
+ width: 250px;
+ background-color: white;
+ box-shadow: 2px 0 5px rgba(0, 0, 0, 0.05);
+ padding: 1.5rem 1rem;
+ flex-shrink: 0;
+}
+
+.workspace-section h2 {
+ font-size: 1.2rem;
+ margin-bottom: 0.5rem;
+ font-weight: 600;
+}
+
+.workspace-list {
+ margin-bottom: 1.5rem;
+}
+
+.workspace-item {
+ padding: 0.5rem 0.75rem;
+ border-radius: 0.375rem;
+ margin-bottom: 0.25rem;
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+}
+
+.workspace-item i {
+ margin-right: 0.5rem;
+ color: #4b5563;
+}
+
+.workspace-item:hover {
+ background-color: #f3f4f6;
+}
+
+.workspace-item.active {
+ background-color: #e0f2fe;
+ color: #1d4ed8;
+}
+
+.sidebar-nav {
+ margin-top: 1rem;
+}
+
+.sidebar-item {
+ padding: 0.75rem;
+ border-radius: 0.375rem;
+ margin-bottom: 0.25rem;
+}
+
+.sidebar-item a {
+ display: flex;
+ align-items: center;
+}
+
+.sidebar-item i {
+ margin-right: 0.75rem;
+ width: 1.25rem;
+ text-align: center;
+}
+
+.sidebar-item:hover {
+ background-color: #f3f4f6;
+}
+
+.sidebar-item.active {
+ background-color: #e0f2fe;
+ color: #1d4ed8;
+}
+
+/* Main Content */
+.main-content {
+ flex: 1;
+ padding: 1.5rem;
+ overflow-y: auto;
+}
+
+.workflow-container {
+ display: flex;
+ gap: 1.5rem;
+}
+
+.config-panel, .results-panel {
+ flex: 1;
+}
+
+/* Cards */
+.card {
+ background-color: white;
+ border-radius: 0.5rem;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+ padding: 1.25rem;
+ margin-bottom: 1.25rem;
+}
+
+h2 {
+ font-size: 1.5rem;
+ font-weight: 600;
+ margin-bottom: 1rem;
+}
+
+h3 {
+ font-size: 1.125rem;
+ font-weight: 600;
+ margin-bottom: 1rem;
+ color: #4b5563;
+}
+
+h4 {
+ font-size: 0.875rem;
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+ color: #6b7280;
+}
+
+/* File Selection */
+.files-container {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.section-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 0.5rem;
+ font-weight: 500;
+}
+
+.upload-btn {
+ background-color: #fff;
+ border: 1px solid #d1d5db;
+ border-radius: 0.375rem;
+ padding: 0.375rem 0.75rem;
+ font-size: 0.875rem;
+ color: #4b5563;
+ display: flex;
+ align-items: center;
+ gap: 0.375rem;
+ transition: all 0.2s;
+}
+
+.upload-btn:hover {
+ background-color: #f9fafb;
+ border-color: #9ca3af;
+}
+
+.file-list {
+ max-height: 200px;
+ overflow-y: auto;
+ border: 1px solid #e5e7eb;
+ border-radius: 0.375rem;
+ background-color: #f9fafb;
+}
+
+.file-item {
+ padding: 0.625rem;
+ border-bottom: 1px solid #e5e7eb;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ background-color: white;
+}
+
+.file-item:last-child {
+ border-bottom: none;
+}
+
+.file-item-name {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ flex: 1;
+}
+
+.file-item-info {
+ font-size: 0.75rem;
+ color: #6b7280;
+}
+
+.selected-files-container {
+ border: 1px dashed #d1d5db;
+ border-radius: 0.375rem;
+ min-height: 100px;
+ background-color: #f9fafb;
+}
+
+.empty-state {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 100px;
+ color: #9ca3af;
+ gap: 0.5rem;
+}
+
+.empty-state i {
+ font-size: 1.5rem;
+}
+
+.selected-file-list {
+ padding: 0.5rem;
+}
+
+.selected-file-item {
+ background-color: white;
+ border: 1px solid #e5e7eb;
+ border-radius: 0.375rem;
+ padding: 0.5rem 0.75rem;
+ margin-bottom: 0.5rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.selected-file-item:last-child {
+ margin-bottom: 0;
+}
+
+.remove-file-btn {
+ color: #ef4444;
+ width: 1.5rem;
+ height: 1.5rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 50%;
+ transition: background-color 0.2s;
+}
+
+.remove-file-btn:hover {
+ background-color: #fee2e2;
+}
+
+/* Prompt input */
+#prompt-input {
+ width: 100%;
+ min-height: 150px;
+ border: 1px solid #d1d5db;
+ border-radius: 0.375rem;
+ padding: 0.75rem;
+ font-family: inherit;
+ resize: vertical;
+ font-size: 0.875rem;
+}
+
+#prompt-input:focus {
+ outline: none;
+ border-color: #2563eb;
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
+}
+
+/* Agent list */
+.agent-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+
+.agent-item {
+ background-color: #f9fafb;
+ border: 1px solid #e5e7eb;
+ border-radius: 0.375rem;
+ padding: 0.75rem;
+}
+
+.agent-header {
+ display: flex;
+ align-items: center;
+}
+
+.agent-checkbox {
+ margin-right: 0.75rem;
+}
+
+.agent-name {
+ font-weight: 500;
+}
+
+.agent-description {
+ margin-top: 0.25rem;
+ font-size: 0.875rem;
+ color: #6b7280;
+ margin-left: 2rem;
+}
+
+/* Action buttons */
+.action-buttons {
+ display: flex;
+ justify-content: space-between;
+ gap: 0.75rem;
+}
+
+.reset-btn {
+ background-color: #f3f4f6;
+ color: #4b5563;
+ border-radius: 0.375rem;
+ padding: 0.625rem 1.25rem;
+ font-weight: 500;
+ transition: background-color 0.2s;
+}
+
+.reset-btn:hover {
+ background-color: #e5e7eb;
+}
+
+.start-btn {
+ background-color: #10b981;
+ color: white;
+ border-radius: 0.375rem;
+ padding: 0.625rem 1.25rem;
+ font-weight: 500;
+ transition: background-color 0.2s;
+}
+
+.start-btn:hover {
+ background-color: #059669;
+}
+
+.start-btn.running {
+ background-color: #9ca3af;
+ cursor: not-allowed;
+}
+
+/* Log Container */
+.log-container {
+ background-color: #111827;
+ color: #34d399;
+ border-radius: 0.375rem;
+ padding: 0.75rem;
+ font-family: 'Consolas', 'Monaco', monospace;
+ font-size: 0.875rem;
+ height: 300px;
+ overflow-y: auto;
+}
+
+.log-empty-state {
+ color: #6b7280;
+ font-style: italic;
+}
+
+.log-entry {
+ margin-bottom: 0.25rem;
+}
+
+.log-time {
+ color: #9ca3af;
+}
+
+.log-message {
+ margin-left: 0.5rem;
+}
+
+.log-info {
+ color: #ffffff;
+}
+
+.log-success {
+ color: #34d399;
+}
+
+.log-error {
+ color: #f87171;
+}
+
+.log-start {
+ color: #60a5fa;
+}
+
+.log-complete {
+ color: #c084fc;
+}
+
+/* Results Container */
+.results-container {
+ min-height: 200px;
+}
+
+.results-empty-state {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ background-color: #f9fafb;
+ border: 1px solid #e5e7eb;
+ border-radius: 0.375rem;
+ padding: 2.5rem 1rem;
+ color: #6b7280;
+ text-align: center;
+}
+
+.sub-text {
+ font-size: 0.875rem;
+ color: #9ca3af;
+ margin-top: 0.25rem;
+}
+
+.results-list {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.result-item {
+ background-color: #f9fafb;
+ border: 1px solid #e5e7eb;
+ border-radius: 0.375rem;
+ padding: 1rem;
+}
+
+.result-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ margin-bottom: 0.75rem;
+}
+
+.result-title {
+ font-weight: 600;
+ font-size: 1.125rem;
+}
+
+.result-agent {
+ font-size: 0.75rem;
+ color: #6b7280;
+}
+
+.save-btn {
+ display: flex;
+ align-items: center;
+ gap: 0.25rem;
+ color: #2563eb;
+ font-size: 0.875rem;
+ font-weight: 500;
+ padding: 0.25rem 0.5rem;
+ border-radius: 0.25rem;
+ transition: background-color 0.2s;
+}
+
+.save-btn:hover {
+ background-color: #e0f2fe;
+}
+
+.result-content {
+ background-color: white;
+ border: 1px solid #e5e7eb;
+ border-radius: 0.375rem;
+ padding: 0.75rem;
+ font-size: 0.875rem;
+ white-space: pre-line;
+}
+
+.chart-container {
+ background-color: white;
+ border: 1px solid #e5e7eb;
+ border-radius: 0.375rem;
+ padding: 0.75rem;
+ text-align: center;
+ height: 200px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #6b7280;
+}
+
+.chart-title {
+ border-bottom: 1px solid #e5e7eb;
+ padding-bottom: 0.5rem;
+ margin-bottom: 0.75rem;
+ font-weight: 500;
+}
\ No newline at end of file
diff --git a/backend/backend/__init__.py b/ida_prod/backend/backend/__init__.py
similarity index 100%
rename from backend/backend/__init__.py
rename to ida_prod/backend/backend/__init__.py
diff --git a/backend/backend/asgi.py b/ida_prod/backend/backend/asgi.py
similarity index 100%
rename from backend/backend/asgi.py
rename to ida_prod/backend/backend/asgi.py
diff --git a/backend/backend/settings.py b/ida_prod/backend/backend/settings.py
similarity index 100%
rename from backend/backend/settings.py
rename to ida_prod/backend/backend/settings.py
diff --git a/backend/backend/urls.py b/ida_prod/backend/backend/urls.py
similarity index 100%
rename from backend/backend/urls.py
rename to ida_prod/backend/backend/urls.py
diff --git a/backend/backend/views.py b/ida_prod/backend/backend/views.py
similarity index 100%
rename from backend/backend/views.py
rename to ida_prod/backend/backend/views.py
diff --git a/backend/backend/wsgi.py b/ida_prod/backend/backend/wsgi.py
similarity index 100%
rename from backend/backend/wsgi.py
rename to ida_prod/backend/backend/wsgi.py
diff --git a/backend/manage.py b/ida_prod/backend/manage.py
similarity index 100%
rename from backend/manage.py
rename to ida_prod/backend/manage.py
diff --git a/frontend/frontend/.gitignore b/ida_prod/frontend/frontend/.gitignore
similarity index 100%
rename from frontend/frontend/.gitignore
rename to ida_prod/frontend/frontend/.gitignore
diff --git a/frontend/frontend/README.md b/ida_prod/frontend/frontend/README.md
similarity index 100%
rename from frontend/frontend/README.md
rename to ida_prod/frontend/frontend/README.md
diff --git a/frontend/frontend/package-lock.json b/ida_prod/frontend/frontend/package-lock.json
similarity index 100%
rename from frontend/frontend/package-lock.json
rename to ida_prod/frontend/frontend/package-lock.json
diff --git a/frontend/frontend/package.json b/ida_prod/frontend/frontend/package.json
similarity index 100%
rename from frontend/frontend/package.json
rename to ida_prod/frontend/frontend/package.json
diff --git a/frontend/frontend/public/favicon.ico b/ida_prod/frontend/frontend/public/favicon.ico
similarity index 100%
rename from frontend/frontend/public/favicon.ico
rename to ida_prod/frontend/frontend/public/favicon.ico
diff --git a/frontend/frontend/public/index.html b/ida_prod/frontend/frontend/public/index.html
similarity index 100%
rename from frontend/frontend/public/index.html
rename to ida_prod/frontend/frontend/public/index.html
diff --git a/frontend/frontend/public/logo192.png b/ida_prod/frontend/frontend/public/logo192.png
similarity index 100%
rename from frontend/frontend/public/logo192.png
rename to ida_prod/frontend/frontend/public/logo192.png
diff --git a/frontend/frontend/public/logo512.png b/ida_prod/frontend/frontend/public/logo512.png
similarity index 100%
rename from frontend/frontend/public/logo512.png
rename to ida_prod/frontend/frontend/public/logo512.png
diff --git a/frontend/frontend/public/manifest.json b/ida_prod/frontend/frontend/public/manifest.json
similarity index 100%
rename from frontend/frontend/public/manifest.json
rename to ida_prod/frontend/frontend/public/manifest.json
diff --git a/frontend/frontend/public/robots.txt b/ida_prod/frontend/frontend/public/robots.txt
similarity index 100%
rename from frontend/frontend/public/robots.txt
rename to ida_prod/frontend/frontend/public/robots.txt
diff --git a/frontend/frontend/src/App.css b/ida_prod/frontend/frontend/src/App.css
similarity index 100%
rename from frontend/frontend/src/App.css
rename to ida_prod/frontend/frontend/src/App.css
diff --git a/frontend/frontend/src/App.js b/ida_prod/frontend/frontend/src/App.js
similarity index 100%
rename from frontend/frontend/src/App.js
rename to ida_prod/frontend/frontend/src/App.js
diff --git a/frontend/frontend/src/App.test.js b/ida_prod/frontend/frontend/src/App.test.js
similarity index 100%
rename from frontend/frontend/src/App.test.js
rename to ida_prod/frontend/frontend/src/App.test.js
diff --git a/frontend/frontend/src/api.js b/ida_prod/frontend/frontend/src/api.js
similarity index 100%
rename from frontend/frontend/src/api.js
rename to ida_prod/frontend/frontend/src/api.js
diff --git a/frontend/frontend/src/index.css b/ida_prod/frontend/frontend/src/index.css
similarity index 100%
rename from frontend/frontend/src/index.css
rename to ida_prod/frontend/frontend/src/index.css
diff --git a/frontend/frontend/src/index.js b/ida_prod/frontend/frontend/src/index.js
similarity index 100%
rename from frontend/frontend/src/index.js
rename to ida_prod/frontend/frontend/src/index.js
diff --git a/frontend/frontend/src/logo.svg b/ida_prod/frontend/frontend/src/logo.svg
similarity index 100%
rename from frontend/frontend/src/logo.svg
rename to ida_prod/frontend/frontend/src/logo.svg
diff --git a/frontend/frontend/src/reportWebVitals.js b/ida_prod/frontend/frontend/src/reportWebVitals.js
similarity index 100%
rename from frontend/frontend/src/reportWebVitals.js
rename to ida_prod/frontend/frontend/src/reportWebVitals.js
diff --git a/frontend/frontend/src/setupTests.js b/ida_prod/frontend/frontend/src/setupTests.js
similarity index 100%
rename from frontend/frontend/src/setupTests.js
rename to ida_prod/frontend/frontend/src/setupTests.js
diff --git a/ida_prod/requirements.txt b/ida_prod/requirements.txt
new file mode 100644
index 00000000..9ecd9896
--- /dev/null
+++ b/ida_prod/requirements.txt
@@ -0,0 +1,9 @@
+Django
+gunicorn
+django-cors-headers
+djangorestframework
+whitenoise
+openai
+Flask
+requests
+gunicorn
\ No newline at end of file
diff --git a/ida_prod/start.sh b/ida_prod/start.sh
new file mode 100644
index 00000000..276092ae
--- /dev/null
+++ b/ida_prod/start.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# Installiere Abhängigkeiten
+cd backend
+python -m venv venv
+source venv/bin/activate
+pip install -r requirements.txt
+
+# Migration durchführen
+python manage.py migrate
+python manage.py collectstatic --noinput
+
+# React bauen
+cd ../frontend
+npm install
+npm run build
+
+# React-Frontend nach Django-Statisches-Verzeichnis verschieben
+cp -r build/* ../backend/staticfiles/
+
+# Starte Gunicorn (Django-Server)
+cd ../backend
+gunicorn backend.wsgi --bind 0.0.0.0:8000
diff --git a/readme.md b/readme.md
new file mode 100644
index 00000000..525d7f72
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,168 @@
+# Data Platform - Multi-Agent Service
+
+Eine Full-Stack-Webapplikation für die Ausführung von Multi-Agent-Workflows zur Verarbeitung und Analyse von Daten basierend auf natürlichsprachlichen Benutzeranfragen.
+
+Hier: http://localhost:8000/docs
+
+## Übersicht
+
+Das System ermöglicht Benutzern:
+- Hochladen und Verwalten verschiedener Datendateien
+- Definieren von Prompts/Anweisungen für KI-Agenten
+- Auswählen und Kombinieren spezialisierter Agenten
+- Ausführen von Workflows mit Echtzeit-Protokollierung
+- Visualisieren und Verwalten der Ergebnisse
+
+## Projektstruktur
+
+Das Projekt besteht aus zwei Hauptkomponenten:
+
+### Frontend (HTML/CSS/JavaScript)
+
+- `index.html` - Hauptstruktur der Benutzeroberfläche
+- `styles.css` - Umfangreiches CSS für das responsive Design
+- `script.js` - Client-seitige Logik für Interaktionen
+
+### Backend (Python/FastAPI)
+
+- `app.py` - Hauptanwendung mit API-Endpunkten
+- `models.py` - Datenmodelle und Validierungsschemas
+- `database.py` - Datenpersistenz (JSON-basiert für Demo)
+- `agent_service.py` - Multi-Agent-Orchestrierung
+- `requirements.txt` - Python-Abhängigkeiten
+
+## Hauptfunktionen
+
+### Workspace-Management
+- Mehrere Workspaces für verschiedene Projekte
+- Organisierte Gruppenarbeit mit geteilten Ressourcen
+
+### Datei-Verarbeitung
+- Upload verschiedener Dateitypen (PDF, Excel, Bilder, etc.)
+- Automatische Erkennung und Kategorisierung
+
+### Agent-Orchestrierung
+- Kombination verschiedener Agent-Typen:
+ - **Datenanalyse-Agent**: Extrahiert Insights aus strukturierten Daten
+ - **Visualisierungs-Agent**: Erstellt Diagramme und visuelle Darstellungen
+ - **Text-Generator**: Verfasst Berichte und Zusammenfassungen
+ - **Web-Scraper**: Sammelt externe Daten
+ - **Marktanalyse-Agent**: Spezialisiert auf Wettbewerbsanalyse
+
+### Workflow-Ausführung
+- Echtzeit-Protokollierung des Fortschritts
+- Vollständige Nachverfolgbarkeit aller Schritte
+
+### Ergebnis-Management
+- Strukturierte Darstellung von Analysen, Diagrammen und Berichten
+- Export- und Sharing-Funktionen
+
+## Installation und Einrichtung
+
+### Voraussetzungen
+- Python 3.8+
+- Ein moderner Webbrowser
+- Optional: Node.js für Entwicklungswerkzeuge
+
+### Frontend-Installation
+1. Klonen des Repositories
+2. Platzieren der Frontend-Dateien auf einem Webserver oder lokalen Entwicklungsserver:
+ ```bash
+ # Mit Python einen einfachen HTTP-Server starten
+ python -m http.server 8080
+ ```
+
+### Backend-Installation
+1. Virtuelle Umgebung erstellen und aktivieren:
+ ```bash
+ python -m venv venv
+ source venv/bin/activate # Linux/Mac
+ venv\Scripts\activate # Windows
+ ```
+
+2. Abhängigkeiten installieren:
+ ```bash
+ pip install -r requirements.txt
+ ```
+
+3. Server starten:
+ ```bash
+ uvicorn app:app --reload --host 0.0.0.0 --port 8000
+ ```
+
+4. Zugangspunkte:
+ - Frontend: `http://localhost:8080`
+ - Backend API: `http://localhost:8000`
+ - API-Dokumentation: `http://localhost:8000/docs`
+
+## Verwendung: Der Customer Journey
+
+### 1. Workspace auswählen oder erstellen
+- Wählen Sie einen vorhandenen Workspace oder erstellen Sie einen neuen für Ihr Projekt
+
+### 2. Dateien hochladen
+- Laden Sie die zu analysierenden Dateien hoch
+- Das System erkennt automatisch Dateitypen und bereitet sie für die Verarbeitung vor
+
+### 3. Prompt formulieren
+- Definieren Sie in natürlicher Sprache, was Sie analysieren möchten
+- Je präziser Ihre Anweisungen, desto zielgerichteter die Ergebnisse
+
+### 4. Agenten konfigurieren
+- Wählen Sie die passenden Agenten für Ihre Aufgabe
+- Kombinieren Sie Agenten für umfassendere Analysen
+ - Datenanalyse → Visualisierung → Textgenerierung
+
+### 5. Workflow ausführen
+- Starten Sie den Workflow und verfolgen Sie die Ausführung in Echtzeit
+- Im linken Bereich sehen Sie die Konfiguration
+- Im rechten Bereich werden Protokoll und Ergebnisse angezeigt
+
+### 6. Ergebnisse verwenden
+- Sehen Sie Analysen, Diagramme und Berichte ein
+- Exportieren oder teilen Sie die Ergebnisse
+- Iterieren Sie bei Bedarf mit angepassten Prompts oder Agent-Konfigurationen
+
+## Anpassung und Erweiterung
+
+### Integration mit echten KI-Diensten
+Die aktuelle Implementierung simuliert die Agent-Verarbeitung. Für eine produktive Nutzung:
+
+1. Erweitern Sie `agent_service.py` mit Integrationen zu:
+ - OpenAI GPT-Modellen (ChatGPT, GPT-4)
+ - Claude von Anthropic
+ - Eigenentwickelten Modellen mit spezieller Expertise
+
+2. Implementieren Sie robuste Datei-Parser für:
+ - PDF-Dokumente mit OCR
+ - Excel- und CSV-Verarbeitung
+ - Bild- und Medienanalyse
+
+3. Ergänzen Sie Authentifizierung und Autorisierung:
+ - Benutzer-Accounts mit Rollenkonzept
+ - API-Schlüsselverwaltung für externe Dienste
+ - Sichere Datenspeicherung
+
+### Datenbank-Migration
+Für größere Installationen die JSON-basierte Datenbank ersetzen durch:
+- PostgreSQL für relationale Daten
+- MongoDB für Dokumente und unstrukturierte Daten
+- Redis für Caching und Workflow-Status
+
+## Technische Details
+
+### Frontend-Architektur
+- Vanilla JavaScript ohne Framework-Abhängigkeiten
+- Modularer CSS-Ansatz für einfache Anpassungen
+- Responsive Design für Desktop und mobile Nutzung
+
+### Backend-Architektur
+- FastAPI für hohe Performance und automatische API-Dokumentation
+- Asynchrone Verarbeitung für parallele Agent-Ausführung
+- Erweiterbare Service-Struktur für einfache Integration neuer Agententypen
+
+## Lizenz
+
+PRIVATE LICENSE PATRICK MOTSCH ValueOn AG
+---
+Für Fragen oder Unterstützung wenden Sie sich bitte an p.motsch@valueon.ch
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 9ecd9896..79715519 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,9 +1,11 @@
-Django
-gunicorn
-django-cors-headers
-djangorestframework
-whitenoise
-openai
-Flask
-requests
-gunicorn
\ No newline at end of file
+fastapi==0.103.1
+uvicorn==0.23.2
+python-multipart==0.0.6
+pydantic==2.4.2
+typing-extensions==4.8.0
+python-dateutil==2.8.2
+six==1.16.0
+starlette==0.27.0
+anyio==3.7.1
+idna==3.4
+sniffio==1.3.0
\ No newline at end of file
diff --git a/start.bat b/start.bat
new file mode 100644
index 00000000..1a7c2e65
--- /dev/null
+++ b/start.bat
@@ -0,0 +1,53 @@
+@echo off
+echo Data Platform - Multi-Agent Service
+echo Startskript fuer Frontend und Backend
+echo ----------------------------------------
+
+:: Verzeichnisstruktur erstellen, falls sie nicht existiert
+if not exist backend\data mkdir backend\data
+if not exist backend\uploads mkdir backend\uploads
+if not exist backend\results mkdir backend\results
+if not exist backend\static mkdir backend\static
+
+:: Prüfen, ob Python installiert ist
+python --version >nul 2>&1
+if %errorlevel% neq 0 (
+ echo Python ist nicht installiert. Bitte installieren Sie Python 3.8 oder hoeher.
+ exit /b 1
+)
+
+:: Virtuelle Umgebung erstellen, falls sie nicht existiert
+if not exist backend\venv (
+ echo Erstelle virtuelle Python-Umgebung...
+ cd backend
+ python -m venv venv
+ cd ..
+)
+
+:: Virtuelle Umgebung aktivieren
+echo Aktiviere virtuelle Umgebung...
+call backend\venv\Scripts\activate
+
+:: Abhängigkeiten installieren
+echo Installiere Abhaengigkeiten...
+pip install -r requirements.txt
+
+:: Starte Backend in neuem Fenster
+echo Starte Backend-Server...
+start cmd /k "cd backend && call venv\Scripts\activate && uvicorn app:app --reload --host 0.0.0.0 --port 8000"
+
+:: Kurz warten, um sicherzustellen, dass das Backend startet
+timeout /t 2 >nul
+
+:: Starte Frontend-Server in neuem Fenster
+echo Starte Frontend-Server...
+start cmd /k "cd frontend && python -m http.server 8080"
+
+echo ----------------------------------------
+echo Server wurden gestartet!
+echo Frontend laeuft auf: http://localhost:8080
+echo Backend API laeuft auf: http://localhost:8000
+echo API-Dokumentation: http://localhost:8000/docs
+echo Schliesse die Kommandozeilenfenster, um die Server zu beenden.
+
+pause
\ No newline at end of file
diff --git a/start.sh b/start.sh
index 276092ae..2a705b27 100644
--- a/start.sh
+++ b/start.sh
@@ -1,22 +1,81 @@
#!/bin/bash
-# Installiere Abhängigkeiten
-cd backend
-python -m venv venv
-source venv/bin/activate
+
+# Farben für die Ausgabe
+GREEN='\033[0;32m'
+BLUE='\033[0;34m'
+NC='\033[0m' # No Color
+
+echo -e "${GREEN}Data Platform - Multi-Agent Service${NC}"
+echo -e "${BLUE}Startskript für Frontend und Backend${NC}"
+echo "----------------------------------------"
+
+# Verzeichnisstruktur erstellen, falls sie nicht existiert
+mkdir -p backend/data
+mkdir -p backend/uploads
+mkdir -p backend/results
+mkdir -p backend/static
+
+# Prüfen, ob Python installiert ist
+if command -v python3 &>/dev/null; then
+ PYTHON_CMD="python3"
+elif command -v python &>/dev/null; then
+ PYTHON_CMD="python"
+else
+ echo "Python ist nicht installiert. Bitte installieren Sie Python 3.8 oder höher."
+ exit 1
+fi
+
+# Virtuelle Umgebung erstellen, falls sie nicht existiert
+if [ ! -d "backend/venv" ]; then
+ echo "Erstelle virtuelle Python-Umgebung..."
+ cd backend
+ $PYTHON_CMD -m venv venv
+ cd ..
+fi
+
+# Virtuelle Umgebung aktivieren
+echo "Aktiviere virtuelle Umgebung..."
+source backend/venv/bin/activate 2>/dev/null || . backend/venv/bin/activate
+
+# Abhängigkeiten installieren
+echo "Installiere Abhängigkeiten..."
pip install -r requirements.txt
-# Migration durchführen
-python manage.py migrate
-python manage.py collectstatic --noinput
+# Backend als Hintergrundprozess starten
+echo "Starte Backend-Server..."
+cd backend
+uvicorn app:app --reload --host 0.0.0.0 --port 8000 &
+BACKEND_PID=$!
+cd ..
-# React bauen
-cd ../frontend
-npm install
-npm run build
+# Kurz warten, um sicherzustellen, dass das Backend startet
+sleep 2
-# React-Frontend nach Django-Statisches-Verzeichnis verschieben
-cp -r build/* ../backend/staticfiles/
+# Frontend-Server starten
+echo "Starte Frontend-Server..."
+cd frontend
+$PYTHON_CMD -m http.server 8080 &
+FRONTEND_PID=$!
+cd ..
-# Starte Gunicorn (Django-Server)
-cd ../backend
-gunicorn backend.wsgi --bind 0.0.0.0:8000
+echo "----------------------------------------"
+echo -e "${GREEN}Server wurden gestartet!${NC}"
+echo "Frontend läuft auf: http://localhost:8080"
+echo "Backend API läuft auf: http://localhost:8000"
+echo "API-Dokumentation: http://localhost:8000/docs"
+echo -e "${BLUE}Drücke STRG+C, um beide Server zu beenden${NC}"
+
+# Funktion zum Beenden der Server bei STRG+C
+cleanup() {
+ echo -e "\n${GREEN}Beende Server...${NC}"
+ kill $BACKEND_PID
+ kill $FRONTEND_PID
+ echo "Server wurden beendet"
+ exit 0
+}
+
+# Signal-Handler für STRG+C
+trap cleanup SIGINT
+
+# Warten auf Benutzeraktion
+wait
\ No newline at end of file
diff --git a/test/data.py b/test/data.py
new file mode 100644
index 00000000..a80f76eb
--- /dev/null
+++ b/test/data.py
@@ -0,0 +1,55 @@
+data_object_model = {
+ "Mandate": {
+ "id": "mandate_001",
+ "users": [
+ {
+ "id": "user_001",
+ "settings": {
+ "id": "setting_001",
+ "preferences": {}
+ },
+ "sessions": [
+ {
+ "id": "session_001",
+ "timestamp": "2025-03-13T12:00:00Z",
+ "active": True
+ }
+ ],
+ "workspaces": [
+ {
+ "id": "workspace_001",
+ "prompts": [
+ {
+ "id": "prompt_001",
+ "content": "",
+ "created_at": "2025-03-13T10:30:00Z"
+ }
+ ],
+ "agents": [
+ {
+ "id": "agent_001",
+ "type": "assistant",
+ "capabilities": []
+ }
+ ],
+ "dataObjectReferences": ["dataobject_001", "dataobject_002"]
+ }
+ ],
+ "dataObjects": [
+ {
+ "id": "dataobject_001",
+ "type": "document",
+ "content": {},
+ "metadata": {}
+ },
+ {
+ "id": "dataobject_002",
+ "type": "image",
+ "content": {},
+ "metadata": {}
+ }
+ ]
+ }
+ ]
+ }
+}
diff --git a/main.py b/test/gw_main.py
similarity index 100%
rename from main.py
rename to test/gw_main.py
diff --git a/test.py b/test/gw_test.py
similarity index 100%
rename from test.py
rename to test/gw_test.py