v1.30.0 - Runtime config management, Dynamic user management, Dynamic RAG model selection, Multi-value vector support, BlockMax WAND-based BM25
Breaking Changes
BlockMax WAND Migration
This release contains the migration process to enable migration of existing property indexes to the new BlockMax WAND-based file format. This step is required to take advantage of the performance improvements. Note that the migration process produces segment files which are not backwards compatible with previous versions.
New Features
Runtime configuration management (GA)
Dynamically update select configuration variables at runtime—no restarts, no downtime. This streamlines operational workflows, enabling rapid experimentation and fine-tuning without disrupting active processes. Built with extensibility in mind, this lays the groundwork for broader runtime configurability in future releases, making the system more adaptable and resilient.
- feat(runtime-config): Add support for runtime config manager by @kavirajk in #7344
- feat: Integrate runtime config for
maximum_allowed_collection_limitby @kavirajk in #7501 - feat: Support
AUTOSCHEMA_ENABLEDas runtime overrides by @kavirajk in #7572 - feat: Support
ASYNC_REPLICATION_DISABLEDas runtime overrides by @kavirajk in #7573 - chore: Some cleanup related to runtime overrides. by @kavirajk in #7605
Dynamic user management (GA)
User and API key management just got a major upgrade with dynamic configuration. With a simple REST API, you can now create, update, and revoke users and API keys on the fly. This makes it easier to integrate with automated workflows, improve security by rotating credentials seamlessly, and adapt access controls in real time.
- Dynamic User: Add safe api key generation and decoding by @dirkkul in #7320
- Rename UserInfo definition to UserOwnInfo by @dirkkul in #7354
- Dynamic User management: Add user permissions and tests by @dirkkul in #7366
- Delete user revoke roles by @dirkkul in #7374
- Dynamic user management: Fix prefixing of rbac user names by @dirkkul in #7391
- Dynamic user management: Block from editing root users by @dirkkul in #7398
- RBAC: Allow root group to assign/revoke roles from group by @dirkkul in #7409
- Also return static users for requests from root by @dirkkul in #7417
- RBAC: Fix race with concurrent create role requests by @dirkkul in #7412
- Dynamic Users: Add suspend and activate by @dirkkul in #7428
- Distinguish user types by @dirkkul in #7444
- Dynamic users: list all users by @dirkkul in #7499
- Dynamic user management: Add /db to all new paths by @dirkkul in #7517
- Dynamic user management by @dirkkul in #7495
- Add env var to enable dynamic user management by @dirkkul in #7505
- Rename DYNAMIC_USERS_ENABLED env var. by @jfrancoa in #7563
- Dynamic users: Relax name validation by @dirkkul in #7580
- Dynamic user: Make username in error message more visible by @dirkkul in #7586
- Dynamic users: Disallow deactivating own user by @dirkkul in #7587
- Better user existence validation when assignning/revoking roles by @dirkkul in #7581
- Dynamic users: Return code for conflicts when (de)activating users by @dirkkul in #7585
- Make returning full roles optional by @dirkkul in #7604
- Handle unknown commands in RAFT more gracefully by @dirkkul in #7629
- RBAC: Filter nodes endpoint with permissions by @dirkkul in #7645
- Change returned info from get users for role by @dirkkul in #7637
- Rbac tenant filtering/grpc search by @tsmith023 in #7529
- Rename dynamic users to DB users by @dirkkul in #7653
- Rbac tenant filtering/batch objs by @tsmith023 in #7532
- Add additional journey tests for DB users by @dirkkul in #7660
- RBAC: Improve root role assignments by @dirkkul in #7666
- Add tenant filtering tests for all tenant ops by @tsmith023 in #7675
- RBAC: Add verification of permissions for role creation by @dirkkul in #7673
- DB Users: Disallow creating dynmic users with IDs present in adminlist config by @dirkkul in #7685
- Fix usernames in OIDC tests by @dirkkul in #7686
- Add save to file to db users by @dirkkul in #7703
- Readd lines removed by mistake by @dirkkul in #7712
- Add upgrade for groupings in casbin by @dirkkul in #7717
- Handle upgrades from stable/v1.29 that need role info by @dirkkul in #7718
- RBAC: Only assign to namespace if exists by @dirkkul in #7721
- Db users: Fix returned code to unauthorized by @dirkkul in #7724
- Add creation time to dynamic users by @dirkkul in #7725
- Dynamic user: Reorder content of api key by @dirkkul in #7726
- Save first letters of the api key by @dirkkul in #7728
- Rbac tenant filtering/add objects head by @tsmith023 in #7731
- Add tenant filtering tests for
POST batch/referencesby @tsmith023 in #7736
Dynamic RAG model selection (GA)
Adapt your retrieval-augmented generation (RAG) pipeline on the fly by selecting the generative model at runtime. This flexibility allows you to optimize responses based on query complexity, cost constraints, or latency requirements—switching between models dynamically to get the best results for each use case. No more one-size-fits-all; now every query gets the model it deserves.
- Support images in Dynamic RAG group generation by @tsmith023 in #7313
- Double timeouts over GQL and gRPC for generative module tests by @tsmith023 in #7342
- Dynamic Users: Create endpoints and wire them up by @dirkkul in #7317
- Dynamic user management: Block creating dynamic users with same name as static users by @dirkkul in #7385
- Split
imagesandimagePropertiesin dynamic provider by @tsmith023 in #7386 - Enable Dynamic RAG syntax by @antas-marcin in #7416
- Remove redundant old code adding nvidia case to
extractFromQueryby @tsmith023 in #7435 - chore: add an option of falling back to ENABLE_EXPERIMENTAL_DYNAMIC_RAG_SYNTAX env variable by @antas-marcin in #7442
- Make model optional in
GenerativeOpenAIby @tsmith023 in #7479 - chore: change the order of generative images passed with prompt by @antas-marcin in #7727
BlockMax WAND-based BM25 (GA)
Keyword search just got a major speed boost with BlockMax WAND, enabling significantly faster BM25 ranking. This enhancement accelerates query execution while maintaining relevance, making large-scale search workloads more efficient. A provided production-ready online migration process ensures seamless adoption without downtime, allowing for a smooth transition for existing datasets.
- Fix/Blockmax tombstone handling and global idf computation by @amourao in #7535
- Feat: Blockmax migrator by @aliszka in #7578
- Improvements: blockmax migrator concurrent objects read/process by @aliszka in #7607
- Fix(bm25_block): Memtable filtered count by @amourao in #7640
- feat(bm25_block): ✨ Use inverted format and blockmax by default by @amourao in #7639
- fix: unswapped buckets with map strategy by @aliszka in #7650
- Feat: shard reindexer v3 and improved blockmax migration by @aliszka in #7670
- Improvement (blockmax migration): Revert lazy shutdown by @aliszka in #7708
- fix(bm25_block): 🐛 Fix concurrent access to segment and memtable tombstones by @amourao in #7735
Multi-value vector support (GA)
Multi-value vector search is now production-ready, bringing robust support for ColBERT-style embeddings. This allows for more expressive and granular retrieval, improving performance on tasks that benefit from late interaction scoring. Previously experimental, this release is battle-tested for real-world workloads, delivering scalable and efficient multi-vector search at production scale.
Additionally, all multi-vector indexes now support all quantization options.
- Add support for BQ, PQ and SQ on multivector by @robbespo00 in #7422
- Fix startup for multivector index by @robbespo00 in #7644
Modules
- Add xAI Generative Module by @erika-cardenas in #7487
Performance & Observability Improvements
- perf: Use FromBinaryOptional when repairing index by @faustuzas in #7243
- feat(metrics): Support metrics for internal
httpserver by @kavirajk in #7341 - hnsw: isolate nodes from graph by @asdine in #7406
- Add additional metrics to debug batching by @dirkkul in #7466
Testing Improvements
- Build a fast amd64 build directly after PR creation by @dirkkul in #7300
- Add new option --arm64-only into push-docker script. by @jfrancoa in #7504
- Add new option --arm64-only into push-docker script. by @antas-marcin in #7552
- Add more tests for openai with missing rate limit headers by @dirkkul in #7568
- benchmark: different access modes for
ParseReplaceNodeIntoPreadby @salvatore-campagna-weaviate in #7558 - Replace -arm64/-amd64 by .arm64/.amd64 in docker tags by @antas-marcin in #7646
- Add test for recall restore with hnsw by @rlmanrique in #7623
- Add tests for all objects endpoints besides deprecated ones by @tsmith023 in #7707
Chores and Docs
- Remove old locking mechanism by @dirkkul in #7135
- chore(dependabot): change interval to monthly by @moogacs in #7191
- doc: remove duplicated blog link in readme by @kumarlokesh in #7124
- chore: download gRPC health probe instead of building it by @antas-marcin in #7293
- Makefile: add
--loadflag tobuildxto add it to local registry by @kavirajk in #7296 - chore: makes number of goroutines stared by cyclemanger configurable by @aliszka in #7311
- [HNSW] Expose more quantization stats by @trengrj in #7297
- chore: iterative replace cursor by @jeroiraz in #7323
- improvement: DX - show only vector names in error msg with wrong target vector by @melsonic in #7329
- Upgrade golanci-lint by @dirkkul in #7350
- async: add ASYNC_INDEXING_BATCH_SIZE env var by @asdine in #7348
- [CLU-30] ensure catching up log is not printed past catching up by @reyreaud-l in #7349
- chore: Add concurrency limit to shard loading by @faustuzas in #7343
- chore: Refactor code to avoid checking whether target vectors are enabled by @faustuzas in #7357
- chore: log shutdown error instead of panicking by @faustuzas in #7359
- Remove
grpc_health_probebinary from Weaviate's docker image by @antas-marcin in #7358 - refactor: replace
golang.org/x/expwith stdlib by @Juneezee in #7171 - chore: Refactor code to avoid checking whether target vectors are enabled II by @faustuzas in #7363
- chore(ci): enable multiarch docker image builds for branch builds by @antas-marcin in #7376
- chore: refactor shard metrics to capture more use cases by @faustuzas in #7373
- test: check nodes are running after restart by @jeroiraz in #7375
- chore(acceptance-test): add class with limitation by @moogacs in #7392
- Text2vec weaviate auth by @augustas1 in #7404
- [CLU-35] store node id next to their addr to improve logging when bootstrapping raft by @reyreaud-l in #7395
- chore: refactor dimension tracking to support mixed vectors by @faustuzas in #7414
- chore: batch objects to propagate in non-consecutive ranges by @jeroiraz in #7405
- chore: refactor to use less checking for enabled named vectors III by @faustuzas in #7425
- housekeeping: update go client version to v5 by @antas-marcin in #7419
- Binary quantization using bit shifts. by @tobias-weaviate in #7430
- chore: refactor to use less checking for enabled named vectors IV by @faustuzas in #7433
- chore: rename env variable enabling dynamic RAG syntax by @antas-marcin in #7440
- chore: add go sched latency metric by @faustuzas in #7437
- chore(test) fix test usage of reflect because of changes of in go reflect pkg 1.24 by @moogacs in #7450
- Build nodes api multinode backport by @jfrancoa in #7456
- chore: remove high cardinality target vector tracking metrics by @faustuzas in #7438
- chore: refactor module config to support mixed vectors by @faustuzas in #7445
- chore: initialize mixed vector indexes in shard by @faustuzas in #7471
- chore: fix flaky RAFT bootstrap test by @moogacs in #7475
- chore: add support for mixed vectors in class creation by @faustuzas in #7465
- Validate all property fields besides description when updating collections by @tsmith023 in #7480
- feat: add support for mixed vectors in ingestion by @faustuzas in #7482
- chore(raft): add concurrency tests for RAFT schema ops by @moogacs in #7508
- chore: remove unnecessary deep copy of Sharding state by @antas-marcin in #7521
- remove unused experimental FQDN resolver by @reyreaud-l in #7472
- chore: add support for ollama in dev environment by @faustuzas in #7527
- chore: replica finder remove unused named error by @nathanwilk7 in #7530
- Take out authz check when performing auto tenant activation by @tsmith023 in #7537
- chore(tests): remove AI21 models from generative-aws module tests that reached end of life by @antas-marcin in #7538
- chore(sec): security updates #1 by @antas-marcin in #7547
- chore: experimental flag to reject collection creation with mixed vectors by @faustuzas in #7550
- chore: add acceptance test for mixed vectors in backups by @faustuzas in #7548
- chore(recovery-logging): log empty recovery wal filenames once per dir by @moogacs in #7576
- Use errorgroup to limit concurrency in batch inserts by @dirkkul in #7601
- Set GH action test runners on dedicated group by @parkerduckworth in #7582
- chore: yield processor during hashtree initialization by @jeroiraz in #7566
- backport: chore: refactor vector index and queue access to be thread-safe by @faustuzas in #7651
Security Updates
- dependencies(update): bump github.com/Azure/azure-sdk-for-go/sdk/storage/azblob from 1.5.0 to 1.6.0 by @dependabot in #7185
- dependencies(update): bump github.com/aws/aws-sdk-go-v2 from 1.36.0 to 1.36.1 by @dependabot in #7184
- dependencies(update): bump golang.org/x/sync from 0.10.0 to 0.11.0 by @dependabot in #7188
- dependencies(update): bump golang.org/x/text from 0.21.0 to 0.22.0 by @dependabot in #7187
- sec: project security updates #1 by @antas-marcin in #7199
- Upgrade golanci-lint by @dirkkul in #7353
- Ugrade go-jose to v4.0.5 by @dirkkul in #7352
- chore(deps): upgrade jwt dependency to latest v4.5.2 version by @antas-marcin in #7687
Fixes
- fix: set timeout for boltdb initialization to prevent infinite loop by @llinvokerl in #7210
- common: add PagedCache implementation by @asdine in #7303
- fix: pass initialPages argument to constructor by @bevzzz in #7308
- fix(backup): memory control consumption by setting minio specific part size by @moogacs in #7057
- Fix query search degration after restart by @robbespo00 in #7269
- fix: prevent race during shard initialization by @jeroiraz in #7319
- fix: validate requested secondary index is present in the segment by @jeroiraz in #7315
- Remove
ai21.j2-mid-v1fromgenerative-awsmodule tests by @tsmith023 in #7345 - fix: default value for segment checksum enablement by @faustuzas in #7322
- shutdown before replacing buckets to avoid race condition by @donomii in #6997
- fix: allows concurrent writes and search in rangeable memtable by @aliszka in #7377
- fix: include last update time during object propagation by @jeroiraz in #7365
- fix: include last update time during object propagation by @jfrancoa in #7372
- fix: remove empty wal upon start by @jeroiraz in #7025
- fix: do not back up subdirectories by @faustuzas in #7418
- fix(raft): stop retrying in case of error in applies by @moogacs in #7421
- fix: getting default maxTokens value in generative anthropic module by @antas-marcin in #7439
- Fix nodes api with collection name on multi node [backport] by @dirkkul in #7454
- fix: add locks around vector index configuration access by @faustuzas in #7468
- Fix parsing and replying of
DebugandReturnMetadataby @tsmith023 in #7467 - fix: vector nil and empty considered equal by @aliszka in #7469
- fix: linter errors in TestUpdatePropertyDescription test by @antas-marcin in #7502
- fix(raft): data races on schema.Classes by @moogacs in #7506
- fix(db-internals): handle cases where class is nil due to EC by @moogacs in #7509
- fix(raft): randomize shard owner to tolerate down nodes by @moogacs in #7515
- fix: improve vector selection in queries for mixed vectors by @faustuzas in #7518
- fix: add mixed vector support in aggregate queries by @faustuzas in #7531
- Remove deprecated codepath for pre-1.23 grpc code by @tsmith023 in #7536
- Handle missing or not parseable numbers from openai by @dirkkul in #7562
- Fix class capitalisation in batch with autoschema by @tsmith023 in #7545
- fix: propagate distance parameter in remote search by @faustuzas in #7569
- fix: context-aware aggreation when no filters are specified by @jeroiraz in #7559
- fix: add BYOV support for mixed vectors by @faustuzas in #7575
- fix: add mixed vector support in near queries by @faustuzas in #7543
- fix: provide a better error message when configuration for named vector does not exist by @faustuzas in #7603
- async indexing: fix deadlock during upgrade of dynamic index by @asdine in #7602
- Fix integer conversion and assignment by @donomii in #7614
- Port fix/deadlock dynamic index by @asdine in #7616
- fix: upgrade jwt library by @faustuzas in #7618
- fix: add support for mixed vectors in grpc by @faustuzas in #7589
- Fix potential vectorization batch deadlock by @dirkkul in #7658
- Revert "Merge pull request #7406 from weaviate/hnsw-nodes-refactor" by @asdine in #7643
- fix: fix race condition in config manager test by @faustuzas in #7665
- If nested object is
nil, returnNilValuein grpc by @tsmith023 in #7680 - Fix typos in username in auth test by @dirkkul in #7690
- fix: prevent creating dynamic index with async indexing disabled by @faustuzas in #7701
- Fix race between delete and deactive/activate by @dirkkul in #7723
Others
- Add gse chinese tokeniser by @donomii in #7484
- Add throttle for apac tokenisers by @donomii in #7512
- Add tokeniser metrics by @donomii in #7316
- feat: limit class creation to configured cap with optional MAXIMUM_ALLOWED_COLLECTIONS_COUNT by @moogacs in #7443
- feat: add a named vector to an existing collection by @faustuzas in #7647
- feat: add additional mixed vector schema validation by @faustuzas in #7662
New Contributors
- @llinvokerl made their first contribution in #7210
- @bevzzz made their first contribution in #7308
- @tobias-weaviate made their first contribution in #7430
- @rlmanrique made their first contribution in #7623
Full Changelog: v1.29.0...v1.30.0