diff --git a/haiku_rag_slim/haiku/rag/chunkers/base.py b/haiku_rag_slim/haiku/rag/chunkers/base.py index e1daf93b..96c9fc9e 100644 --- a/haiku_rag_slim/haiku/rag/chunkers/base.py +++ b/haiku_rag_slim/haiku/rag/chunkers/base.py @@ -15,7 +15,7 @@ class DocumentChunker(ABC): """ @abstractmethod - async def chunk(self, document: "DoclingDocument") -> list["Chunk"]: + async def chunk(self, document: "DoclingDocument | None") -> list["Chunk"]: """Split a document into chunks with metadata. Args: diff --git a/haiku_rag_slim/haiku/rag/chunkers/docling_local.py b/haiku_rag_slim/haiku/rag/chunkers/docling_local.py index 42bfaffe..85b7f690 100644 --- a/haiku_rag_slim/haiku/rag/chunkers/docling_local.py +++ b/haiku_rag_slim/haiku/rag/chunkers/docling_local.py @@ -162,7 +162,7 @@ class DoclingLocalChunker(DocumentChunker): return result - async def chunk(self, document: "DoclingDocument") -> list[Chunk]: + async def chunk(self, document: "DoclingDocument | None") -> list[Chunk]: """Split the document into chunks with metadata. Extracts structured metadata from each DocChunk including: diff --git a/haiku_rag_slim/haiku/rag/chunkers/docling_serve.py b/haiku_rag_slim/haiku/rag/chunkers/docling_serve.py index c0380134..1bfb7648 100644 --- a/haiku_rag_slim/haiku/rag/chunkers/docling_serve.py +++ b/haiku_rag_slim/haiku/rag/chunkers/docling_serve.py @@ -129,7 +129,7 @@ class DoclingServeChunker(DocumentChunker): return result.get("chunks", []) - async def chunk(self, document: "DoclingDocument") -> list[Chunk]: + async def chunk(self, document: "DoclingDocument | None") -> list[Chunk]: """Split the document into chunks with metadata via docling-serve. Extracts structured metadata from the API response including: diff --git a/tests/test_chunker.py b/tests/test_chunker.py index 192bc0f9..c1f1a833 100644 --- a/tests/test_chunker.py +++ b/tests/test_chunker.py @@ -55,6 +55,13 @@ async def test_local_chunker(qa_corpus: list[dict[str, str]]): assert abs(total_tokens - original_tokens) <= original_tokens * 0.1 +@pytest.mark.asyncio +async def test_local_chunker_none_document(): + """Test DoclingLocalChunker returns empty list for None document.""" + chunker = DoclingLocalChunker() + assert await chunker.chunk(None) == [] + + @pytest.mark.asyncio async def test_local_chunker_runs_off_event_loop_thread(): """Chunking is CPU-bound; verify it runs in a worker thread."""