diff --git a/docs/benchmarks.md b/docs/benchmarks.md index 29fd9207..e4a86110 100644 --- a/docs/benchmarks.md +++ b/docs/benchmarks.md @@ -126,11 +126,16 @@ Numbers measured under the current pinned judge (`ollama:qwen3.6`) on a recent ` ### OpenRAG Bench (ORB) -[OpenRAG Bench](https://huggingface.co/datasets/vectara/open_ragbench) contains ArXiv research papers with multimodal question-answering pairs. Queries include both text-based and image-based questions, testing retrieval and reasoning over visual content like figures, charts, and diagrams. +[OpenRAG Bench](https://huggingface.co/datasets/vectara/open_ragbench) contains ArXiv research papers with multimodal question-answering pairs. Queries include both text-based and image-based questions, testing retrieval and reasoning over visual content like figures, charts, and diagrams. Each query maps to one relevant document. -**Multimodal embeddings**: Picture bytes are embedded directly into the same vector space as text via a multimodal embedder (`Qwen/Qwen3-VL-Embedding-8B` served by vLLM). No VLM descriptions are needed — figures are searchable through their image embedding alongside their captions and surrounding text. +Two approaches are benchmarked separately: -#### Retrieval (MAP) +- **Multimodal embedder** (`Qwen/Qwen3-VL-Embedding-8B`, served via vLLM): picture bytes and text live in a shared vector space, no VLM is run at ingest. +- **Text embedder + VLM picture descriptions** (`qwen3-embedding:4b` + `ollama/ministral-3`): pictures are described at ingest and the descriptions are woven into chunk text; retrieval runs over text only. See [Picture Description configuration](configuration/processing.md#picture-description-vlm). + +#### Multimodal embedder + +##### Retrieval (MAP) | Embedding Model | Source bucket | Cases | MAP | |------------------------------|--------------------|------:|-------:| @@ -140,16 +145,25 @@ Numbers measured under the current pinned judge (`ollama:qwen3.6`) on a recent ` | `Qwen/Qwen3-VL-Embedding-8B` | text + table+image | 220 | 0.9720 | | `Qwen/Qwen3-VL-Embedding-8B` | **all** | 3045 | **0.9774** | -#### QA Accuracy +##### QA Accuracy | Embedding Model | QA Model | Source bucket | Cases | Accuracy | |------------------------------|-------------------------|---------------|------:|---------:| | `Qwen/Qwen3-VL-Embedding-8B` | `ollama:qwen3.6` (vision) | text only | 682 | 96.9 % | | `Qwen/Qwen3-VL-Embedding-8B` | `ollama:qwen3.6` (vision) | with image | 299 | 91.3 % | - The text-vs-image gap on retrieval is small (0.81 pp) but on QA it widens to ~5.6 pp — most of the loss is downstream of retrieval, in the model reasoning over image-bearing chunks rather than in finding them. +#### Text embedder + VLM picture descriptions + +##### Skill QA + citation retrieval + +| Embedding Model | VLM | Skill model | QA accuracy | Mean `cited_map` | +|------------------------|----------------------|------------------|-------------|------------------| +| `qwen3-embedding:4b` | Ollama / ministral-3 | `ollama:gpt-oss` | 0.94 | 0.86 | + +*Measured on haiku.rag v0.44.0, judged by `ollama:qwen3.6` (current default), on 2992 of 3044 completed cases.* + ## Past results These were measured under the prior pinned judge (`ollama:gpt-oss`). The pinned default has since switched to `ollama:qwen3.6` (see [Methodology — QA Accuracy](#qa-accuracy)) — under the new judge the QA accuracy numbers below typically shift up by ~5–10 pp. diff --git a/evaluations/evaluations/benchmark.py b/evaluations/evaluations/benchmark.py index 5fcb8388..7849d04b 100644 --- a/evaluations/evaluations/benchmark.py +++ b/evaluations/evaluations/benchmark.py @@ -133,13 +133,12 @@ async def populate_db( progress.advance(task) continue - # Use the actual URI that will be stored in the database - if payload.source_path is not None: - lookup_uri = payload.source_path.absolute().as_uri() - else: - lookup_uri = payload.uri - - existing = await rag.get_document_by_uri(lookup_uri) + # `payload.uri` is the canonical document identifier and is now + # honored by both `create_document` and (via the `uri=` override) + # `create_document_from_source`, so it's also the right key to + # look up an existing document, regardless of whether the source + # is a file path or inline content. + existing = await rag.get_document_by_uri(payload.uri) if existing is not None: assert existing.id chunks = await rag.chunk_repository.get_by_document_id(existing.id) @@ -153,6 +152,7 @@ async def populate_db( source=payload.source_path, title=payload.title, metadata=payload.metadata, + uri=payload.uri, ) else: assert payload.content is not None diff --git a/haiku_rag_slim/haiku/rag/client/__init__.py b/haiku_rag_slim/haiku/rag/client/__init__.py index caca877f..cb95771e 100644 --- a/haiku_rag_slim/haiku/rag/client/__init__.py +++ b/haiku_rag_slim/haiku/rag/client/__init__.py @@ -209,10 +209,11 @@ class HaikuRAG: source: str | Path, title: str | None = None, metadata: dict | None = None, + uri: str | None = None, ) -> Document | list[Document]: from haiku.rag.client.documents import create_document_from_source - return await create_document_from_source(self, source, title, metadata) + return await create_document_from_source(self, source, title, metadata, uri=uri) async def update_document( self, diff --git a/haiku_rag_slim/haiku/rag/client/documents.py b/haiku_rag_slim/haiku/rag/client/documents.py index ed4449f8..e104cce3 100644 --- a/haiku_rag_slim/haiku/rag/client/documents.py +++ b/haiku_rag_slim/haiku/rag/client/documents.py @@ -196,6 +196,7 @@ async def create_document_from_source( source: str | Path, title: str | None = None, metadata: dict | None = None, + uri: str | None = None, ) -> Document | list[Document]: """Create or update document(s) from a file path, directory, or URL. @@ -204,6 +205,12 @@ async def create_document_from_source( - If MD5 changed, updates the document - If no document exists, creates a new one + If ``uri`` is provided, it overrides the URI auto-derived from the source + (which is normally ``file://`` for local files or the URL for remote + sources). This is useful when callers want to persist documents under a + logical identifier (e.g. an ArXiv ID) rather than the on-disk path. Not + supported for directory sources, which produce one document per file. + Returns a single Document for files/URLs, a list for directories. """ metadata = metadata or {} @@ -212,7 +219,7 @@ async def create_document_from_source( parsed_url = urlparse(source_str) if parsed_url.scheme in ("http", "https"): return await _create_or_update_document_from_url( - client, source_str, title=title, metadata=metadata + client, source_str, title=title, metadata=metadata, uri=uri ) elif parsed_url.scheme == "file": source_path = Path(parsed_url.path) @@ -220,6 +227,11 @@ async def create_document_from_source( source_path = Path(source) if isinstance(source, str) else source if source_path.is_dir(): + if uri is not None: + raise ValueError( + "uri override is not supported for directory sources; each file " + "produces its own document with its own auto-derived URI." + ) from haiku.rag.monitor import FileFilter documents = [] @@ -236,7 +248,7 @@ async def create_document_from_source( return documents return await _create_document_from_file( - client, source_path, title=title, metadata=metadata + client, source_path, title=title, metadata=metadata, uri=uri ) @@ -245,8 +257,13 @@ async def _create_document_from_file( source_path: Path, title: str | None = None, metadata: dict | None = None, + uri: str | None = None, ) -> Document: - """Create or update a document from a single file path.""" + """Create or update a document from a single file path. + + ``uri`` overrides the auto-derived ``file://`` URI; it's used as the + canonical document identifier for lookup and storage. + """ from haiku.rag.embeddings import embed_chunks metadata = metadata or {} @@ -258,7 +275,8 @@ async def _create_document_from_file( if not source_path.exists(): raise ValueError(f"File does not exist: {source_path}") - uri = source_path.absolute().as_uri() + if uri is None: + uri = source_path.absolute().as_uri() md5_hash = hashlib.md5(source_path.read_bytes(), usedforsecurity=False).hexdigest() content_type, _ = mimetypes.guess_type(str(source_path)) @@ -327,12 +345,17 @@ async def _create_or_update_document_from_url( url: str, title: str | None = None, metadata: dict | None = None, + uri: str | None = None, ) -> Document: - """Create or update a document from a URL by downloading and parsing the content.""" + """Create or update a document from a URL by downloading and parsing the content. + + ``uri`` overrides the URL as the stored document identifier. + """ from haiku.rag.client.processing import get_extension_from_content_type_or_url from haiku.rag.embeddings import embed_chunks metadata = metadata or {} + stored_uri = uri if uri is not None else url converter = get_converter(client._config) supported_extensions = converter.supported_extensions @@ -346,7 +369,7 @@ async def _create_or_update_document_from_url( content_type = response.headers.get("content-type", "").lower() # Check if document already exists - existing_doc = await client.get_document_by_uri(url) + existing_doc = await client.get_document_by_uri(stored_uri) if existing_doc and existing_doc.metadata.get("md5") == md5_hash: updated = False if title is not None and title != existing_doc.title: @@ -408,7 +431,7 @@ async def _create_or_update_document_from_url( ) document = Document( content=stored_content, - uri=url, + uri=stored_uri, title=title, metadata=metadata, ) diff --git a/tests/cassettes/test_client/test_client_create_document_from_source_uri_override_dedupes.yaml b/tests/cassettes/test_client/test_client_create_document_from_source_uri_override_dedupes.yaml new file mode 100644 index 00000000..b111897c --- /dev/null +++ b/tests/cassettes/test_client/test_client_create_document_from_source_uri_override_dedupes.yaml @@ -0,0 +1,42 @@ +interactions: +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '100' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + encoding_format: base64 + input: + - Stable content for dedup test. + model: qwen3-embedding:4b + uri: http://localhost:11434/v1/embeddings + response: + headers: + content-type: + - application/json + transfer-encoding: + - chunked + parsed_body: + data: + - embedding: MkCiuVDYjbwcbwo9ovPsu/XerboRDBk9VxZAPcxcHjup3Cg8xuJEPBTiwrzDcpA8PY6uOukqSbwmPfK7ou4XvU3aiTucz8Y7ME6KO/6ofLvYl8K87+bpPEjpAj0ggKI7HKxqvb9t6rymeMy8AYZuvKqnWT1r2OQ7gAoVvAn5UL2gPY07HH8LvMzwQDu5TkS8BAYvO/FzNbziSwk8MSbpvJQGizwDjWU6/VYyPImr7TsDJqm8XmgDPb+4hzz3h7C8AIPdvJaUSryevqM71GdyPEY5+jloC9S8uSmWOUjc2zsS+gC8N8IcOl6DJ70vNzK9zcgDvOKEGbzA78i6hDUXvcaVsrv6Gcm8necPvL6M2DvU+mk8J/Q4vHjGQD3jMKC87n7MO4FKMj230+m7ST0GvV1YMrySVOc8Oc6KupqFJzwMq3I8KVw1uixwGDuLXbM8bqLBPH5olzuRscw63FgHPKzYF71CNUK7ODwtPBqQpjy+XNY7/bh3PFgmhrYwpy88gIfRuvaGhbwhB527CaHAO0/LOjwNxxu7XUaTPKhXSLy9SjK7Gh/AvPHPPrxsGIy7BpeiPGLksDzSfXa7g5zzOuzPoTzPFGe8GlbhvFiBlLxdr+E8NwmUPPjInzwilHI9PoD/uxYzljwyFaS7FNeDvEaCmLs1PSK8HrtNOq+/wryFTqE8W8FIPDtTETwByD68x2IHPLzO57u+PhK9DFa5O91P8bp9QVi80WIgPNwJijxFcRE7jR+Cu8+efjzdZpk8RAjPOlo17TsECkM8sFZ3PACM7TsoXaU8B3oCPbgJv7vEsOA71A2/PGjb8buZVK48jPgTvInxfDxCsbk7XG9MvFAV/jvDQ8E7mNAIvbKJ/rmQb+I7FT5TvP9uQDz4NKy7dsX1um1eijwLTGm7UWBbvLqjEryDoEq8biKIvF8NaDtKNbO8wRSvO1DEc7x4tlc9JTiVu6hJ1zsY/qa8rFyCOg7WED11iR46i2IHvJk/jzrZFRI8Au2HPDDQoTyfa8A8dPIEvDcv9TtIwyW7gBEGvRD2c7ww2QU9lwuiub8bQjykboQ7B5e1u2nC7Tw6zxK8TQAlPJTyHLzJSLE7qMpyvELTXTxE5rG855GLPDzKDrzM9zu8hpZdO+fyzrvrzvQ73f3RvFfwTrxNhwE9wUtLPKh6wDu89Da6zj0LvWlVjzwMKRC9uiAFu5MemTyGCjK8EzEnvPasOLy5CGe8kUUlux/QVbyyhJ+8eP46PA2mJrxOB5c75UysPNz7YjxXlNW8bDD8OjYpHrygo1g4pDDKus4HLzxB5KC7mKg1O5BYObut/zW8hvEEvRqLc7yKJ8k7FOwOOyDB7rpK0oA84hW9O7OS87keT3481KuJPBr2YLxvWn05dM2MvHwEMruJBl281c9CvEnw2LyDiyM7i/jNvDrvmTvTf5O7w84EPSJs6boc+rq7D9s0POwbg7xQtBS9nlK9O6yYlDupXMs8IbUPPawDibzTiBc7NRrbvLBZEDwQDZk8sKZsPCFZ9zyjfGw6xzAQvNC9XzwuL9081eMsvebUkzzLJgU8ALw5vC+qLTwND8g8LJ6GvO6YnLvOQ9G7XuIlO9Fj47uaaKO8Q/MGPYFOuTwsshU9pLdoOR2oTTzMlcy8aTCzO+eWpbu3Tlg6iiKXu0kH0Lu94Oi6d0fRu+t6krssYMG7vV/1vJO3nrwoPcK75nEEvMnw1TuEvzK8snLHu9i7LDz+rys9t1oMOn2W1rzp6ws9M18UOgZ7DT2Y9UG9hdNhvN7tFLzAwzO8LSR1PKtbOz3NRV27bMu8O1E38LxKhfW54zxuvI5elTzyAXC8WNV1vLE7KzvvoaG7ncFWvJJMjDs6th48t9pyvGqwar34TZa8saU6PAxkaT2FSJC8WmmCO/VpbzyaUlG8bc/5O5NBR7rYa4g814Knu1QLE703gO26RX7tu+k/3zwoqUI5xdIsvcdWtDw0rcw8m4iTPEP+lDxInKI7FSldu/B3lztHcyA8KPLGuzXb7jtpEZE8HdCluUY8ITj2VZM8ywzEvAAUhjxfTTW80gokvPKthzx/0hw6HFtRu/xAIrw+VRO8XP8mPCahLzxdGps70cKUPHNe8TxrD0w9DZo2vCSGCTpbzcy6BXoGvbn0ojzjtKW8GKjjvECwXTm2I+E8SknSPKJwWTtbzI+8jP59PB4ebju0cSO9V6rAvMIRiTzHsTU87DrcvK6RKr3swDe82w7Ku8qDRzsMZYw75xS7vKnayTuCVMC4E4aAvPNNrTztvY+8FaCyu7u9kbwgZQk8hrLnPAxAcjz0i328wL0/PWjBFz0QduW7DgZsOogfX7w5/Jq8W0MovDHJjbtHdfM8e0q4u2Ck9zx9prQ8ShYIPXDvtLxckfc7U7j8vE0m8rwqzMA7I04yuzDCMb2Sb0q7/218PKFnPb2Y7Bu9JzYiPI2atr2+zIE7JvB0PL/QX7xtDhS9exP9u3it/br81iG8+5q6ugrQ2TzEPxQ8Y2dMu2b83zq3bck8cTsIvaVGkzwWb+g8eoEBPGTN7Tvqm888E66TPC6dc7zHOUA9OOcXPBQtFzsGAlc9yF6PO5iA5Tx5MgA989NCu/YTQrzxwi88dHkBPO7Uu7yRi4K88UU/PIsYLDygRaS8tnilvD3csztwkxY737nouh4TEb3uNIG7DWa6vIMB1bz21Kk8oLx5vBDkK7w6BrQ8SfC+PND4ijtp0YK8/sxgva2b2jzqyVc7nrrnvKZ5GL2DKQe8m+3UO0HlcLyaPAQ9gsU0PC7SDbzAgp68VwmnPAU5uDxsZLC7V6+mu1hX+jtWGoe7sySXOyFWBD1qb1w88DOTvMnwlTvYBwU81+uZu1cv6TsuVk284ySmvMFkFrzQiea7K/cevUhKtrssrxC94NRKvIDfSTzESyC92pQhPRBZHLyKUB87vPBbPLZo6bzlqgk8OYDCPFRjE7vFgY28n2GDPA7spru0dI88NWGZO6+w1zzRDgk9rFT/PE6LLb1/Zfe8XLNHPM/RA7yOX7q81iR8OyJwRTyTYEA8v6YePCt3JT2mVak6dacUPC+r1rxzhIO7iMxcOx2aOLxmddo81yr+vKQCAzz3xKM7QK8PPaEew7xcAla82qKgPJQRgzqmEMm8YeSnOx9x4Tttb9M8+aDFvEUSwby9mMu8T8l3vT/RvTt2s2Y8QplAPZBsv7y4Lgi92sVfOwCnn7sq+Ws8Fys9PA+WpTwIX4y9M6iGPPsJeztgCzk7BzQ8vRBIOzwU0H08aDj+vKPEQ7znJR68/5vyu8xLQDyk6LK8yZm1u8uLlTqR2dS8GpKTvDFvHb3flS28bP6CvO9XmDubJhW7GYokPIVk3Dqk4Qg9KMi7vPZsazsfF268+59jvc0T+rrRXo88tK6wvGlh7jwMboA8FWZWO+5b8Dx5kIw8e9rvuk2fWL2VLRO9BMMqO0Bf5jw6WMu824oxOSVq1jsb/CG7FgrfO2xFIr3t4Vg94749vIC5tjt9oko8ZaZAu6I9c7xYV5Y8/1oOu+6JuTvRXBQ8/9TivFHvDLy0AzM9/ffUu92u+Llzsm08V3U3vOvmbzy5oDE92G0MvYjN0Tjz6pS7gYf6O2R5+Tr0B9o8vYKUPFJ+AD2kfIy84bszPBlpvTk/EFO8hYAYPK0j3jwwkDc9xAT4OTcPpzy1cwg9yyyWPNPv7TrUhAo7IvyZPJgcw7xxKf+8ffSpvKIREzlLl5u81RFnPID4IzycA6I7rhOFPOMFIby9qCo7kDgFPLjxjDz+IgA9urKgvOiwkrzw/VW8oPmKvLLc9LwN0a+8smagu/eUwbzm5xa8EqzCvL1w0zyPAK28+QaSO/QpNjwVIKY6ORiDPCUJ6TxX+4m84QgKPaCNmjyWIji8e1I+u3nM5TynwAi9wlOUPLBaqbxl7y+6YOTyvDJvkrlKcNM7szWpPPntjzyPbWc7XLepvEOEZrq+qmW7Q94DvPTraTxiDCu8rsP6udrcB7tndaQ8xmIUPI2WELwQJhc9hzt1PNZEdzxHc3y8sp7kO1OMK7xftKI6LkbwO8/Vj7zrzHq8StdGvGRPl7va4R88oyp9PDGXgDzhrlG8/bzjPJKhRDw8TNk8kYGdPEl4JzyDgyG8pT8uPI5ICD32DT48GLCyuyJh6zrc5+I8cc9lO6+nVbwrAmq8l0OnvHFPY7za5YQ6jGihu7UHKjxzc9S81CX/uyC42DsvEZY8CvxOugUL3LpFjs87DXL7u5TLyry0K4k7NBasvNTHErzKgQk9JVWnPGNEDzz6a4Q8izFlu+7mjDxwiYQ8SLr/PCdITb2GMDG746qiO9OqAjuH3Ca82ATXPMDXxbv+U8C72GQ9PFAnQTzZCyC7FNNfvJDMYTutmoG8E2iPvKvaSjy1v+Q7prP1OnbsoTwGx4G8bWlxPavlrTwoZ1w8QNxiPLWeRjzoWg07y4/SvNsDb7z3i/O7t8akvHbfz7yb7/07NsI6vBzi77xv6s46uf6qvDlZgjw7P0O83Dqgu1dtwDxIoTo97WvsPF5Vsjqbwao77RWePFqIr7zUtFU8yQijPAtsPrynYYk8scnjvApfLDx/OfO7TAXuO+aNkbvRHZ68j6VEvBpEHz38Jfu8PeVbPEnunzxBaNE7+SNHOT58YDzG0oy7yoHvuwa5FTyIvwW9PFI6OxyyBD3pcII86c0NPZsCVrx3rI27vD4bu34hpLyTTo08t+MCPXDZzjwVyVK8GtUGPb/DfzwEsw+5HL8VPVkBmTwSlaO8nIaVvDmYjzwoyMe801UUu+DSgDu4Wim8qPK2vE2IrDzjYvI7r4xLva49Izxmb787TBOCPFSGxrx3dwQ8CYefPMSFhDygDzC9i2AOvZ6VC704F7U7PR4hvYO8bztw5Uo8PH1MPD1BlLxvzhO7edEtPQjRc7xoEca8MNWoO6Zl5rz+Ihm8soqqPOacQ7w2edy8zqMdO1FpqLzYfq27qv/HO0qQdDvqrUg8vGILvaOXVDucbpS8qIR/PLlSNzyti9k7TYPMvBkMlzyvswE8Eg5rPN9m0DxSMWw7+ImOvMPI+LzY1Ry8t1pFvCAamryHuU4894kVvCbUQLw2UYi8TzqLvJs5QLwQ1dO8ihGIOgGpBT1nkAo8EkcuO6wttLgJS2k8F//LvDsP37tn56e8xQDFu4lEoLvsNKo7oRoRO1Li6bw8Ems8LeKrPIdodTxakBE9LM2yutb587xFwnO8OVSCO5jLL7wkZKm8qcYYvGlffDurVYC8ep4ivGd+Fzz9Zlk8LEYouiIPfTxiNS098pNeOwnm9Tm+nDk84ijbPPFnAr2jkz489kakPKUDQL1R/dO8V3Z5vaTmEjxJOac7c7bsPAk5/LvCcVS8cYN7u9z/rbxdLcy80lKHu7rhsbxEsUA8mtiZPHA1NLxeY3A8Ks8mvRUzCTyxRiK896uJvNVy0rvjT/m73xgDPUQ7XTz7GQq9g1U0Pahpjjy4dnO8mk8/vGAgejwBv9c89oqWvMdVYDsGvYY98+YVPB0sqDz6Nz+8ksiJPMX/Xztqty+8eRXtupr+VLurnl47h2+oPMTYubwfxM48JNPLPDdbMDsuU0g8NGGqPD9rdrwLxME8fzJ3PKq3jDufEQI9kRKfuyYOAz39PMO8ekqBvL+VFr2B34A8Pax9O09PWburIxo8WLiKPNjQwToVbfO7Yiq/PP37VLxnrSS8SbkkPeC/D7yhrKC81WUXuw+IUrxAv/O7dcqSvKXX9bqEfbu8LNslvcY0M7vbyve87BD9OwxYpbvUoQe9U0crPNKljbxVhgG7lowDva6HJ7xoqOQ8LmoRu9RhkrxsLcG63DKGPH+eiLw/o4C7/aFmvPIuCTzdzdK6WtJAu0FH87v5GD08BL0PPeJ3LjtZpUU9iz0EvY5qSzzsnIy8k9VGuzhSCT1vy6K8rqT/uj2N1TtYnom8ivbLvPNih7xnMNA881AmvCvHp7sKfbi7YJ8mPOhWtDsZfAK9Ig4DPKYG0Dt429m7tz6iPBvRID0ksfS65woRPWO2wzxajZW8QtbEOumfMD3VD/28EqyUOmFznjzfbN289O9+vDrkczzuJwY9ujcGvFfKdDw9kQm8AS6YvBwUjLzPGSM97/mBvCfcYzt+bp05H2QTuscmNj3N6Hw8N+ERvPISGLzqTIk8dJTCO/8ZnTzYV4K8vWVou2hcuzsFa4Q7pKvOvDALlLzQ7og8DqYWvOrTr7wO1d87QcjbulPhYjwAFgM7T6xDPM0cLjtBZDc8LKSevAtSPbweFaI8ReQWO3hXDb0YvEq8s1b2PI3anzydI3+82hHGu0nsBLyRQlQ9qWsJPPQxoDzlXoQ8rOJKPKCOarzJXlo7szx/PKJTRLu8ucy8eEA9upQ+F70ogTS7DcC9O8D3Kbyh1WM8OZJJPFowkjziIoU86VYZPRyg4rsur8O8Nd0dvDL6oTxdnN+8PGB2PJyheTst9oW8YBBBvGimSzyViem807bRPPWcsztDmGy8wmiAvJP9bLwc88K8qOxCPaxlvzw0HpY8UuBevOTpHz2BAII8K+/dOyZjibvsZKA80emxvIOdIL1Akwo8H5o9ujrEhzuY5Rk7nKLhOye2wToPisM8ncUHPdiEK73lELs8H7MMO/e/Gjx0M+K847gqu24hibsJd+o5JOB+vGFspbs1/Ow8L9sRvWqCmzujKco5b5wQvVdnEbyH06u8kZxdu16gtjvzNGq5f8UWPc6Wiryp89c8pwXMO5vnuDwPYbK7go4nvH64ejwCmse8FR2HuOXS9jsNz9C8UFjgvBSPKLwqhnK89WyzPAS1XDxts6A8tOIDPEGsCb0CSwG910VLvM4GMr2MQAK9mAT0OseO6TtrinC8aobTPMifKjwjCrO8Ou2bu/Y2gLwKLTo8T2K3O/sEirsWBYA64UwRPNg1dbyxlZ+7x26PvFkSB7zELw+65OAFvfLarbv00oG6fFgHPaeRs7nA+tM8IbAVPVlGrbyQAtq8XOwvu35xxbtbzlW8HeXcu/+YKr1J5u+7JlnFPKoda7v/Ejg8Bik4PBQJhbynRqq6qp4evDpLTbwqp8Q8MT65PIdkhrsk6Fu8OkXYvIaznzwxc+88hn4BPErQ8zsITG27w06ovHvOUr3l6r88LsaHO3EEtTzxtFC9dEU+PDn9izuyDw+9aUnfPIbx5Lx1eOc78KbRvD3UrzoN8PE8bINxvG4zhzzqcJM7KEdnO6XIcz1vdOO8tI3APCrwXLsbCHY8jb6SPCWCTT1mmou7MlLZO9mggDz0FME8LxCfPB0uyruAlrC8o/o6PQPQiTz8SxW9dI+tO8c16Tt8P7C8b+7ZO7CF1bxDp3C6/h9LvLOPZjxnQj086KWnvN7oTjz4YQi7KdzXPJBXOrt+8pW8v64Nvb5atDugkcw8zFnKvMDkDD1pqUq8kBwPvB7UkDxMGE88mVWgPM9B1ryJ6LY7f43tOmdjjbwjioM8SiUYvZ2ahry4xgW9QnnNvNMwCz3t4u+8YA/PvNSaRLy+l4i8WCuJO+az9Lxj5Cy8jlGKvLHfJj0+A1Q8V5wlvMLLL7yCegA83fI8vHMBnzw/3qu7cfPnuqQP+7xtn1O7uC6UvLqNkrtAwgw7qKO+PNzUCDwT3x+8MFV+Oz2e3jwZ4oc8C3J0vI4doLsFaJg744CgO8uNbzt79vG8FP6Huz6ZHrwyYqi8y0KVPBWQtbxJ9M08pVfQuhN5EbwBFPs5AZXfPLAI1jsq6JI7U1u7u7o9RDzXSm88tL8TPRTa1rv9BYo8aGchPQScubzwZY45b+RqOnpkBjxH2im9rbrRvGv2sLzBsTC8JOcvPOKoIz1X7Ms6vS13PMpYRrxREKw8GsxtvHjMLbuMkRk8ofCmPPelUjx8FGS7mztaPO5FsryPOay8nS4xOhlQ/zsF7Di88npVvJoNzjsvJyG8um9SPViSqLz+5e68jth9vEJsWLwSylK890AuvMavkrwe7yu8YXUOPWyyvzrAuim9wNKrvHyIirra5km8Tm9CvK4tijwBHPG6GkUPPf5Avjw1bEy8vWmBu0wclLwMBAe72p6EvF8CwDsks8I8htLCvGudGDyuDsM8AHaDPEDJhrwZB1a79wiuPC5JmTwiIYo7DmznPMMyZDu41KA8F5QMvdOO7LvLpnE8uhafu2mpIbsuuIU6exv8uzhEaDzujVE8/hjqu04PCLw8bMY8HnQ6vBAipjzvL/Y8HRIPvcgMIjzETr68Ea0JvUI6UzziAYU8vYvevGOfZDzS2QQ9aYBdvN01VLusLuO7wlWrvOXTPD0XLxe9TmpfPHyi+btHKMC8UmtgvLtEWTyKvu282EzVu1GOj7xdaO08mjbbPFcqBD35IMW5s5ilvH02MjwgsI88pZKqPGKOnjvWJhA8fYUsO1S97bxbyUy80DAfvOXq+7qcsvM8ycvjPHT4ITwJWnI8f4ouO5HWuTxwjG88BJsXvLeE1DnLVQE80bS0PJUqCrxJgi49MrYkPHSa/LyHV4u801FRPMo28DzdwrG8RXAaujfs4bsslya8US9yvHLawrwGKIu7SEUWvK6ogLzeWVW8VtUtPMonXDx6vAy9UUEGPWJapTxuLeQ7zi3cPPlxcTu/4587+uhEvYvUmzyBuy49o/J3OnOJn7uRMaK8P4/CvDzStjtrl5e8/+wbvGbD9Ltmlxy9xqmsvJTywrzzTY88LfWBPOjG7zx0kIe8QE+KuUeK2DwlFJa8NzpTOVkF9LpzZXW5dKj5ugVm0bz68ZM8rYsKPVAoCbrNZFU7/1ahuyeR2rtHDIm7npyYO5YGb7wdDaI8E0nhO7QhUzzfoJ68Hq2lPGiD/ToppjC8dOsEPNIqozzmEYy7tsESvMKI+jw9ZJy8X3pIvJTZxTrQQNs8YUvtu1nlabypCTS8XPPaPDZzRry5DnY6TpJjvI7GBr33Omu8PacaPUCEWjyAdE69zuyOPPmaOTys60S6RAxuO/xMsjuWkQ88mVAHu2ZiYj3GrJo7UpEVPSJPMjvevrK7lWs4vb6/GDzv6R295/2rPA3+/DuUWIE7lGV8PB5SojpYPE+9rx5CvBXusLuJKL67VQ/dOoQMXbvaIaC86q4WvBzRqLz7Eho9UW2YvOiDB7xU4gU9kJpkvHiFBj3mdfM8dzd8vJl4/bwYqtE8YuXfOtpnBjydHIG7nu79O6A7GD2uwEu8CD3Yuy11qTxH9c68oo9KPKBPKLuf1I68tIqwO3yUiLws6Hw8qpuRur9KlzygfaA8Ep+Rt3cqgjsx3wq8g77ZOseHQT2wZz87BUlKvHdNtrhL0Uk7SFqhvC9LN7y+Ycy6HYEfPVPiqLuQm6E80XLCvEi6rrtORkU8VKOyu/0Xq7nhCA68IqpPO3QtMrzDi9W8uwyWPKaJ+rypHPQ7hSWNuz/TdjzZ4w65mkQ+PYQKXzs2auE8JieAvAHdpzz9iSM7e8VavDEL/TtkdBe8/dtBuyWmhzwX1gs8/S31vEbeQr0vLNM8FjqdPJqc27urcYU6AESjvEEHY7vX4CO9m6fSu31ODj3XAaG8ZP1qPNUcA736eJY853wOvVGg+bvIU2W8Ia1EvAOUEz0RXmQ9kgcQvf70Q7zfzA09rNWfOwYHrjzALAw9h44WPKoIqzxurpI8qyflPLWW+buB5AI9k6O9u4r8FrsIzkG8swsIPP8WL72GpQ87WzpGvKk0zrycc5C7CbAIunRPcjtOvSE9xBz0vDClVjz14Bu9NQvEvMOM3zyxqQe9xN3/u0mDVL1GAes8G1rLvHrFcrwqcYU76QOXu5GlrzxSS7k8nd4NPJFkSDxeqgI9g6cfvI5swzxfr407ePb+vMdATbxPAKw7vw+VvGjQqLueBtg7qDH/O3gKwLtgjZ+81WZCvUoin7wfgeM77g0vvaF2nzv76Pk8b9unvJ+fz7uB6yK8G2CcvG53yzznkge9lid3PCz4PjuwxGq6GjKmu/pp3Dzxv8U8kl49vA+wgzwv7YY7AfpZPItHMrqrwdA8gwifO3tvOTzdwSU8XteTPADmVTxc6nO8QA3PvNAfajxasuu7FTtTPFWfRbyG5sI8VQHUuzacnDt0zRC52nqDPORJYrtHPsy8fMcTvQQauzqGz0a8sG4dPYhLUbyKU6u8QmoIvRqxVjwnHI88d6ezOnpoiTyYflq8euHWu/OKizw1BMs8QjFPPE7t6LxRzWS8ykc1PP7RoTzcdS48EXNlvLu1Ljw+CoI8IaHJvBXKITxIO+87ezK1vNwuALxNxp47JpV0u4dZwLteIWC8L6u1PHwr7DzwsNe7MMcRPU5mg7wkxds7CFt+PHRCNrwnzie83mmOPA9aF715+Xk8sowKvJlBd7yHbuU88tQjva0mvbzd7E+8FMVjuYePy7sO0aY8ftbXu5NsJLwyg0y8+FN7PPhFszzJgsC773tBvUx2MryGFe28XKJAOoJZBT3Ij269+GLFvD6xk7wVgM67lWm9uZUsfzwt0wG8titLu9yqmjv4cQK9mLmJuf2GjLxMR1G9iIELPRm+GTwT5is7liMJPE0FxjzukMi6ZD7PO1ILsLyMSIC8HBlpPExGdTtJLZe85pWTvDgd2TycV+w8Okp0O0Tatzzp8QQ9ICYavPZhKDyrSra8i6UsvPHAhDxrgAQ9voRfO39iWjxe7bo762cCPHJ3Ar1Wyu68qa4BvTbCFb3IqNa8T/O+vBzxZLwBS1s7uE0eu6M+hrtsspC8ljtUuiZ61LtdHso7nF4RvWICy7tBcQY6EGb0u4aBBD2tGyG8/JYIu3kzKjoisUq7HFOLucvfwbx1cjw8iKi0O2roQLyH6rq8pjnjuke7iTwY2a07Rh9RvO+pEzly9JC7ntBeu8xhszoeYUm8p13PvHmFBb16oge961lJPAj8Gbw000e8B9sevLLuRTw356u8BKRPvBz1nzxQypa7p6czvPVOc7wte3+8MyotPOK2rTytyQ+9pxtGPHnZzjuX+Cw9oziEPFmuNjzTxWq8tvovOyo0IbuHj8y8mfmgPJk6vjvUyIa8BCkiO2GgqLyg5JO88gtgPATWJL3dYgq8pR3KPEDo5rskd8O8C2ibvP+fAT0Ou6M817DtO3BMV7yg5Ic8VePNPDLsSzxdPVU8mMKIPMJXlDw6NRo8Db5JPAYbULzTWFq7wgguPLC7nDzq+Ys7XhSWu89qyrvF+fO7a0rOPOmSArztTdI7Kq2butC0PL1hzcc8AP3ZO1igvDwZJts4c/GfvBIGujwRQci8u7SRvByVdzy4uAO9I98CvP8UpbwiQhU8dhoOPZO8qjzzRZ28bg0XPEsbSrzfqYW8YZATvXDSH720ooc8n4G3vCDivzzqkdw6hEzRu6g/rDyJ4xG6+YdBPFgjmTt6jZa8QF53PFwHEbzqI5Q8nLcNvEXqHz2+zBM8BzI9PBGL+zqDzei7weQqO/p2Br0Anui7Uy2HPNafDLzoJBM7/cy1PFHdxrxY44u8eMOUPJlAj7y+ZIA66yy9vF9rSjuY+d+85jfAvIUKOr07R0c6jDSHvCeLnjwbCUg8ecypPLW5ELyb5gs7vjzOvMtFEjyUUJ+8Jt5QO7+oALycUb2801JcvIx1G70xRgy9bdN2vJ7bjrx3YsU7EP2FvNz09TzC3hg9HRenuz1/wrxgUm89iRTuu8YoYDxdeFE9hbEOPfjJE7wrOS29kyA2POS64rw3bpc8dkHyvBp5ADvYtYM80xqvPNRC0jxxZSq9Z4UEOlr/ljyN2bE8ayBxvIX5TL35n+c8gtwCPJyVpjyxQQ49FIQVvEPHqzpIhuk87nIkPK0YMzyH5nw8qJacvKwoDzugbNe7gzdIvKjMCD0mRlo8TXvfPAWt2Lw4Oju8m99PPGJVGDtjdpc8SGwQPUFR07ttSYO8dL/FO6W/zjzXlom825Q2POnCfr2pKQG8sakTvHVDE705q/m8ibCCu/Mkwbw4eAE97WjrvB2xpLyI/BU8lc/juo+3uLztmy47iBa5vCn4LrwhAmw89eSmvKAvhjzJF3w7wTZmPKmS0zwSkMo5SvFlPIsoSTuvPv+6nuODvCmYxrxk9Su8cLK7Oyx3ZLtd+Yg8Z0d/uURf5DwfhYS8XFuiu1WtoDol3h+854HdPKFGXjyKe2s8Tr6EPKxUiTsINRq9W9RRvHWNKbpCRsG85Gl+OyeJPLx9uhY98JXbO2scujtem5e77jw4vO6+YTwsliU8UMXOO/m2ZLyzEyw8qkYfPL896DxAC+06Rnf6OyQakjxpNla9uD2EPKtiFr1LM4I7SlOLO3AvKjqHL6457TRsvGwftLz5ilo8VLWsvLwLtjwc6o88ikWyvOW47DtC6Ek8iG7KPO+1Nzx0B5W8dJcbvSvD0rvPca08bWSauZnScjta5b+7zlepvPFQkrzO04y7LbrbvKD6gTy622A8HyzbvDbPTTwsXrs8tuxmPASQfDzXDF47QmxmPATXJLx9/qy7RtqHO2J3r7xtZt+8h3VmPM/fzDx8Vo28DPfEu27Gxrs9KJa8YX7DvNp6SDxG8bc869eIu4TbVTwtWpC8+cS4OrES5jw6AiY8jiSEPN/+/LzFMY48dvNPPLXnrLwLUec7L5OsuX5VqDtDf7C7ukQxPTRxi7woH5u83hqtPJLCTbyoBGw86UlFOgejqLqnplk8z01vutH51rvJkQu9UjvovMzlWTzQiFu6ZXarvLyPhDuS4qQ8+r/XPLMb1jy3u5g8IwbjPCuGlrwPjD+8bQU3vP83MLzoCgu8j0vXOw23I7tL0X08XQsouxVo/bt1Y/28oksQvT0hYzzBMwE8pcOZvKe4ejznFJO7hTidvMKbzzuxMc05l9NhvMaNpjzzMpm8HS8rvYmzDbxRKzg73fvpupNh8LqkGso80zoVvDKwGr3bHYm8JVg9vPLWnDuqrtS8qcmAvIIMEDy1N0y8FL8OvA8irbwzzQm8BLA4Pdv/v7x71LG8PEPfu402uTwgEby5Ejf5uUTTjTyLvc47p/tSPFpdJ7zMhBQ9F2MuO+yO3Dxkw7W8WuFeusfS3ryjCcY8EEgDOzLRLr1EMWQ8x1chPIgRpjyXAPM8UkGivH829jjaI5A5nSARPVBTFbqzkDs7eWWhvEVhFD0WATW8K1ocPNcVADwHM/y7M3o8u1UHJDqQ+iG9RWYVOyv1Cj0RSA67jtUlvHo0Hz0cQp+5lnlyPJ+BcDyjJse8Jq5VvI4WYbzQUBq81R2evF+FRju8ZE28pQSuOvm257talUg9pR2OPKQHhTuugK67XZxYPJLCbTyFH+S7pH7hO9qCvDwKK9i8a6ANvLPhmTsWMw29o6iHvLBt2Dx1Swi8xcqtulZvCjz7+pU6u0rvPHvghjyMdim6triXvOgtBTz8xqi8AJ5MvMZvgDuao4i8OziRvH7ORTubOjk9ZbeIvA/z1bvfKRG6NdMFvBB2ebXOIMq79gA9u2zIaDzkKCK9DEYIusUT1TvHhWy9mzBAPA8GkrzvgMa7esJavP6uHLyGNAI9RWD5O0dV+jsRJvQ7k3eBvPOywznJgAE8GoRKvDEDoDs5VQW8MDACvYob9LwEUZM756YlvEoJLztfO2q7o70uPLA3C71cFR68tef/uw== + index: 0 + object: embedding + model: qwen3-embedding:4b + object: list + usage: + prompt_tokens: 9 + total_tokens: 9 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/test_client/test_client_create_document_from_source_with_uri_override.yaml b/tests/cassettes/test_client/test_client_create_document_from_source_with_uri_override.yaml new file mode 100644 index 00000000..3c6fee6b --- /dev/null +++ b/tests/cassettes/test_client/test_client_create_document_from_source_with_uri_override.yaml @@ -0,0 +1,42 @@ +interactions: +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '110' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + encoding_format: base64 + input: + - Synthetic content for URI-override test. + model: qwen3-embedding:4b + uri: http://localhost:11434/v1/embeddings + response: + headers: + content-type: + - application/json + transfer-encoding: + - chunked + parsed_body: + data: + - embedding: 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 + index: 0 + object: embedding + model: qwen3-embedding:4b + object: list + usage: + prompt_tokens: 10 + total_tokens: 10 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/test_rebuild/test_rebuild_descriptions_patches_blob_and_chunks.yaml b/tests/cassettes/test_rebuild/test_rebuild_descriptions_patches_blob_and_chunks.yaml new file mode 100644 index 00000000..a416693d --- /dev/null +++ b/tests/cassettes/test_rebuild/test_rebuild_descriptions_patches_blob_and_chunks.yaml @@ -0,0 +1,44 @@ +interactions: +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '105' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + encoding_format: base64 + input: + - |- + Hello world + A red square (mocked). + model: qwen3-embedding:4b + uri: http://localhost:11434/v1/embeddings + response: + headers: + content-type: + - application/json + transfer-encoding: + - chunked + parsed_body: + data: + - embedding: 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 + index: 0 + object: embedding + model: qwen3-embedding:4b + object: list + usage: + prompt_tokens: 11 + total_tokens: 11 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/test_rebuild/test_rebuild_descriptions_skips_already_described.yaml b/tests/cassettes/test_rebuild/test_rebuild_descriptions_skips_already_described.yaml new file mode 100644 index 00000000..600b361b --- /dev/null +++ b/tests/cassettes/test_rebuild/test_rebuild_descriptions_skips_already_described.yaml @@ -0,0 +1,44 @@ +interactions: +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '108' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + encoding_format: base64 + input: + - |- + Hello world + Pre-existing description. + model: qwen3-embedding:4b + uri: http://localhost:11434/v1/embeddings + response: + headers: + content-type: + - application/json + transfer-encoding: + - chunked + parsed_body: + data: + - embedding: 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 + index: 0 + object: embedding + model: qwen3-embedding:4b + object: list + usage: + prompt_tokens: 8 + total_tokens: 8 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_client.py b/tests/test_client.py index 360163dc..dd9a347e 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -263,6 +263,64 @@ async def test_client_update_title_noop_behavior(temp_db_path): assert got.title == "Title B" +@pytest.mark.vcr() +async def test_client_create_document_from_source_with_uri_override(temp_db_path): + """A `uri` override is honored as the canonical document identifier.""" + async with HaikuRAG(temp_db_path, create=True) as client: + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) / "2412.06611v2.pdf-ish.txt" + temp_path.write_text("Synthetic content for URI-override test.") + + doc = await client.create_document_from_source( + source=temp_path, uri="2412.06611v2" + ) + assert isinstance(doc, Document) + assert doc.uri == "2412.06611v2" + assert doc.uri != temp_path.as_uri() + + # The override URI is the lookup key for subsequent reads. + looked_up = await client.get_document_by_uri("2412.06611v2") + assert looked_up is not None + assert looked_up.id == doc.id + + # The original file URI is NOT a key. + assert await client.get_document_by_uri(temp_path.as_uri()) is None + + +@pytest.mark.vcr() +async def test_client_create_document_from_source_uri_override_dedupes(temp_db_path): + """Re-creating from the same source with the same override is a no-op.""" + async with HaikuRAG(temp_db_path, create=True) as client: + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) / "doc.txt" + temp_path.write_text("Stable content for dedup test.") + + doc1 = await client.create_document_from_source( + source=temp_path, uri="paper-id-1" + ) + doc2 = await client.create_document_from_source( + source=temp_path, uri="paper-id-1" + ) + assert isinstance(doc1, Document) and isinstance(doc2, Document) + assert doc1.id == doc2.id + + +@pytest.mark.vcr() +async def test_client_create_document_from_source_uri_override_rejected_for_dir( + temp_db_path, +): + """Directory sources reject the `uri` override (would collide on multiple files).""" + async with HaikuRAG(temp_db_path, create=True) as client: + with tempfile.TemporaryDirectory() as temp_dir: + (Path(temp_dir) / "a.txt").write_text("a") + (Path(temp_dir) / "b.txt").write_text("b") + + with pytest.raises(ValueError, match="directory sources"): + await client.create_document_from_source( + source=Path(temp_dir), uri="some-uri" + ) + + @pytest.mark.vcr() async def test_client_create_document_from_source_unsupported(temp_db_path): """Test creating a document from an unsupported file type.""" diff --git a/tests/test_rebuild.py b/tests/test_rebuild.py index 7b7d0e57..cec7d57f 100644 --- a/tests/test_rebuild.py +++ b/tests/test_rebuild.py @@ -437,6 +437,7 @@ async def test_rebuild_descriptions_requires_enabled(temp_db_path): pass +@pytest.mark.vcr() async def test_rebuild_descriptions_patches_blob_and_chunks(temp_db_path, monkeypatch): """End-to-end: ingest a doc with a picture (no VLM at ingest), then run rebuild --descriptions with the VLM mocked. The docling blob should gain @@ -503,6 +504,7 @@ async def test_rebuild_descriptions_patches_blob_and_chunks(temp_db_path, monkey assert any("A red square (mocked)." in (c.content or "") for c in chunks) +@pytest.mark.vcr() async def test_rebuild_descriptions_skips_already_described(temp_db_path, monkeypatch): """Pictures that already carry a description must not be re-sent to the VLM, so the operation is safe to re-run after a partial failure."""