"""Pluggable OCR backends. The OCR channel of the hybrid extractor is backend-agnostic. Each backend implements `OCRBackend.extract(path) -> OCRBackendResult`. Selection is by name (`OCR_BACKEND`) or a per-request override, with a graceful fallback chain so a missing GPU / key / endpoint never breaks a run. Backends: • minicpm — MiniCPM-V-4.6 via an OpenAI-compatible server (vLLM / llama.cpp) • cohere — a Cohere vision/OCR model from HuggingFace (transformers) • llamaparse — LlamaParse (LlamaCloud) • tesseract — Tesseract OCR • easyocr — EasyOCR • sidecar — deterministic offline fallback (reads .txt) """ from .base import OCRBackend, OCRBackendResult from .registry import ( OCRRegistry, build_ocr_registry, list_backends, ) __all__ = [ "OCRBackend", "OCRBackendResult", "OCRRegistry", "build_ocr_registry", "list_backends", ]