From 4a15d46dfd663dbdc8d38f192876bf94e8ebd6aa Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Sat, 14 Mar 2026 09:11:26 +0100 Subject: [PATCH] =?UTF-8?q?refactor:=20rename=20PaddleOCR=20=E2=86=92=20PP?= =?UTF-8?q?-OCRv5=20in=20frontend,=20remove=20Kombi-Vergleich=20tab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since ocr_region_paddle() now runs RapidOCR locally (same PP-OCRv5 models), the "PaddleOCR (Hetzner)" labels were misleading. Renamed to "PP-OCRv5 (lokal)". Removed the Kombi-Vergleich tab since both sides would produce identical results. Co-Authored-By: Claude Opus 4.6 --- .../app/(admin)/ai/ocr-overlay/page.tsx | 49 ++++++------------- .../app/(admin)/ai/ocr-overlay/types.ts | 18 ++----- .../ocr-overlay/PaddleDirectStep.tsx | 8 +-- .../ocr-pipeline/StepWordRecognition.tsx | 12 ++--- 4 files changed, 26 insertions(+), 61 deletions(-) diff --git a/admin-lehrer/app/(admin)/ai/ocr-overlay/page.tsx b/admin-lehrer/app/(admin)/ai/ocr-overlay/page.tsx index a99dc89..1c3ded3 100644 --- a/admin-lehrer/app/(admin)/ai/ocr-overlay/page.tsx +++ b/admin-lehrer/app/(admin)/ai/ocr-overlay/page.tsx @@ -11,13 +11,12 @@ import { StepRowDetection } from '@/components/ocr-pipeline/StepRowDetection' import { StepWordRecognition } from '@/components/ocr-pipeline/StepWordRecognition' import { OverlayReconstruction } from '@/components/ocr-overlay/OverlayReconstruction' import { PaddleDirectStep } from '@/components/ocr-overlay/PaddleDirectStep' -import { KombiCompareStep } from '@/components/ocr-overlay/KombiCompareStep' -import { OVERLAY_PIPELINE_STEPS, PADDLE_DIRECT_STEPS, KOMBI_STEPS, KOMBI_COMPARE_STEPS, DOCUMENT_CATEGORIES, dbStepToOverlayUi, type PipelineStep, type SessionListItem, type DocumentCategory } from './types' +import { OVERLAY_PIPELINE_STEPS, PADDLE_DIRECT_STEPS, KOMBI_STEPS, DOCUMENT_CATEGORIES, dbStepToOverlayUi, type PipelineStep, type SessionListItem, type DocumentCategory } from './types' const KLAUSUR_API = '/klausur-api' export default function OcrOverlayPage() { - const [mode, setMode] = useState<'pipeline' | 'paddle-direct' | 'kombi' | 'kombi-compare'>('pipeline') + const [mode, setMode] = useState<'pipeline' | 'paddle-direct' | 'kombi'>('pipeline') const [currentStep, setCurrentStep] = useState(0) const [sessionId, setSessionId] = useState(null) const [sessionName, setSessionName] = useState('') @@ -67,12 +66,11 @@ export default function OcrOverlayPage() { // Check if this session was processed with paddle_direct, kombi, or rapid_kombi const ocrEngine = data.word_result?.ocr_engine const isPaddleDirect = ocrEngine === 'paddle_direct' - const isKombi = ocrEngine === 'kombi' - const isRapidKombi = ocrEngine === 'rapid_kombi' + const isKombi = ocrEngine === 'kombi' || ocrEngine === 'rapid_kombi' - if (isPaddleDirect || isKombi || isRapidKombi) { - const m = isKombi ? 'kombi' : isPaddleDirect ? 'paddle-direct' : 'kombi-compare' - const baseSteps = isKombi ? KOMBI_STEPS : isRapidKombi ? KOMBI_COMPARE_STEPS : PADDLE_DIRECT_STEPS + if (isPaddleDirect || isKombi) { + const m = isKombi ? 'kombi' : 'paddle-direct' + const baseSteps = isKombi ? KOMBI_STEPS : PADDLE_DIRECT_STEPS setMode(m) setSteps( baseSteps.map((s, i) => ({ @@ -107,7 +105,7 @@ export default function OcrOverlayPage() { if (sessionId === sid) { setSessionId(null) setCurrentStep(0) - const baseSteps = mode === 'kombi' ? KOMBI_STEPS : mode === 'kombi-compare' ? KOMBI_COMPARE_STEPS : mode === 'paddle-direct' ? PADDLE_DIRECT_STEPS : OVERLAY_PIPELINE_STEPS + const baseSteps = mode === 'kombi' ? KOMBI_STEPS : mode === 'paddle-direct' ? PADDLE_DIRECT_STEPS : OVERLAY_PIPELINE_STEPS setSteps(baseSteps.map((s, i) => ({ ...s, status: i === 0 ? 'active' : 'pending' }))) } } catch (e) { @@ -164,7 +162,7 @@ export default function OcrOverlayPage() { const handleNext = () => { if (currentStep >= steps.length - 1) { // Last step completed — return to session list - const baseSteps = mode === 'kombi' ? KOMBI_STEPS : mode === 'kombi-compare' ? KOMBI_COMPARE_STEPS : mode === 'paddle-direct' ? PADDLE_DIRECT_STEPS : OVERLAY_PIPELINE_STEPS + const baseSteps = mode === 'kombi' ? KOMBI_STEPS : mode === 'paddle-direct' ? PADDLE_DIRECT_STEPS : OVERLAY_PIPELINE_STEPS setSteps(baseSteps.map((s, i) => ({ ...s, status: i === 0 ? 'active' : 'pending' }))) setCurrentStep(0) setSessionId(null) @@ -193,7 +191,7 @@ export default function OcrOverlayPage() { setSessionId(null) setSessionName('') setCurrentStep(0) - const baseSteps = mode === 'kombi' ? KOMBI_STEPS : mode === 'kombi-compare' ? KOMBI_COMPARE_STEPS : mode === 'paddle-direct' ? PADDLE_DIRECT_STEPS : OVERLAY_PIPELINE_STEPS + const baseSteps = mode === 'kombi' ? KOMBI_STEPS : mode === 'paddle-direct' ? PADDLE_DIRECT_STEPS : OVERLAY_PIPELINE_STEPS setSteps(baseSteps.map((s, i) => ({ ...s, status: i === 0 ? 'active' : 'pending' }))) } @@ -232,7 +230,7 @@ export default function OcrOverlayPage() { }, [sessionId, goToStep]) const renderStep = () => { - if (mode === 'paddle-direct' || mode === 'kombi' || mode === 'kombi-compare') { + if (mode === 'paddle-direct' || mode === 'kombi') { switch (currentStep) { case 0: return @@ -243,19 +241,16 @@ export default function OcrOverlayPage() { case 3: return case 4: - if (mode === 'kombi-compare') { - return - } return mode === 'kombi' ? ( ) : ( @@ -501,7 +496,7 @@ export default function OcrOverlayPage() { : 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300' }`} > - Paddle Direct (5 Schritte) + PP-OCRv5 Direct (5 Schritte) - ('idle') diff --git a/admin-lehrer/components/ocr-pipeline/StepWordRecognition.tsx b/admin-lehrer/components/ocr-pipeline/StepWordRecognition.tsx index f2dead0..af857d5 100644 --- a/admin-lehrer/components/ocr-pipeline/StepWordRecognition.tsx +++ b/admin-lehrer/components/ocr-pipeline/StepWordRecognition.tsx @@ -108,7 +108,7 @@ export function StepWordRecognition({ sessionId, onNext, goToStep, skipHealGaps setGridResult(null) try { - // PaddleOCR forces words_first on the backend, so align frontend accordingly + // PP-OCRv5 forces words_first on the backend, so align frontend accordingly const effectiveGridMethod = eng === 'paddle' ? 'words_first' : gridMethod const useStream = effectiveGridMethod === 'v2' @@ -133,7 +133,7 @@ export function StepWordRecognition({ sessionId, onNext, goToStep, skipHealGaps throw new Error(err.detail || 'Worterkennung fehlgeschlagen') } - // words_first / paddle returns plain JSON (no streaming) + // words_first / pp-ocrv5 returns plain JSON (no streaming) if (!useStream) { const data = await res.json() as GridResult applyGridResult(data) @@ -820,7 +820,7 @@ export function StepWordRecognition({ sessionId, onNext, goToStep, skipHealGaps - + {/* Pronunciation selector (only for vocab) */} @@ -846,13 +846,11 @@ export function StepWordRecognition({ sessionId, onNext, goToStep, skipHealGaps {/* Show which engine was used */} {usedEngine && ( - {usedEngine} + {usedEngine === 'paddle' ? 'pp-ocrv5' : usedEngine} )}