mirror of
https://github.com/lancedb/lancedb.git
synced 2026-08-16 11:08:24 +00:00
python-v0.35.0-beta.1
2659 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
715be580d0 | Bump version: 0.35.0-beta.0 → 0.35.0-beta.1 python-v0.35.0-beta.1 | ||
|
|
0d9c87a079 |
ci(nodejs): move Windows builds to larger runner and use ThinLTO (#3634)
The `build - aarch64-pc-windows-msvc` node build job (and, marginally, the x86_64 one) had started hitting `rustc-LLVM ERROR: out of memory` while linking the `lancedb-nodejs` cdylib — most recently surfaced by #3526, which adds the goosefs backend (and its tonic/prost gRPC subtree) to the default node binary. The peak-memory step is the fat-LTO codegen (`lto=fat`, `codegen-units=1` from `.cargo/config.toml`), which merges the whole crate graph into a single LLVM module and runs single-threaded. It therefore neither parallelizes across cores nor fits in the 16 GB of the standard `windows-latest` runner as the dependency graph grows. This PR: - Moves both `*-pc-windows-msvc` node build jobs to `windows-2025-8x-x64` (more memory + cores). - Overrides the release profile to ThinLTO for just these jobs, via `CARGO_PROFILE_RELEASE_LTO=thin` / `CARGO_PROFILE_RELEASE_CODEGEN_UNITS=16` in `pre_build`. ThinLTO parallelizes the cross-module optimization across the runner's cores and keeps peak memory well under the limit. Scoped so Python wheels and Rust release builds keep fat LTO. The larger runner alone would clear the OOM but waste the added cores on the single-threaded fat-LTO tail; ThinLTO is what makes the extra cores actually reduce wall-clock and gives durable memory headroom for future dependency growth. Tradeoff: ThinLTO can leave a small runtime-perf gap vs fat LTO for the node native binary, but it recovers most of it and is a common release configuration. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
8e364e6812 | Bump version: 0.31.0-beta.6 → 0.32.0-beta.0 | ||
|
|
32a2776446 | Bump version: 0.34.0-beta.6 → 0.35.0-beta.0 python-v0.35.0-beta.0 | ||
|
|
285add40dd |
feat: expose Lance metrics via OpenTelemetry in Python and Node (#3609)
Bridges Lance's internal `metrics`-crate instrumentation (object store request counts, bytes, latency, errors, and throttles) into OpenTelemetry, in both the Python and Node bindings, with a shared adapter in the Rust core. This is the LanceDB counterpart to lance-format/lance#7537. ## Rust core (`rust/lancedb`) Two new, **off-by-default** features: - `metrics` — re-exports the [`metrics`](https://docs.rs/metrics) crate as `lancedb::metrics` and turns on Lance's object-store instrumentation. Install any `metrics`-compatible recorder to collect them. - `metrics-otel` — adds `lancedb::metrics_otel`, a pull-based adapter that installs a process-global recorder aggregating into lock-free cumulative storage and exposes a snapshot/catalog API (`register_metrics_recorder`, `metrics_catalog`, `snapshot_metrics`, `MetricPoint`/`MetricValue`/`MetricKind`/`MetricDescription`). Both bindings build on this. ## Python `lancedb.otel.instrument_lancedb_metrics()` registers each metric as an OpenTelemetry observable instrument on the given (or global) `MeterProvider`. Available via the `otel` extra (`pip install lancedb[otel]`), which pulls in only `opentelemetry-api` — the application supplies and configures the SDK. ## Node `instrumentLanceDbMetrics()` provides the equivalent wiring against `@opentelemetry/api`. This is the only public entry point; the underlying recorder/catalog/snapshot functions stay internal. Because OpenTelemetry has no asynchronous histogram instrument, histograms are exported Prometheus-style as `<name>_bucket` (with an `le` attribute), `<name>_count`, and `<name>_sum`. Only `_sum` carries the histogram's unit; `_bucket` and `_count` observe cumulative counts and are unitless. The adapter is enabled by default in the Python and Node builds, and off by default in the Rust crate. ## Notes - Requires Lance ≥ `v9.0.0-beta.19`, which ships the object-store metrics APIs (upstream lance-format/lance#7537, now merged). `main` is already on beta.19, so this is a single feature commit with no dependency bump. - Tests: 8 Rust unit tests, 3 Python tests, 2 Node tests, all covering the end-to-end object-store-metrics → OpenTelemetry path. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
22bf091de1 |
fix: avoid manifest writes for read-only directory namespace opens (#3635)
Bumps Lance to v9.0.0-beta.19, which includes lance-format/lance#7687 for side-effect-free DirectoryNamespace read paths. This fixes root-level read-only table opens that previously could trigger `__manifest` creation through directory namespace construction, including Hugging Face bucket reads with read-only tokens. A LanceDB regression test now covers root listing operations without creating `__manifest`. Fixes #3633. |
||
|
|
ff81428a9c |
fix(python): flatten_columns raises when flatten=False (#3629)
### Summary
`flatten_columns` raises `ValueError` when called with `flatten=False`,
even though `False` should mean "do not flatten". This is reachable from
the public API — `Query.to_pandas(flatten=...)` and
`to_batches(flatten=...)` type their `flatten` param as
`Optional[Union[int, bool]]` and pass it straight to `flatten_columns`.
### Cause
`bool` is a subclass of `int`, so `isinstance(False, int)` is `True`.
`flatten=False` skips the `flatten is True` check, falls into the
integer branch, and `False <= 0` evaluates to `True`, raising:
```
ValueError: Please specify a positive integer for flatten or the boolean value `True`
```
### Reproduction
```python
import lancedb
db = lancedb.connect("/tmp/db")
t = db.create_table("t", data=[{"id": 1, "vector": [0.1, 0.2]}])
t.search([0.1, 0.2]).to_pandas(flatten=False) # -> ValueError
```
### Fix
Guard the integer branch with `not isinstance(flatten, bool)` so that
`flatten=False` (and `None`) mean "do not flatten". Behavior is
otherwise unchanged:
- `flatten=True` → flatten all nested levels
- positive `int` → flatten to that depth
- non-positive `int` (e.g. `0`) → still rejected with `ValueError`
Added a regression test in `tests/test_util.py` covering `None`,
`False`, `True`, a positive depth, and `0`.
|
||
|
|
75c5c83f12 |
fix(python): resolve Ollama embedding serialization error in create_table (#3583)
This PR fixes a serialization error when using Ollama embeddings in `create_table`. The use of `@cached_property` for the Ollama client was causing issues during serialization/pickling, which is required by certain LanceDB operations (like when using multiprocessing or certain storage backends). Switching to a standard `@property` ensures the client is instantiated when needed without being stored in a way that breaks serialization. Verified with the following script: ```python import lancedb from lancedb.embeddings import get_registry import pickle registry = get_registry().get(\"ollama\") model = registry(name=\"llama3\") # This would fail before the fix pickled = pickle.dumps(model) unpickled = pickle.loads(pickled) ``` Fixes #2629 (or similar serialization issues reported). --------- Co-authored-by: Unmilan Mukherjee <Missing-Identity@users.noreply.github.com> |
||
|
|
291e9e37be |
feat: add Tencent COS and GooseFS object store support via new feature flags (#3526)
## Summary Closes #3525 This PR wires up two new optional object-store backends at the LanceDB layer, exposing capabilities that already exist upstream in `lance` / `lance-io`: | Backend | Cargo feature | Default in Rust crate | Default in Python wheel | Default in Node binding | | --- | --- | --- | --- | --- | | **Tencent COS** | `cos` | ❌ off | ✅ on | ❌ off | | **GooseFS** | `goosefs` | ❌ off | ✅ on | ✅ on | Both backends are additive and do not affect existing users who don't opt in. ## Motivation - **Tencent COS** is the dominant object storage in the China region. Tencent Cloud users currently need an S3-compatible proxy or a private fork to use LanceDB against COS buckets. - **GooseFS** is Tencent Cloud's distributed cache acceleration layer that sits in front of COS/S3, a common pattern for vector search / AI training where the same hot dataset is read repeatedly. - This brings COS / GooseFS to feature parity with the existing first-class backends (`aws`, `gcs`, `azure`, `oss`, `huggingface`). See the linked issue #3525 for the full discussion. ## Changes ### `rust/lancedb/Cargo.toml` Add two new optional features that pull through the corresponding upstream feature flags: ```toml cos = ["lance/tencent", "lance-io/tencent"] goosefs = [ "lance/goosefs", "lance-io/goosefs", "lance-namespace-impls/dir-goosefs", ] ``` ### `python/Cargo.toml` Enable both `cos` and `goosefs` by default for the Python wheels, so `pip install lancedb` works against COS / GooseFS out of the box (consistent with how `aws` / `gcs` / `azure` / `oss` are bundled today): ```diff -default = ["remote", "lancedb/aws", "lancedb/gcs", "lancedb/azure", "lancedb/dynamodb", "lancedb/oss", "lancedb/huggingface"] +default = ["remote", "lancedb/aws", "lancedb/gcs", "lancedb/azure", "lancedb/dynamodb", "lancedb/oss", "lancedb/huggingface", "lancedb/cos", "lancedb/goosefs"] ``` ### `nodejs/Cargo.toml` Enable `goosefs` by default for the Node binding (COS kept opt-in to limit the default native binary size; can be revisited based on demand): ```diff -default = ["remote", "lancedb/aws", "lancedb/gcs", "lancedb/azure", "lancedb/dynamodb", "lancedb/oss", "lancedb/huggingface"] +default = ["remote", "lancedb/aws", "lancedb/gcs", "lancedb/azure", "lancedb/dynamodb", "lancedb/oss", "lancedb/huggingface", "lancedb/goosefs"] ``` ### `Cargo.lock` Regenerated to reflect the transitive dependencies brought in by the new upstream features. No manual edits. ## Example Usage ### Rust ```toml # Cargo.toml lancedb = { version = "0.30", features = ["cos", "goosefs"] } ``` ```rust // Tencent COS let db = lancedb::connect("cos://my-bucket/my-db").execute().await?; // GooseFS let db = lancedb::connect("goosefs://my-namespace/my-db").execute().await?; ``` ### Python ```python import lancedb db = lancedb.connect( "cos://my-bucket/my-db", storage_options={ "secret_id": "...", "secret_key": "...", "region": "ap-guangzhou", }, ) ``` ## Backwards Compatibility - All new features are **opt-in** at the Rust crate level (`default = []` for `lancedb` itself is unchanged). - The Python wheel gains both backends by default, increasing wheel size slightly but matching the existing pattern of bundling all major cloud backends. - Node binding only adds `goosefs` to defaults; existing users see no behavior change. ## Testing - `cargo check --all-features` ✅ - `cargo check -p lancedb --features cos` ✅ - `cargo check -p lancedb --features goosefs` ✅ - End-to-end COS / GooseFS smoke tests require Tencent Cloud credentials and are intentionally not added to CI in this PR (same approach used for `s3-test`). Happy to add a gated test feature in a follow-up if reviewers prefer. ## Checklist - [x] Added `cos` and `goosefs` features to `rust/lancedb/Cargo.toml` - [x] Updated `python/Cargo.toml` default features - [x] Updated `nodejs/Cargo.toml` default features - [x] Regenerated `Cargo.lock` - [x] Verified build with `--all-features` - [ ] Documentation update (can be done in a follow-up PR once API stabilizes) ## Related - Issue: #3525 - Upstream support: [`lance/tencent`](https://github.com/lance-format/lance), [`lance/goosefs`](https://github.com/lance-format/lance) |
||
|
|
6c066530e5 |
feat: add get_lsm_write_spec to read the installed LSM write spec (#3631)
## Summary Adds `Table::get_lsm_write_spec` returning `Option<LsmWriteSpec>` — the read counterpart to the existing `set_lsm_write_spec` / `unset_lsm_write_spec`. Returns `None` when the MemWAL LSM write path is not enabled; otherwise reconstructs the spec (mode, shard column, `num_buckets`, `maintained_indexes`, `writer_config_defaults`) exactly as installed. ## Changes - **Rust core (`NativeTable`)** — reconstructs the spec from `mem_wal_index_details()`, resolving the shard column from its Lance field id via the dataset schema. This is a raw metadata read, so it is unaffected by `describe_indices` system-index filtering. - **Remote (`RemoteTable`)** — reads the `__lance_mem_wal` system index through `index/list` with `include_system: true` (so the curated `list_indices` surface stays unchanged), then parses the index `details` JSON. It matches the index by name and ignores `index_type`, so no client `IndexType` variant is needed. It uses the **server-resolved `column` name** from the details (Lance field ids do not travel to the remote client). - **Python + TypeScript bindings** — sync and async, mirroring `set`/`unset`, with round-trip tests (bucket / identity / unsharded, plus `None` when unset). ## Tests - Rust: native round-trip unit test + remote mock-endpoint tests (present + absent). All green (`cargo test --features remote -p lancedb`). - Python/TS: round-trip tests added; binding-runtime execution runs in CI. ## Dependencies for the remote path The remote path is complete on the client side but depends on two out-of-repo pieces to work end-to-end: 1. **lance** — emit the server-resolved shard **`column`** name in the MemWAL index `details` JSON (field ids can't reach the client). See lance-format/lance#7667. 2. **server** — honor `include_system` on `index/list` so the `__lance_mem_wal` entry is returned for this read. Against an older server (no `include_system`), the remote getter degrades gracefully to `Ok(None)` rather than erroring. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
f428c6a76c |
chore: update lance dependency to v9.0.0-beta.18 (#3632)
Updates LanceDB's Lance dependencies to v9.0.0-beta.18.\n\nThis refreshes the Rust workspace lockfile and Java lance-core version using the repository update script. Triggering Lance tag: https://github.com/lancedb/lance/releases/tag/v9.0.0-beta.18 |
||
|
|
df89c133ca |
feat(python)!: align Permutation.with_format("torch") with HuggingFace set_format("torch") (#3369)
Closes #3245. > **BREAKING CHANGE:** `with_format("torch")` no longer returns a list of stacked row tensors. It now returns per-row dicts so PyTorch's default `DataLoader` collate stacks them into `{col: tensor(B,)}`. Switch to `with_format("torch_row")` to keep the old shape. ### What changed `"torch"` now returns a list of per-row dicts (`[{col: tensor}, ...]`) at every indexed access path. The default `DataLoader` collate stacks them into a column-keyed batched dict, no custom `collate_fn` needed. The old shape is preserved under a new `"torch_row"` literal. `"torch_col"` is unchanged. The unbatching lives inside the transform (`batch_to_tensor_dict`), not `__getitems__`, so the shape survives pickling and works under `DataLoader(num_workers>0, multiprocessing_context="spawn")`. ### Format comparison | Format | `iter(batch_size=N)` | `__getitems__([0,1,2])` | `DataLoader` default collate | |---|---|---|---| | `"torch"` (new) | `list[{col: tensor}]` length N | `list[{col: tensor}]` length 3 | `{col: tensor(B,)}` | | `"torch_row"` (old `"torch"` behavior) | `list[tensor(n_cols,)]` length N | `list[tensor(n_cols,)]` length 3 | `tensor(B, n_cols)` | | `"torch_col"` (unchanged) | `tensor(n_cols, N)` | `tensor(n_cols, 3)` | needs `collate_fn=lambda x: x` | Output matches HuggingFace `Dataset.set_format("torch")` on container shape, keys, and values at every access path. The only divergence: HuggingFace downcasts `float64` to `torch.float32` by default, LanceDB preserves dtype. Verified by `scripts/verify_torch_format.py`. ### Migration ```python # Old default — column names lost, shape was tensor(B, n_cols) DataLoader(Permutation.identity(table).with_format("torch")) # New default — column names preserved DataLoader(Permutation.identity(table).with_format("torch")) # {col: tensor(B,)} # Keep old behavior DataLoader(Permutation.identity(table).with_format("torch_row")) # tensor(B, n_cols) ``` |
||
|
|
ec763521d4 |
chore: update lance dependency to v9.0.0-beta.17 (#3627)
Updates Lance Rust workspace dependencies and Java lance-core to v9.0.0-beta.17. Includes the required PyO3 compatibility fix for the newer dependency set. Triggering Lance tag: https://github.com/lance-format/lance/releases/tag/v9.0.0-beta.17 --------- Co-authored-by: Jack Ye <yezhaoqin@gmail.com> |
||
|
|
f8dc2f78ee |
ci: add CODEOWNERS file for sensitive paths (#3312)
Fixes #3296 ## Problem The repository has no `CODEOWNERS` file, so there is no enforced review routing for sensitive areas such as release workflows, auth code, and FFI boundaries. This means changes to critical paths can be merged without an explicit codeowner review. ## Solution Add `.github/CODEOWNERS` covering: - `/.github/workflows/` — release/publish workflows (supply chain risk) - `/rust/lancedb/src/remote/` — remote client & auth code - `/python/src/` and `/nodejs/src/` — FFI language boundaries The listed owners (`@jackye1995`, `@wjones127`, `@Xuanwo`, `@AyushExel`) are based on recent merge activity. Feel free to adjust to match the actual team structure or replace with GitHub team handles if preferred. ## Testing No code change — only adds a metadata file. GitHub will start routing review requests automatically once this is merged and branch protection is configured to require codeowner approval. Co-authored-by: octo-patch <octo-patch@github.com> |
||
|
|
3bcff0165e |
feat: support date, datetime, bytes, and Decimal literals in expr builder (#3235)
### **Summary** Closes #3212 Extends the Python `lit()` helper to natively support three additional types (`date`, `datetime`, and `Decimal`) and implements reflexive operators for the `Expr` class. This implementation specifically addresses the blocking feedback regarding precision loss, CI discovery, and query engine limitations: * **Logic Refactoring**: Simplified `lit()` by combining `date` and `datetime` normalization into ISO-8601 strings, ensuring stable SQL parsing across different engine locales. * **Precision Preservation**: `decimal.Decimal` objects are now passed as high-precision strings to the Rust bridge, bypassing intermediate float conversions and preserving full 128-bit decimal precision for DataFusion. * **Averted CI Failures**: Temporarily deferred `bytes` literal support to a future PR to resolve a known DataFusion `expr_to_sql` limitation that was crashing the `Doctest` runner. * **Reflexive Operators**: Added support for "literal-first" arithmetic and logical operations (e.g., `10 + col('a')` or `True & col('active')`). Redundant reflexive comparisons (e.g., `__rlt__`) were pruned as Python's data model handles them automatically. * **Integration Verification**: Added dedicated integration tests in the official test directory to ensure the query engine correctly handles the new types and preserves bit-perfect fidelity. ### **Changes** #### [python/python/lancedb/expr.py](file:///c:/Users/Laksh/Documents/lancedb/python/python/lancedb/expr.py) * Updated `lit()` to handle `date`, `datetime`, and `Decimal` natively. * Implemented reflexive operators (`__radd__`, `__rand__`, `__rmul__`, etc.) to support literals on the left-hand side. * Removed the problematic `bytes` doctest example and `lit()` type support to unblock CI. #### [python/src/expr.rs](file:///c:/Users/Laksh/Documents/lancedb/python/src/expr.rs) * Modified the Rust FFI bridge to extract `Decimal` objects as strings. * Ensured the `expr_lit` handler is ready to receive normalized temporal strings. * Consolidated imports and added missing operator documentation. #### [python/python/lancedb/_lancedb.pyi](file:///c:/Users/Laksh/Documents/lancedb/python/python/lancedb/_lancedb.pyi) * Updated type stubs for `expr_lit` to include `Any` (allowing for `Decimal`). ### **Testing** Added several new advanced test cases in [python/python/tests/test_expr.py](file:///c:/Users/Laksh/Documents/lancedb/python/python/tests/test_expr.py) covering: * **High-precision Decimal preservation**: Verified against 128-bit boundaries with a "one point off" test case (`1.234567890123456789 < 1.234567890123456790`). * **Reflexive operator positioning**: Verified successful query construction with literals on the left. * **Timezone-aware normalization**: Confirmed stable behavior for `datetime` objects. * **Integration Testing**: Confirmed Date32 and Decimal columns return the correct Python types and values from the engine during `.to_arrow()` calls. --------- Co-authored-by: Will Jones <willjones127@gmail.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
c6db80dd0b |
feat: add an elastic dataloader as an iterable dataset (#3509)
# Elastic Streaming Dataloader ## Motivation Training large models on LanceDB tables today requires loading the entire dataset into memory or writing bespoke batching logic. This PR introduces `StreamingDataset`, a PyTorch `IterableDataset` that streams directly from a LanceDB table with two hard guarantees that are difficult to achieve together: **elastic determinism** and **resumability**. ## Goals ### Elastic determinism The dataset partitions the table into a fixed number of *splits* (controlled by `num_splits`, `shuffle_seed`, and `epoch`). Samples are yielded by round-robining over splits one sample per split per cycle. Because the split structure is fixed, the set of samples that makes up each global training step is identical regardless of `world_size` or `num_workers`. You can scale your cluster up or down between runs and the model sees the same data in the same order — no re-sharding, no gradient variance from topology changes. ### Resumability `state_dict()` / `load_state_dict()` capture how many samples each split has consumed. Because all splits are the same size and the round-robin design keeps them in lockstep, the state reduces to a single scalar (`samples_consumed_per_split`) that is topology-independent. A checkpoint saved with 8 GPUs can resume correctly on 4 GPUs or 16 GPUs without any adjustment. ### PyTorch `IterableDataset` / streaming `StreamingDataset` implements the standard PyTorch `IterableDataset` interface, so it drops into any existing `DataLoader` pipeline without modification. Data is fetched lazily from Lance in chunks — only the rows needed for the current batch are ever in memory. Compared to the map dataset this takes more work from pytorch and puts it into the dataset itself (e.g. shuffling, filtering, etc.). We do this because we cannot achieve things like elastic determinism or prefiltering otherwise. ### Multi-worker support DataLoader workers are automatically assigned contiguous sub-blocks of splits (the rank's splits are divided evenly across workers). Each worker is independent: no shared state, no inter-process coordination. The only constraint is that `num_splits` must be divisible by `world_size * num_workers`. That being said, multi-worker is highly discouraged as it relies on multiprocessing which is inefficient. Still, we want to support it. ### Filters as prefilters Filters are applied at *permutation-build time* via `PermutationBuilder.filter()`, not re-evaluated on every fetch. The filtered row IDs are stored in the permutation table so that subsequent reads see only the matching rows. This allows us to avoid loading rows that don't match the filter (which is the default pytorch behavior) ### Prefetching Two parameters control the I/O pipeline: - `read_batch_size` (default 64) — number of rows fetched per `take_offsets` call. Larger values amortise per-request overhead, which is critical on object storage where a single round-trip can cost ~100 ms. - `prefetch_batches` (default 4) — number of batches prefetched in parallel per split via a `ThreadPoolExecutor`. While the model processes the current batch, the next several batches are already in flight, hiding storage latency behind compute. If set correctly then you can get good performance even with num_workers=0 (unless you are bottlenecked on transform). ### Transform parallelism The underlying `Permutation` API supports a `with_transform()` callback for decoding, augmentation, and format conversion. Unfortunately, this is not parallelized. Pytorch typically parallelizes this with num_workers which is multiprocessing which is highly inefficient. For simple transforms we should be able to utilize multithreading and Rust based UDFs. For complex python UDFs we could have a dedicated multiprocessing pipeline for just the transform. Or we could just utilize multithreading. In both cases we would exclude the I/O stage from the multiprocessing because that ends up being very memory hungry and inefficient. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|
|
f84190fe12 |
chore(deps): bump the rust-minor-patch group with 2 updates (#3621)
Bumps the rust-minor-patch group with 2 updates: [napi](https://github.com/napi-rs/napi-rs) and [napi-derive](https://github.com/napi-rs/napi-rs). Updates `napi` from 3.9.4 to 3.10.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/napi-rs/napi-rs/releases">napi's releases</a>.</em></p> <blockquote> <h2>napi-v3.10.3</h2> <h3>Fixed</h3> <ul> <li><em>(napi)</em> preserve the JS error object when cloning an Error off-thread (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3375">#3375</a>)</li> </ul> <h2>napi-v3.10.2</h2> <h3>Fixed</h3> <ul> <li><em>(napi)</em> keep message and cause when cloning a JS-exception Error off-thread (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3373">#3373</a>)</li> </ul> <h2>napi-v3.10.1</h2> <h3>Fixed</h3> <ul> <li><em>(napi)</em> release Error's exception reference via the custom GC when dropped off-thread. (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3370">#3370</a>)</li> <li><em>(napi)</em> stop ref exception object in ThreadsafeFunction sync-throw path on wasm targets (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3369">#3369</a>)</li> </ul> <h3>Other</h3> <ul> <li><em>(napi)</em> share class accessor trampolines (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3364">#3364</a>)</li> <li>optimize object field raw property access (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3365">#3365</a>)</li> </ul> <h2>napi-v3.10.0</h2> <h3>Added</h3> <ul> <li><em>(napi)</em> implement <code>To</code>/<code>FromNapiValue</code> for <code>OsString</code>, <code>OsStr</code>, <code>Path</code> and <code>PathBuf</code> (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3339">#3339</a>)</li> </ul> <h3>Fixed</h3> <ul> <li><em>(napi)</em> route custom-GC Buffer/TypedArray cross-thread drops through the owning isolate (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3357">#3357</a>) (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3360">#3360</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/napi-rs/napi-rs/commit/1ac467e06e71f78b983630926c7908894d08e496"><code>1ac467e</code></a> chore(napi): release v3.10.3 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3376">#3376</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/9d672f9f9ac4784364548cac55c15444f4d2b1f8"><code>9d672f9</code></a> fix(napi): preserve the JS error object when cloning an Error off-thread (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3375">#3375</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/35476aebcc774a33b7e79e79d6c476db88a50215"><code>35476ae</code></a> chore(napi): release v3.10.2 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3374">#3374</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/7844c7343f92f3ef45f2756dbba224c342a8467e"><code>7844c73</code></a> ci: dogfood script-jail <a href="https://github.com/v0"><code>@v0</code></a>.2.10 (lifecycle audit gate + safe install) (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3343">#3343</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/d449ccd8c50ad2268b051458ef919848e72b40a5"><code>d449ccd</code></a> fix(napi): keep message and cause when cloning a JS-exception Error off-threa...</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/2ec02a67a0ffdbe8dcbe93f7f24d1d79b861216b"><code>2ec02a6</code></a> chore(deps): update dependency electron to v43 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3361">#3361</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/fd0a99f83015d4b67a591641d9ce66edf08d9740"><code>fd0a99f</code></a> chore(deps): update dependency <code>@types/sinon</code> to v22 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3366">#3366</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/745cd8561f9be2781cc04c8ba4564c8f436792c1"><code>745cd85</code></a> fix: de-flake Windows CI (ava import-from-project EPERM race + cli e2e timeou...</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/2785de583a97e49adea8194090fca2ee12f067c8"><code>2785de5</code></a> chore: release (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3367">#3367</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/441ae7a7b6ddb06a2682a7dd27cf186a8afca9e8"><code>441ae7a</code></a> fix(napi): release Error's exception reference via the custom GC when dropped...</li> <li>Additional commits viewable in <a href="https://github.com/napi-rs/napi-rs/compare/napi-v3.9.4...napi-v3.10.3">compare view</a></li> </ul> </details> <br /> Updates `napi-derive` from 3.5.7 to 3.5.9 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/napi-rs/napi-rs/releases">napi-derive's releases</a>.</em></p> <blockquote> <h2>napi-derive-v3.5.9</h2> <h3>Other</h3> <ul> <li>updated the following local packages: napi-derive-backend</li> </ul> <h2>napi-derive-v3.5.8</h2> <h3>Other</h3> <ul> <li>updated the following local packages: napi-derive-backend</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/napi-rs/napi-rs/commit/2785de583a97e49adea8194090fca2ee12f067c8"><code>2785de5</code></a> chore: release (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3367">#3367</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/441ae7a7b6ddb06a2682a7dd27cf186a8afca9e8"><code>441ae7a</code></a> fix(napi): release Error's exception reference via the custom GC when dropped...</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/cfa3b77ed50dd3639278b219f5d0f630c596cfac"><code>cfa3b77</code></a> fix(deps): update emnapi to v1.11.2 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3371">#3371</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/65918a6d195fa007985c83baf97a9ce82a95c2cf"><code>65918a6</code></a> fix(napi): stop ref exception object in ThreadsafeFunction sync-throw path on...</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/324c5502fb4deaabd6d76253e8a8e380c5a2bbb5"><code>324c550</code></a> perf(napi): share class accessor trampolines (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3364">#3364</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/80caf6063deb42468f2742bee02cc43ecb2e111d"><code>80caf60</code></a> perf: optimize object field raw property access (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3365">#3365</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/f72afd58976a83bb0776c6a71171673d94e82226"><code>f72afd5</code></a> chore: release (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3354">#3354</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/4effa4da6247a91048ca3462f2ff8eccdcfabfa4"><code>4effa4d</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3363">#3363</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/f2bf197f629e491362d1911578c57c33be2e561f"><code>f2bf197</code></a> chore(deps): lock file maintenance (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3362">#3362</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/962a2f0504517c0f83ff7357100c8b5fc26203af"><code>962a2f0</code></a> fix(napi): route custom-GC Buffer/TypedArray cross-thread drops through the o...</li> <li>Additional commits viewable in <a href="https://github.com/napi-rs/napi-rs/compare/napi-derive-v3.5.7...napi-derive-v3.5.9">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
122dcd0f66 |
chore: ignore RUSTSEC-2026-0194 and RUSTSEC-2026-0195 in cargo deny (#3616)
quick-xml < 0.41.0 has two DoS advisories (quadratic attribute-name check and unbounded namespace allocation in NsReader). All three versions in our lockfile (0.26.0, 0.38.4, 0.39.4) are below the patched threshold. These are pulled in transitively by inferno (dev-only flame-graph dep), lance-namespace-impls (git dep from lance), and opendal/reqsign (cloud storage XML parsing). None of these paths expose attacker- controlled XML; clearing them requires upstream to upgrade to quick-xml >= 0.41.0. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|
|
e6661a7285 |
fix: handle empty/wrong-length vectors returned by embedding functions (#3192)
## Summary - When an embedding function returns an empty list (e.g. `[]`) for an input row — as can happen when a model produces no output for a blank string — `_append_vector_columns` crashed with `ArrowInvalid: Length of item not correct: expected N but got array of size 0` because PyArrow cannot fit a zero-length value into a fixed-size list element. - The fix adds a validation step in `gen()`, inside `_append_vector_columns`, that replaces any vector whose length does not match the expected `ndims` (including empty lists and `None`) with `None` before `pa.array()` is called. - `None` is a valid null in a PyArrow fixed-size list array, so the bad entry flows into `_handle_bad_vectors` and is handled according to the caller-supplied `on_bad_vectors` policy (`error` / `drop` / `fill` / `null`) instead of causing an unconditional crash. ## Test plan - [ ] Added `test_embedding_with_empty_output_vectors` in `python/python/tests/test_embeddings.py` that uses an embedding function returning `[]` for empty-string inputs, calls `table.add(..., on_bad_vectors="drop")`, and asserts no crash and that bad rows are correctly dropped. - [ ] Existing `test_embedding_with_bad_results` continues to pass (NaN vectors still handled correctly). - [ ] Verified manually that `pa.array([[1.,2.,3.,4.], []], type=pa.list_(pa.float32(), 4))` raises `ArrowInvalid` without the fix, and succeeds with `None` in place of `[]`. Fixes #1672 --------- Co-authored-by: Will Jones <willjones127@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|
|
37466a0390 | Bump version: 0.31.0-beta.5 → 0.31.0-beta.6 | ||
|
|
bfce8a510d | Bump version: 0.34.0-beta.5 → 0.34.0-beta.6 python-v0.34.0-beta.6 | ||
|
|
a1261e6299 |
fix(python): average MRR reciprocal ranks over all rankings (#3599)
## What
`MRRReranker.rerank_multivector` averages each document's reciprocal
ranks over the wrong denominator. It divides by the number of rankings
the document *happens to appear in*, instead of the total number of
rankings being fused.
```python
# python/python/lancedb/rerankers/mrr.py
for result_id, reciprocal_ranks in mrr_score_map.items():
mean_rr = np.mean(reciprocal_ranks) # divides by len(present systems)
```
`mrr_score_map[doc]` only accumulates a reciprocal rank for the systems
in which the document was returned, so `np.mean` never accounts for the
systems that missed it.
## Why it's wrong
Mean Reciprocal Rank fusion treats a system that didn't return a
document as a reciprocal rank of `0` and averages across **all**
systems. That's the exact mechanism by which it rewards cross-system
consensus. Dividing by the appearance count removes that, so a document
liked by a single ranking can beat one ranked highly by every ranking.
Concretely, fusing 3 vector rankings:
| Doc | Ranks | Current score | Correct score |
|-----|-------|---------------|---------------|
| A | #1 in 1 system only | `mean([1.0]) = 1.000` | `1.0 / 3 = 0.333` |
| B | #1, #1, #2 across all 3 | `mean([1, 1, .5]) = 0.833` | `2.5 / 3 =
0.833` |
The current code ranks **A above B** - a document two of three rankings
ignored outranks one all three ranked at or near the top.
This also makes `rerank_multivector` inconsistent with `rerank_hybrid`
in the same file, which already treats a missing system as `0`
(`vector_rr = 0.0` / `fts_rr = 0.0`), and with the class docstring
("average of reciprocal ranks across different search results").
## Fix
Divide the summed reciprocal ranks by the total number of rankings:
```python
num_systems = len(vector_results)
...
mean_rr = float(np.sum(reciprocal_ranks)) / num_systems
```
## Tests
Adds `test_mrr_multivector_rewards_consensus`, which asserts the exact
MRR scores and that the consensus document ranks first. It fails on
`main` and passes with this change. Existing reranker tests are
unaffected.
|
||
|
|
17c499177f |
docs(python): add missing parameter documentation for when_matched_update_all (#3536)
Fixes #2493 Added target. prefix requirement to where parameter docstring. |
||
|
|
d889321b5e |
fix!: combine repeated where filters with AND instead of replacing (#3585)
BREAKING CHANGE: When passing multiple where clauses to a query, they now stack instead of replacing the previous filter. Previously, calling `where`/`only_if` more than once on a query silently replaced the previous filter, so only the last filter was applied. This was surprising and could return rows that an earlier filter should have excluded. This implements the alternative suggested in https://github.com/lancedb/lancedb/pull/3514#issuecomment-4664901580: instead of rejecting a second filter, repeated filters are combined with a logical AND (`(previous) AND (new)`). The combination happens in the Rust core (`QueryBase::only_if` and `only_if_expr`), so it applies to all SDKs at once (Rust, Python async, and TypeScript). The Python sync query builder keeps its own filter state, so it combines filters in the binding layer as well. SQL string and expression filters are combined within their own representation. When the two representations are mixed, the expression is lowered to SQL (via `expr_to_sql_string`) and the filters are combined as SQL strings, so chaining `where` works regardless of which form each filter takes. Fixes #2649 ## Tests - Rust: `cargo test --features remote -p lancedb --lib query` - Python: `uv run --extra tests pytest python/tests/test_query.py` - TypeScript: `pnpm test __test__/query.test.ts` 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
8a37f2ad77 |
feat(rust): re-export arrow and datafusion crates from lancedb (#3576)
lancedb's public API forces downstream crates to construct foreign types
— `RecordBatch`/arrays/builders for `Table::add(...)` (arrow), and
`datafusion_expr::Expr` for `only_if_expr`/`expr_projection`/merge
filters. The required version must exactly match lancedb's internal
arrow/datafusion line, but nothing on the API surface makes that
visible. Drift surfaces only as confusing trait/type errors:
```text
error[E0277]: the trait bound `RecordBatch: Scannable` is not satisfied
= note: there are multiple different versions of crate `arrow_array` in the dependency graph
```
This re-exports the crates lancedb already pins, so consumers can rely
on a single, guaranteed-matching line via a discoverable import path
instead of declaring their own (potentially mismatched) direct
dependency.
- `lancedb::arrow::{arrow, arrow_array, arrow_buffer, arrow_cast,
arrow_data, arrow_ipc, arrow_ord, arrow_schema, arrow_select}` —
previously only `arrow_schema` was re-exported. `arrow-buffer` is
promoted from a transitive to a direct dependency.
- `lancedb::datafusion` — `Expr` is a first-class part of the query and
merge APIs (`only_if_expr`, `expr_projection`,
`QueryFilter::Datafusion`, `when_matched_update_all_expr`), and
`ExecutionPlan` is returned from `create_plan`.
This follows DataFusion's own precedent of re-exporting `arrow`. The
coupling already exists via the trait/impl bounds — this surfaces it
rather than hiding it behind an `E0277`.
Closes #3575
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
f94673ae5e |
ci: update deprecated GitHub Actions to latest versions (Fixes #3577) (#3608)
Fixes #3577 ## Problem GitHub Actions is deprecating Node.js 20 on its runners. Multiple workflows in lancedb use action versions that target Node.js 20 (`actions/checkout@v4`, `actions/setup-node@v4`, `actions/cache@v4`, `actions/upload-artifact@v4`, `actions/download-artifact@v4`, `pnpm/action-setup@v4`). These are being force-run on Node.js 24, generating deprecation warnings. ## Solution Updated all deprecated actions to their latest major versions that support Node.js 24: | Action | Old Version | New Version | |--------|------------|-------------| | `actions/checkout` | @v4 | @v6 | | `actions/setup-node` | @v4 | @v6 | | `actions/cache` | @v4 | @v5 | | `actions/upload-artifact` | @v4 | @v7 | | `actions/download-artifact` | @v4 | @v8 | | `pnpm/action-setup` | @v4 | @v6 | Note: `actions/checkout@v6` and `actions/upload-artifact@v7` are already used in `pypi-publish.yml` — this PR extends the same versions to all remaining workflows. ### Files Changed - `.github/workflows/npm-publish.yml` — Updated checkout, setup-node, cache, upload-artifact, download-artifact, pnpm - `.github/workflows/nodejs.yml` — Updated checkout, setup-node, pnpm - `.github/workflows/python.yml` — Updated checkout - `.github/workflows/rust.yml` — Updated checkout - `.github/workflows/java.yml` — Updated checkout - `.github/workflows/java-publish.yml` — Updated checkout - `.github/workflows/cargo-publish.yml` — Updated checkout - `.github/workflows/docs.yml` — Updated checkout, setup-node - `.github/workflows/dev.yml` — Updated setup-node - `.github/workflows/codex-fix-ci.yml` — Updated checkout, setup-node, pnpm - `.github/workflows/codex-update-lance-dependency.yml` — Updated checkout, setup-node - `.github/workflows/license-header-check.yml` — Updated checkout - `.github/workflows/make-release-commit.yml` — Updated checkout - `.github/workflows/update_package_lock_run.yml` — Updated checkout - `.github/workflows/update_package_lock_run_nodejs.yml` — Updated checkout ## Verification - All 20 YAML files validated with `yaml.safe_load()` — no syntax errors - GitHub Actions CI will validate the actual action versions at runtime ## Changelog | Date | Change | Author | |------|--------|--------| | 2026-07-01 | Updated all deprecated Node 20 actions to latest versions across 15 workflow files | rtmalikian | --- **Disclosure:** This code was developed with assistance from DeepSeek-v4-pro (DeepSeek) via Hermes Agent (Nous Research). All changes were reviewed and verified for correctness. Signed-off-by: rtmalikian <rtmalikian@gmail.com> |
||
|
|
3b70fc4c9d |
fix(python): route async namespace connections through rust (#3603)
Summary: - Route built-in async namespace-backed connections through the Rust namespace connector. - Delegate async namespace/table management methods to the inner AsyncConnection while keeping the custom implementation Python-client fallback. - Add regressions for the native async dir path and lazy namespace_client() construction. Validated locally with targeted namespace/db/table pytest, full test_namespace.py, ruff, cargo fmt/check/clippy, and cargo test -p lancedb-python. |
||
|
|
3a7b02119b | Bump version: 0.31.0-beta.4 → 0.31.0-beta.5 | ||
|
|
bcbc0da090 | Bump version: 0.34.0-beta.4 → 0.34.0-beta.5 python-v0.34.0-beta.5 | ||
|
|
9bead9f53d |
fix(python): route sync namespace connections through rust (#3598)
Summary: - Route built-in sync namespace connections through the Rust namespace connector. - Keep custom namespace clients on the existing Python fallback. - Preserve namespace-backed to_lance compatibility with lazy Python client construction and add regressions. |
||
|
|
0351b77984 |
feat(remote): monotonic reads via x-lancedb-min-read-version watermark (#3597)
## Summary Adds per-session monotonic reads for remote (LanceDB Cloud/Enterprise) tables, preventing successive reads on a handle from moving *backward* in dataset version when a load balancer routes them to query nodes with differently-cached views. Each `RemoteTable` handle tracks the highest dataset version it has observed in a read response — surfaced by the server via a new `x-lancedb-version` response header — and sends it back as `x-lancedb-min-read-version` on subsequent reads (`count_rows`, `query`). A query node whose cache is behind that version refreshes before serving; a node already at/beyond it serves from cache at no extra cost. The watermark is sourced only from reads (always committed dataset versions), so unlike the retired `x-lancedb-min-version` it is unaffected by WAL writes returning WAL entry ids. It is reset on `checkout_latest()`. Both headers are optional and ignored by older peers. Server-side enforcement lives in LanceDB Enterprise. Targets the `codex/update-lance-9-0-0-beta-8` integration branch to match the Enterprise submodule pin. |
||
|
|
f6c9d31f98 |
feat: add polars dataframe integration (#3584)
This PR is part cleanup, part feature, part example. It removes `IntoArrow` and `IntoArrowStream`. There was only one redundant call site between the two. Once we moved everything to `Scannable` these traits no longer serve any purpose. It adds a `Scannable` impl for a polars DataFrame. We used to have this at one point for `IntoArrow` so this is more like a regression fix than anything. It adds an example (and unit test) which ensures we can ingest from a Polars DataFrame and export to one. LazyFrame support would be a follow-up (though a pretty straightforward one) but we've never had proper LazyFrame support before. |
||
|
|
a8f1c5a69f |
feat: add skill to work with branches better (#3596)
Agents seemed to have trouble finding the right calls to work with branches (create, list, delete) and passing the right params to get it to work. We probably don't need a big skill to get it on the right track but a little nudge seems helpful. Doing a couple simple tasks, it saved about half the time and tokens, so feels worthwhile. Created with the Claude skills creator, hence the "skill.md in a bare folder" organization - happy to move it if that's not the standard anymore. ``` Benchmark results (3 evals, with-skill vs baseline): ┌────────────────┬────────────┬────────────────────┐ │ Metric │ With skill │ Without skill │ ├────────────────┼────────────┼────────────────────┤ │ Pass rate │ 3/3 (100%) │ 3/3 (100%) │ ├────────────────┼────────────┼────────────────────┤ │ Avg time │ 51s │ 142s (2.8× slower) │ ├────────────────┼────────────┼────────────────────┤ │ Avg tokens │ 19,305 │ 36,513 (47% more) │ ├────────────────┼────────────┼────────────────────┤ │ Avg tool calls │ 5.7 │ 26 (4.5× more) │ └────────────────┴────────────┴────────────────────┘ ``` |
||
|
|
10fecdf051 |
feat(node): expose OAuth connection config (#3587)
Expose the merged Rust OAuth header provider through the Node/TypeScript connection path. Includes: - Native OAuthConfig conversion for napi-rs - ConnectionOptions.oauthConfig plumbing - Public TypeScript OAuthConfig and OAuthFlowType exports - Generated TypeScript API docs for the new config surface - input-validation and debug-redaction coverage in the Rust binding layer Local validation: cargo fmt --all; git diff --check. |
||
|
|
c9ae93a7fa |
fix: add missing stacklevel=2 to warnings.warn() calls (Fixes #3589) (#3590)
Fixes #3589 ## Problem Multiple `warnings.warn()` calls across the Python client are missing the `stacklevel=2` parameter. This causes warning messages to point to lancedb internal code instead of the user's code that triggered the warning, making debugging difficult. ## Solution Add `stacklevel=2` to 7 `warnings.warn()` calls across 4 files: | File | Warnings Fixed | |------|---------------| | `remote/db.py` | `request_thread_pool`, `connection_timeout`, `read_timeout` deprecation warnings | | `remote/table.py` | `cleanup_old_versions`, `compact_files`, `optimize` no-op warnings | | `table.py` | `data_storage_version`, `enable_v2_manifest_paths`, `retrain` deprecation warnings | | `embeddings/colpali.py` | `use_token_pooling` deprecation warning | ## Verification - All 4 modified files pass `ast.parse()` syntax check - Only `stacklevel=2` added — no other changes ## Changelog | Date | Change | Author | |------|--------|--------| | 2026-06-27 | Add missing stacklevel=2 to warnings.warn() calls | rtmalikian | ### Files Changed - `python/python/lancedb/remote/db.py` — Add stacklevel=2 to 3 deprecation warnings - `python/python/lancedb/remote/table.py` — Add stacklevel=2 to 3 no-op warnings - `python/python/lancedb/table.py` — Add stacklevel=2 to 3 deprecation warnings - `python/python/lancedb/embeddings/colpali.py` — Add stacklevel=2 to 1 deprecation warning ### Verification - Syntax check passed on all modified files --- **About the Author:** Raphael Malikian — Clinical AI Solutions Architect. I specialise in building and fixing AI/ML systems for healthcare, including vector databases, RAG pipelines, and clinical NLP. If you need help with your project or think I can add value to your organisation, feel free to reach out — I'd love to connect. 📧 rtmalikian@gmail.com 🔗 GitHub: https://github.com/rtmalikian 🔗 LinkedIn: http://www.linkedin.com/in/raphael-t-malikian-mbbs-bsc-hons-71075436a --- **Disclosure:** This code was developed with assistance from DeepSeek-V4-Pro (DeepSeek) via Hermes Agent (Nous Research). All changes were reviewed, tested against the actual codebase, and verified for correctness. Signed-off-by: rtmalikian <rtmalikian@gmail.com> |
||
|
|
05756f0bbf |
fix(python): raise clear error when permutation API is used on remote tables (Fixes #2934) (#3591)
Fixes #2934 ## Problem Passing a `RemoteTable` to `permutation_builder()` raises a cryptic `AttributeError`: ``` AttributeError: 'RemoteTable' object has no attribute '_inner' ``` This leaves users confused about what went wrong and why. ## Root Cause `PermutationBuilder.__init__()` calls `async_permutation_builder(table)` which accesses `table._inner` — the underlying Rust Lance table object. `RemoteTable` connects to LanceDB Cloud/Enterprise and does not have a local `_inner` attribute, making permutations fundamentally unsupported on remote tables. ## Solution Added an early check in `PermutationBuilder.__init__()` that verifies the table has `_inner` before calling the Rust function, raising a clear `TypeError` with an explanation of why permutations don't work on remote tables. ## Verification - Syntax validated with `ast.parse()` - Structural verification: single call site (`permutation_builder()`), guard placed before Rust FFI call - Error message tested with mock: `MockRemoteTable()` correctly triggers `TypeError` ## Changelog | Date | Change | Author | |------|--------|--------| | 2026-06-28 | Added remote table guard in PermutationBuilder.__init__ | rtmalikian | ### Files Changed - python/python/lancedb/permutation.py — Added `hasattr(table, "_inner")` check with clear error --- **About the Author:** Raphael Malikian — Clinical AI Solutions Architect. I specialise in building and fixing AI/ML systems for healthcare, including vector databases, RAG pipelines, and clinical NLP. If you need help with your project or think I can add value to your organisation, feel free to reach out — I'd love to connect. 📧 rtmalikian@gmail.com 🔗 GitHub: https://github.com/rtmalikian 🔗 LinkedIn: http://www.linkedin.com/in/raphael-t-malikian-mbbs-bsc-hons-71075436a --- **Disclosure:** This code was developed with assistance from deepseek-v4-pro (DeepSeek) via Hermes Agent (Nous Research). All changes were reviewed, tested against the actual codebase, and verified for correctness. Signed-off-by: rtmalikian <rtmalikian@gmail.com> |
||
|
|
2a0945443e |
chore: update lance dependency to v9.0.0-beta.10 (#3594)
Updates Lance Rust workspace dependencies and Java lance-core to v9.0.0-beta.10. No compatibility code changes were required; clippy and rustfmt passed after installing the missing runner components. Lance tag: https://github.com/lance-format/lance/releases/tag/v9.0.0-beta.10 |
||
|
|
39e819b6a7 |
feat(python): expose OAuth connection config (#3586)
Expose the merged Rust OAuth header provider through the Python async connection path. Includes: - Python OAuthConfig and OAuthFlowType public config objects - PyO3 conversion into the Rust OAuthConfig - connect_async(oauth_config=...) plumbing - repr redaction coverage for client_secret Local validation: cargo fmt --all; ruff format/check on touched Python files. |
||
|
|
70126943ff |
chore(deps): bump the rust-minor-patch group across 1 directory with 6 updates (#3588)
Bumps the rust-minor-patch group with 6 updates in the / directory: | Package | From | To | | --- | --- | --- | | [env_logger](https://github.com/rust-cli/env_logger) | `0.11.10` | `0.11.11` | | [log](https://github.com/rust-lang/log) | `0.4.32` | `0.4.33` | | [uuid](https://github.com/uuid-rs/uuid) | `1.23.3` | `1.23.4` | | [anyhow](https://github.com/dtolnay/anyhow) | `1.0.102` | `1.0.103` | | [napi](https://github.com/napi-rs/napi-rs) | `3.9.3` | `3.9.4` | | [napi-derive](https://github.com/napi-rs/napi-rs) | `3.5.6` | `3.5.7` | Updates `env_logger` from 0.11.10 to 0.11.11 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/rust-cli/env_logger/releases">env_logger's releases</a>.</em></p> <blockquote> <h2>v0.11.11</h2> <h2>[0.11.11] - 2026-06-25</h2> <h3>Internal</h3> <ul> <li>Updated <code>env_filter</code></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/rust-cli/env_logger/blob/main/CHANGELOG.md">env_logger's changelog</a>.</em></p> <blockquote> <h2>[0.11.11] - 2026-06-25</h2> <h3>Internal</h3> <ul> <li>Updated <code>env_filter</code></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/rust-cli/env_logger/commit/b4d3f2b8dd3f1c3362f07da8f6f4a30c701358cf"><code>b4d3f2b</code></a> chore: Release</li> <li><a href="https://github.com/rust-cli/env_logger/commit/cc2b2efcd7454be82ca49f8ac165b3fbc3095ae3"><code>cc2b2ef</code></a> chore: Release</li> <li><a href="https://github.com/rust-cli/env_logger/commit/69e27d1e822d8f7e6b788bedffcb00575127553f"><code>69e27d1</code></a> docs: Update changelog</li> <li><a href="https://github.com/rust-cli/env_logger/commit/166880db07de228ab22dd32f06b408464e73ac79"><code>166880d</code></a> Merge pull request <a href="https://redirect.github.com/rust-cli/env_logger/issues/411">#411</a> from epage/parse</li> <li><a href="https://github.com/rust-cli/env_logger/commit/0a580d06e7ac42816e1a84e06fe6417d6973f8e6"><code>0a580d0</code></a> fix(filter): Remove 'parse' on no_std</li> <li><a href="https://github.com/rust-cli/env_logger/commit/78d8ef116efbf981e272ad41c0b380298e4b2060"><code>78d8ef1</code></a> Merge pull request <a href="https://redirect.github.com/rust-cli/env_logger/issues/404">#404</a> from cagatay-y/feature/filter-no_std</li> <li><a href="https://github.com/rust-cli/env_logger/commit/132fe86c8cb8e5df4fca7d71067a8d862a366b95"><code>132fe86</code></a> feat(filter): Add support for no_std environments</li> <li><a href="https://github.com/rust-cli/env_logger/commit/4feafa4c3c5baeec6d8646bb73a35246882a731d"><code>4feafa4</code></a> refactor(env_filter): Fix unreachable pub warning</li> <li><a href="https://github.com/rust-cli/env_logger/commit/92f8d8d08343c30e60b5f54455d7e16c810fcf11"><code>92f8d8d</code></a> Merge pull request <a href="https://redirect.github.com/rust-cli/env_logger/issues/410">#410</a> from rust-cli/renovate/crate-ci-typos-1.x</li> <li><a href="https://github.com/rust-cli/env_logger/commit/4e57784e0a878d9e6510d71ee4f63ec96b8fdcc8"><code>4e57784</code></a> chore(deps): Update pre-commit hook crate-ci/typos to v1.47.0</li> <li>Additional commits viewable in <a href="https://github.com/rust-cli/env_logger/compare/v0.11.10...v0.11.11">compare view</a></li> </ul> </details> <br /> Updates `log` from 0.4.32 to 0.4.33 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/rust-lang/log/blob/master/CHANGELOG.md">log's changelog</a>.</em></p> <blockquote> <h2>[0.4.33] - 2026-06-20</h2> <h2>What's Changed</h2> <ul> <li>Fixed key comparison by <a href="https://github.com/matteo-zeggiotti-ok"><code>@matteo-zeggiotti-ok</code></a> in <a href="https://redirect.github.com/rust-lang/log/pull/732">rust-lang/log#732</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/matteo-zeggiotti-ok"><code>@matteo-zeggiotti-ok</code></a> made their first contribution in <a href="https://redirect.github.com/rust-lang/log/pull/732">rust-lang/log#732</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/rust-lang/log/compare/0.4.32...0.4.33">https://github.com/rust-lang/log/compare/0.4.32...0.4.33</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/rust-lang/log/commit/f405739f3a15a3f00680c793e1e1fa7e57d26ba4"><code>f405739</code></a> Merge pull request <a href="https://redirect.github.com/rust-lang/log/issues/734">#734</a> from rust-lang/cargo/0.4.33</li> <li><a href="https://github.com/rust-lang/log/commit/6a24abf0835cef62e3d882287c97307dd3ecb403"><code>6a24abf</code></a> prepare for 0.4.33 release</li> <li><a href="https://github.com/rust-lang/log/commit/87e062162e051d54bb553aacae3f0c6c4c213e59"><code>87e0621</code></a> Merge pull request <a href="https://redirect.github.com/rust-lang/log/issues/732">#732</a> from matteo-zeggiotti-ok/fix-key-comparison</li> <li><a href="https://github.com/rust-lang/log/commit/a9b57119a631249fc8e881c7ef78e2028aacb823"><code>a9b5711</code></a> Review: fallback to the &str hash</li> <li><a href="https://github.com/rust-lang/log/commit/cc89cc6e41190de36892e33fff48e5f48cf57fa9"><code>cc89cc6</code></a> Review: fixed other comparisons</li> <li><a href="https://github.com/rust-lang/log/commit/920e7dc2811c18a228bf78e818196de950659d85"><code>920e7dc</code></a> Review: fixed comparison on <code>MaybeStaticStr</code></li> <li><a href="https://github.com/rust-lang/log/commit/0d71d3c685f2e23b1ad209b48408efe1205b18b0"><code>0d71d3c</code></a> Fixed key comparison</li> <li>See full diff in <a href="https://github.com/rust-lang/log/compare/0.4.32...0.4.33">compare view</a></li> </ul> </details> <br /> Updates `uuid` from 1.23.3 to 1.23.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/uuid-rs/uuid/releases">uuid's releases</a>.</em></p> <blockquote> <h2>v1.23.4</h2> <h2>What's Changed</h2> <ul> <li>Fix up name of fuzz script in readme by <a href="https://github.com/KodrAus"><code>@KodrAus</code></a> in <a href="https://redirect.github.com/uuid-rs/uuid/pull/888">uuid-rs/uuid#888</a></li> <li>document fixes by <a href="https://github.com/frostyplanet"><code>@frostyplanet</code></a> in <a href="https://redirect.github.com/uuid-rs/uuid/pull/889">uuid-rs/uuid#889</a></li> <li>Prepare for 1.23.4 release by <a href="https://github.com/KodrAus"><code>@KodrAus</code></a> in <a href="https://redirect.github.com/uuid-rs/uuid/pull/890">uuid-rs/uuid#890</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/frostyplanet"><code>@frostyplanet</code></a> made their first contribution in <a href="https://redirect.github.com/uuid-rs/uuid/pull/889">uuid-rs/uuid#889</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/uuid-rs/uuid/compare/v1.23.3...v1.23.4">https://github.com/uuid-rs/uuid/compare/v1.23.3...v1.23.4</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/uuid-rs/uuid/commit/3296d64a196e0303c486538cdf143080c681ae2e"><code>3296d64</code></a> Merge pull request <a href="https://redirect.github.com/uuid-rs/uuid/issues/890">#890</a> from uuid-rs/cargo/v1.23.4</li> <li><a href="https://github.com/uuid-rs/uuid/commit/cba53d0da2089109ea23fd964c8ffd21b0165a49"><code>cba53d0</code></a> prepare for 1.23.4 release</li> <li><a href="https://github.com/uuid-rs/uuid/commit/e347af48aab7f7dd6b58a6bb5b578d467660e327"><code>e347af4</code></a> Merge pull request <a href="https://redirect.github.com/uuid-rs/uuid/issues/889">#889</a> from frostyplanet/main</li> <li><a href="https://github.com/uuid-rs/uuid/commit/e9bf55c22216c27ff2283a6c427a7b13e025c75e"><code>e9bf55c</code></a> doc: Fix broken link warnings</li> <li><a href="https://github.com/uuid-rs/uuid/commit/5351af40a0bc3243a580c40d313f243d2435bad6"><code>5351af4</code></a> doc: Enable feature flag label for docs.rs</li> <li><a href="https://github.com/uuid-rs/uuid/commit/1e6a9669e30d53bae50fd52f16b7a1961fda236b"><code>1e6a966</code></a> Merge pull request <a href="https://redirect.github.com/uuid-rs/uuid/issues/888">#888</a> from uuid-rs/KodrAus-patch-1</li> <li><a href="https://github.com/uuid-rs/uuid/commit/c9619f639c0e2d5f932fa4e3588aed859f7dc5d0"><code>c9619f6</code></a> fix up name of fuzz script in readme</li> <li>See full diff in <a href="https://github.com/uuid-rs/uuid/compare/v1.23.3...v1.23.4">compare view</a></li> </ul> </details> <br /> Updates `anyhow` from 1.0.102 to 1.0.103 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/dtolnay/anyhow/releases">anyhow's releases</a>.</em></p> <blockquote> <h2>1.0.103</h2> <ul> <li>Fix Stacked Borrows violation (UB) in <code>Error::downcast_mut</code> (<a href="https://redirect.github.com/dtolnay/anyhow/issues/451">#451</a>, <a href="https://redirect.github.com/dtolnay/anyhow/issues/452">#452</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/dtolnay/anyhow/commit/5bdb0e24db3994be119d42f18fe2d655e1f68f4a"><code>5bdb0e2</code></a> Release 1.0.103</li> <li><a href="https://github.com/dtolnay/anyhow/commit/e621bd35ddddcd8b2f39d80b9f5938583571a87d"><code>e621bd3</code></a> Merge pull request <a href="https://redirect.github.com/dtolnay/anyhow/issues/452">#452</a> from dtolnay/downcast</li> <li><a href="https://github.com/dtolnay/anyhow/commit/6e8c000690151cba99305092024535905b2be162"><code>6e8c000</code></a> Eliminate pointer->reference->pointer during downcast</li> <li><a href="https://github.com/dtolnay/anyhow/commit/67c4abd7718b6191768193993270abe8dcdd66bb"><code>67c4abd</code></a> Add regression test for issue 451</li> <li><a href="https://github.com/dtolnay/anyhow/commit/917a16932009c1957f53c2ea325663948add2153"><code>917a169</code></a> Update actions/upload-artifact@v6 -> v7</li> <li><a href="https://github.com/dtolnay/anyhow/commit/d9dc3faf78b8647fdb5b8c5b53abb85e05e13d42"><code>d9dc3fa</code></a> Update actions/checkout@v6 -> v7</li> <li><a href="https://github.com/dtolnay/anyhow/commit/841522b2aa09732fecee40804440d2c35c68c480"><code>841522b</code></a> Raise minimum tested compiler to rust 1.85</li> <li>See full diff in <a href="https://github.com/dtolnay/anyhow/compare/1.0.102...1.0.103">compare view</a></li> </ul> </details> <br /> Updates `napi` from 3.9.3 to 3.9.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/napi-rs/napi-rs/releases">napi's releases</a>.</em></p> <blockquote> <h2>napi-v3.9.4</h2> <h3>Other</h3> <ul> <li><em>(napi-derive)</em> outline #[napi(object)] field-error decoration (<a href="https://redirect.github.com/napi-rs/napi-rs/pull/3338">#3338</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/napi-rs/napi-rs/commit/9cc199fa348a6ef395eb2cce14e84057dfebcfd8"><code>9cc199f</code></a> chore: release (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3345">#3345</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/b77119e711704cc453949e056b45a4996ea0386c"><code>b77119e</code></a> chore(release): publish</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/71ce9f6015b5e1bc73fb9b466fd7f7755feb9a42"><code>71ce9f6</code></a> chore(deps): update actions/cache action to v6 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3349">#3349</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/8c87f474c8901b7c5510a92cdfa2d651de2769ef"><code>8c87f47</code></a> chore(deps): update <code>@tybys/wasm-util</code> to 0.10.3 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3348">#3348</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/04e2a7655d070b577a9fccdc5697c0aecc5f8df9"><code>04e2a76</code></a> chore(deps): update cross-platform-actions/action action to v1.3.0 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3346">#3346</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/54ecbe4915bfe191110db5979b412e169049031e"><code>54ecbe4</code></a> chore(deps): update actions/checkout action to v7 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3340">#3340</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/3dd0c309da6fff15efb2db0c0e056ca9eb6a3299"><code>3dd0c30</code></a> perf(napi-derive): outline #[napi(object)] field-error decoration (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3338">#3338</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/81ac3d98c305cb9fdeec7fdf8d8a1d6ee9faba1f"><code>81ac3d9</code></a> build(deps): bump undici from 6.26.0 to 6.27.0 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3342">#3342</a>)</li> <li>See full diff in <a href="https://github.com/napi-rs/napi-rs/compare/napi-v3.9.3...napi-v3.9.4">compare view</a></li> </ul> </details> <br /> Updates `napi-derive` from 3.5.6 to 3.5.7 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/napi-rs/napi-rs/releases">napi-derive's releases</a>.</em></p> <blockquote> <h2>napi-derive-v3.5.7</h2> <h3>Other</h3> <ul> <li>updated the following local packages: napi-derive-backend</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/napi-rs/napi-rs/commit/9cc199fa348a6ef395eb2cce14e84057dfebcfd8"><code>9cc199f</code></a> chore: release (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3345">#3345</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/b77119e711704cc453949e056b45a4996ea0386c"><code>b77119e</code></a> chore(release): publish</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/71ce9f6015b5e1bc73fb9b466fd7f7755feb9a42"><code>71ce9f6</code></a> chore(deps): update actions/cache action to v6 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3349">#3349</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/8c87f474c8901b7c5510a92cdfa2d651de2769ef"><code>8c87f47</code></a> chore(deps): update <code>@tybys/wasm-util</code> to 0.10.3 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3348">#3348</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/04e2a7655d070b577a9fccdc5697c0aecc5f8df9"><code>04e2a76</code></a> chore(deps): update cross-platform-actions/action action to v1.3.0 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3346">#3346</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/54ecbe4915bfe191110db5979b412e169049031e"><code>54ecbe4</code></a> chore(deps): update actions/checkout action to v7 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3340">#3340</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/3dd0c309da6fff15efb2db0c0e056ca9eb6a3299"><code>3dd0c30</code></a> perf(napi-derive): outline #[napi(object)] field-error decoration (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3338">#3338</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/81ac3d98c305cb9fdeec7fdf8d8a1d6ee9faba1f"><code>81ac3d9</code></a> build(deps): bump undici from 6.26.0 to 6.27.0 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3342">#3342</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/ee58383da4d91950e95355dcd8b93885f78f20e5"><code>ee58383</code></a> chore(napi): release v3.9.3 (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3335">#3335</a>)</li> <li><a href="https://github.com/napi-rs/napi-rs/commit/c78727667b75807ece2e601ca3e1b2a3f87c7196"><code>c787276</code></a> fix(napi): sync referred flag when creating a weak ThreadsafeFunction (<a href="https://redirect.github.com/napi-rs/napi-rs/issues/3337">#3337</a>)</li> <li>Additional commits viewable in <a href="https://github.com/napi-rs/napi-rs/compare/napi-derive-v3.5.6...napi-derive-v3.5.7">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
e01777070d | Bump version: 0.31.0-beta.3 → 0.31.0-beta.4 | ||
|
|
3878adc6dc | Bump version: 0.34.0-beta.3 → 0.34.0-beta.4 python-v0.34.0-beta.4 | ||
|
|
3df3043563 |
feat(rust): add OAuth header provider (#3579)
## Summary Add the Rust OAuth header provider for remote LanceDB connections. This supports client credentials and Azure managed identity flows, handles token caching and refresh, redacts secrets in Debug output, and wires `ConnectBuilder::oauth_config()` into the remote client while rejecting ambiguous API-key/header-provider combinations. |
||
|
|
8a5cd74e48 |
fix: ensure read freshness provider is built into namespace client (#3571)
By default the read freshness provider was not included in the namespace client, preventing the read freshness headers from being included in the request. This prevents checkout_latest() from working as expected when using the namespace client. This fix ensures the provided is built into the client when the namespace impl and properties are provided. |
||
|
|
448d5ec20f | Bump version: 0.31.0-beta.2 → 0.31.0-beta.3 | ||
|
|
8718345229 | Bump version: 0.34.0-beta.2 → 0.34.0-beta.3 python-v0.34.0-beta.3 | ||
|
|
026fedc286 |
chore: update lance dependency to v9.0.0-beta.8 (#3580)
Updates Lance dependencies from v9.0.0-beta.4 to v9.0.0-beta.8.\n\nThis refreshes the Rust workspace lockfile and the Java lance-core version. Triggering Lance tag: https://github.com/lance-format/lance/releases/tag/v9.0.0-beta.8 |
||
|
|
fe287dc98c |
fix(remote): support namespace clients with dynamic headers
Bridge LanceDB dynamic header providers into Lance Namespace dynamic context providers for live remote namespace clients. |
||
|
|
411568b72c |
fix(remote): omit empty api key header (#3573)
## Summary Skip inserting the x-api-key header when the configured API key is empty. This lets bearer-token or other dynamic-header authentication avoid sending an empty static API key header alongside the real auth header. |
||
|
|
ebf8d55ede |
chore: update lance dependency to v9.0.0-beta.4 (#3570)
Bumps the Lance dependencies to v9.0.0-beta.4 and refreshes the generated lockfile metadata. No compatibility fixes were required beyond the dependency updates. Triggered by https://github.com/lance-format/lance/releases/tag/v9.0.0-beta.4 |
||
|
|
0ba70d96c3 |
fix: add missing stacklevel=2 to warnings.warn() and fix broken message concatenation (Fixes #3563) (#3564)
Fixes #3563 ## Summary - Add `stacklevel=2` to 10 `warnings.warn()` calls across 4 files - Fix broken message concatenation in `table.py` where the second string was incorrectly passed as the `category` parameter ## Problem Multiple `warnings.warn()` calls in the `python/lancedb/` codebase were missing the `stacklevel` parameter. Without `stacklevel=2`, warnings point to library internals instead of the caller's code, making it impossible for users to identify which of their function calls triggered the warning. Additionally, two calls in `table.py` (lines 3411 and 3420) had a more serious bug: the deprecation message was split across two separate string arguments, causing the second string to be passed as the `category` parameter instead of being concatenated with the first string. This would cause `TypeError` when the warning was triggered. ## Changes | File | Fixes | Description | |------|-------|-------------| | `embeddings/colpali.py` | 1 | Add `stacklevel=2` to `use_token_pooling` deprecation warning | | `remote/db.py` | 3 | Add `stacklevel=2` to `request_thread_pool`, `connection_timeout`, `read_timeout` deprecation warnings | | `remote/table.py` | 3 | Add `stacklevel=2` to `cleanup_old_versions`, `compact_files`, `optimize` no-op warnings | | `table.py` | 3 | Fix broken message concatenation for `data_storage_version` and `enable_v2_manifest_paths` deprecation warnings + add `stacklevel=2` to `retrain` deprecation warning | ## Verification ```python # All warnings.warn() calls now have stacklevel python3 -c "import ast, os; ..." # Result: All warnings.warn() calls now have stacklevel! ``` ## Changelog | Date | Change | Author | |------|--------|--------| | 2026-06-20 | Fix missing stacklevel=2 in 10 warnings.warn() calls + fix broken message concatenation | rtmalikian | ### Files Changed - `python/python/lancedb/embeddings/colpali.py` — Add stacklevel=2 - `python/python/lancedb/remote/db.py` — Add stacklevel=2 to 3 deprecation warnings - `python/python/lancedb/remote/table.py` — Add stacklevel=2 to 3 no-op warnings - `python/python/lancedb/table.py` — Fix broken message concatenation + add stacklevel=2 ### Verification - AST-based audit confirms all `warnings.warn()` calls now include `stacklevel=2` - Syntax check passes for all 4 modified files --- **About the Author:** Raphael Malikian — Clinical AI Solutions Architect. I specialise in building and fixing AI/ML systems for healthcare, including vector databases, RAG pipelines, and clinical NLP. If you need help with your project or think I can add value to your organisation, feel free to reach out — I'd love to connect. 📧 rtmalikian@gmail.com 🔗 GitHub: https://github.com/rtmalikian 🔗 LinkedIn: http://www.linkedin.com/in/raphael-t-malikian-mbbs-bsc-hons-71075436a --- **Disclosure:** This code was developed with assistance from **Hermes Agent** (Nous Research). All changes were reviewed, tested against the actual codebase, and verified for correctness. Signed-off-by: rtmalikian <rtmalikian@gmail.com> |