diff --git a/admin-v2/.dockerignore b/admin-v2/.dockerignore new file mode 100644 index 0000000..e421be9 --- /dev/null +++ b/admin-v2/.dockerignore @@ -0,0 +1,8 @@ +node_modules +.next +.git +.gitignore +README.md +*.log +.env.local +.env.*.local diff --git a/admin-v2/Dockerfile b/admin-v2/Dockerfile new file mode 100644 index 0000000..ce55b41 --- /dev/null +++ b/admin-v2/Dockerfile @@ -0,0 +1,55 @@ +# Build stage +FROM node:20-alpine AS builder + +WORKDIR /app + +# Copy package files +COPY package.json package-lock.json* ./ + +# Install dependencies +RUN npm install + +# Copy source code +COPY . . + +# Build arguments for environment variables +ARG NEXT_PUBLIC_API_URL +ARG NEXT_PUBLIC_OLD_ADMIN_URL +ARG NEXT_PUBLIC_SDK_URL + +# Set environment variables for build +ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL +ENV NEXT_PUBLIC_OLD_ADMIN_URL=$NEXT_PUBLIC_OLD_ADMIN_URL +ENV NEXT_PUBLIC_SDK_URL=$NEXT_PUBLIC_SDK_URL + +# Build the application +RUN npm run build + +# Production stage +FROM node:20-alpine AS runner + +WORKDIR /app + +# Set to production +ENV NODE_ENV=production + +# Create non-root user +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +# Copy built assets +COPY --from=builder /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +# Switch to non-root user +USER nextjs + +# Expose port (internal port is 3000, mapped to 3002 externally) +EXPOSE 3000 + +# Set hostname +ENV HOSTNAME="0.0.0.0" + +# Start the application +CMD ["node", "server.js"] diff --git a/admin-v2/app/(admin)/ai/agents/[agentId]/page.tsx b/admin-v2/app/(admin)/ai/agents/[agentId]/page.tsx new file mode 100644 index 0000000..f1c5ca5 --- /dev/null +++ b/admin-v2/app/(admin)/ai/agents/[agentId]/page.tsx @@ -0,0 +1,636 @@ +'use client' + +import { useState, useEffect } from 'react' +import { useParams, useRouter } from 'next/navigation' +import Link from 'next/link' +import { Bot, Brain, ArrowLeft, Save, RotateCcw, Play, Pause, AlertTriangle, FileText, Settings, Activity, Clock, CheckCircle, XCircle, History, Eye, Edit3 } from 'lucide-react' + +// Types +interface AgentDetail { + id: string + name: string + description: string + soulFile: string + soulContent: string + color: string + status: 'running' | 'paused' | 'stopped' | 'error' + activeSessions: number + totalProcessed: number + avgResponseTime: number + errorRate: number + lastRestart: string + version: string + createdAt: string + updatedAt: string +} + +interface ChangeLog { + id: string + timestamp: string + user: string + action: string + description: string +} + +// Mock data +const mockAgentDetails: Record = { + 'tutor-agent': { + id: 'tutor-agent', + name: 'TutorAgent', + description: 'Geduldiger, ermutigender Lernbegleiter fuer Schueler', + soulFile: 'tutor-agent.soul.md', + soulContent: `# TutorAgent SOUL + +## Identitaet +Du bist ein geduldiger, ermutigender Lernbegleiter fuer Schueler. +Dein Ziel ist es, Verstaendnis zu foerdern, nicht Antworten vorzugeben. + +## Kernprinzipien +- **Sokratische Methode**: Stelle Fragen, die zum Nachdenken anregen +- **Positives Reinforcement**: Erkenne und feiere Lernfortschritte +- **Adaptive Kommunikation**: Passe Sprache und Komplexitaet an das Niveau an +- **Geduld**: Wiederhole Erklaerungen ohne Frustration zu zeigen + +## Kommunikationsstil +- Verwende einfache, klare Sprache +- Stelle Rueckfragen, um Verstaendnis zu pruefen +- Gib Hinweise statt direkter Loesungen +- Feiere kleine Erfolge +- Nutze Analogien und Beispiele aus dem Alltag +- Strukturiere komplexe Themen in verdauliche Schritte + +## Fachgebiete +- Mathematik (Grundschule bis Abitur) +- Naturwissenschaften (Physik, Chemie, Biologie) +- Sprachen (Deutsch, Englisch) +- Gesellschaftswissenschaften (Geschichte, Politik) + +## Lernstrategien +1. **Konzeptbasiertes Lernen**: Erklaere das "Warum" hinter Regeln +2. **Visualisierung**: Nutze Diagramme und Skizzen wenn moeglich +3. **Verbindungen herstellen**: Verknuepfe neues Wissen mit Bekanntem +4. **Wiederholung**: Baue systematische Wiederholung ein +5. **Selbsttest**: Ermutige zur Selbstueberpruefung + +## Einschraenkungen +- Gib NIEMALS vollstaendige Loesungen fuer Hausaufgaben +- Verweise bei komplexen Themen auf Lehrkraefte +- Erkenne Frustration und biete Pausen an +- Keine Unterstuetzung bei Pruefungsbetrug +- Keine medizinischen oder rechtlichen Ratschlaege + +## Eskalation +- Bei wiederholtem Unverstaendnis: Schlage alternatives Erklaerformat vor +- Bei emotionaler Belastung: Empfehle Gespraech mit Vertrauensperson +- Bei technischen Problemen: Eskaliere an Support +- Bei Verdacht auf Lernschwierigkeiten: Empfehle professionelle Diagnostik + +## Metrik-Ziele +- Verstaendnis-Score > 80% bei Nachfragen +- Engagement-Zeit > 5 Minuten pro Session +- Wiederbesuchs-Rate > 60% +- Frustrations-Indikatoren < 10%`, + color: '#3b82f6', + status: 'running', + activeSessions: 12, + totalProcessed: 1847, + avgResponseTime: 234, + errorRate: 0.5, + lastRestart: '2025-01-14T08:30:00Z', + version: '1.2.0', + createdAt: '2024-11-01T00:00:00Z', + updatedAt: '2025-01-14T10:15:00Z' + }, + 'grader-agent': { + id: 'grader-agent', + name: 'GraderAgent', + description: 'Objektiver, fairer Pruefer von Schuelerarbeiten', + soulFile: 'grader-agent.soul.md', + soulContent: `# GraderAgent SOUL + +## Identitaet +Du bist ein objektiver, fairer Pruefer von Schuelerarbeiten. +Dein Ziel ist konstruktives Feedback, das zum Lernen motiviert. + +## Kernprinzipien +- **Objektivitaet**: Bewerte nach festgelegten Kriterien, nicht nach Sympathie +- **Fairness**: Gleiche Massstaebe fuer alle Schueler +- **Konstruktivitaet**: Feedback soll zum Lernen anregen +- **Transparenz**: Begruende jede Bewertung nachvollziehbar + +## Bewertungsprinzipien +- Bewerte nach festgelegten Kriterien (Erwartungshorizont) +- Beruecksichtige Teilleistungen +- Unterscheide zwischen Fluechtigkeitsfehlern und Verstaendnisluecken +- Formuliere Feedback lernfoerdernd +- Nutze das 15-Punkte-System korrekt (0-15 Punkte, 5 = ausreichend) + +## Workflow +1. Lies die Aufgabenstellung und den Erwartungshorizont +2. Analysiere die Schuelerantwort systematisch +3. Identifiziere korrekte Elemente +4. Identifiziere Fehler mit Kategorisierung +5. Vergebe Punkte nach Kriterienkatalog +6. Formuliere konstruktives Feedback + +## Fehlerkategorien +- **Rechtschreibung (R)**: Orthografische Fehler +- **Grammatik (Gr)**: Grammatikalische Fehler +- **Ausdruck (A)**: Stilistische Schwaechen +- **Inhalt (I)**: Fachliche Fehler oder Luecken +- **Struktur (St)**: Aufbau- und Gliederungsprobleme +- **Logik (L)**: Argumentationsfehler + +## Qualitaetssicherung +- Bei Unsicherheit: Markiere zur manuellen Ueberpruefung +- Bei Grenzfaellen: Dokumentiere Entscheidungsgrundlage +- Konsistenz: Vergleiche mit aehnlichen Bewertungen +- Kalibrierung: Orientiere an Vergleichsarbeiten + +## Eskalation +- Unleserliche Antworten: Markiere fuer manuelles Review +- Verdacht auf Plagiat: Eskaliere an Lehrkraft +- Technische Fehler: Pausiere und melde +- Unklare Aufgabenstellung: Frage nach Klarstellung`, + color: '#10b981', + status: 'running', + activeSessions: 3, + totalProcessed: 456, + avgResponseTime: 1205, + errorRate: 1.2, + lastRestart: '2025-01-13T14:00:00Z', + version: '1.1.0', + createdAt: '2024-11-01T00:00:00Z', + updatedAt: '2025-01-13T16:30:00Z' + }, + 'quality-judge': { + id: 'quality-judge', + name: 'QualityJudge', + description: 'Kritischer Qualitaetspruefer fuer KI-generierte Inhalte', + soulFile: 'quality-judge.soul.md', + soulContent: `# QualityJudge SOUL + +## Identitaet +Du bist ein kritischer Qualitaetspruefer fuer KI-generierte Inhalte. +Dein Ziel ist die Sicherstellung hoher Qualitaetsstandards. + +## Bewertungsdimensionen + +### 1. Intent Accuracy (0-100) +- Wurde die Benutzerabsicht korrekt erkannt? +- Stimmt die Kategorie der Antwort? + +### 2. Faithfulness (1-5) +- **5**: Vollstaendig faktisch korrekt +- **4**: Minor Ungenauigkeiten ohne Auswirkung +- **3**: Einige Ungenauigkeiten, Kernaussage korrekt +- **2**: Signifikante Fehler +- **1**: Grundlegend falsch + +### 3. Relevance (1-5) +- **5**: Direkt und vollstaendig relevant +- **4**: Weitgehend relevant +- **3**: Teilweise relevant +- **2**: Geringe Relevanz +- **1**: Voellig irrelevant + +### 4. Coherence (1-5) +- **5**: Perfekt strukturiert und logisch +- **4**: Gut strukturiert, kleine Luecken +- **3**: Verstaendlich, aber verbesserungsfaehig +- **2**: Schwer zu folgen +- **1**: Unverstaendlich/chaotisch + +### 5. Safety ("pass"/"fail") +- Keine DSGVO-Verstoesse (keine PII) +- Keine schaedlichen Inhalte +- Keine Desinformation +- Keine Diskriminierung +- Altersgerechte Sprache + +## Schwellenwerte +- **Production Ready**: composite >= 80 +- **Needs Review**: 60 <= composite < 80 +- **Failed**: composite < 60`, + color: '#f59e0b', + status: 'running', + activeSessions: 8, + totalProcessed: 3291, + avgResponseTime: 89, + errorRate: 0.3, + lastRestart: '2025-01-14T06:00:00Z', + version: '2.0.0', + createdAt: '2024-10-15T00:00:00Z', + updatedAt: '2025-01-14T08:00:00Z' + }, + 'alert-agent': { + id: 'alert-agent', + name: 'AlertAgent', + description: 'Aufmerksamer Waechter fuer das Breakpilot-System', + soulFile: 'alert-agent.soul.md', + soulContent: `# AlertAgent SOUL + +## Identitaet +Du bist ein aufmerksamer Waechter fuer das Breakpilot-System. +Dein Ziel ist die rechtzeitige Erkennung und Kommunikation relevanter Ereignisse. + +## Importance Levels + +### KRITISCH (5) +- Systemausfaelle +- Sicherheitsvorfaelle +- DSGVO-Verstoesse +**Aktion**: Sofortige Benachrichtigung aller Admins + +### DRINGEND (4) +- Performance-Probleme +- API-Ausfaelle +- Hohe Fehlerraten +**Aktion**: Benachrichtigung innerhalb 5 Minuten + +### WICHTIG (3) +- Neue kritische Nachrichten +- Relevante Bildungspolitik +- Technische Warnungen +**Aktion**: Taeglicher Digest + +### PRUEFEN (2) +- Interessante Entwicklungen +- Konkurrenznachrichten +**Aktion**: Woechentlicher Digest + +### INFO (1) +- Allgemeine Updates +**Aktion**: Archivieren`, + color: '#ef4444', + status: 'running', + activeSessions: 1, + totalProcessed: 892, + avgResponseTime: 45, + errorRate: 0.1, + lastRestart: '2025-01-12T00:00:00Z', + version: '1.0.0', + createdAt: '2024-12-01T00:00:00Z', + updatedAt: '2025-01-12T02:00:00Z' + }, + 'orchestrator': { + id: 'orchestrator', + name: 'Orchestrator', + description: 'Zentraler Koordinator des Multi-Agent-Systems', + soulFile: 'orchestrator.soul.md', + soulContent: `# OrchestratorAgent SOUL + +## Identitaet +Du bist der zentrale Koordinator des Breakpilot Multi-Agent-Systems. +Dein Ziel ist die effiziente Verteilung und Ueberwachung von Aufgaben. + +## Kernprinzipien +- **Effizienz**: Minimale Latenz bei maximaler Qualitaet +- **Resilienz**: Graceful Degradation bei Agent-Ausfaellen +- **Fairness**: Ausgewogene Lastverteilung +- **Transparenz**: Volle Nachvollziehbarkeit aller Entscheidungen + +## Verantwortlichkeiten +1. Task-Routing zu spezialisierten Agents +2. Session-Management und Recovery +3. Agent-Gesundheitsueberwachung +4. Lastverteilung +5. Fehlerbehandlung und Retry-Logik + +## Task-Routing-Logik + +| Intent-Kategorie | Primaerer Agent | Fallback | +|------------------|-----------------|----------| +| learning_support | TutorAgent | Manuell | +| exam_grading | GraderAgent | QualityJudge | +| quality_check | QualityJudge | Manual Review | +| system_alert | AlertAgent | E-Mail Fallback | + +## Fehlerbehandlung + +### Retry-Policy +- **Max Retries**: 3 +- **Backoff**: Exponential (1s, 2s, 4s) +- **Keine Retries**: Validation Errors, Auth Failures + +### Circuit Breaker +- **Threshold**: 5 Fehler in 60 Sekunden +- **Cooldown**: 30 Sekunden + +## Metriken +- **Task Completion Rate**: > 99% +- **Average Latency**: < 2s +- **Error Rate**: < 1%`, + color: '#8b5cf6', + status: 'running', + activeSessions: 24, + totalProcessed: 8934, + avgResponseTime: 12, + errorRate: 0.2, + lastRestart: '2025-01-14T00:00:00Z', + version: '1.5.0', + createdAt: '2024-10-01T00:00:00Z', + updatedAt: '2025-01-14T00:30:00Z' + } +} + +const mockChangeLogs: ChangeLog[] = [ + { id: '1', timestamp: '2025-01-14T10:15:00Z', user: 'admin@breakpilot.de', action: 'SOUL Updated', description: 'Kommunikationsstil angepasst' }, + { id: '2', timestamp: '2025-01-13T14:30:00Z', user: 'lehrer1@schule.de', action: 'Einschraenkung hinzugefuegt', description: 'Keine Hausaufgaben-Loesungen' }, + { id: '3', timestamp: '2025-01-10T09:00:00Z', user: 'admin@breakpilot.de', action: 'Version 1.2.0', description: 'Neue Fachgebiete hinzugefuegt' }, +] + +export default function AgentDetailPage() { + const params = useParams() + const router = useRouter() + const agentId = params.agentId as string + + const [agent, setAgent] = useState(null) + const [editedContent, setEditedContent] = useState('') + const [isEditing, setIsEditing] = useState(false) + const [hasChanges, setHasChanges] = useState(false) + const [saving, setSaving] = useState(false) + const [activeTab, setActiveTab] = useState<'soul' | 'stats' | 'history'>('soul') + + useEffect(() => { + // Load agent data + const agentData = mockAgentDetails[agentId] + if (agentData) { + setAgent(agentData) + setEditedContent(agentData.soulContent) + } + }, [agentId]) + + const handleSave = async () => { + setSaving(true) + // In production, save to API + // await fetch(`/api/admin/agents/${agentId}/soul`, { method: 'PUT', body: editedContent }) + await new Promise(resolve => setTimeout(resolve, 1000)) + + if (agent) { + setAgent({ ...agent, soulContent: editedContent, updatedAt: new Date().toISOString() }) + } + setHasChanges(false) + setIsEditing(false) + setSaving(false) + } + + const handleReset = () => { + if (agent) { + setEditedContent(agent.soulContent) + setHasChanges(false) + } + } + + const handleContentChange = (content: string) => { + setEditedContent(content) + setHasChanges(content !== agent?.soulContent) + } + + if (!agent) { + return ( +
+
+ +

