'use client' /** * Sessions tab: create new sessions and list existing ones. */ import { useState } from 'react' import { API_BASE } from '../constants' import type { OCRSession, CreateSessionRequest, OCRModel } from '../types' interface SessionsTabProps { sessions: OCRSession[] selectedSession: string | null setSelectedSession: (id: string | null) => void fetchSessions: () => Promise setError: (error: string | null) => void } export function SessionsTab({ sessions, selectedSession, setSelectedSession, fetchSessions, setError, }: SessionsTabProps) { const [newSession, setNewSession] = useState({ name: '', source_type: 'klausur', description: '', ocr_model: 'llama3.2-vision:11b', }) const createSession = async () => { try { const res = await fetch(`${API_BASE}/api/v1/ocr-label/sessions`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(newSession), }) if (res.ok) { setNewSession({ name: '', source_type: 'klausur', description: '', ocr_model: 'llama3.2-vision:11b' }) fetchSessions() } else { setError('Session erstellen fehlgeschlagen') } } catch { setError('Netzwerkfehler') } } return (
{/* Create Session */}

Neue Session erstellen

setNewSession(prev => ({ ...prev, name: e.target.value }))} placeholder="z.B. Mathe Klausur Q1 2025" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary-500" />

{newSession.ocr_model === 'paddleocr' && 'PaddleOCR erkennt Text schnell, LLM strukturiert die Ergebnisse.'} {newSession.ocr_model === 'donut' && 'Speziell fuer Dokumente mit Tabellen und Formularen.'} {newSession.ocr_model === 'trocr' && 'Schnelles Transformer-Modell fuer gedruckten Text.'} {newSession.ocr_model === 'llama3.2-vision:11b' && 'Beste Qualitaet bei Handschrift, aber langsamer.'}

setNewSession(prev => ({ ...prev, description: e.target.value }))} placeholder="Optional..." className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-primary-500" />
{/* Sessions List */}

Sessions ({sessions.length})

{sessions.map((session) => (
setSelectedSession(session.id === selectedSession ? null : session.id)} >

{session.name}

{session.source_type} | {session.ocr_model}

{session.labeled_items}/{session.total_items} gelabelt

0 ? (session.labeled_items / session.total_items) * 100 : 0}%` }} />
{session.description && (

{session.description}

)}
))} {sessions.length === 0 && (

Keine Sessions vorhanden

)}
) }