'use client' import React, { useState } from 'react' import { useSDK } from '@/lib/sdk' // ============================================================================= // TYPES // ============================================================================= interface QualityMetric { id: string name: string category: 'accuracy' | 'fairness' | 'robustness' | 'explainability' | 'performance' score: number threshold: number trend: 'up' | 'down' | 'stable' lastMeasured: Date aiSystem: string } interface QualityTest { id: string name: string status: 'passed' | 'failed' | 'warning' | 'pending' lastRun: Date duration: string aiSystem: string details: string } // ============================================================================= // MOCK DATA // ============================================================================= const mockMetrics: QualityMetric[] = [ { id: 'm-1', name: 'Accuracy Score', category: 'accuracy', score: 94.5, threshold: 90, trend: 'up', lastMeasured: new Date('2024-01-22'), aiSystem: 'Bewerber-Screening', }, { id: 'm-2', name: 'Fairness Index (Gender)', category: 'fairness', score: 87.2, threshold: 85, trend: 'stable', lastMeasured: new Date('2024-01-22'), aiSystem: 'Bewerber-Screening', }, { id: 'm-3', name: 'Fairness Index (Age)', category: 'fairness', score: 78.5, threshold: 85, trend: 'down', lastMeasured: new Date('2024-01-22'), aiSystem: 'Bewerber-Screening', }, { id: 'm-4', name: 'Robustness Score', category: 'robustness', score: 91.0, threshold: 85, trend: 'up', lastMeasured: new Date('2024-01-21'), aiSystem: 'Kundenservice Chatbot', }, { id: 'm-5', name: 'Explainability Index', category: 'explainability', score: 72.3, threshold: 75, trend: 'up', lastMeasured: new Date('2024-01-22'), aiSystem: 'Empfehlungsalgorithmus', }, { id: 'm-6', name: 'Response Time (P95)', category: 'performance', score: 95.0, threshold: 90, trend: 'stable', lastMeasured: new Date('2024-01-22'), aiSystem: 'Kundenservice Chatbot', }, ] const mockTests: QualityTest[] = [ { id: 't-1', name: 'Bias Detection Test', status: 'warning', lastRun: new Date('2024-01-22T10:30:00'), duration: '45min', aiSystem: 'Bewerber-Screening', details: 'Leichte Verzerrung bei Altersgruppe 50+ erkannt', }, { id: 't-2', name: 'Accuracy Benchmark', status: 'passed', lastRun: new Date('2024-01-22T08:00:00'), duration: '2h 15min', aiSystem: 'Bewerber-Screening', details: 'Alle Schwellenwerte eingehalten', }, { id: 't-3', name: 'Adversarial Testing', status: 'passed', lastRun: new Date('2024-01-21T14:00:00'), duration: '1h 30min', aiSystem: 'Kundenservice Chatbot', details: 'System robust gegen Manipulation', }, { id: 't-4', name: 'Explainability Test', status: 'failed', lastRun: new Date('2024-01-22T09:00:00'), duration: '30min', aiSystem: 'Empfehlungsalgorithmus', details: 'SHAP-Werte unter Schwellenwert', }, { id: 't-5', name: 'Performance Load Test', status: 'passed', lastRun: new Date('2024-01-22T06:00:00'), duration: '3h', aiSystem: 'Kundenservice Chatbot', details: '10.000 gleichzeitige Anfragen verarbeitet', }, ] // ============================================================================= // COMPONENTS // ============================================================================= function MetricCard({ metric }: { metric: QualityMetric }) { const isAboveThreshold = metric.score >= metric.threshold const categoryColors = { accuracy: 'bg-blue-100 text-blue-700', fairness: 'bg-purple-100 text-purple-700', robustness: 'bg-green-100 text-green-700', explainability: 'bg-yellow-100 text-yellow-700', performance: 'bg-orange-100 text-orange-700', } const categoryLabels = { accuracy: 'Genauigkeit', fairness: 'Fairness', robustness: 'Robustheit', explainability: 'Erklaerbarkeit', performance: 'Performance', } return (
{categoryLabels[metric.category]}

{metric.name}

{metric.aiSystem}

{metric.trend === 'up' && ( )} {metric.trend === 'down' && ( )} {metric.trend === 'stable' && ( )}
{metric.score}%
Schwellenwert: {metric.threshold}%
) } function TestRow({ test }: { test: QualityTest }) { const statusColors = { passed: 'bg-green-100 text-green-700', failed: 'bg-red-100 text-red-700', warning: 'bg-yellow-100 text-yellow-700', pending: 'bg-gray-100 text-gray-500', } const statusLabels = { passed: 'Bestanden', failed: 'Fehlgeschlagen', warning: 'Warnung', pending: 'Ausstehend', } return (
{test.name}
{test.aiSystem}
{statusLabels[test.status]} {test.lastRun.toLocaleString('de-DE')} {test.duration} {test.details} ) } // ============================================================================= // MAIN PAGE // ============================================================================= export default function QualityPage() { const { state } = useSDK() const [metrics] = useState(mockMetrics) const [tests] = useState(mockTests) const passedTests = tests.filter(t => t.status === 'passed').length const failedTests = tests.filter(t => t.status === 'failed').length const metricsAboveThreshold = metrics.filter(m => m.score >= m.threshold).length const avgScore = Math.round(metrics.reduce((sum, m) => sum + m.score, 0) / metrics.length) return (
{/* Header */}

AI Quality Dashboard

Ueberwachen Sie die Qualitaet und Fairness Ihrer KI-Systeme

{/* Stats */}
Durchschnittlicher Score
{avgScore}%
Metriken ueber Schwellenwert
{metricsAboveThreshold}/{metrics.length}
Tests bestanden
{passedTests}
Tests fehlgeschlagen
{failedTests}
{/* Alert for failed metrics */} {metrics.filter(m => m.score < m.threshold).length > 0 && (

{metrics.filter(m => m.score < m.threshold).length} Metrik(en) unter Schwellenwert

Ueberpruefen Sie die betroffenen KI-Systeme und ergreifen Sie Korrekturmassnahmen.

)} {/* Metrics Grid */}

Qualitaetsmetriken

{metrics.map(metric => ( ))}
{/* Tests Table */}

Testergebnisse

{tests.map(test => ( ))}
Test Status Letzter Lauf Dauer Details Aktion
) }