'use client' import { useState, useEffect } from 'react' import Link from 'next/link' import { ArrowLeft, BarChart3, TrendingUp, TrendingDown, Clock, Activity, Bot, Brain, MessageSquare, AlertTriangle, Settings, RefreshCw, Calendar, Filter, Download } from 'lucide-react' // Types interface AgentMetric { agentType: string name: string color: string sessions: number messagesProcessed: number avgResponseTime: number errorRate: number successRate: number trend: 'up' | 'down' | 'stable' trendValue: number } interface TimeSeriesData { timestamp: string value: number } interface DailyStats { date: string sessions: number messages: number errors: number avgLatency: number } // Mock data const mockAgentMetrics: AgentMetric[] = [ { agentType: 'tutor-agent', name: 'TutorAgent', color: '#3b82f6', sessions: 156, messagesProcessed: 4521, avgResponseTime: 234, errorRate: 0.3, successRate: 99.7, trend: 'up', trendValue: 12 }, { agentType: 'grader-agent', name: 'GraderAgent', color: '#10b981', sessions: 45, messagesProcessed: 1205, avgResponseTime: 1102, errorRate: 0.5, successRate: 99.5, trend: 'stable', trendValue: 2 }, { agentType: 'quality-judge', name: 'QualityJudge', color: '#f59e0b', sessions: 89, messagesProcessed: 8934, avgResponseTime: 89, errorRate: 0.1, successRate: 99.9, trend: 'up', trendValue: 8 }, { agentType: 'alert-agent', name: 'AlertAgent', color: '#ef4444', sessions: 12, messagesProcessed: 892, avgResponseTime: 45, errorRate: 0.0, successRate: 100, trend: 'stable', trendValue: 0 }, { agentType: 'orchestrator', name: 'Orchestrator', color: '#8b5cf6', sessions: 234, messagesProcessed: 15420, avgResponseTime: 12, errorRate: 0.2, successRate: 99.8, trend: 'up', trendValue: 15 } ] const mockDailyStats: DailyStats[] = [ { date: '2026-01-28', sessions: 420, messages: 12500, errors: 15, avgLatency: 156 }, { date: '2026-01-29', sessions: 445, messages: 13200, errors: 12, avgLatency: 148 }, { date: '2026-01-30', sessions: 398, messages: 11800, errors: 18, avgLatency: 162 }, { date: '2026-01-31', sessions: 512, messages: 15600, errors: 10, avgLatency: 145 }, { date: '2026-02-01', sessions: 489, messages: 14200, errors: 8, avgLatency: 139 }, { date: '2026-02-02', sessions: 534, messages: 16100, errors: 11, avgLatency: 142 }, { date: '2026-02-03', sessions: 478, messages: 14800, errors: 9, avgLatency: 151 } ] const mockHourlyLatency: TimeSeriesData[] = Array.from({ length: 24 }, (_, i) => ({ timestamp: `${i.toString().padStart(2, '0')}:00`, value: Math.floor(100 + Math.random() * 100) })) function getAgentIcon(agentType: string) { switch (agentType) { case 'tutor-agent': return case 'grader-agent': return case 'quality-judge': return case 'alert-agent': return case 'orchestrator': return default: return } } // Simple bar chart component function BarChart({ data, color, maxValue }: { data: number[], color: string, maxValue: number }) { return (
{data.map((value, i) => (
))}
) } // Simple line chart visualization function SparkLine({ data, color }: { data: number[], color: string }) { const max = Math.max(...data) const min = Math.min(...data) const range = max - min || 1 const points = data.map((value, i) => { const x = (i / (data.length - 1)) * 100 const y = 100 - ((value - min) / range) * 100 return `${x},${y}` }).join(' ') return ( ) } export default function StatisticsPage() { const [loading, setLoading] = useState(false) const [timeRange, setTimeRange] = useState<'24h' | '7d' | '30d'>('7d') const [lastRefresh, setLastRefresh] = useState(new Date()) const refreshData = async () => { setLoading(true) await new Promise(resolve => setTimeout(resolve, 500)) setLastRefresh(new Date()) setLoading(false) } // Calculate totals const totals = { sessions: mockAgentMetrics.reduce((sum, m) => sum + m.sessions, 0), messages: mockAgentMetrics.reduce((sum, m) => sum + m.messagesProcessed, 0), avgLatency: Math.round(mockAgentMetrics.reduce((sum, m) => sum + m.avgResponseTime, 0) / mockAgentMetrics.length), avgErrorRate: (mockAgentMetrics.reduce((sum, m) => sum + m.errorRate, 0) / mockAgentMetrics.length).toFixed(2) } // Calculate week stats const weekTotals = { sessions: mockDailyStats.reduce((sum, d) => sum + d.sessions, 0), messages: mockDailyStats.reduce((sum, d) => sum + d.messages, 0), errors: mockDailyStats.reduce((sum, d) => sum + d.errors, 0), avgLatency: Math.round(mockDailyStats.reduce((sum, d) => sum + d.avgLatency, 0) / mockDailyStats.length) } return (
{/* Header */}
Zurueck zur Agent-Verwaltung

