2 Commits

Author SHA1 Message Date
Benjamin Admin
533e0d85f4 fix: DocumentGenerator — 4 Bugs behoben (Suche, Sources, Status-Tiles)
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-ai-compliance (push) Successful in 41s
CI / test-python-backend-compliance (push) Successful in 37s
CI / test-python-document-crawler (push) Successful in 27s
CI / test-python-dsms-gateway (push) Successful in 21s
- runSearch() extrahiert: löst stale-closure bei Schnellstart-Buttons
- Suchbutton nicht mehr disabled bei leerem Query (zeigt alle Vorlagen)
- Status-Tiles: status.total / status.by_status statt status.stats.*
- getSources(): gibt strukturierte Objekte zurück statt rohe Strings
  (Verfügbare Quellen-Kacheln zeigen jetzt Inhalt)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-04 09:49:11 +01:00
Benjamin Admin
119689ee9e fix: Sidebar — MagicHelp (TrOCR) + Bildung & Schule Kategorie entfernt
Diese Module gehoeren nur in den Admin Lehrer (macmini:3002),
nicht ins Compliance Dashboard. Entfernt: Education Search,
Zeugnisse-Crawler, Abitur-Archiv, Klausur-Korrektur, Magic Help.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 09:49:05 +01:00
14 changed files with 41 additions and 523 deletions

View File

