From 25e5a7415a7b111a65f92ab83b024c838b4d266e Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Thu, 23 Apr 2026 16:09:17 +0200 Subject: [PATCH] Add A/B testing toggles to OCR Kombi Grid Review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quality step toggles in admin-lehrer StepGridReview (port 3002): - CLAHE checkbox (Step 3: image enhancement) - MaxCol dropdown (Step 2: column limit, 0=off) - MinConf dropdown (Step 1: OCR confidence, 0=auto) Parameters flow through: StepGridReview → useGridEditor → build-grid endpoint → _build_grid_core. MinConf filters words before grid building. Toggle settings, click "Neu berechnen" to test each step individually. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../components/grid-editor/useGridEditor.ts | 19 ++++++++++- .../ocr-pipeline/StepGridReview.tsx | 34 +++++++++++++++++++ klausur-service/backend/grid_build_core.py | 17 ++++++++-- klausur-service/backend/grid_editor_api.py | 6 ++++ 4 files changed, 73 insertions(+), 3 deletions(-) diff --git a/admin-lehrer/components/grid-editor/useGridEditor.ts b/admin-lehrer/components/grid-editor/useGridEditor.ts index 188357d..3e9288e 100644 --- a/admin-lehrer/components/grid-editor/useGridEditor.ts +++ b/admin-lehrer/components/grid-editor/useGridEditor.ts @@ -28,6 +28,11 @@ export function useGridEditor(sessionId: string | null) { const [ipaMode, setIpaMode] = useState('auto') const [syllableMode, setSyllableMode] = useState('auto') + // OCR Quality Steps (A/B testing toggles) + const [ocrEnhance, setOcrEnhance] = useState(true) + const [ocrMaxCols, setOcrMaxCols] = useState(0) // 0 = unlimited (admin pipeline default) + const [ocrMinConf, setOcrMinConf] = useState(0) // 0 = auto from quality score + // Undo/redo stacks store serialized zone arrays const undoStack = useRef([]) const redoStack = useRef([]) @@ -52,6 +57,9 @@ export function useGridEditor(sessionId: string | null) { const params = new URLSearchParams() params.set('ipa_mode', ipaMode) params.set('syllable_mode', syllableMode) + params.set('enhance', String(ocrEnhance)) + if (ocrMaxCols > 0) params.set('max_cols', String(ocrMaxCols)) + if (ocrMinConf > 0) params.set('min_conf', String(ocrMinConf)) const res = await fetch( `${KLAUSUR_API}/api/v1/ocr-pipeline/sessions/${sessionId}/build-grid?${params}`, { method: 'POST' }, @@ -70,7 +78,7 @@ export function useGridEditor(sessionId: string | null) { } finally { setLoading(false) } - }, [sessionId, ipaMode, syllableMode]) + }, [sessionId, ipaMode, syllableMode, ocrEnhance, ocrMaxCols, ocrMinConf]) const loadGrid = useCallback(async () => { if (!sessionId) return @@ -85,6 +93,9 @@ export function useGridEditor(sessionId: string | null) { const params = new URLSearchParams() params.set('ipa_mode', ipaMode) params.set('syllable_mode', syllableMode) + params.set('enhance', String(ocrEnhance)) + if (ocrMaxCols > 0) params.set('max_cols', String(ocrMaxCols)) + if (ocrMinConf > 0) params.set('min_conf', String(ocrMinConf)) const buildRes = await fetch( `${KLAUSUR_API}/api/v1/ocr-pipeline/sessions/${sessionId}/build-grid?${params}`, { method: 'POST' }, @@ -981,5 +992,11 @@ export function useGridEditor(sessionId: string | null) { setIpaMode, syllableMode, setSyllableMode, + ocrEnhance, + setOcrEnhance, + ocrMaxCols, + setOcrMaxCols, + ocrMinConf, + setOcrMinConf, } } diff --git a/admin-lehrer/components/ocr-pipeline/StepGridReview.tsx b/admin-lehrer/components/ocr-pipeline/StepGridReview.tsx index cb25e45..c19fd97 100644 --- a/admin-lehrer/components/ocr-pipeline/StepGridReview.tsx +++ b/admin-lehrer/components/ocr-pipeline/StepGridReview.tsx @@ -61,6 +61,12 @@ export function StepGridReview({ sessionId, onNext, saveRef }: StepGridReviewPro setIpaMode, syllableMode, setSyllableMode, + ocrEnhance, + setOcrEnhance, + ocrMaxCols, + setOcrMaxCols, + ocrMinConf, + setOcrMinConf, } = useGridEditor(sessionId) const [showImage, setShowImage] = useState(true) @@ -256,6 +262,34 @@ export function StepGridReview({ sessionId, onNext, saveRef }: StepGridReviewPro Alle akzeptieren )} + {/* OCR Quality Steps (A/B Testing) */} + | + + + +