Agent Statistiken

Performance-Metriken und Trends des Multi-Agent-Systems

{/* Overview Stats */}
Sessions (7d)
{weekTotals.sessions.toLocaleString()}
+12% vs. Vorwoche
Messages (7d)
{weekTotals.messages.toLocaleString()}
+8% vs. Vorwoche
Avg. Latenz
{weekTotals.avgLatency}ms
-5% (verbessert)
Fehler (7d)
{weekTotals.errors}
+3 vs. Vorwoche
{/* Charts Row */}
{/* Sessions per Day */}

Sessions pro Tag

d.sessions)} color="#3b82f6" maxValue={Math.max(...mockDailyStats.map(d => d.sessions)) * 1.1} />
{mockDailyStats.map(d => ( {new Date(d.date).toLocaleDateString('de-DE', { weekday: 'short' })} ))}
{/* Messages per Day */}

Messages pro Tag

d.messages)} color="#10b981" maxValue={Math.max(...mockDailyStats.map(d => d.messages)) * 1.1} />
{mockDailyStats.map(d => ( {new Date(d.date).toLocaleDateString('de-DE', { weekday: 'short' })} ))}
{/* Latency Chart */}

Latenz (24h)

Durchschnitt: {totals.avgLatency}ms
d.value)} color="#8b5cf6" />
00:00 06:00 12:00 18:00 24:00
{/* Agent Performance Table */}

Agent Performance

{mockAgentMetrics.map(metric => ( ))}
Agent Sessions Messages Avg. Response Success Rate Error Rate Trend
{getAgentIcon(metric.agentType)}
{metric.name}
{metric.agentType}
{metric.sessions} {metric.messagesProcessed.toLocaleString()} {metric.avgResponseTime}ms {metric.successRate}% 0.5 ? 'bg-red-100 text-red-700' : metric.errorRate > 0 ? 'bg-amber-100 text-amber-700' : 'bg-green-100 text-green-700' }`}> {metric.errorRate}% {metric.trend === 'up' && ( +{metric.trendValue}% )} {metric.trend === 'down' && ( -{metric.trendValue}% )} {metric.trend === 'stable' && ( {metric.trendValue}% )}
{/* Error Distribution */}
{/* Error by Agent */}

Fehlerverteilung nach Agent

{mockAgentMetrics.filter(m => m.errorRate > 0).map(metric => (
{metric.name}
{metric.errorRate}%
))}
{/* Message Distribution */}

Message-Verteilung nach Agent

{mockAgentMetrics.map(metric => { const percentage = (metric.messagesProcessed / totals.messages) * 100 return (
{metric.name}
{percentage.toFixed(1)}%
) })}
{/* Export Button */}
) }