From 77922b8e8f69cebea02128418f8410925c8225d9 Mon Sep 17 00:00:00 2001 From: r-dh Date: Fri, 23 Jan 2026 10:04:00 +0000 Subject: [PATCH 01/11] feat: support Mistral Document AI for document processing --- pyproject.toml | 1 + src/raglite/__init__.py | 4 +- src/raglite/_chainlit.py | 4 +- src/raglite/_config.py | 29 ++++ src/raglite/_database.py | 5 +- src/raglite/_markdown.py | 33 +++- src/raglite/_mistral_ocr.py | 228 ++++++++++++++++++++++++++++ tests/test_mistral_ocr.py | 292 ++++++++++++++++++++++++++++++++++++ 8 files changed, 590 insertions(+), 6 deletions(-) create mode 100644 src/raglite/_mistral_ocr.py create mode 100644 tests/test_mistral_ocr.py diff --git a/pyproject.toml b/pyproject.toml index cdde3628..cc4afecd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,6 +80,7 @@ chainlit = ["chainlit (>=2.0.0)"] # Large Language Models: llama-cpp-python = ["llama-cpp-python (>=0.3.9)"] # Markdown conversion: +mistral-ocr = ["mistralai (>=1.10.1)"] pandoc = ["pypandoc-binary (>=1.13)"] # Evaluation: ragas = ["pandas (>=2.1.1)", "ragas (>=0.3.3)"] diff --git a/src/raglite/__init__.py b/src/raglite/__init__.py index 52a9b598..871eb582 100644 --- a/src/raglite/__init__.py +++ b/src/raglite/__init__.py @@ -1,6 +1,6 @@ """RAGLite.""" -from raglite._config import RAGLiteConfig +from raglite._config import ImageType, MistralOCRConfig, RAGLiteConfig from raglite._database import Document from raglite._delete import delete_documents, delete_documents_by_metadata from raglite._eval import answer_evals, evaluate, insert_evals @@ -22,6 +22,8 @@ __all__ = [ # Config "RAGLiteConfig", + "MistralOCRConfig", + "ImageType", # Insert "Document", "insert_documents", diff --git a/src/raglite/_chainlit.py b/src/raglite/_chainlit.py index d6ff12ea..5bd8d939 100644 --- a/src/raglite/_chainlit.py +++ b/src/raglite/_chainlit.py @@ -75,7 +75,7 @@ async def handle_message(user_message: cl.Message) -> None: inline_attachments = [] for file in user_message.elements: if file.path: - doc_md = document_to_markdown(Path(file.path)) + doc_md = document_to_markdown(Path(file.path), config=config) if len(doc_md) // 3 <= 5 * (config.chunk_max_size // 3): # Document is small enough to attach to the context. inline_attachments.append(f"{Path(file.path).name}:\n\n{doc_md}") @@ -83,7 +83,7 @@ async def handle_message(user_message: cl.Message) -> None: # Document is too large and must be inserted into the database. async with cl.Step(name="insert", type="run") as step: step.input = Path(file.path).name - document = Document.from_path(Path(file.path)) + document = Document.from_path(Path(file.path), config=config) await async_insert_documents([document], config=config) # Append any inline attachments to the user prompt. user_prompt = ( diff --git a/src/raglite/_config.py b/src/raglite/_config.py index de715c68..8e7766e3 100644 --- a/src/raglite/_config.py +++ b/src/raglite/_config.py @@ -3,6 +3,7 @@ import contextlib import os from dataclasses import dataclass, field +from enum import Enum from io import StringIO from pathlib import Path from typing import Literal @@ -23,6 +24,32 @@ cache_path = Path(user_data_dir("raglite", ensure_exists=True)) +class ImageType(str, Enum): + """Type of image detected by OCR.""" + + GRAPH = "graph" + CHART = "chart" + DIAGRAM = "diagram" + TABLE = "table" + PHOTO = "photo" + SCREENSHOT = "screenshot" + LOGO = "logo" + ICON = "icon" + OTHER = "other" + + +@dataclass(frozen=True) +class MistralOCRConfig: + """Configuration for MistralOCR document processor.""" + + # API key - falls back to MISTRAL_API_KEY env var if None. + api_key: str | None = None + # Whether to use vision to describe images in documents. + include_image_descriptions: bool = True + # Image types to exclude from processing (e.g., {ImageType.LOGO, ImageType.ICON}). + exclude_image_types: frozenset[ImageType] = field(default_factory=frozenset) + + # Lazily load the default search method to avoid circular imports. # TODO: Replace with search_and_rerank_chunk_spans after benchmarking. def _vector_search( @@ -65,6 +92,8 @@ class RAGLiteConfig: embedder_normalize: bool = True # Chunk config used to partition documents into chunks. chunk_max_size: int = 2048 # Max number of characters per chunk. + # Document processing config. None = default processor. + document_processor: MistralOCRConfig | None = None # Vector search config. vector_search_distance_metric: Literal["cosine", "dot", "l2"] = "cosine" vector_search_multivector: bool = True diff --git a/src/raglite/_database.py b/src/raglite/_database.py index 2276f46b..7ea5cc62 100644 --- a/src/raglite/_database.py +++ b/src/raglite/_database.py @@ -108,6 +108,7 @@ def from_path( *, id: DocumentId | None = None, # noqa: A002 url: str | None = None, + config: RAGLiteConfig | None = None, **kwargs: Any, ) -> "Document": """Create a document from a file path. @@ -120,6 +121,8 @@ def from_path( The document id to use. If not provided, a hash of the document's content is used. url The URL of the document, if available. + config + The RAGLite configuration for document processing. kwargs Any additional metadata to store. @@ -145,7 +148,7 @@ def from_path( filename=doc_path.name, url=url, metadata_=metadata, - content=document_to_markdown(doc_path), + content=document_to_markdown(doc_path, config=config), ) @staticmethod diff --git a/src/raglite/_markdown.py b/src/raglite/_markdown.py index b5269fb3..d421e71b 100644 --- a/src/raglite/_markdown.py +++ b/src/raglite/_markdown.py @@ -9,6 +9,8 @@ from pdftext.extraction import dictionary_output from sklearn.cluster import KMeans +from raglite._config import MistralOCRConfig, RAGLiteConfig + def parsed_pdf_to_markdown(pages: list[dict[str, Any]]) -> list[str]: # noqa: C901, PLR0915 """Convert a PDF parsed with pdftext to Markdown.""" @@ -194,8 +196,8 @@ def _merge_split_headings(match: re.Match[str]) -> str: return pages_md -def document_to_markdown(doc_path: Path) -> str: - """Convert any document to GitHub Flavored Markdown.""" +def _default_document_to_markdown(doc_path: Path) -> str: + """Convert any document to GitHub Flavored Markdown using pdftext/pandoc.""" # Convert the file's content to GitHub Flavored Markdown. if doc_path.suffix == ".pdf": # Parse the PDF with pdftext and convert it to Markdown. @@ -219,3 +221,30 @@ def document_to_markdown(doc_path: Path) -> str: # File format not supported, fall back to reading the text. doc = doc_path.read_text() return doc + + +def document_to_markdown(doc_path: Path, *, config: RAGLiteConfig | None = None) -> str: + """Convert any document to GitHub Flavored Markdown. + + Parameters + ---------- + doc_path + Path to the document file. + config + Optional RAGLite configuration. If document_processor is set to a + MistralOCRConfig, uses MistralOCR instead of the default processor. + + Returns + ------- + str + Document content as GitHub Flavored Markdown. + """ + config = config or RAGLiteConfig() + + if isinstance(config.document_processor, MistralOCRConfig): + # Lazy import to avoid requiring mistralai when not using MistralOCR. + from raglite._mistral_ocr import mistral_ocr_to_markdown + + return mistral_ocr_to_markdown(doc_path, processor_config=config.document_processor) + + return _default_document_to_markdown(doc_path) diff --git a/src/raglite/_mistral_ocr.py b/src/raglite/_mistral_ocr.py new file mode 100644 index 00000000..af48be99 --- /dev/null +++ b/src/raglite/_mistral_ocr.py @@ -0,0 +1,228 @@ +"""MistralOCR document processor for RAGLite.""" + +from __future__ import annotations + +import base64 +import logging +import os +import re +from pathlib import Path # noqa: TC003 +from typing import Any + +from pydantic import BaseModel, Field + +from raglite._config import ImageType, MistralOCRConfig # noqa: TC001 + +logger = logging.getLogger(__name__) + +# File extensions supported by MistralOCR. +SUPPORTED_EXTENSIONS = {".pdf", ".png", ".jpg", ".jpeg", ".avif", ".docx", ".pptx", ".webp"} + + +class MistralOCRError(Exception): + """Error during MistralOCR processing.""" + + +class ImageAnnotation(BaseModel): + """Schema for vision-based image annotation.""" + + image_type: ImageType = Field( + ..., + description=( + "The type of the image. Must be one of: graph, chart, diagram, table, " + "photo, screenshot, logo, icon, or other." + ), + ) + description: str = Field( + ..., + description=( + "A concise description of the image content. For diagrams and charts, " + "describe what is being illustrated. For tables, summarize the data. " + "For photos, describe the subject matter." + ), + ) + + +def _get_api_key(processor_config: MistralOCRConfig) -> str: + """Get the Mistral API key from config or environment variable.""" + api_key = processor_config.api_key or os.environ.get("MISTRAL_API_KEY") + if not api_key: + error_msg = ( + "MISTRAL_API_KEY environment variable is not set and MistralOCRConfig.api_key is None." + ) + raise ValueError(error_msg) + return api_key + + +def _get_mistral_client(processor_config: MistralOCRConfig) -> Any: + """Get a Mistral client instance.""" + try: + from mistralai import Mistral + except ImportError as e: + error_msg = ( + "To use MistralOCR, please install the `mistral-ocr` extra: " + "`pip install raglite[mistral-ocr]` or `uv add raglite[mistral-ocr]`." + ) + raise ImportError(error_msg) from e + + api_key = _get_api_key(processor_config) + return Mistral(api_key=api_key) + + +def _encode_document_base64(doc_path: Path) -> tuple[str, str]: + """Encode a document as base64 with appropriate MIME type.""" + mime_types = { + ".pdf": "application/pdf", + ".png": "image/png", + ".jpg": "image/jpeg", + ".jpeg": "image/jpeg", + ".avif": "image/avif", + ".webp": "image/webp", + ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", + } + mime_type = mime_types.get(doc_path.suffix.lower(), "application/octet-stream") + data = base64.standard_b64encode(doc_path.read_bytes()).decode("utf-8") + return data, mime_type + + +def _process_ocr_response( + ocr_response: Any, + *, + include_image_descriptions: bool = True, + exclude_image_types: frozenset[ImageType] | None = None, +) -> str: + """Convert MistralOCR response to markdown string. + + When include_image_descriptions is True and bbox_annotation_format was used, + image placeholders are replaced with their annotations. + + Parameters + ---------- + ocr_response + Response from Mistral OCR API. + include_image_descriptions + Whether to replace image placeholders with annotations. + exclude_image_types + Set of ImageType values to exclude from output. + + Returns + ------- + str + Document content as markdown. + """ + exclude_image_types = exclude_image_types or frozenset() + pages_md = [] + + for page in ocr_response.pages: + page_md = page.markdown + + if include_image_descriptions and page.images: + for img in page.images: + # Check if the image has an annotation (from bbox_annotation_format). + annotation = getattr(img, "image_annotation", None) + if annotation: + placeholder_pattern = rf"!\[[^\]]*\]\({re.escape(img.id)}\)" + # Parse annotation to check image type for filtering. + try: + parsed = ImageAnnotation.model_validate_json(annotation) + if parsed.image_type in exclude_image_types: + # Remove the image placeholder entirely. + page_md = re.sub(placeholder_pattern, "", page_md) + continue + replacement = f"[Image ({parsed.image_type.value}): {parsed.description}]" + except (ValueError, TypeError): + # If parsing fails, use raw annotation. + replacement = f"[Image: {annotation}]" + page_md = re.sub(placeholder_pattern, replacement, page_md) + + pages_md.append(page_md) + + return "\n\n".join(pages_md) + + +def mistral_ocr_to_markdown(doc_path: Path, *, processor_config: MistralOCRConfig) -> str: + """Convert a document to markdown using Mistral OCR with vision annotations. + + Uses Mistral's bbox_annotation_format to automatically describe images and + diagrams found in the document, making visual content searchable. + + Parameters + ---------- + doc_path + Path to the document file. + processor_config + MistralOCR processor configuration. + + Returns + ------- + str + Document content as GitHub Flavored Markdown with image descriptions. + + Raises + ------ + ImportError + If the mistralai package is not installed. + ValueError + If MISTRAL_API_KEY is not set and MistralOCRConfig.api_key is None. + MistralOCRError + If the OCR processing fails. + """ + # Check if file extension is supported by MistralOCR. + if doc_path.suffix.lower() not in SUPPORTED_EXTENSIONS: + # Fall back to default processor for unsupported types. + from raglite._markdown import _default_document_to_markdown + + return _default_document_to_markdown(doc_path) + + try: + from mistralai.extra import response_format_from_pydantic_model + + client = _get_mistral_client(processor_config) + + # Encode document as base64. + data, mime_type = _encode_document_base64(doc_path) + + # Prepare document payload based on file type. + if doc_path.suffix.lower() in {".png", ".jpg", ".jpeg", ".avif", ".webp"}: + document_payload = { + "type": "image_url", + "image_url": f"data:{mime_type};base64,{data}", + } + else: + # PDF, DOCX, PPTX. + document_payload = { + "type": "document_url", + "document_url": f"data:{mime_type};base64,{data}", + } + + # Build OCR request parameters. + ocr_params: dict[str, Any] = { + "model": "mistral-ocr-latest", + "document": document_payload, + "include_image_base64": False, # We don't need base64, just annotations. + } + + # Add bbox annotation format if image descriptions are enabled. + if processor_config.include_image_descriptions: + ocr_params["bbox_annotation_format"] = response_format_from_pydantic_model( + ImageAnnotation + ) + + # Call MistralOCR API. + ocr_response = client.ocr.process(**ocr_params) + + # Process response and replace image placeholders with annotations. + return _process_ocr_response( + ocr_response, + include_image_descriptions=processor_config.include_image_descriptions, + exclude_image_types=processor_config.exclude_image_types, + ) + + except ImportError: + raise # Re-raise import errors with the helpful message. + except ValueError: + raise # Re-raise API key errors. + except Exception as e: + error_msg = f"MistralOCR failed to process {doc_path}: {e}" + raise MistralOCRError(error_msg) from e diff --git a/tests/test_mistral_ocr.py b/tests/test_mistral_ocr.py new file mode 100644 index 00000000..fa10ae2d --- /dev/null +++ b/tests/test_mistral_ocr.py @@ -0,0 +1,292 @@ +"""Test MistralOCR integration.""" + +from __future__ import annotations + +import os +from pathlib import Path +from unittest.mock import MagicMock, patch + +import pytest + +from raglite import ImageType, MistralOCRConfig, RAGLiteConfig + + +class TestMistralOCRConfig: + """Test MistralOCR configuration.""" + + def test_default_processor_is_none(self) -> None: + """Default processor should be None (use default processor).""" + config = RAGLiteConfig() + assert config.document_processor is None + + def test_mistral_processor_config(self) -> None: + """Can configure MistralOCR processor.""" + processor_config = MistralOCRConfig( + api_key="test-key", + include_image_descriptions=False, + ) + config = RAGLiteConfig(document_processor=processor_config) + assert config.document_processor is not None + assert config.document_processor.api_key == "test-key" + assert config.document_processor.include_image_descriptions is False + + def test_default_image_descriptions_enabled(self) -> None: + """Image descriptions should be enabled by default.""" + processor_config = MistralOCRConfig() + assert processor_config.include_image_descriptions is True + + def test_exclude_image_types_default_empty(self) -> None: + """Exclude image types should be empty by default.""" + processor_config = MistralOCRConfig() + assert processor_config.exclude_image_types == frozenset() + + def test_exclude_image_types_can_be_set(self) -> None: + """Can set exclude image types.""" + processor_config = MistralOCRConfig( + exclude_image_types=frozenset({ImageType.LOGO, ImageType.ICON}) + ) + assert ImageType.LOGO in processor_config.exclude_image_types + assert ImageType.ICON in processor_config.exclude_image_types + assert ImageType.PHOTO not in processor_config.exclude_image_types + + +class TestMistralOCRAPIKey: + """Test MistralOCR API key handling.""" + + def test_api_key_from_config(self) -> None: + """API key can be provided via config.""" + from raglite._mistral_ocr import _get_api_key + + processor_config = MistralOCRConfig(api_key="config-key") + assert _get_api_key(processor_config) == "config-key" + + def test_api_key_from_env(self) -> None: + """API key falls back to environment variable.""" + from raglite._mistral_ocr import _get_api_key + + processor_config = MistralOCRConfig() + with patch.dict(os.environ, {"MISTRAL_API_KEY": "env-key"}): + assert _get_api_key(processor_config) == "env-key" + + def test_api_key_config_takes_precedence(self) -> None: + """Config API key takes precedence over environment variable.""" + from raglite._mistral_ocr import _get_api_key + + processor_config = MistralOCRConfig(api_key="config-key") + with patch.dict(os.environ, {"MISTRAL_API_KEY": "env-key"}): + assert _get_api_key(processor_config) == "config-key" + + def test_missing_api_key_raises_error(self) -> None: + """Missing API key should raise ValueError.""" + from raglite._mistral_ocr import _get_api_key + + processor_config = MistralOCRConfig() + with patch.dict(os.environ, {}, clear=True): + # Remove MISTRAL_API_KEY if present. + os.environ.pop("MISTRAL_API_KEY", None) + with pytest.raises(ValueError, match="MISTRAL_API_KEY"): + _get_api_key(processor_config) + + +class TestMistralOCRFallback: + """Test MistralOCR fallback behavior.""" + + def test_unsupported_extension_falls_back(self) -> None: + """Unsupported file extensions should fall back to default processor.""" + from raglite._mistral_ocr import SUPPORTED_EXTENSIONS, mistral_ocr_to_markdown + + # .odt is not in SUPPORTED_EXTENSIONS. + assert ".odt" not in SUPPORTED_EXTENSIONS + + processor_config = MistralOCRConfig(api_key="test-key") + + # Patch at the source module where it's defined. + with patch("raglite._markdown._default_document_to_markdown") as mock_default: + mock_default.return_value = "fallback content" + result = mistral_ocr_to_markdown(Path("test.odt"), processor_config=processor_config) + mock_default.assert_called_once_with(Path("test.odt")) + assert result == "fallback content" + + +class TestMistralOCRMocked: + """Test MistralOCR with mocked API.""" + + def test_process_ocr_response_basic(self) -> None: + """Test _process_ocr_response with basic markdown.""" + from raglite._mistral_ocr import _process_ocr_response + + # Create mock OCR response. + mock_page = MagicMock() + mock_page.markdown = "# Test Document\n\nThis is a test." + mock_page.images = [] + + mock_response = MagicMock() + mock_response.pages = [mock_page] + + result = _process_ocr_response(mock_response, include_image_descriptions=False) + + assert "# Test Document" in result + assert "This is a test." in result + + def test_process_ocr_response_with_annotations(self) -> None: + """Test _process_ocr_response replaces image placeholders with annotations.""" + from raglite._mistral_ocr import _process_ocr_response + + # Create mock image with valid JSON annotation. + mock_image = MagicMock() + mock_image.id = "img-0.jpeg" + mock_image.image_annotation = ( + '{"image_type": "diagram", "description": "A flowchart showing the process"}' + ) + + mock_page = MagicMock() + mock_page.markdown = "# Document\n\n![img-0.jpeg](img-0.jpeg)\n\nSome text." + mock_page.images = [mock_image] + + mock_response = MagicMock() + mock_response.pages = [mock_page] + + result = _process_ocr_response(mock_response, include_image_descriptions=True) + + # Image placeholder should be replaced with annotation. + assert "![img-0.jpeg](img-0.jpeg)" not in result + assert "[Image (diagram): A flowchart showing the process]" in result + + def test_process_ocr_response_with_raw_annotation_fallback(self) -> None: + """Test _process_ocr_response falls back to raw annotation if parsing fails.""" + from raglite._mistral_ocr import _process_ocr_response + + # Create mock image with non-JSON annotation. + mock_image = MagicMock() + mock_image.id = "img-0.jpeg" + mock_image.image_annotation = "diagram: A flowchart showing the process" + + mock_page = MagicMock() + mock_page.markdown = "# Document\n\n![img-0.jpeg](img-0.jpeg)\n\nSome text." + mock_page.images = [mock_image] + + mock_response = MagicMock() + mock_response.pages = [mock_page] + + result = _process_ocr_response(mock_response, include_image_descriptions=True) + + # Should fall back to raw annotation. + assert "[Image: diagram: A flowchart showing the process]" in result + + def test_process_ocr_response_multiple_pages(self) -> None: + """Test _process_ocr_response with multiple pages.""" + from raglite._mistral_ocr import _process_ocr_response + + mock_page1 = MagicMock() + mock_page1.markdown = "# Page 1" + mock_page1.images = [] + + mock_page2 = MagicMock() + mock_page2.markdown = "# Page 2" + mock_page2.images = [] + + mock_response = MagicMock() + mock_response.pages = [mock_page1, mock_page2] + + result = _process_ocr_response(mock_response, include_image_descriptions=False) + + assert "# Page 1" in result + assert "# Page 2" in result + # Pages should be separated by double newlines. + assert "\n\n" in result + + def test_process_ocr_response_exclude_image_types(self) -> None: + """Test _process_ocr_response excludes specified image types.""" + from raglite._mistral_ocr import _process_ocr_response + + # Create mock images with different types. + mock_logo = MagicMock() + mock_logo.id = "img-logo.jpeg" + mock_logo.image_annotation = '{"image_type": "logo", "description": "Company logo"}' + + mock_diagram = MagicMock() + mock_diagram.id = "img-diagram.jpeg" + mock_diagram.image_annotation = ( + '{"image_type": "diagram", "description": "Architecture diagram"}' + ) + + mock_page = MagicMock() + mock_page.markdown = ( + "# Document\n\n![](img-logo.jpeg)\n\n![](img-diagram.jpeg)\n\nSome text." + ) + mock_page.images = [mock_logo, mock_diagram] + + mock_response = MagicMock() + mock_response.pages = [mock_page] + + result = _process_ocr_response( + mock_response, + include_image_descriptions=True, + exclude_image_types=frozenset({ImageType.LOGO}), + ) + + # Logo should be removed entirely. + assert "logo" not in result.lower() + assert "Company logo" not in result + # Diagram should be included. + assert "[Image (diagram): Architecture diagram]" in result + + +class TestDocumentToMarkdownDispatch: + """Test document_to_markdown dispatcher.""" + + def test_default_processor_used(self) -> None: + """Default config should use default processor.""" + from raglite._markdown import document_to_markdown + + config = RAGLiteConfig() + + with patch("raglite._markdown._default_document_to_markdown") as mock_default: + mock_default.return_value = "default content" + # Need to create a real file for this test. + document_to_markdown(Path("test.txt"), config=config) + mock_default.assert_called_once_with(Path("test.txt")) + + def test_mistral_processor_used(self) -> None: + """Mistral config should use MistralOCR processor.""" + from raglite._markdown import document_to_markdown + + processor_config = MistralOCRConfig(api_key="test-key") + config = RAGLiteConfig(document_processor=processor_config) + + # Patch at the source module where mistral_ocr_to_markdown is defined. + with patch("raglite._mistral_ocr.mistral_ocr_to_markdown") as mock_mistral: + mock_mistral.return_value = "mistral content" + result = document_to_markdown(Path("test.pdf"), config=config) + mock_mistral.assert_called_once_with( + Path("test.pdf"), processor_config=processor_config + ) + assert result == "mistral content" + + +def is_mistral_available() -> bool: + """Check if Mistral API key is set.""" + return bool(os.environ.get("MISTRAL_API_KEY")) + + +@pytest.mark.skipif(not is_mistral_available(), reason="MISTRAL_API_KEY not set") +@pytest.mark.slow +class TestMistralOCRIntegration: + """Integration tests requiring actual API access.""" + + def test_real_pdf_conversion(self) -> None: + """Test real PDF conversion with actual API.""" + from raglite._mistral_ocr import mistral_ocr_to_markdown + + processor_config = MistralOCRConfig(include_image_descriptions=True) + + # Use the test PDF that exists in the tests directory. + doc_path = Path(__file__).parent / "specrel.pdf" + if not doc_path.exists(): + pytest.skip("Test PDF not found") + + result = mistral_ocr_to_markdown(doc_path, processor_config=processor_config) + + # Basic sanity checks. + assert len(result) > 100 # noqa: PLR2004 + assert isinstance(result, str) From 142636270e3dd65e973ba063e0a8fb58306732ab Mon Sep 17 00:00:00 2001 From: r-dh Date: Fri, 23 Jan 2026 15:23:52 +0000 Subject: [PATCH 02/11] chore: clean up code --- src/raglite/__init__.py | 2 ++ src/raglite/_config.py | 2 +- src/raglite/_markdown.py | 5 ++-- src/raglite/_mistral_ocr.py | 56 +++++++++++++++---------------------- tests/test_mistral_ocr.py | 47 +++++++------------------------ 5 files changed, 39 insertions(+), 73 deletions(-) diff --git a/src/raglite/__init__.py b/src/raglite/__init__.py index 871eb582..f0ba3edf 100644 --- a/src/raglite/__init__.py +++ b/src/raglite/__init__.py @@ -6,6 +6,7 @@ from raglite._eval import answer_evals, evaluate, insert_evals from raglite._extract import expand_document_metadata from raglite._insert import insert_documents +from raglite._mistral_ocr import MistralOCRError from raglite._query_adapter import update_query_adapter from raglite._rag import add_context, async_rag, rag, retrieve_context from raglite._search import ( @@ -23,6 +24,7 @@ # Config "RAGLiteConfig", "MistralOCRConfig", + "MistralOCRError", "ImageType", # Insert "Document", diff --git a/src/raglite/_config.py b/src/raglite/_config.py index 8e7766e3..acea2de6 100644 --- a/src/raglite/_config.py +++ b/src/raglite/_config.py @@ -47,7 +47,7 @@ class MistralOCRConfig: # Whether to use vision to describe images in documents. include_image_descriptions: bool = True # Image types to exclude from processing (e.g., {ImageType.LOGO, ImageType.ICON}). - exclude_image_types: frozenset[ImageType] = field(default_factory=frozenset) + exclude_image_types: frozenset[ImageType] = frozenset() # Lazily load the default search method to avoid circular imports. diff --git a/src/raglite/_markdown.py b/src/raglite/_markdown.py index d421e71b..d8a19895 100644 --- a/src/raglite/_markdown.py +++ b/src/raglite/_markdown.py @@ -243,8 +243,9 @@ def document_to_markdown(doc_path: Path, *, config: RAGLiteConfig | None = None) if isinstance(config.document_processor, MistralOCRConfig): # Lazy import to avoid requiring mistralai when not using MistralOCR. - from raglite._mistral_ocr import mistral_ocr_to_markdown + from raglite._mistral_ocr import SUPPORTED_EXTENSIONS, mistral_ocr_to_markdown - return mistral_ocr_to_markdown(doc_path, processor_config=config.document_processor) + if doc_path.suffix.lower() in SUPPORTED_EXTENSIONS: + return mistral_ocr_to_markdown(doc_path, processor_config=config.document_processor) return _default_document_to_markdown(doc_path) diff --git a/src/raglite/_mistral_ocr.py b/src/raglite/_mistral_ocr.py index af48be99..192885f2 100644 --- a/src/raglite/_mistral_ocr.py +++ b/src/raglite/_mistral_ocr.py @@ -1,37 +1,46 @@ """MistralOCR document processor for RAGLite.""" -from __future__ import annotations - import base64 import logging import os import re -from pathlib import Path # noqa: TC003 +from pathlib import Path from typing import Any from pydantic import BaseModel, Field -from raglite._config import ImageType, MistralOCRConfig # noqa: TC001 +from raglite._config import ImageType, MistralOCRConfig logger = logging.getLogger(__name__) -# File extensions supported by MistralOCR. -SUPPORTED_EXTENSIONS = {".pdf", ".png", ".jpg", ".jpeg", ".avif", ".docx", ".pptx", ".webp"} +# Single source of truth for supported extensions and their MIME types. +_MIME_TYPES: dict[str, str] = { + ".pdf": "application/pdf", + ".png": "image/png", + ".jpg": "image/jpeg", + ".jpeg": "image/jpeg", + ".avif": "image/avif", + ".webp": "image/webp", + ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", +} +SUPPORTED_EXTENSIONS = frozenset(_MIME_TYPES) +_IMAGE_EXTENSIONS = frozenset(ext for ext, mime in _MIME_TYPES.items() if mime.startswith("image/")) class MistralOCRError(Exception): """Error during MistralOCR processing.""" +_IMAGE_TYPE_VALUES = ", ".join(t.value for t in ImageType) + + class ImageAnnotation(BaseModel): """Schema for vision-based image annotation.""" image_type: ImageType = Field( ..., - description=( - "The type of the image. Must be one of: graph, chart, diagram, table, " - "photo, screenshot, logo, icon, or other." - ), + description=f"The type of the image. Must be one of: {_IMAGE_TYPE_VALUES}.", ) description: str = Field( ..., @@ -71,17 +80,7 @@ def _get_mistral_client(processor_config: MistralOCRConfig) -> Any: def _encode_document_base64(doc_path: Path) -> tuple[str, str]: """Encode a document as base64 with appropriate MIME type.""" - mime_types = { - ".pdf": "application/pdf", - ".png": "image/png", - ".jpg": "image/jpeg", - ".jpeg": "image/jpeg", - ".avif": "image/avif", - ".webp": "image/webp", - ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", - } - mime_type = mime_types.get(doc_path.suffix.lower(), "application/octet-stream") + mime_type = _MIME_TYPES.get(doc_path.suffix.lower(), "application/octet-stream") data = base64.standard_b64encode(doc_path.read_bytes()).decode("utf-8") return data, mime_type @@ -168,13 +167,6 @@ def mistral_ocr_to_markdown(doc_path: Path, *, processor_config: MistralOCRConfi MistralOCRError If the OCR processing fails. """ - # Check if file extension is supported by MistralOCR. - if doc_path.suffix.lower() not in SUPPORTED_EXTENSIONS: - # Fall back to default processor for unsupported types. - from raglite._markdown import _default_document_to_markdown - - return _default_document_to_markdown(doc_path) - try: from mistralai.extra import response_format_from_pydantic_model @@ -184,7 +176,7 @@ def mistral_ocr_to_markdown(doc_path: Path, *, processor_config: MistralOCRConfi data, mime_type = _encode_document_base64(doc_path) # Prepare document payload based on file type. - if doc_path.suffix.lower() in {".png", ".jpg", ".jpeg", ".avif", ".webp"}: + if doc_path.suffix.lower() in _IMAGE_EXTENSIONS: document_payload = { "type": "image_url", "image_url": f"data:{mime_type};base64,{data}", @@ -219,10 +211,8 @@ def mistral_ocr_to_markdown(doc_path: Path, *, processor_config: MistralOCRConfi exclude_image_types=processor_config.exclude_image_types, ) - except ImportError: - raise # Re-raise import errors with the helpful message. - except ValueError: - raise # Re-raise API key errors. + except (ImportError, ValueError): + raise except Exception as e: error_msg = f"MistralOCR failed to process {doc_path}: {e}" raise MistralOCRError(error_msg) from e diff --git a/tests/test_mistral_ocr.py b/tests/test_mistral_ocr.py index fa10ae2d..d01b5cd2 100644 --- a/tests/test_mistral_ocr.py +++ b/tests/test_mistral_ocr.py @@ -1,7 +1,5 @@ """Test MistralOCR integration.""" -from __future__ import annotations - import os from pathlib import Path from unittest.mock import MagicMock, patch @@ -9,6 +7,13 @@ import pytest from raglite import ImageType, MistralOCRConfig, RAGLiteConfig +from raglite._markdown import document_to_markdown +from raglite._mistral_ocr import ( + SUPPORTED_EXTENSIONS, + _get_api_key, + _process_ocr_response, + mistral_ocr_to_markdown, +) class TestMistralOCRConfig: @@ -55,31 +60,23 @@ class TestMistralOCRAPIKey: def test_api_key_from_config(self) -> None: """API key can be provided via config.""" - from raglite._mistral_ocr import _get_api_key - processor_config = MistralOCRConfig(api_key="config-key") assert _get_api_key(processor_config) == "config-key" def test_api_key_from_env(self) -> None: """API key falls back to environment variable.""" - from raglite._mistral_ocr import _get_api_key - processor_config = MistralOCRConfig() with patch.dict(os.environ, {"MISTRAL_API_KEY": "env-key"}): assert _get_api_key(processor_config) == "env-key" def test_api_key_config_takes_precedence(self) -> None: """Config API key takes precedence over environment variable.""" - from raglite._mistral_ocr import _get_api_key - processor_config = MistralOCRConfig(api_key="config-key") with patch.dict(os.environ, {"MISTRAL_API_KEY": "env-key"}): assert _get_api_key(processor_config) == "config-key" def test_missing_api_key_raises_error(self) -> None: """Missing API key should raise ValueError.""" - from raglite._mistral_ocr import _get_api_key - processor_config = MistralOCRConfig() with patch.dict(os.environ, {}, clear=True): # Remove MISTRAL_API_KEY if present. @@ -93,17 +90,14 @@ class TestMistralOCRFallback: def test_unsupported_extension_falls_back(self) -> None: """Unsupported file extensions should fall back to default processor.""" - from raglite._mistral_ocr import SUPPORTED_EXTENSIONS, mistral_ocr_to_markdown - # .odt is not in SUPPORTED_EXTENSIONS. assert ".odt" not in SUPPORTED_EXTENSIONS - processor_config = MistralOCRConfig(api_key="test-key") + config = RAGLiteConfig(document_processor=MistralOCRConfig(api_key="test-key")) - # Patch at the source module where it's defined. with patch("raglite._markdown._default_document_to_markdown") as mock_default: mock_default.return_value = "fallback content" - result = mistral_ocr_to_markdown(Path("test.odt"), processor_config=processor_config) + result = document_to_markdown(Path("test.odt"), config=config) mock_default.assert_called_once_with(Path("test.odt")) assert result == "fallback content" @@ -113,8 +107,6 @@ class TestMistralOCRMocked: def test_process_ocr_response_basic(self) -> None: """Test _process_ocr_response with basic markdown.""" - from raglite._mistral_ocr import _process_ocr_response - # Create mock OCR response. mock_page = MagicMock() mock_page.markdown = "# Test Document\n\nThis is a test." @@ -130,8 +122,6 @@ def test_process_ocr_response_basic(self) -> None: def test_process_ocr_response_with_annotations(self) -> None: """Test _process_ocr_response replaces image placeholders with annotations.""" - from raglite._mistral_ocr import _process_ocr_response - # Create mock image with valid JSON annotation. mock_image = MagicMock() mock_image.id = "img-0.jpeg" @@ -154,8 +144,6 @@ def test_process_ocr_response_with_annotations(self) -> None: def test_process_ocr_response_with_raw_annotation_fallback(self) -> None: """Test _process_ocr_response falls back to raw annotation if parsing fails.""" - from raglite._mistral_ocr import _process_ocr_response - # Create mock image with non-JSON annotation. mock_image = MagicMock() mock_image.id = "img-0.jpeg" @@ -175,8 +163,6 @@ def test_process_ocr_response_with_raw_annotation_fallback(self) -> None: def test_process_ocr_response_multiple_pages(self) -> None: """Test _process_ocr_response with multiple pages.""" - from raglite._mistral_ocr import _process_ocr_response - mock_page1 = MagicMock() mock_page1.markdown = "# Page 1" mock_page1.images = [] @@ -197,8 +183,6 @@ def test_process_ocr_response_multiple_pages(self) -> None: def test_process_ocr_response_exclude_image_types(self) -> None: """Test _process_ocr_response excludes specified image types.""" - from raglite._mistral_ocr import _process_ocr_response - # Create mock images with different types. mock_logo = MagicMock() mock_logo.id = "img-logo.jpeg" @@ -237,8 +221,6 @@ class TestDocumentToMarkdownDispatch: def test_default_processor_used(self) -> None: """Default config should use default processor.""" - from raglite._markdown import document_to_markdown - config = RAGLiteConfig() with patch("raglite._markdown._default_document_to_markdown") as mock_default: @@ -249,8 +231,6 @@ def test_default_processor_used(self) -> None: def test_mistral_processor_used(self) -> None: """Mistral config should use MistralOCR processor.""" - from raglite._markdown import document_to_markdown - processor_config = MistralOCRConfig(api_key="test-key") config = RAGLiteConfig(document_processor=processor_config) @@ -264,20 +244,13 @@ def test_mistral_processor_used(self) -> None: assert result == "mistral content" -def is_mistral_available() -> bool: - """Check if Mistral API key is set.""" - return bool(os.environ.get("MISTRAL_API_KEY")) - - -@pytest.mark.skipif(not is_mistral_available(), reason="MISTRAL_API_KEY not set") +@pytest.mark.skipif(not os.environ.get("MISTRAL_API_KEY"), reason="MISTRAL_API_KEY not set") @pytest.mark.slow class TestMistralOCRIntegration: """Integration tests requiring actual API access.""" def test_real_pdf_conversion(self) -> None: """Test real PDF conversion with actual API.""" - from raglite._mistral_ocr import mistral_ocr_to_markdown - processor_config = MistralOCRConfig(include_image_descriptions=True) # Use the test PDF that exists in the tests directory. From ebda3aaa2278e576e94b684771c388e009da7862 Mon Sep 17 00:00:00 2001 From: r-dh Date: Mon, 2 Feb 2026 10:03:17 +0000 Subject: [PATCH 03/11] feat: expose Mistral model explicitly, clarify dependency on import error --- src/raglite/_config.py | 1 + src/raglite/_mistral_ocr.py | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/raglite/_config.py b/src/raglite/_config.py index acea2de6..8331984f 100644 --- a/src/raglite/_config.py +++ b/src/raglite/_config.py @@ -48,6 +48,7 @@ class MistralOCRConfig: include_image_descriptions: bool = True # Image types to exclude from processing (e.g., {ImageType.LOGO, ImageType.ICON}). exclude_image_types: frozenset[ImageType] = frozenset() + model: str = "mistral-ocr-latest" # Lazily load the default search method to avoid circular imports. diff --git a/src/raglite/_mistral_ocr.py b/src/raglite/_mistral_ocr.py index 192885f2..64907df0 100644 --- a/src/raglite/_mistral_ocr.py +++ b/src/raglite/_mistral_ocr.py @@ -78,6 +78,19 @@ def _get_mistral_client(processor_config: MistralOCRConfig) -> Any: return Mistral(api_key=api_key) +def _get_response_format_converter() -> Any: + """Get the response_format_from_pydantic_model function from mistralai.""" + try: + from mistralai.extra import response_format_from_pydantic_model + except ImportError as e: + error_msg = ( + "To use MistralOCR, please install the `mistral-ocr` extra: " + "`uv add raglite[mistral-ocr]` or `pip install raglite[mistral-ocr]`." + ) + raise ImportError(error_msg) from e + return response_format_from_pydantic_model + + def _encode_document_base64(doc_path: Path) -> tuple[str, str]: """Encode a document as base64 with appropriate MIME type.""" mime_type = _MIME_TYPES.get(doc_path.suffix.lower(), "application/octet-stream") @@ -168,14 +181,10 @@ def mistral_ocr_to_markdown(doc_path: Path, *, processor_config: MistralOCRConfi If the OCR processing fails. """ try: - from mistralai.extra import response_format_from_pydantic_model - client = _get_mistral_client(processor_config) - # Encode document as base64. data, mime_type = _encode_document_base64(doc_path) - # Prepare document payload based on file type. if doc_path.suffix.lower() in _IMAGE_EXTENSIONS: document_payload = { "type": "image_url", @@ -190,18 +199,18 @@ def mistral_ocr_to_markdown(doc_path: Path, *, processor_config: MistralOCRConfi # Build OCR request parameters. ocr_params: dict[str, Any] = { - "model": "mistral-ocr-latest", + "model": processor_config.model, "document": document_payload, "include_image_base64": False, # We don't need base64, just annotations. } # Add bbox annotation format if image descriptions are enabled. if processor_config.include_image_descriptions: + response_format_from_pydantic_model = _get_response_format_converter() ocr_params["bbox_annotation_format"] = response_format_from_pydantic_model( ImageAnnotation ) - # Call MistralOCR API. ocr_response = client.ocr.process(**ocr_params) # Process response and replace image placeholders with annotations. From a55d64eaa473ef1278c4ee239c3ef7613563c75b Mon Sep 17 00:00:00 2001 From: r-dh Date: Mon, 2 Feb 2026 10:03:58 +0000 Subject: [PATCH 04/11] feat: add logging for unsupported file types in document processing --- src/raglite/_markdown.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/raglite/_markdown.py b/src/raglite/_markdown.py index d8a19895..d41a63b1 100644 --- a/src/raglite/_markdown.py +++ b/src/raglite/_markdown.py @@ -1,5 +1,6 @@ """Convert any document to Markdown.""" +import logging import re from copy import deepcopy from pathlib import Path @@ -11,6 +12,8 @@ from raglite._config import MistralOCRConfig, RAGLiteConfig +logger = logging.getLogger(__name__) + def parsed_pdf_to_markdown(pages: list[dict[str, Any]]) -> list[str]: # noqa: C901, PLR0915 """Convert a PDF parsed with pdftext to Markdown.""" @@ -247,5 +250,8 @@ def document_to_markdown(doc_path: Path, *, config: RAGLiteConfig | None = None) if doc_path.suffix.lower() in SUPPORTED_EXTENSIONS: return mistral_ocr_to_markdown(doc_path, processor_config=config.document_processor) + logger.debug( + "Mistral does not support file type: %s\nFalling back to default processor.", doc_path + ) return _default_document_to_markdown(doc_path) From ba763139c0d6cbe9fd7fec08e70911871f98bd4e Mon Sep 17 00:00:00 2001 From: r-dh Date: Mon, 2 Feb 2026 10:05:57 +0000 Subject: [PATCH 05/11] refactor: streamline MistralOCR tests --- tests/test_mistral_ocr.py | 296 +++++++------------------------------- 1 file changed, 48 insertions(+), 248 deletions(-) diff --git a/tests/test_mistral_ocr.py b/tests/test_mistral_ocr.py index d01b5cd2..0568e413 100644 --- a/tests/test_mistral_ocr.py +++ b/tests/test_mistral_ocr.py @@ -1,265 +1,65 @@ -"""Test MistralOCR integration.""" +"""Test MistralOCR document processing.""" import os from pathlib import Path -from unittest.mock import MagicMock, patch +from types import SimpleNamespace import pytest -from raglite import ImageType, MistralOCRConfig, RAGLiteConfig -from raglite._markdown import document_to_markdown +from raglite import ImageType, MistralOCRConfig from raglite._mistral_ocr import ( - SUPPORTED_EXTENSIONS, - _get_api_key, _process_ocr_response, mistral_ocr_to_markdown, ) -class TestMistralOCRConfig: - """Test MistralOCR configuration.""" - - def test_default_processor_is_none(self) -> None: - """Default processor should be None (use default processor).""" - config = RAGLiteConfig() - assert config.document_processor is None - - def test_mistral_processor_config(self) -> None: - """Can configure MistralOCR processor.""" - processor_config = MistralOCRConfig( - api_key="test-key", - include_image_descriptions=False, - ) - config = RAGLiteConfig(document_processor=processor_config) - assert config.document_processor is not None - assert config.document_processor.api_key == "test-key" - assert config.document_processor.include_image_descriptions is False - - def test_default_image_descriptions_enabled(self) -> None: - """Image descriptions should be enabled by default.""" - processor_config = MistralOCRConfig() - assert processor_config.include_image_descriptions is True - - def test_exclude_image_types_default_empty(self) -> None: - """Exclude image types should be empty by default.""" - processor_config = MistralOCRConfig() - assert processor_config.exclude_image_types == frozenset() - - def test_exclude_image_types_can_be_set(self) -> None: - """Can set exclude image types.""" - processor_config = MistralOCRConfig( - exclude_image_types=frozenset({ImageType.LOGO, ImageType.ICON}) - ) - assert ImageType.LOGO in processor_config.exclude_image_types - assert ImageType.ICON in processor_config.exclude_image_types - assert ImageType.PHOTO not in processor_config.exclude_image_types - - -class TestMistralOCRAPIKey: - """Test MistralOCR API key handling.""" - - def test_api_key_from_config(self) -> None: - """API key can be provided via config.""" - processor_config = MistralOCRConfig(api_key="config-key") - assert _get_api_key(processor_config) == "config-key" - - def test_api_key_from_env(self) -> None: - """API key falls back to environment variable.""" - processor_config = MistralOCRConfig() - with patch.dict(os.environ, {"MISTRAL_API_KEY": "env-key"}): - assert _get_api_key(processor_config) == "env-key" - - def test_api_key_config_takes_precedence(self) -> None: - """Config API key takes precedence over environment variable.""" - processor_config = MistralOCRConfig(api_key="config-key") - with patch.dict(os.environ, {"MISTRAL_API_KEY": "env-key"}): - assert _get_api_key(processor_config) == "config-key" - - def test_missing_api_key_raises_error(self) -> None: - """Missing API key should raise ValueError.""" - processor_config = MistralOCRConfig() - with patch.dict(os.environ, {}, clear=True): - # Remove MISTRAL_API_KEY if present. - os.environ.pop("MISTRAL_API_KEY", None) - with pytest.raises(ValueError, match="MISTRAL_API_KEY"): - _get_api_key(processor_config) - - -class TestMistralOCRFallback: - """Test MistralOCR fallback behavior.""" - - def test_unsupported_extension_falls_back(self) -> None: - """Unsupported file extensions should fall back to default processor.""" - # .odt is not in SUPPORTED_EXTENSIONS. - assert ".odt" not in SUPPORTED_EXTENSIONS - - config = RAGLiteConfig(document_processor=MistralOCRConfig(api_key="test-key")) - - with patch("raglite._markdown._default_document_to_markdown") as mock_default: - mock_default.return_value = "fallback content" - result = document_to_markdown(Path("test.odt"), config=config) - mock_default.assert_called_once_with(Path("test.odt")) - assert result == "fallback content" - - -class TestMistralOCRMocked: - """Test MistralOCR with mocked API.""" - - def test_process_ocr_response_basic(self) -> None: - """Test _process_ocr_response with basic markdown.""" - # Create mock OCR response. - mock_page = MagicMock() - mock_page.markdown = "# Test Document\n\nThis is a test." - mock_page.images = [] - - mock_response = MagicMock() - mock_response.pages = [mock_page] - - result = _process_ocr_response(mock_response, include_image_descriptions=False) - - assert "# Test Document" in result - assert "This is a test." in result - - def test_process_ocr_response_with_annotations(self) -> None: - """Test _process_ocr_response replaces image placeholders with annotations.""" - # Create mock image with valid JSON annotation. - mock_image = MagicMock() - mock_image.id = "img-0.jpeg" - mock_image.image_annotation = ( - '{"image_type": "diagram", "description": "A flowchart showing the process"}' - ) - - mock_page = MagicMock() - mock_page.markdown = "# Document\n\n![img-0.jpeg](img-0.jpeg)\n\nSome text." - mock_page.images = [mock_image] - - mock_response = MagicMock() - mock_response.pages = [mock_page] - - result = _process_ocr_response(mock_response, include_image_descriptions=True) - - # Image placeholder should be replaced with annotation. - assert "![img-0.jpeg](img-0.jpeg)" not in result - assert "[Image (diagram): A flowchart showing the process]" in result - - def test_process_ocr_response_with_raw_annotation_fallback(self) -> None: - """Test _process_ocr_response falls back to raw annotation if parsing fails.""" - # Create mock image with non-JSON annotation. - mock_image = MagicMock() - mock_image.id = "img-0.jpeg" - mock_image.image_annotation = "diagram: A flowchart showing the process" - - mock_page = MagicMock() - mock_page.markdown = "# Document\n\n![img-0.jpeg](img-0.jpeg)\n\nSome text." - mock_page.images = [mock_image] - - mock_response = MagicMock() - mock_response.pages = [mock_page] - - result = _process_ocr_response(mock_response, include_image_descriptions=True) - - # Should fall back to raw annotation. - assert "[Image: diagram: A flowchart showing the process]" in result - - def test_process_ocr_response_multiple_pages(self) -> None: - """Test _process_ocr_response with multiple pages.""" - mock_page1 = MagicMock() - mock_page1.markdown = "# Page 1" - mock_page1.images = [] - - mock_page2 = MagicMock() - mock_page2.markdown = "# Page 2" - mock_page2.images = [] - - mock_response = MagicMock() - mock_response.pages = [mock_page1, mock_page2] - - result = _process_ocr_response(mock_response, include_image_descriptions=False) - - assert "# Page 1" in result - assert "# Page 2" in result - # Pages should be separated by double newlines. - assert "\n\n" in result - - def test_process_ocr_response_exclude_image_types(self) -> None: - """Test _process_ocr_response excludes specified image types.""" - # Create mock images with different types. - mock_logo = MagicMock() - mock_logo.id = "img-logo.jpeg" - mock_logo.image_annotation = '{"image_type": "logo", "description": "Company logo"}' - - mock_diagram = MagicMock() - mock_diagram.id = "img-diagram.jpeg" - mock_diagram.image_annotation = ( - '{"image_type": "diagram", "description": "Architecture diagram"}' - ) - - mock_page = MagicMock() - mock_page.markdown = ( - "# Document\n\n![](img-logo.jpeg)\n\n![](img-diagram.jpeg)\n\nSome text." - ) - mock_page.images = [mock_logo, mock_diagram] - - mock_response = MagicMock() - mock_response.pages = [mock_page] - - result = _process_ocr_response( - mock_response, - include_image_descriptions=True, - exclude_image_types=frozenset({ImageType.LOGO}), - ) - - # Logo should be removed entirely. - assert "logo" not in result.lower() - assert "Company logo" not in result - # Diagram should be included. - assert "[Image (diagram): Architecture diagram]" in result - - -class TestDocumentToMarkdownDispatch: - """Test document_to_markdown dispatcher.""" - - def test_default_processor_used(self) -> None: - """Default config should use default processor.""" - config = RAGLiteConfig() - - with patch("raglite._markdown._default_document_to_markdown") as mock_default: - mock_default.return_value = "default content" - # Need to create a real file for this test. - document_to_markdown(Path("test.txt"), config=config) - mock_default.assert_called_once_with(Path("test.txt")) - - def test_mistral_processor_used(self) -> None: - """Mistral config should use MistralOCR processor.""" - processor_config = MistralOCRConfig(api_key="test-key") - config = RAGLiteConfig(document_processor=processor_config) - - # Patch at the source module where mistral_ocr_to_markdown is defined. - with patch("raglite._mistral_ocr.mistral_ocr_to_markdown") as mock_mistral: - mock_mistral.return_value = "mistral content" - result = document_to_markdown(Path("test.pdf"), config=config) - mock_mistral.assert_called_once_with( - Path("test.pdf"), processor_config=processor_config +def _mock_ocr_response(pages: list[tuple[str, list[tuple[str, str | None]]]]) -> SimpleNamespace: + """Create a mock OCR response.""" + return SimpleNamespace( + pages=[ + SimpleNamespace( + markdown=markdown, + images=[SimpleNamespace(id=img_id, image_annotation=ann) for img_id, ann in images], ) - assert result == "mistral content" + for markdown, images in pages + ] + ) + + +def test_process_ocr_response() -> None: + """Test OCR response processing: annotations, filtering, multi-page join.""" + diagram_ann = '{"image_type": "diagram", "description": "A flowchart"}' + logo_ann = '{"image_type": "logo", "description": "Company logo"}' + response = _mock_ocr_response( + [ + ( + "![](img-d.jpeg)\n\n![](img-l.jpeg)", + [ + ("img-d.jpeg", diagram_ann), + ("img-l.jpeg", logo_ann), + ], + ), + ("![](img-r.jpeg)", [("img-r.jpeg", "raw fallback text")]), # page 2 + ] + ) + result = _process_ocr_response( + response, + include_image_descriptions=True, + exclude_image_types=frozenset({ImageType.LOGO}), + ) + assert "[Image (diagram): A flowchart]" in result + assert "Company logo" not in result + assert "[Image: raw fallback text]" in result # fallback + page 2 joined @pytest.mark.skipif(not os.environ.get("MISTRAL_API_KEY"), reason="MISTRAL_API_KEY not set") @pytest.mark.slow -class TestMistralOCRIntegration: - """Integration tests requiring actual API access.""" - - def test_real_pdf_conversion(self) -> None: - """Test real PDF conversion with actual API.""" - processor_config = MistralOCRConfig(include_image_descriptions=True) - - # Use the test PDF that exists in the tests directory. - doc_path = Path(__file__).parent / "specrel.pdf" - if not doc_path.exists(): - pytest.skip("Test PDF not found") - - result = mistral_ocr_to_markdown(doc_path, processor_config=processor_config) - - # Basic sanity checks. - assert len(result) > 100 # noqa: PLR2004 - assert isinstance(result, str) +def test_real_pdf_conversion() -> None: + """Test real PDF conversion with the Mistral API.""" + doc_path = Path(__file__).parent / "specrel.pdf" + result = mistral_ocr_to_markdown( + doc_path, + processor_config=MistralOCRConfig(include_image_descriptions=True), + ) + assert len(result) > 100 # noqa: PLR2004 + assert "electrodynamics" in result.lower() or "einstein" in result.lower() From 94373ee9752c39fd95d7821e3a1061323d59b418 Mon Sep 17 00:00:00 2001 From: r-dh Date: Mon, 2 Feb 2026 10:10:56 +0000 Subject: [PATCH 06/11] chore: specify type for metadata to satisfy mypy --- tests/conftest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 94614e4f..bee153cb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,6 +5,7 @@ import tempfile from collections.abc import Generator from pathlib import Path +from typing import Any import pytest from sqlalchemy import create_engine, text @@ -124,6 +125,6 @@ def raglite_test_config(database: str, llm: str, embedder: str) -> RAGLiteConfig db_config = RAGLiteConfig(db_url=database, llm=llm, embedder=embedder) # Insert a document and update the index. doc_path = Path(__file__).parent / "specrel.pdf" # Einstein's special relativity paper. - metadata = {"type": "Paper", "topic": "Physics", "author": "Albert Einstein"} + metadata: dict[str, Any] = {"type": "Paper", "topic": "Physics", "author": "Albert Einstein"} insert_documents([Document.from_path(doc_path, **metadata)], config=db_config) return db_config From 94e6f3b1cbda11ad3ac61dd0289335bf19e22372 Mon Sep 17 00:00:00 2001 From: r-dh Date: Mon, 9 Feb 2026 10:57:52 +0000 Subject: [PATCH 07/11] test: add NVIDIA report PDF for Mistral OCR testing with enhanced assertions --- tests/NVIDIA-report.pdf | Bin 0 -> 205720 bytes tests/conftest.py | 5 ++++- tests/test_mistral_ocr.py | 10 ++++++---- 3 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 tests/NVIDIA-report.pdf diff --git a/tests/NVIDIA-report.pdf b/tests/NVIDIA-report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59b1bd048e359653da121da7ed0a444ac33a7972 GIT binary patch literal 205720 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 literal 0 HcmV?d00001 diff --git a/tests/conftest.py b/tests/conftest.py index bee153cb..a2d4b3e4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,10 +8,13 @@ from typing import Any import pytest +from dotenv import load_dotenv from sqlalchemy import create_engine, text from raglite import Document, RAGLiteConfig, insert_documents +load_dotenv() + POSTGRES_URL = "postgresql+pg8000://raglite_user:raglite_password@postgres:5432/postgres" @@ -80,7 +83,7 @@ def database(request: pytest.FixtureRequest) -> str: params=[ pytest.param( ( - "llama-cpp-python/unsloth/Qwen3-4B-GGUF/*Q4_K_M.gguf@8192", + "llama-cpp-python/unsloth/Qwen3-4B-GGUF/*Q4_K_M.gguf@8192", # mistralai/Ministral-3-3B-Instruct-2512 "llama-cpp-python/lm-kit/bge-m3-gguf/*Q4_K_M.gguf@512", # More context degrades performance. ), id="qwen3_4B-bge_m3", diff --git a/tests/test_mistral_ocr.py b/tests/test_mistral_ocr.py index 0568e413..a3ec488a 100644 --- a/tests/test_mistral_ocr.py +++ b/tests/test_mistral_ocr.py @@ -55,11 +55,13 @@ def test_process_ocr_response() -> None: @pytest.mark.skipif(not os.environ.get("MISTRAL_API_KEY"), reason="MISTRAL_API_KEY not set") @pytest.mark.slow def test_real_pdf_conversion() -> None: - """Test real PDF conversion with the Mistral API.""" - doc_path = Path(__file__).parent / "specrel.pdf" + """Test Mistral OCR on NVIDIA report with tables, charts, and financial data.""" + doc_path = Path(__file__).parent / "NVIDIA-report.pdf" result = mistral_ocr_to_markdown( doc_path, processor_config=MistralOCRConfig(include_image_descriptions=True), ) - assert len(result) > 100 # noqa: PLR2004 - assert "electrodynamics" in result.lower() or "einstein" in result.lower() + assert len(result) > 500 # noqa: PLR2004 # substantial multi-page content + assert "| " in result # tables rendered as markdown + assert "[Image (" in result # image descriptions with type classification + assert "$130.5 billion" in result # financial data from table cells From 4e9bda01e956392636926c6ee497a11d934f9ce8 Mon Sep 17 00:00:00 2001 From: r-dh Date: Mon, 9 Feb 2026 12:11:53 +0000 Subject: [PATCH 08/11] chore: add python-dotenv to development dependencies --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index cc4afecd..85e1dc49 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,6 +70,7 @@ dev = [ "pytest (>=8.3.4)", "pytest-mock (>=3.14.0)", "pytest-xdist (>=3.6.1)", + "python-dotenv (>=1.0.0)", "ruff (>=0.10.0)", "typeguard (>=4.4.1)", ] From 6145552e6c103208bf888cb5776fc6032df8fa59 Mon Sep 17 00:00:00 2001 From: r-dh Date: Tue, 10 Feb 2026 18:33:18 +0000 Subject: [PATCH 09/11] refactor: streamline OCR processing logic --- src/raglite/_mistral_ocr.py | 57 ++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/src/raglite/_mistral_ocr.py b/src/raglite/_mistral_ocr.py index 64907df0..4b1c2b00 100644 --- a/src/raglite/_mistral_ocr.py +++ b/src/raglite/_mistral_ocr.py @@ -180,48 +180,45 @@ def mistral_ocr_to_markdown(doc_path: Path, *, processor_config: MistralOCRConfi MistralOCRError If the OCR processing fails. """ - try: - client = _get_mistral_client(processor_config) + data, mime_type = _encode_document_base64(doc_path) - data, mime_type = _encode_document_base64(doc_path) - - if doc_path.suffix.lower() in _IMAGE_EXTENSIONS: - document_payload = { - "type": "image_url", - "image_url": f"data:{mime_type};base64,{data}", - } - else: - # PDF, DOCX, PPTX. - document_payload = { - "type": "document_url", - "document_url": f"data:{mime_type};base64,{data}", - } - - # Build OCR request parameters. - ocr_params: dict[str, Any] = { - "model": processor_config.model, - "document": document_payload, - "include_image_base64": False, # We don't need base64, just annotations. + if doc_path.suffix.lower() in _IMAGE_EXTENSIONS: + document_payload = { + "type": "image_url", + "image_url": f"data:{mime_type};base64,{data}", + } + else: + # PDF, DOCX, PPTX. + document_payload = { + "type": "document_url", + "document_url": f"data:{mime_type};base64,{data}", } + # Build OCR request parameters. + ocr_params: dict[str, Any] = { + "model": processor_config.model, + "document": document_payload, + "include_image_base64": False, # We don't need base64, just annotations. + } + + try: + client = _get_mistral_client(processor_config) # Add bbox annotation format if image descriptions are enabled. if processor_config.include_image_descriptions: response_format_from_pydantic_model = _get_response_format_converter() ocr_params["bbox_annotation_format"] = response_format_from_pydantic_model( ImageAnnotation ) - ocr_response = client.ocr.process(**ocr_params) - - # Process response and replace image placeholders with annotations. - return _process_ocr_response( - ocr_response, - include_image_descriptions=processor_config.include_image_descriptions, - exclude_image_types=processor_config.exclude_image_types, - ) - except (ImportError, ValueError): raise except Exception as e: error_msg = f"MistralOCR failed to process {doc_path}: {e}" raise MistralOCRError(error_msg) from e + + # Process response and replace image placeholders with annotations. + return _process_ocr_response( + ocr_response, + include_image_descriptions=processor_config.include_image_descriptions, + exclude_image_types=processor_config.exclude_image_types, + ) From c9f13a3944d304d3ff4f95ce9b14c720a5e96253 Mon Sep 17 00:00:00 2001 From: r-dh Date: Thu, 12 Feb 2026 18:06:59 +0100 Subject: [PATCH 10/11] feat: allow custom image type categories in MistralOCRConfig --- src/raglite/__init__.py | 3 +- src/raglite/_config.py | 22 +++++---------- src/raglite/_mistral_ocr.py | 56 ++++++++++++++++++++++--------------- tests/test_mistral_ocr.py | 7 +++-- 4 files changed, 47 insertions(+), 41 deletions(-) diff --git a/src/raglite/__init__.py b/src/raglite/__init__.py index f0ba3edf..5f568c68 100644 --- a/src/raglite/__init__.py +++ b/src/raglite/__init__.py @@ -1,6 +1,6 @@ """RAGLite.""" -from raglite._config import ImageType, MistralOCRConfig, RAGLiteConfig +from raglite._config import MistralOCRConfig, RAGLiteConfig from raglite._database import Document from raglite._delete import delete_documents, delete_documents_by_metadata from raglite._eval import answer_evals, evaluate, insert_evals @@ -25,7 +25,6 @@ "RAGLiteConfig", "MistralOCRConfig", "MistralOCRError", - "ImageType", # Insert "Document", "insert_documents", diff --git a/src/raglite/_config.py b/src/raglite/_config.py index 8331984f..da0471d3 100644 --- a/src/raglite/_config.py +++ b/src/raglite/_config.py @@ -3,7 +3,6 @@ import contextlib import os from dataclasses import dataclass, field -from enum import Enum from io import StringIO from pathlib import Path from typing import Literal @@ -24,18 +23,9 @@ cache_path = Path(user_data_dir("raglite", ensure_exists=True)) -class ImageType(str, Enum): - """Type of image detected by OCR.""" - - GRAPH = "graph" - CHART = "chart" - DIAGRAM = "diagram" - TABLE = "table" - PHOTO = "photo" - SCREENSHOT = "screenshot" - LOGO = "logo" - ICON = "icon" - OTHER = "other" +DEFAULT_IMAGE_TYPES = frozenset( + {"graph", "chart", "diagram", "table", "photo", "screenshot", "logo", "icon", "other"} +) @dataclass(frozen=True) @@ -46,8 +36,10 @@ class MistralOCRConfig: api_key: str | None = None # Whether to use vision to describe images in documents. include_image_descriptions: bool = True - # Image types to exclude from processing (e.g., {ImageType.LOGO, ImageType.ICON}). - exclude_image_types: frozenset[ImageType] = frozenset() + # Image types that Mistral classifies each image into. + image_types: frozenset[str] = DEFAULT_IMAGE_TYPES + # Image types to exclude from the output (e.g., {"logo", "icon"}). + exclude_image_types: frozenset[str] = frozenset() model: str = "mistral-ocr-latest" diff --git a/src/raglite/_mistral_ocr.py b/src/raglite/_mistral_ocr.py index 4b1c2b00..84fccc78 100644 --- a/src/raglite/_mistral_ocr.py +++ b/src/raglite/_mistral_ocr.py @@ -4,12 +4,13 @@ import logging import os import re +from enum import Enum from pathlib import Path from typing import Any from pydantic import BaseModel, Field -from raglite._config import ImageType, MistralOCRConfig +from raglite._config import MistralOCRConfig logger = logging.getLogger(__name__) @@ -32,24 +33,28 @@ class MistralOCRError(Exception): """Error during MistralOCR processing.""" -_IMAGE_TYPE_VALUES = ", ".join(t.value for t in ImageType) +def _build_image_annotation_model(image_types: frozenset[str]) -> type[BaseModel]: + """Build an ImageAnnotation Pydantic model with the given image types.""" + image_type_enum = Enum("ImageType", {t.upper(): t for t in sorted(image_types)}, type=str) # type: ignore[misc] + image_type_values = ", ".join(sorted(image_types)) + class ImageAnnotation(BaseModel): + """Schema for vision-based image annotation.""" -class ImageAnnotation(BaseModel): - """Schema for vision-based image annotation.""" + image_type: image_type_enum = Field( # type: ignore[valid-type] + ..., + description=f"The type of the image. Must be one of: {image_type_values}.", + ) + description: str = Field( + ..., + description=( + "A concise description of the image content. For diagrams and charts, " + "describe what is being illustrated. For tables, summarize the data. " + "For photos, describe the subject matter." + ), + ) - image_type: ImageType = Field( - ..., - description=f"The type of the image. Must be one of: {_IMAGE_TYPE_VALUES}.", - ) - description: str = Field( - ..., - description=( - "A concise description of the image content. For diagrams and charts, " - "describe what is being illustrated. For tables, summarize the data. " - "For photos, describe the subject matter." - ), - ) + return ImageAnnotation def _get_api_key(processor_config: MistralOCRConfig) -> str: @@ -101,8 +106,9 @@ def _encode_document_base64(doc_path: Path) -> tuple[str, str]: def _process_ocr_response( ocr_response: Any, *, + annotation_model: type[BaseModel], include_image_descriptions: bool = True, - exclude_image_types: frozenset[ImageType] | None = None, + exclude_image_types: frozenset[str] | None = None, ) -> str: """Convert MistralOCR response to markdown string. @@ -113,10 +119,12 @@ def _process_ocr_response( ---------- ocr_response Response from Mistral OCR API. + annotation_model + The Pydantic model used to parse image annotations. include_image_descriptions Whether to replace image placeholders with annotations. exclude_image_types - Set of ImageType values to exclude from output. + Set of image type strings to exclude from output. Returns ------- @@ -137,12 +145,13 @@ def _process_ocr_response( placeholder_pattern = rf"!\[[^\]]*\]\({re.escape(img.id)}\)" # Parse annotation to check image type for filtering. try: - parsed = ImageAnnotation.model_validate_json(annotation) - if parsed.image_type in exclude_image_types: + parsed: Any = annotation_model.model_validate_json(annotation) + image_type = parsed.image_type.value + if image_type in exclude_image_types: # Remove the image placeholder entirely. page_md = re.sub(placeholder_pattern, "", page_md) continue - replacement = f"[Image ({parsed.image_type.value}): {parsed.description}]" + replacement = f"[Image ({image_type}): {parsed.description}]" except (ValueError, TypeError): # If parsing fails, use raw annotation. replacement = f"[Image: {annotation}]" @@ -201,13 +210,15 @@ def mistral_ocr_to_markdown(doc_path: Path, *, processor_config: MistralOCRConfi "include_image_base64": False, # We don't need base64, just annotations. } + annotation_model = _build_image_annotation_model(processor_config.image_types) + try: client = _get_mistral_client(processor_config) # Add bbox annotation format if image descriptions are enabled. if processor_config.include_image_descriptions: response_format_from_pydantic_model = _get_response_format_converter() ocr_params["bbox_annotation_format"] = response_format_from_pydantic_model( - ImageAnnotation + annotation_model ) ocr_response = client.ocr.process(**ocr_params) except (ImportError, ValueError): @@ -219,6 +230,7 @@ def mistral_ocr_to_markdown(doc_path: Path, *, processor_config: MistralOCRConfi # Process response and replace image placeholders with annotations. return _process_ocr_response( ocr_response, + annotation_model=annotation_model, include_image_descriptions=processor_config.include_image_descriptions, exclude_image_types=processor_config.exclude_image_types, ) diff --git a/tests/test_mistral_ocr.py b/tests/test_mistral_ocr.py index a3ec488a..0ec39e21 100644 --- a/tests/test_mistral_ocr.py +++ b/tests/test_mistral_ocr.py @@ -6,8 +6,9 @@ import pytest -from raglite import ImageType, MistralOCRConfig +from raglite import MistralOCRConfig from raglite._mistral_ocr import ( + _build_image_annotation_model, _process_ocr_response, mistral_ocr_to_markdown, ) @@ -42,10 +43,12 @@ def test_process_ocr_response() -> None: ("![](img-r.jpeg)", [("img-r.jpeg", "raw fallback text")]), # page 2 ] ) + annotation_model = _build_image_annotation_model(frozenset({"diagram", "logo"})) result = _process_ocr_response( response, + annotation_model=annotation_model, include_image_descriptions=True, - exclude_image_types=frozenset({ImageType.LOGO}), + exclude_image_types=frozenset({"logo"}), ) assert "[Image (diagram): A flowchart]" in result assert "Company logo" not in result From f1abc8bea0aa5b837290fae2b27840e3d4bb10a5 Mon Sep 17 00:00:00 2001 From: r-dh Date: Thu, 12 Feb 2026 18:07:37 +0100 Subject: [PATCH 11/11] docs: add Mistral OCR usage documentation to README --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 91379fd7..730d894b 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ RAGLite is a Python toolkit for Retrieval-Augmented Generation (RAG) with DuckDB - 🔌 A built-in [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server that any MCP client like [Claude desktop](https://claude.ai/download) can connect with - 💬 Optional customizable ChatGPT-like frontend for [web](https://docs.chainlit.io/deploy/copilot), [Slack](https://docs.chainlit.io/deploy/slack), and [Teams](https://docs.chainlit.io/deploy/teams) with [Chainlit](https://github.com/Chainlit/chainlit) - ✍️ Optional conversion of any input document to Markdown with [Pandoc](https://github.com/jgm/pandoc) +- 🔎 Optional high-quality document processing with [Mistral OCR](https://docs.mistral.ai/capabilities/document/) for PDFs, images, DOCX, and PPTX with automatic image descriptions - ✅ Optional evaluation of retrieval and generation performance with [Ragas](https://github.com/explodinggradients/ragas) ## Installing @@ -69,6 +70,12 @@ To add support for filetypes other than PDF, use the `pandoc` extra: pip install raglite[pandoc] ``` +To add support for high-quality document processing with [Mistral OCR](https://docs.mistral.ai/capabilities/document/), use the `mistral-ocr` extra: + +```sh +pip install raglite[mistral-ocr] +``` + To add support for evaluation, use the `ragas` extra: ```sh @@ -152,6 +159,21 @@ my_config = RAGLiteConfig( > [!TIP] > ✍️ To insert documents other than PDF, install the `pandoc` extra with `pip install raglite[pandoc]`. +> [!TIP] +> 🔎 For higher-quality document processing with automatic image descriptions, install the `mistral-ocr` extra with `pip install raglite[mistral-ocr]` and configure it as follows: +> ```python +> from raglite import RAGLiteConfig, MistralOCRConfig +> +> my_config = RAGLiteConfig( +> document_processor=MistralOCRConfig( +> include_image_descriptions=True, # Describe images, charts, and diagrams as text +> image_types=frozenset({"chart", "diagram", "photo", "table", "logo", "icon"}), # Custom image categories +> exclude_image_types=frozenset({"logo", "icon"}), # Filter out specific types from the output +> ), +> ) +> ``` +> The `image_types` parameter defines the categories that Mistral classifies each image into — you can use the defaults or provide your own domain-specific types. Use `exclude_image_types` to filter out any classified types that are not useful for retrieval. + Next, insert some documents into the database. RAGLite will take care of the [conversion to Markdown](src/raglite/_markdown.py), [optimal level 4 semantic chunking](src/raglite/_split_chunks.py), and [multi-vector embedding with late chunking](src/raglite/_embed.py): ```python