VectorConfig.CustomTypeAdapterFactory.read looks for the bq/pq/sq/rq keys at the top level of vectorIndexConfig. That is correct for hnsw and flat, but a dynamic index nests them one level deeper, under hnsw/flat, so the quantizer is silently dropped on read.
Verified against a live Weaviate 1.38.0 collection with a dynamic index and RQ enabled:
raw hnsw.rq = {"bits":8,"enabled":true,"rescoreLimit":20}
typed quantization = null
The same root cause loses Dynamic.flat's own quantizer.
Also dropped on read at the dynamic level: vectorIndexConfig.distance.
Fixing this needs a design call first: under dynamic, hnsw and flat can carry different quantizers, but VectorConfig has a single quantization() slot.
Found while working on #598, which adds getConfigAsJson as a raw-JSON escape hatch — that unblocks callers who need the complete picture, but does not fix the typed mapping.
VectorConfig.CustomTypeAdapterFactory.readlooks for thebq/pq/sq/rqkeys at the top level ofvectorIndexConfig. That is correct forhnswandflat, but adynamicindex nests them one level deeper, underhnsw/flat, so the quantizer is silently dropped on read.Verified against a live Weaviate 1.38.0 collection with a dynamic index and RQ enabled:
The same root cause loses
Dynamic.flat's own quantizer.Also dropped on read at the dynamic level:
vectorIndexConfig.distance.Fixing this needs a design call first: under
dynamic,hnswandflatcan carry different quantizers, butVectorConfighas a singlequantization()slot.Found while working on #598, which adds
getConfigAsJsonas a raw-JSON escape hatch — that unblocks callers who need the complete picture, but does not fix the typed mapping.