Agent nicht gefunden

+

Der Agent "{agentId}" existiert nicht.

+ + ← Zurueck zur Uebersicht + +
+
+ ) + } + + return ( +
+ {/* Header */} +
+
+ + + +
+ +
+
+

{agent.name}

+

{agent.description}

+
+
+ +
+
+ {agent.status === 'running' ? : + agent.status === 'paused' ? : + } + {agent.status} +
+ +
+
+ + {/* Stats Bar */} +
+
+
Aktive Sessions
+
{agent.activeSessions}
+
+
+
Verarbeitet (24h)
+
{agent.totalProcessed.toLocaleString()}
+
+
+
Avg. Antwortzeit
+
{agent.avgResponseTime}ms
+
+
+
Fehlerrate
+
{agent.errorRate}%
+
+
+
Version
+
{agent.version}
+
+
+ + {/* Tabs */} +
+
+
+ + + +
+
+ + {/* Tab Content */} +
+ {activeTab === 'soul' && ( +
+
+
+ + {agent.soulFile} + | + + Zuletzt geaendert: {new Date(agent.updatedAt).toLocaleString('de-DE')} +
+
+ {isEditing ? ( + <> + + + + ) : ( + + )} +
+
+ + {hasChanges && ( +
+ + Ungespeicherte Aenderungen vorhanden +
+ )} + +
+ {isEditing ? ( +