'use client'
/**
* RAG Pipeline Page
*
* Dokument-Indexierung fuer die semantische Suche.
* Teil der KI-Daten-Pipeline:
* OCR-Labeling -> RAG Pipeline -> Daten & RAG
*/
import { PagePurpose } from '@/components/common/PagePurpose'
import { AIModuleSidebarResponsive } from '@/components/ai/AIModuleSidebar'
import { useRagPipeline } from './useRagPipeline'
import { TabButton } from './_components/SharedWidgets'
import { TrainingJobCard } from './_components/TrainingJobCard'
import { DatasetOverview } from './_components/DatasetOverview'
import { ArchitectureTab } from './_components/ArchitectureTab'
import { DataSourcesTab } from './_components/DataSourcesTab'
import { NewTrainingModal } from './_components/NewTrainingModal'
export default function TrainingDashboardPage() {
const {
activeTab,
setActiveTab,
jobs,
stats,
dataSources,
showNewTrainingModal,
setShowNewTrainingModal,
setSelectedJob,
isLoading,
error,
setError,
handleStartTraining,
handlePauseJob,
handleResumeJob,
handleCancelJob,
} = useRagPipeline()
return (
{/* Header */}
RAG-Indexierung
Dokumente fuer die semantische Suche aufbereiten und indexieren
{activeTab === 'dashboard' && (
)}
{/* Tabs */}
setActiveTab('dashboard')}>
Dashboard
setActiveTab('architecture')}>
Architektur
setActiveTab('sources')}>
Datenquellen
{/* Error Banner */}
{error && (
⚠
{error}
)}
{/* Tab Content */}
{activeTab === 'architecture' ? (
) : activeTab === 'sources' ? (
) : isLoading ? (
) : (
)}
setShowNewTrainingModal(false)}
onSubmit={handleStartTraining}
/>
)
}
// --- Internal layout components ---
function LoadingSpinner() {
return (
)
}
function DashboardContent({ jobs, stats, setActiveTab, setShowNewTrainingModal, setSelectedJob, handlePauseJob, handleResumeJob, handleCancelJob }: {
jobs: import('./types').TrainingJob[]
stats: import('./types').DatasetStats
activeTab: string
setActiveTab: (tab: 'dashboard' | 'architecture' | 'sources') => void
setShowNewTrainingModal: (show: boolean) => void
setSelectedJob: (job: import('./types').TrainingJob | null) => void
handlePauseJob: (jobId: string) => Promise
handleResumeJob: (jobId: string) => Promise
handleCancelJob: (jobId: string) => Promise
}) {
return (
{/* Training Jobs */}
{jobs.length === 0 ? (
setShowNewTrainingModal(true)} />
) : (
jobs.map(job => (
handlePauseJob(job.id)}
onResume={() => handleResumeJob(job.id)}
onStop={() => handleCancelJob(job.id)}
onViewDetails={() => setSelectedJob(job)}
/>
))
)}
{/* Sidebar */}
)
}
function EmptyJobsState({ onStart }: { onStart: () => void }) {
return (
Keine aktive Indexierung
Starten Sie eine neue Indexierung, um Dokumente fuer die Suche aufzubereiten.
)
}
function QuickActions({ setActiveTab }: {
setActiveTab: (tab: 'dashboard' | 'architecture' | 'sources') => void
}) {
return (
Schnellaktionen
setActiveTab('architecture')}
/>
setActiveTab('sources')}
/>
)
}
function QuickActionButton({ icon, title, subtitle, onClick }: {
icon: string
title: string
subtitle: string
onClick?: () => void
}) {
return (
)
}