From 2d89507dc109c3684d594ebbe6cf56df4630a43b Mon Sep 17 00:00:00 2001 From: Osama Ansar Date: Tue, 1 Sep 2026 12:29:37 +0500 Subject: [PATCH] gh-467: add centered RQ4 quantization support Adds optional centering and trainingLimit fields to the RQ quantizer config (create + reconfigure), matching the shape already merged in weaviate-python-client#2148. No wire/proto changes needed since RQ config is a plain hand-written TS type sent via the REST schema API. --- src/collections/config/types/vectorIndex.ts | 3 ++ .../configure/types/vectorIndex.ts | 3 ++ src/collections/configure/unit.test.ts | 30 +++++++++++++++++++ src/collections/configure/vectorIndex.ts | 19 ++++++++++-- 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/collections/config/types/vectorIndex.ts b/src/collections/config/types/vectorIndex.ts index 99dbfdb9..bcff2066 100644 --- a/src/collections/config/types/vectorIndex.ts +++ b/src/collections/config/types/vectorIndex.ts @@ -79,7 +79,10 @@ export type PQConfig = { export type RQConfig = { bits?: number; + /** Whether to center vectors before rotation (centered RQ4). Requires Weaviate 1.39.2+. */ + centering?: boolean; rescoreLimit?: number; + trainingLimit?: number; type: 'rq'; }; diff --git a/src/collections/configure/types/vectorIndex.ts b/src/collections/configure/types/vectorIndex.ts index ee8ea6ca..80d64360 100644 --- a/src/collections/configure/types/vectorIndex.ts +++ b/src/collections/configure/types/vectorIndex.ts @@ -26,7 +26,10 @@ export type RQConfigCreate = QuantizerRecursivePartial; export type RQConfigUpdate = { bit?: number; + /** Whether to center vectors before rotation (centered RQ4). Requires Weaviate 1.39.2+. */ + centering?: boolean; rescoreLimit?: number; + trainingLimit?: number; type: 'rq'; }; diff --git a/src/collections/configure/unit.test.ts b/src/collections/configure/unit.test.ts index 43e3c849..76876c2c 100644 --- a/src/collections/configure/unit.test.ts +++ b/src/collections/configure/unit.test.ts @@ -286,6 +286,36 @@ describe('Unit testing of the configure & reconfigure factory classes', () => { }); }); + it('should create the correct RQConfigCreate type with all values including centering', () => { + const quantizer = configure.vectorIndex.quantizer.rq({ + bits: 4, + centering: true, + rescoreLimit: 500, + trainingLimit: 1000, + }); + expect(quantizer).toEqual({ + bits: 4, + centering: true, + rescoreLimit: 500, + trainingLimit: 1000, + type: 'rq', + }); + }); + + it('should create the correct RQConfigUpdate type with all values including centering', () => { + const quantizer = reconfigure.vectorIndex.quantizer.rq({ + centering: false, + rescoreLimit: 750, + trainingLimit: 2000, + }); + expect(quantizer).toEqual({ + centering: false, + rescoreLimit: 750, + trainingLimit: 2000, + type: 'rq', + }); + }); + it('should create the correct hfresh VectorIndexConfig type with defaults', () => { const config = configure.vectorIndex.hfresh({ quantizer: configure.vectorIndex.quantizer.rq() }); expect(config).toEqual>({ diff --git a/src/collections/configure/vectorIndex.ts b/src/collections/configure/vectorIndex.ts index d2969a73..32ab93ea 100644 --- a/src/collections/configure/vectorIndex.ts +++ b/src/collections/configure/vectorIndex.ts @@ -206,13 +206,22 @@ const configure = { * Create an object of type `RQConfigCreate` to be used when defining the quantizer configuration of a vector index. * * @param {number} [options.bits] Number of bits to user per vector element. + * @param {boolean} [options.centering] Whether to center vectors before rotation (centered RQ4). Requires Weaviate 1.39.2+. * @param {number} [options.rescoreLimit] The rescore limit. Default is 1000. + * @param {number} [options.trainingLimit] The training limit. * @returns {RQConfigCreate} The object of type `RQConfigCreate`. */ - rq: (options?: { bits?: number; rescoreLimit?: number }): RQConfigCreate => { + rq: (options?: { + bits?: number; + centering?: boolean; + rescoreLimit?: number; + trainingLimit?: number; + }): RQConfigCreate => { return { bits: options?.bits, + centering: options?.centering, rescoreLimit: options?.rescoreLimit, + trainingLimit: options?.trainingLimit, type: 'rq', }; }, @@ -374,10 +383,16 @@ const reconfigure = { * NOTE: If the vector index already has a quantizer configured, you cannot change its quantizer type; only its values. * So if you want to change the quantizer type, you must recreate the collection. * + * @param {boolean} [options.centering] Whether to center vectors before rotation (centered RQ4). Requires Weaviate 1.39.2+. * @param {number} [options.rescoreLimit] The new rescore limit. + * @param {number} [options.trainingLimit] The new training limit. * @returns {RQConfigUpdate} The configuration object. */ - rq: (options?: { rescoreLimit?: number }): RQConfigUpdate => { + rq: (options?: { + centering?: boolean; + rescoreLimit?: number; + trainingLimit?: number; + }): RQConfigUpdate => { return { ...options, type: 'rq',