@@ -312,17 +312,15 @@ function DocumentGeneratorPageInner() {
}
}, [placeholderValues, selectedDataPointsData])
// Search handler
const handleSearch = useCallback(async () => {
if (!searchQuery.trim()) return
// Core search — accepts explicit params to avoid stale closure issues
const runSearch = useCallback(async (query: string, type?: string, lang?: string, jurisdiction?: string) => {
setIsSearching(true)
try {
const results = await searchTemplates({
query: searchQuery,
templateType: selectedType || undefined,
language: selectedLanguage || undefined,
jurisdiction: selectedJurisdiction || undefined,
query: query || '',
templateType: type || undefined,
language: (lang as 'de' | 'en') || undefined,
jurisdiction: jurisdiction || undefined,
limit: 20,
})
setSearchResults(results)
@@ -331,7 +329,12 @@ function DocumentGeneratorPageInner() {
} finally {
setIsSearching(false)
}
}, [searchQuery, selectedType, selectedLanguage, selectedJurisdiction])
}, [])
// Search handler (uses current state)
const handleSearch = useCallback(async () => {
runSearch(searchQuery, selectedType, selectedLanguage, selectedJurisdiction)
}, [searchQuery, selectedType, selectedLanguage, selectedJurisdiction, runSearch])
// Toggle template selection
const toggleTemplate = (id: string) => {
@@ -408,25 +411,25 @@ function DocumentGeneratorPageInner() {
{/* Status Overview */}
<div className="grid grid-cols-1 md:grid-cols-4 gap-4">
<div className="bg-white rounded-xl border border-gray-200 p-6">
<div className="text-sm text-gray-500">Collection Status</div>
<div className="text-sm text-gray-500">Datenbank</div>
<div className="flex items-center gap-2 mt-1">
<StatusBadge status={status?.stats?.status || 'unknown'} />
<StatusBadge status={status !== null ? 'ready' : serviceMode === 'rag-only' ? 'running' : 'error'} />
</div>
</div>
<div className="bg-white rounded-xl border border-gray-200 p-6">
<div className="text-sm text-gray-500">Indexierte Chunks</div>
<div className="text-sm text-gray-500">Vorlagen gesamt</div>
<div className="text-3xl font-bold text-gray-900">
{status?.stats?.points_count || 0}
{status?.total ?? 0}
</div>
</div>
<div className="bg-white rounded-xl border border-gray-200 p-6">
<div className="text-sm text-gray-500">Aktive Quellen</div>
<div className="text-sm text-gray-500">Veröffentlicht</div>
<div className="text-3xl font-bold text-purple-600">
{sources.filter((s) => s.enabled).length}
{status?.by_status?.published ?? sources.length}
</div>
</div>
<div className="bg-white rounded-xl border border-gray-200 p-6">
<div className="text-sm text-gray-500">Ausgewaehlt</div>
<div className="text-sm text-gray-500">Ausgewählt</div>
<div className="text-3xl font-bold text-blue-600">
{selectedTemplates.length}
</div>
@@ -503,10 +506,10 @@ function DocumentGeneratorPageInner() {
</div>
<button
onClick={handleSearch}
disabled={isSearching || !searchQuery.trim()}
disabled={isSearching}
className="px-6 py-2 bg-purple-600 text-white rounded-lg hover:bg-purple-700 transition-colors disabled:opacity-50"
>
{isSearching ? 'Suche...' : 'Suchen'}
{isSearching ? 'Suche...' : 'Alle anzeigen'}
</button>
</div>
</div>
@@ -570,7 +573,7 @@ function DocumentGeneratorPageInner() {
onClick={() => {
setSearchQuery(item.query)
setSelectedType(item.type as TemplateType)
setTimeout(handleSearch, 100)
runSearch(item.query, item.type)
}}
className="p-4 bg-white rounded-lg border border-gray-200 hover:border-purple-300 hover:shadow transition-all text-center"
>

View File

@@ -132,10 +132,21 @@ export async function getTemplatesStatus(): Promise<any> {
export async function getSources(): Promise<any[]> {
try {
const res = await fetch(`${TEMPLATES_API}/sources`, { signal: AbortSignal.timeout(5000) })
// Fetch status to get type counts for building source objects
const res = await fetch(`${TEMPLATES_API}/status`, { signal: AbortSignal.timeout(5000) })
if (!res.ok) return []
const data = await res.json()
return data.sources || []
const byType: Record<string, number> = data.by_type || {}
const activeTypes = Object.keys(byType).filter(k => byType[k] > 0)
return [
{
name: 'BreakPilot Compliance',
enabled: true,
license_type: 'mit' as const,
description: `${data.total || 0} selbst erstellte Vorlagen (MIT-Lizenz) — DE & EN`,
template_types: activeTypes,
},
]
} catch {
return []
}

View File

@@ -66,16 +66,6 @@
@apply text-infrastructure-700;
}
.bg-category-education {
@apply bg-education-100;
}
.border-category-education {
@apply border-education-300;
}
.text-category-education {
@apply text-education-700;
}
.bg-category-communication {
@apply bg-communication-100;
}

View File

@@ -77,7 +77,6 @@ export default function RoleSelectPage() {
{cat === 'compliance' && 'DSGVO & Compliance'}
{cat === 'ai' && 'KI & Automatisierung'}
{cat === 'infrastructure' && 'Infrastruktur'}
{cat === 'education' && 'Bildung'}
{cat === 'communication' && 'Kommunikation'}
{cat === 'development' && 'Entwicklung'}
</span>

View File

@@ -56,7 +56,6 @@ const CATEGORY_CONFIG: Record<BackendModule['category'], { name: string; icon: s
compliance: { name: 'DSGVO & Compliance', icon: 'shield', color: 'purple' },
ai: { name: 'KI & Automatisierung', icon: 'brain', color: 'teal' },
infrastructure: { name: 'Infrastruktur & DevOps', icon: 'server', color: 'orange' },
education: { name: 'Bildung & Schule', icon: 'graduation', color: 'blue' },
communication: { name: 'Kommunikation & Alerts', icon: 'mail', color: 'green' },
development: { name: 'Entwicklung & Produkte', icon: 'code', color: 'slate' }
}

View File

@@ -463,7 +463,7 @@ export function DataFlowDiagram() {
fill="#94a3b8"
fontSize="11"
>
/compliance | /ai | /infrastructure | /education | /communication | /development
/compliance | /ai | /infrastructure | /communication | /development
</text>
</g>
</svg>

View File

@@ -39,24 +39,6 @@ function getMockData(): CompanionData {
suggestions: [
{
id: '1',
title: 'Klausuren korrigieren',
description: 'Deutsch LK - 12 unkorrigierte Arbeiten warten',
priority: 'urgent',
icon: 'ClipboardCheck',
actionTarget: '/ai/klausur-korrektur',
estimatedTime: 120,
},
{
id: '2',
title: 'Elternsprechtag vorbereiten',
description: 'Notenuebersicht fuer 8b erstellen',
priority: 'high',
icon: 'Users',
actionTarget: '/education/grades',
estimatedTime: 30,
},
{
id: '3',
title: 'Material hochladen',
description: 'Arbeitsblatt fuer naechste Woche bereitstellen',
priority: 'medium',
@@ -64,15 +46,6 @@ function getMockData(): CompanionData {
actionTarget: '/development/content',
estimatedTime: 15,
},
{
id: '4',
title: 'Lernstandserhebung planen',
description: 'Mathe 7a - Naechster Test in 2 Wochen',
priority: 'low',
icon: 'Calendar',
actionTarget: '/education/planning',
estimatedTime: 45,
},
],
upcomingEvents: [
{

View File

@@ -1,164 +0,0 @@
/**
* Extended TypeScript types for Abitur-Archiv
* Builds upon abitur-docs-types.ts with additional search and integration features
*/
import { AbiturDokument, AbiturDocsFilter } from './abitur-docs-types'
// Theme suggestion for autocomplete search
export interface ThemaSuggestion {
label: string // "Gedichtanalyse Romantik"
count: number // 12 Dokumente
aufgabentyp: string // "gedichtanalyse"
zeitraum?: string // "Romantik"
kategorie?: string // Category for grouping
}
// Extended filter with theme search
export interface AbiturArchivFilter extends AbiturDocsFilter {
thema?: string // Semantic theme search query
aufgabentyp?: string // Specific task type filter
}
// Similar document result from RAG
export interface SimilarDocument {
id: string
dateiname: string
similarity_score: number
fach: string
jahr: number
niveau: 'eA' | 'gA'
typ: 'aufgabe' | 'erwartungshorizont'
aufgaben_nummer: string
}
// Extended document with similar documents
export interface AbiturDokumentExtended extends AbiturDokument {
similar_documents?: SimilarDocument[]
themes?: string[] // Extracted themes from content
}
// Response for archive listing
export interface AbiturArchivResponse {
documents: AbiturDokumentExtended[]
total: number
page: number
limit: number
total_pages: number
themes?: ThemaSuggestion[] // Available themes for current filter
}
// Response for theme suggestions
export interface ThemaSuggestResponse {
suggestions: ThemaSuggestion[]
query: string
}
// Response for similar documents
export interface SimilarDocsResponse {
document_id: string
similar: SimilarDocument[]
}
// Klausur creation from archive
export interface KlausurFromArchivRequest {
archiv_dokument_id: string
aufgabentyp: string
title?: string
}
export interface KlausurFromArchivResponse {
klausur_id: string
eh_id?: string
success: boolean
message?: string
}
// View mode for document display
export type ViewMode = 'grid' | 'list'
// Sort options
export type SortField = 'jahr' | 'fach' | 'datum' | 'dateiname'
export type SortDirection = 'asc' | 'desc'
export interface SortConfig {
field: SortField
direction: SortDirection
}
// Predefined theme categories
export const THEME_CATEGORIES = {
textanalyse: {
label: 'Textanalyse',
subcategories: ['pragmatisch', 'literarisch', 'sachtext', 'rede', 'kommentar']
},
gedichtanalyse: {
label: 'Gedichtanalyse',
subcategories: ['romantik', 'expressionismus', 'barock', 'klassik', 'moderne']
},
dramenanalyse: {
label: 'Dramenanalyse',
subcategories: ['klassisch', 'modern', 'episches_theater']
},
prosaanalyse: {
label: 'Prosaanalyse',
subcategories: ['roman', 'kurzgeschichte', 'novelle', 'erzaehlung']
},
eroerterung: {
label: 'Eroerterung',
subcategories: ['textgebunden', 'materialgestuetzt', 'frei']
},
sprachreflexion: {
label: 'Sprachreflexion',
subcategories: ['sprachwandel', 'sprachkritik', 'kommunikation']
}
} as const
// Popular theme suggestions (static fallback)
export const POPULAR_THEMES: ThemaSuggestion[] = [
{ label: 'Textanalyse', count: 45, aufgabentyp: 'textanalyse_pragmatisch', kategorie: 'Analyse' },
{ label: 'Gedichtanalyse', count: 38, aufgabentyp: 'gedichtanalyse', kategorie: 'Analyse' },
{ label: 'Eroerterung', count: 32, aufgabentyp: 'eroerterung_textgebunden', kategorie: 'Argumentation' },
{ label: 'Dramenanalyse', count: 28, aufgabentyp: 'dramenanalyse', kategorie: 'Analyse' },
{ label: 'Prosaanalyse', count: 25, aufgabentyp: 'prosaanalyse', kategorie: 'Analyse' },
]
// Quick action types for document cards
export type QuickAction = 'preview' | 'download' | 'add_to_klausur' | 'view_similar'
// Fullscreen viewer state
export interface ViewerState {
isFullscreen: boolean
zoom: number
currentPage: number
totalPages: number
}
// Default viewer state
export const DEFAULT_VIEWER_STATE: ViewerState = {
isFullscreen: false,
zoom: 100,
currentPage: 1,
totalPages: 1
}
// Zoom levels
export const ZOOM_LEVELS = [25, 50, 75, 100, 125, 150, 175, 200] as const
export const MIN_ZOOM = 25
export const MAX_ZOOM = 200
export const ZOOM_STEP = 25
// Helper functions
export function getThemeLabel(aufgabentyp: string): string {
const entries = Object.entries(THEME_CATEGORIES)
for (const [key, value] of entries) {
if (aufgabentyp.startsWith(key)) {
return value.label
}
}
return aufgabentyp
}
export function formatSimilarityScore(score: number): string {
return `${Math.round(score * 100)}%`
}

View File

@@ -1,84 +0,0 @@
/**
* TypeScript types for Abitur Documents (NiBiS, etc.)
*/
export interface AbiturDokument {
id: string
dateiname: string
original_dateiname: string
bundesland: string
fach: string
jahr: number
niveau: 'eA' | 'gA' // erhöhtes/grundlegendes Anforderungsniveau
typ: 'aufgabe' | 'erwartungshorizont'
aufgaben_nummer: string // I, II, III
status: 'pending' | 'indexed' | 'error'
confidence: number
file_path: string
file_size: number
indexed: boolean
vector_ids: string[]
created_at: string
updated_at: string
}
export interface AbiturDocsResponse {
documents: AbiturDokument[]
total: number
page: number
limit: number
total_pages: number
}
export interface AbiturDocsFilter {
fach?: string
jahr?: number
bundesland?: string
niveau?: 'eA' | 'gA'
typ?: 'aufgabe' | 'erwartungshorizont'
page?: number
limit?: number
}
// Available filter options
export const FAECHER = [
{ id: 'deutsch', label: 'Deutsch' },
{ id: 'mathematik', label: 'Mathematik' },
{ id: 'englisch', label: 'Englisch' },
{ id: 'biologie', label: 'Biologie' },
{ id: 'physik', label: 'Physik' },
{ id: 'chemie', label: 'Chemie' },
{ id: 'geschichte', label: 'Geschichte' },
] as const
export const JAHRE = [2025, 2024, 2023, 2022, 2021, 2020] as const
export const BUNDESLAENDER = [
{ id: 'niedersachsen', label: 'Niedersachsen' },
{ id: 'bayern', label: 'Bayern' },
{ id: 'nrw', label: 'Nordrhein-Westfalen' },
{ id: 'bw', label: 'Baden-Württemberg' },
] as const
export const NIVEAUS = [
{ id: 'eA', label: 'Erhöhtes Anforderungsniveau (eA)' },
{ id: 'gA', label: 'Grundlegendes Anforderungsniveau (gA)' },
] as const
export const TYPEN = [
{ id: 'aufgabe', label: 'Aufgabe' },
{ id: 'erwartungshorizont', label: 'Erwartungshorizont' },
] as const
// Helper functions
export function formatFileSize(bytes: number): string {
if (bytes < 1024) return bytes + ' B'
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'
return (bytes / (1024 * 1024)).toFixed(1) + ' MB'
}
export function formatDocumentTitle(doc: AbiturDokument): string {
const fachLabel = FAECHER.find(f => f.id === doc.fach)?.label || doc.fach
const typLabel = doc.typ === 'erwartungshorizont' ? 'EWH' : 'Aufgabe'
return `${fachLabel} ${doc.jahr} - ${doc.niveau} ${doc.aufgaben_nummer} (${typLabel})`
}

View File

@@ -12,7 +12,7 @@ export interface BackendModule {
id: string
name: string
description: string
category: 'compliance' | 'ai' | 'infrastructure' | 'education' | 'communication' | 'development'
category: 'compliance' | 'ai' | 'infrastructure' | 'communication' | 'development'
backend: {
service: string // e.g. 'consent-service', 'python-backend', 'klausur-service'
port: number
@@ -256,56 +256,6 @@ export const MODULE_REGISTRY: BackendModule[] = [
},
priority: 'medium'
},
{
id: 'magic-help',
name: 'Magic Help (TrOCR)',
description: 'Handschrifterkennung mit TrOCR und LoRA Fine-Tuning',
category: 'ai',
backend: {
service: 'klausur-service',
port: 8086,
basePath: '/api/klausur/trocr',
endpoints: [
{ path: '/status', method: 'GET', description: 'TrOCR Status' },
{ path: '/extract', method: 'POST', description: 'Text aus Bild extrahieren' },
{ path: '/training/examples', method: 'GET', description: 'Trainingsbeispiele' },
{ path: '/training/add', method: 'POST', description: 'Trainingsbeispiel hinzufuegen' },
{ path: '/training/fine-tune', method: 'POST', description: 'Fine-Tuning starten' },
]
},
frontend: {
adminV2Page: '/ai/magic-help',
oldAdminPage: '/admin/magic-help',
status: 'connected'
},
priority: 'medium',
notes: 'Lokale Handschrifterkennung mit Privacy-by-Design'
},
{
id: 'klausur-korrektur',
name: 'Klausur-Korrektur',
description: 'KI-gestuetzte Abitur-Korrektur mit EH-Vorschlaegen',
category: 'ai',
backend: {
service: 'klausur-service',
port: 8086,
basePath: '/api/v1',
endpoints: [
{ path: '/klausuren', method: 'GET', description: 'Alle Klausuren' },
{ path: '/klausuren', method: 'POST', description: 'Klausur erstellen' },
{ path: '/klausuren/{id}/students', method: 'GET', description: 'Studentenarbeiten' },
{ path: '/students/{id}/annotations', method: 'GET', description: 'Anmerkungen' },
{ path: '/students/{id}/gutachten/generate', method: 'POST', description: 'Gutachten generieren' },
]
},
frontend: {
adminV2Page: '/ai/klausur-korrektur',
oldAdminPage: '/admin/klausur-korrektur',
status: 'not-connected'
},
priority: 'high',
notes: 'Komplexes Modul mit eigenem Backend-Service'
},
{
id: 'ocr-labeling',
name: 'OCR-Labeling',
@@ -464,31 +414,6 @@ export const MODULE_REGISTRY: BackendModule[] = [
priority: 'medium'
},
// ===========================================
// EDUCATION MODULES
// ===========================================
{
id: 'edu-search',
name: 'Bildungssuche',
description: 'Suche nach Bildungsinhalten und Ressourcen',
category: 'education',
backend: {
service: 'edu-search-service',
port: 8089,
basePath: '/api/edu',
endpoints: [
{ path: '/search', method: 'GET', description: 'Bildungssuche' },
{ path: '/resources', method: 'GET', description: 'Ressourcen' },
]
},
frontend: {
adminV2Page: '/education/edu-search',
oldAdminPage: '/admin/edu-search',
status: 'connected'
},
priority: 'medium'
},
// ===========================================
// COMMUNICATION MODULES
// ===========================================

View File

@@ -5,7 +5,7 @@
* All DSGVO and Compliance modules are now consolidated under the SDK.
*/
export type CategoryId = 'ai' | 'education' | 'website' | 'sdk-docs'
export type CategoryId = 'ai' | 'website' | 'sdk-docs'
export interface NavModule {
id: string
@@ -42,18 +42,8 @@ export const navigation: NavCategory[] = [
description: 'LLM, OCR, RAG & Machine Learning',
modules: [
// -----------------------------------------------------------------------
// KI-Daten-Pipeline: Magic Help -> OCR -> Indexierung -> Suche
// KI-Daten-Pipeline: OCR -> Indexierung -> Suche
// -----------------------------------------------------------------------
{
id: 'magic-help',
name: 'Magic Help (TrOCR)',
href: '/ai/magic-help',
description: 'TrOCR Testing & Fine-Tuning',
purpose: 'Testen und verbessern Sie die TrOCR-Handschrifterkennung. Laden Sie Bilder hoch, um die OCR-Qualitaet zu pruefen, und trainieren Sie das Modell mit LoRA Fine-Tuning. Bidirektionaler Austausch mit OCR-Labeling.',
audience: ['Entwickler', 'Administratoren', 'QA'],
oldAdminPath: '/admin/magic-help',
subgroup: 'KI-Daten-Pipeline',
},
{
id: 'ocr-labeling',
name: 'OCR-Labeling',
@@ -141,54 +131,6 @@ export const navigation: NavCategory[] = [
],
},
// =========================================================================
// Bildung & Schule
// =========================================================================
{
id: 'education',
name: 'Bildung & Schule',
icon: 'graduation',
color: '#3b82f6', // Blue
colorClass: 'education',
description: 'Bildungsquellen & Lehrplaene',
modules: [
{
id: 'edu-search',
name: 'Education Search',
href: '/education/edu-search',
description: 'Bildungsquellen & Crawler',
purpose: 'Verwalten Sie Bildungsquellen und konfigurieren Sie Crawler fuer neue Inhalte.',
audience: ['Content Manager'],
oldAdminPath: '/admin/edu-search',
},
{
id: 'zeugnisse-crawler',
name: 'Zeugnisse-Crawler',
href: '/education/zeugnisse-crawler',
description: 'Zeugnis-Daten',
purpose: 'Verwalten Sie gecrawlte Zeugnis-Strukturen und -Formate.',
audience: ['Entwickler'],
oldAdminPath: '/admin/zeugnisse-crawler',
},
{
id: 'abitur-archiv',
name: 'Abitur-Archiv',
href: '/education/abitur-archiv',
description: 'Zentralabitur-Materialien 2021-2025',
purpose: 'Durchsuchen und filtern Sie Abitur-Aufgaben und Erwartungshorizonte. Themensuche mit semantischer Suche via RAG. Integration mit Klausur-Korrektur fuer schnelle Vorlagen-Nutzung.',
audience: ['Lehrer', 'Entwickler'],
},
{
id: 'klausur-korrektur',
name: 'Klausur-Korrektur',
href: '/education/klausur-korrektur',
description: 'Abitur-Korrektur mit KI',
purpose: 'KI-gestuetzte Korrektur von Abitur- und Vorabitur-Klausuren. Nutzt die RAG-Pipeline fuer Erwartungshorizont-Vorschlaege.',
audience: ['Lehrer', 'Entwickler'],
oldAdminPath: '/admin/klausur-korrektur',
},
],
},
// =========================================================================
// Website
// =========================================================================
{

View File

@@ -23,7 +23,7 @@ export const roles: Role[] = [
name: 'Entwickler',
description: 'Voller Zugriff auf alle Bereiche',
icon: 'code',
visibleCategories: ['ai', 'education', 'website'],
visibleCategories: ['ai', 'website'],
color: 'bg-primary-100 border-primary-300 text-primary-700',
},
{

View File

@@ -46,18 +46,6 @@ const config: Config = {
800: '#9a3412',
900: '#7c2d12',
},
education: {
50: '#eff6ff',
100: '#dbeafe',
200: '#bfdbfe',
300: '#93c5fd',
400: '#60a5fa',
500: '#3b82f6',
600: '#2563eb',
700: '#1d4ed8',
800: '#1e40af',
900: '#1e3a8a',
},
communication: {
50: '#f0fdf4',
100: '#dcfce7',

View File

@@ -80,16 +80,9 @@ export interface AIModuleLink {
/**
* KI-Daten-Pipeline Module
* Diese Module bilden eine zusammenhaengende Pipeline mit Datenfluss.
* Datenfluss: Magic Help ⟷ OCR-Labeling → RAG Pipeline → Daten & RAG
* Datenfluss: OCR-Labeling → RAG Pipeline → Daten & RAG
*/
export const AI_PIPELINE_MODULES: AIModuleLink[] = [
{
id: 'magic-help',
name: 'Magic Help',
href: '/ai/magic-help',
description: 'TrOCR Testing & LoRA Fine-Tuning',
icon: '✨',
},
{
id: 'ocr-labeling',
name: 'OCR-Labeling',
@@ -149,39 +142,13 @@ export const AI_MODULES: AIModuleLink[] = [
*/
export const AI_MODULE_RELATIONS: Record<string, AIModuleLink[]> = {
// KI-Daten-Pipeline Relations
'magic-help': [
{
id: 'ocr-labeling',
name: 'OCR-Labeling',
href: '/ai/ocr-labeling',
description: 'Ground Truth erstellen',
},
{
id: 'rag-pipeline',
name: 'RAG Pipeline',
href: '/ai/rag-pipeline',
description: 'Erkannte Texte indexieren',
},
],
'ocr-labeling': [
{
id: 'magic-help',
name: 'Magic Help',
href: '/ai/magic-help',
description: 'TrOCR testen & fine-tunen',
},
{
id: 'rag-pipeline',
name: 'RAG Pipeline',
href: '/ai/rag-pipeline',
description: 'Trainierte Daten indexieren',
},
{
id: 'klausur-korrektur',
name: 'Klausur-Korrektur',
href: '/ai/klausur-korrektur',
description: 'OCR in Aktion',
},
],
'rag-pipeline': [
{
@@ -204,12 +171,6 @@ export const AI_MODULE_RELATIONS: Record<string, AIModuleLink[]> = {
href: '/ai/rag-pipeline',
description: 'Neue Dokumente indexieren',
},
{
id: 'klausur-korrektur',
name: 'Klausur-Korrektur',
href: '/ai/klausur-korrektur',
description: 'RAG-Suche nutzen',
},
],
// KI-Werkzeuge Relations (Standalone-Tools)
'llm-compare': [
@@ -233,12 +194,6 @@ export const AI_MODULE_RELATIONS: Record<string, AIModuleLink[]> = {
href: '/ai/llm-compare',
description: 'KI-Provider vergleichen',
},
{
id: 'klausur-korrektur',
name: 'Klausur-Korrektur',
href: '/ai/klausur-korrektur',
description: 'BQAS in Aktion',
},
],
}
@@ -259,24 +214,11 @@ export interface DataFlowConnection {
/**
* Definiert den Datenfluss zwischen den AI-Modulen
*
* Magic Help ⟷ OCR-Labeling: Bidirektionaler Austausch (LoRA + Ground Truth)
* OCR-Labeling → RAG Pipeline: Ground Truth für Training
* RAG Pipeline → Daten & RAG: Embeddings für Vektor-Suche
* Daten & RAG → Klausur-Korrektur: RAG-Suche für Bewertung
*/
export const DATA_FLOW_CONNECTIONS: DataFlowConnection[] = [
{
from: 'magic-help',
to: 'ocr-labeling',
label: 'LoRA Model',
description: 'Verbessertes TrOCR-Modell für OCR-Labeling',
},
{
from: 'ocr-labeling',
to: 'magic-help',
label: 'TrOCR Export',
description: 'Ground Truth Daten im TrOCR-Format für Fine-Tuning',
},
{
from: 'ocr-labeling',
to: 'rag-pipeline',
@@ -289,12 +231,6 @@ export const DATA_FLOW_CONNECTIONS: DataFlowConnection[] = [
label: 'Embeddings',
description: 'Vektor-Embeddings indexierter Dokumente',
},
{
from: 'rag',
to: 'klausur-korrektur',
label: 'RAG-Suche',
description: 'Semantische Suche für Erwartungshorizonte',
},
]
// =============================================================================