'use client' import React, { useState, useEffect, Suspense } from 'react' import { useRouter, useSearchParams } from 'next/navigation' import { ZoneBadge } from '@/components/sdk/compliance-optimizer/ZoneBadge' interface DimensionField { key: string label: string options: { value: string; label: string }[] type?: 'select' | 'toggle' } const DIMENSIONS: DimensionField[] = [ { key: 'automation_level', label: 'Automatisierungsgrad', options: [ { value: 'none', label: 'Keine' }, { value: 'assistive', label: 'Assistierend' }, { value: 'partial', label: 'Teilautomatisiert' }, { value: 'full', label: 'Vollautomatisiert' }, ]}, { key: 'decision_binding', label: 'Entscheidungsbindung', options: [ { value: 'non_binding', label: 'Unverbindlich' }, { value: 'human_review_required', label: 'Mensch entscheidet' }, { value: 'fully_binding', label: 'Vollstaendig bindend' }, ]}, { key: 'decision_impact', label: 'Entscheidungswirkung', options: [ { value: 'low', label: 'Niedrig' }, { value: 'medium', label: 'Mittel' }, { value: 'high', label: 'Hoch' }, ]}, { key: 'domain', label: 'Branche', options: [ { value: 'hr', label: 'HR / Personal' }, { value: 'finance', label: 'Finanzen' }, { value: 'education', label: 'Bildung' }, { value: 'health', label: 'Gesundheit' }, { value: 'marketing', label: 'Marketing' }, { value: 'general', label: 'Allgemein' }, ]}, { key: 'data_type', label: 'Datensensitivitaet', options: [ { value: 'non_personal', label: 'Keine personenbezogenen' }, { value: 'personal', label: 'Personenbezogen' }, { value: 'sensitive', label: 'Besondere Kategorien (Art. 9)' }, { value: 'biometric', label: 'Biometrisch' }, ]}, { key: 'human_in_loop', label: 'Menschliche Kontrolle', options: [ { value: 'required', label: 'Erforderlich' }, { value: 'optional', label: 'Optional' }, { value: 'none', label: 'Keine' }, ]}, { key: 'explainability', label: 'Erklaerbarkeit', options: [ { value: 'high', label: 'Hoch' }, { value: 'basic', label: 'Basis' }, { value: 'none', label: 'Keine' }, ]}, { key: 'risk_classification', label: 'Risikoklasse (AI Act)', options: [ { value: 'minimal', label: 'Minimal' }, { value: 'limited', label: 'Begrenzt' }, { value: 'high', label: 'Hoch' }, { value: 'prohibited', label: 'Verboten' }, ]}, { key: 'legal_basis', label: 'Rechtsgrundlage (DSGVO)', options: [ { value: 'consent', label: 'Einwilligung' }, { value: 'contract', label: 'Vertrag' }, { value: 'legal_obligation', label: 'Rechtl. Verpflichtung' }, { value: 'legitimate_interest', label: 'Berechtigtes Interesse' }, { value: 'public_interest', label: 'Oeffentl. Interesse' }, ]}, { key: 'model_type', label: 'Modelltyp', options: [ { value: 'rule_based', label: 'Regelbasiert' }, { value: 'statistical', label: 'Statistisch / ML' }, { value: 'blackbox_llm', label: 'Blackbox / LLM' }, ]}, { key: 'deployment_scope', label: 'Einsatzbereich', options: [ { value: 'internal', label: 'Intern' }, { value: 'external', label: 'Extern (Kunden)' }, { value: 'public', label: 'Oeffentlich' }, ]}, ] const TOGGLE_DIMENSIONS = [ { key: 'transparency_required', label: 'Transparenzpflicht' }, { key: 'logging_required', label: 'Protokollierungspflicht' }, ] function NewOptimizationPageInner() { const router = useRouter() const searchParams = useSearchParams() const fromAssessment = searchParams.get('from_assessment') const [autoOptimizing, setAutoOptimizing] = useState(false) const [title, setTitle] = useState('') useEffect(() => { if (!fromAssessment) return setAutoOptimizing(true) fetch(`/api/sdk/v1/maximizer/optimize-from-assessment/${fromAssessment}`, { method: 'POST' }) .then(r => r.ok ? r.json() : Promise.reject('failed')) .then(data => router.push(`/sdk/compliance-optimizer/${data.id}`)) .catch(() => setAutoOptimizing(false)) }, [fromAssessment, router]) const [config, setConfig] = useState>({ automation_level: 'assistive', decision_binding: 'non_binding', decision_impact: 'low', domain: 'general', data_type: 'non_personal', human_in_loop: 'required', explainability: 'basic', risk_classification: 'minimal', legal_basis: 'contract', transparency_required: 'false', logging_required: 'false', model_type: 'rule_based', deployment_scope: 'internal', }) const [preview, setPreview] = useState | null>(null) const [submitting, setSubmitting] = useState(false) async function handlePreview() { try { const body = { ...config, transparency_required: config.transparency_required === 'true', logging_required: config.logging_required === 'true' } const res = await fetch('/api/sdk/v1/maximizer/evaluate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }) if (res.ok) { const data = await res.json() setPreview(data.zone_map || {}) } } catch { /* silent */ } } async function handleSubmit() { setSubmitting(true) try { const body = { config: { ...config, transparency_required: config.transparency_required === 'true', logging_required: config.logging_required === 'true' }, title: title || 'Optimierung ' + new Date().toLocaleDateString('de-DE'), } const res = await fetch('/api/sdk/v1/maximizer/optimize', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }) if (res.ok) { const data = await res.json() router.push(`/sdk/compliance-optimizer/${data.id}`) } } finally { setSubmitting(false) } } if (autoOptimizing) { return (
📊

Optimierung laeuft...

Assessment wird analysiert und optimale Konfiguration berechnet.

) } return (

Neue Optimierung

Konfigurieren Sie Ihren KI-Use-Case und finden Sie den maximalen regulatorischen Spielraum.

setTitle(e.target.value)} placeholder="z.B. HR Bewerber-Ranking" className="w-full border border-gray-300 rounded-lg px-3 py-2 text-sm" />
{DIMENSIONS.map((dim) => (
))} {TOGGLE_DIMENSIONS.map((dim) => (
{ setConfig({ ...config, [dim.key]: String(e.target.checked) }); setPreview(null) }} className="h-4 w-4 rounded border-gray-300 text-blue-600" />
))}
) } export default function NewOptimizationPage() { return ( Laden...}> ) }