From aa620aeb60e85d3dd0e252c79660815db71541ce Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Tue, 14 Jul 2026 13:25:02 +0300 Subject: [PATCH] Bump lancedb to 0.34.0 --- CHANGELOG.md | 1 + .../haiku/rag/store/upgrades/v0_45_0.py | 4 +++- haiku_rag_slim/pyproject.toml | 2 +- tests/ingester/test_revision_round_trip.py | 20 ++++++++++++------- uv.lock | 14 ++++++------- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 534e16c9..3bc491c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Unknown `reranking.model.provider` raises `ValueError` instead of silently disabling reranking. - `search.max_context_chars` default lowered from 10000 to 5000. +- `lancedb` bumped to 0.34.0. ### Removed diff --git a/haiku_rag_slim/haiku/rag/store/upgrades/v0_45_0.py b/haiku_rag_slim/haiku/rag/store/upgrades/v0_45_0.py index 4cd6e781..a89ed8aa 100644 --- a/haiku_rag_slim/haiku/rag/store/upgrades/v0_45_0.py +++ b/haiku_rag_slim/haiku/rag/store/upgrades/v0_45_0.py @@ -157,10 +157,12 @@ async def _apply_extract_picture_bytes(store: Store) -> None: schema=_V0_45_0_ITEMS_SCHEMA, ) + # Update-only merge: v0.40.0 guarantees a matching row per + # self_ref, and an insert branch would require the source to + # carry every non-nullable column of the live schema. await ( store.document_items_table.merge_insert(["document_id", "self_ref"]) .when_matched_update_all() - .when_not_matched_insert_all() .execute(new_records) ) wrote_items = True diff --git a/haiku_rag_slim/pyproject.toml b/haiku_rag_slim/pyproject.toml index 7ba291ee..a04e5681 100644 --- a/haiku_rag_slim/pyproject.toml +++ b/haiku_rag_slim/pyproject.toml @@ -28,7 +28,7 @@ dependencies = [ "jinja2>=3.1.0", "jsonpatch>=1.33", "fastmcp>=3.3.0", - "lancedb==0.30.2", + "lancedb==0.34.0", "pathspec>=1.0.4", "pydantic>=2.12.5", "pydantic-ai-slim[openai,logfire,ag-ui]>=1.100.0", diff --git a/tests/ingester/test_revision_round_trip.py b/tests/ingester/test_revision_round_trip.py index 7bffbde0..e71e5750 100644 --- a/tests/ingester/test_revision_round_trip.py +++ b/tests/ingester/test_revision_round_trip.py @@ -38,7 +38,9 @@ async def test_fs_second_sweep_emits_unchanged_after_ingest(temp_db_path, tmp_pa """The full round-trip: ingest a file, build a sync_state-shaped snapshot from document.metadata, hand it to FSSource.discover() — must see UNCHANGED, not UPSERT. This is exactly what the periodic poller does.""" - file_path = tmp_path / "doc.md" + docs_dir = tmp_path / "docs" + docs_dir.mkdir() + file_path = docs_dir / "doc.md" file_path.write_text("hello") async with HaikuRAG(temp_db_path, create=True) as client: @@ -47,7 +49,7 @@ async def test_fs_second_sweep_emits_unchanged_after_ingest(temp_db_path, tmp_pa assert doc.uri is not None snapshot = {doc.uri: doc.metadata["source_revision"]} - src = FSSource(root=tmp_path) + src = FSSource(root=docs_dir) kinds: list[SourceEventKind] = [] async for event in src.discover(since=snapshot): kinds.append(event.kind) @@ -60,7 +62,9 @@ async def test_fs_second_sweep_emits_unchanged_after_ingest(temp_db_path, tmp_pa async def test_fs_second_sweep_emits_upsert_when_file_changes(temp_db_path, tmp_path): """Counterpart to the unchanged test: a file modified after ingest still triggers UPSERT. Ensures the round-trip doesn't accidentally over-skip.""" - file_path = tmp_path / "doc.md" + docs_dir = tmp_path / "docs" + docs_dir.mkdir() + file_path = docs_dir / "doc.md" file_path.write_text("hello") async with HaikuRAG(temp_db_path, create=True) as client: @@ -74,7 +78,7 @@ async def test_fs_second_sweep_emits_upsert_when_file_changes(temp_db_path, tmp_ # on any sane filesystem, but assert anyway to make the intent explicit. assert str(file_path.stat().st_mtime_ns) != doc.metadata["source_revision"] - src = FSSource(root=tmp_path) + src = FSSource(root=docs_dir) kinds: list[SourceEventKind] = [] async for event in src.discover(since=snapshot): kinds.append(event.kind) @@ -242,7 +246,9 @@ async def test_directory_ingest_threads_configured_source_to_provider( """Directory ingestion with a configured source passes that source's id and fetch context to each child, so the provider sees the configured source id rather than an ad-hoc fs: identity.""" - (tmp_path / "doc.md").write_text("hello") + docs_dir = tmp_path / "docs" + docs_dir.mkdir() + (docs_dir / "doc.md").write_text("hello") seen_source_ids: list[str] = [] @@ -251,11 +257,11 @@ async def test_directory_ingest_threads_configured_source_to_provider( seen_source_ids.append(source_id) return {"collection": source_id} - source = FSSource(root=tmp_path, source_id="docs") + source = FSSource(root=docs_dir, source_id="docs") async with HaikuRAG(temp_db_path, create=True) as client: docs = await client.create_document_from_source( - tmp_path, + docs_dir, sources=[source], source_id="docs", metadata_provider=Provider(), diff --git a/uv.lock b/uv.lock index 7ec3a648..1b87ee69 100644 --- a/uv.lock +++ b/uv.lock @@ -1755,7 +1755,7 @@ requires-dist = [ { name = "httpx", specifier = ">=0.28.1" }, { name = "jinja2", specifier = ">=3.1.0" }, { name = "jsonpatch", specifier = ">=1.33" }, - { name = "lancedb", specifier = "==0.30.2" }, + { name = "lancedb", specifier = "==0.34.0" }, { name = "obstore", marker = "extra == 's3'", specifier = ">=0.9,<0.10" }, { name = "opencv-python-headless", marker = "extra == 'docling'", specifier = ">=4.6.0.66,<5.0.0.0" }, { name = "pathspec", specifier = ">=1.0.4" }, @@ -2252,7 +2252,7 @@ wheels = [ [[package]] name = "lancedb" -version = "0.30.2" +version = "0.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecation" }, @@ -2264,12 +2264,10 @@ dependencies = [ { name = "tqdm" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/87/67b23006663be175c396ae8f7c6ac98bfa4728de5b5583016b8b8c54eb14/lancedb-0.30.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:3dd8cb9e2e25efb32c088b24b3fbc57f3f24a636f4b8ad4b287b1eb52f6b5075", size = 41720461, upload-time = "2026-03-31T22:42:32.853Z" }, - { url = "https://files.pythonhosted.org/packages/78/68/b3b5f638f8de91de75751414114690cae9c294dc79d9ab2602f4562ed9df/lancedb-0.30.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f083d50b257f645bd5c4b295d693648ffb37640ce1e9d72f55041b1382f0dbd6", size = 43626135, upload-time = "2026-03-31T22:50:28.577Z" }, - { url = "https://files.pythonhosted.org/packages/ef/d1/ea8b74a8b56dd4925cc9cb9cc23c7d9675708a7f6b33d22136dc7bb34dbc/lancedb-0.30.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aef5538db9cd82af79c90831035b4d67e9aa182ef73095a1b919caddf9bb7a5", size = 46619289, upload-time = "2026-03-31T22:55:02.242Z" }, - { url = "https://files.pythonhosted.org/packages/74/4b/5bfeacf948cfc3452b286a792dcbbfaf04649ef0820e1d3790d47bf5527e/lancedb-0.30.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8b161cb1da04ae6ad45afe10093cfe4107821d93e7712b50200c435d6f4c8a20", size = 43641193, upload-time = "2026-03-31T22:51:13.63Z" }, - { url = "https://files.pythonhosted.org/packages/28/4c/a51af0ce1d18fd86afa3e8538a81abf5523d24632abe7665ce6795b8009d/lancedb-0.30.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7fabc0f57944fd79ddef62ed8cf4df770654b172b1ad1019a999304fed3169f3", size = 46665361, upload-time = "2026-03-31T22:54:20.282Z" }, - { url = "https://files.pythonhosted.org/packages/88/d0/7e44e8143ac2dae8979ba882cc33d4af7b8da4741fb0361497e69b4a4379/lancedb-0.30.2-cp39-abi3-win_amd64.whl", hash = "sha256:531da53002c1c6fda829afccc8ced3056ef58eb036f09ddb2b94a06877ecc66c", size = 50940681, upload-time = "2026-03-31T23:25:52.35Z" }, + { url = "https://files.pythonhosted.org/packages/df/f7/5262b9aa593f790757163c0165ab0da1dda054758901bea7e4f02c9cb633/lancedb-0.34.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c462f2e6f933cad659fd0179394eaab578acbc9151fe2ef41bc29b36ecca5058", size = 52654213, upload-time = "2026-07-02T17:13:31.102Z" }, + { url = "https://files.pythonhosted.org/packages/69/99/05ea0d32229ebea695193ff20c15d6ecae25785ad82a9d4723d98832a284/lancedb-0.34.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:48829e88e708947d0520454ab9e4f8efa35f3e3626469eadd3a6e061b89cb223", size = 55434501, upload-time = "2026-07-02T17:13:34.81Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4e/4325c13d5afa93c466428a5a0f168ad4d96f5eb4a77bbe7c5100d39c9897/lancedb-0.34.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:05ba8a5b58e064edfbe5be71b1abf2e411b4eaf295d1a173dcb1a55c5bfb5285", size = 58659359, upload-time = "2026-07-02T17:13:38.424Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/8ca165f1386caf6c4d1c515afd52f345b66432264eecfdfb7fd33eefd9af/lancedb-0.34.0-cp39-abi3-win_amd64.whl", hash = "sha256:51cbc11808f9e3332819b9367c975b3a888541447a8e7bea09c57c852a279153", size = 63530726, upload-time = "2026-07-02T17:13:41.612Z" }, ] [[package]]