detect per-document failure status in docling-serve chunker

This commit is contained in:
Yiorgis Gozadinos 2026-03-25 17:26:35 +02:00
parent 2e0564d7ea
commit a3a1ad9811
No known key found for this signature in database
2 changed files with 64 additions and 0 deletions

View file

@ -114,6 +114,14 @@ class DoclingServeChunker(DocumentChunker):
name="document",
)
# Task-level polling status can be "success" while individual documents
# report "failure" (e.g. schema version mismatch), returning 0 chunks silently.
documents = result.get("documents", [])
for doc_result in documents:
if doc_result.get("status") not in ("success", "partial_success", None):
errors = doc_result.get("errors", [])
raise ValueError(f"Chunking failed: {errors}")
return result.get("chunks", [])
async def chunk(self, document: "DoclingDocument") -> list[Chunk]:

View file

@ -464,6 +464,62 @@ class TestDoclingServeChunker:
with pytest.raises(ValueError, match="Authentication failed"):
await chunker.chunk(doc)
@pytest.mark.asyncio
@patch("haiku.rag.providers.docling_serve.httpx.AsyncClient")
async def test_chunk_document_failure_status(self, mock_client_class, chunker):
"""Test that document-level failure status raises ValueError."""
result_data = {
"chunks": [],
"documents": [
{
"kind": "ExportResult",
"status": "failure",
"errors": ["Schema version mismatch"],
}
],
}
submit_resp, poll_resp, result_resp = create_async_workflow_mocks(result_data)
mock_client = AsyncMock()
mock_client.post = AsyncMock(return_value=submit_resp)
mock_client.get = AsyncMock(side_effect=[poll_resp, result_resp])
mock_client_class.return_value.__aenter__.return_value = mock_client
converter = get_converter(Config)
doc = await converter.convert_text("# Test", name="test.md")
with pytest.raises(ValueError, match="Chunking failed"):
await chunker.chunk(doc)
@pytest.mark.asyncio
@patch("haiku.rag.providers.docling_serve.httpx.AsyncClient")
async def test_chunk_document_success_empty_chunks(
self, mock_client_class, chunker
):
"""Test that successful status with empty chunks returns empty list."""
result_data = {
"chunks": [],
"documents": [
{
"kind": "ExportResult",
"status": "success",
"errors": [],
}
],
}
submit_resp, poll_resp, result_resp = create_async_workflow_mocks(result_data)
mock_client = AsyncMock()
mock_client.post = AsyncMock(return_value=submit_resp)
mock_client.get = AsyncMock(side_effect=[poll_resp, result_resp])
mock_client_class.return_value.__aenter__.return_value = mock_client
converter = get_converter(Config)
doc = await converter.convert_text("# Test", name="test.md")
chunks = await chunker.chunk(doc)
assert chunks == []
@pytest.mark.asyncio
@patch("haiku.rag.providers.docling_serve.httpx.AsyncClient")
async def test_chunk_metadata_extraction(self, mock_client_class, chunker):