feat(ocr): add self-hosted OCR engine support (Tesseract, EasyOCR) with multi-provider cross-checking

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-02-23 20:59:43 +00:00
parent 9bba1f025f
commit 1f843fe460
7 changed files with 892 additions and 9 deletions
+117
View File
@@ -14,6 +14,7 @@ from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session
from app.models import ApplicationSettings, SettingsAuditLog
from app.utils.ocr_provider import KNOWN_OCR_PROVIDERS
logger = logging.getLogger(__name__)
@@ -280,6 +281,122 @@ SETTING_METADATA = {
"required": False,
"restart_required": False,
},
# OCR Engine Configuration
"ocr_providers": {
"category": "OCR Engines",
"description": (
"Active OCR engines. Select one or more engines to enable. "
"When multiple engines are selected all run in parallel and results are merged. "
"Stored as a comma-separated list (e.g. azure,tesseract)."
),
"type": "multiselect",
"sensitive": False,
"required": False,
"restart_required": False,
"options": KNOWN_OCR_PROVIDERS,
},
"ocr_merge_strategy": {
"category": "OCR Engines",
"description": (
"Strategy for merging results from multiple OCR providers. "
"ai_merge: use AI to produce best merged text (default); "
"longest: return the result with most characters; "
"primary: return only the first provider's result."
),
"type": "string",
"sensitive": False,
"required": False,
"restart_required": False,
"options": ["ai_merge", "longest", "primary"],
},
# OCR Tesseract
"tesseract_cmd": {
"category": "OCR Engines",
"description": "Path to the Tesseract binary (e.g. /usr/bin/tesseract). Leave blank to use system PATH.",
"type": "string",
"sensitive": False,
"required": False,
"restart_required": False,
},
"tesseract_language": {
"category": "OCR Engines",
"description": "Tesseract language code(s), e.g. 'eng' or 'eng+deu'. Default: eng.",
"type": "string",
"sensitive": False,
"required": False,
"restart_required": False,
},
# OCR EasyOCR
"easyocr_languages": {
"category": "OCR Engines",
"description": "Comma-separated EasyOCR language codes, e.g. 'en,de,fr'. Default: en.",
"type": "string",
"sensitive": False,
"required": False,
"restart_required": False,
},
"easyocr_gpu": {
"category": "OCR Engines",
"description": "Enable GPU acceleration for EasyOCR (requires CUDA). Default: False.",
"type": "boolean",
"sensitive": False,
"required": False,
"restart_required": False,
},
# OCR Mistral
"mistral_api_key": {
"category": "OCR Engines",
"description": "Mistral API key (required when 'mistral' is in OCR_PROVIDERS).",
"type": "string",
"sensitive": True,
"required": False,
"restart_required": False,
},
"mistral_ocr_model": {
"category": "OCR Engines",
"description": "Mistral OCR model name. Default: mistral-ocr-latest.",
"type": "string",
"sensitive": False,
"required": False,
"restart_required": False,
},
# OCR Google Cloud Document AI
"google_docai_credentials_json": {
"category": "OCR Engines",
"description": (
"Google Cloud service account credentials JSON for Document AI "
"(optional; falls back to google_drive_credentials_json or Application Default Credentials)."
),
"type": "string",
"sensitive": True,
"required": False,
"restart_required": False,
},
"google_docai_project_id": {
"category": "OCR Engines",
"description": "GCP project ID for Google Cloud Document AI (required when 'google_docai' is in OCR_PROVIDERS).",
"type": "string",
"sensitive": False,
"required": False,
"restart_required": False,
},
"google_docai_processor_id": {
"category": "OCR Engines",
"description": "Document AI processor ID (required when 'google_docai' is in OCR_PROVIDERS).",
"type": "string",
"sensitive": False,
"required": False,
"restart_required": False,
},
"google_docai_location": {
"category": "OCR Engines",
"description": "Document AI processor location (e.g. 'us' or 'eu'). Default: us.",
"type": "string",
"sensitive": False,
"required": False,
"restart_required": False,
"options": ["us", "eu"],
},
# Storage Providers - Dropbox
"dropbox_app_key": {
"category": "Storage Providers",