Problem
In chromadb/segment/impl/vector/hnsw_params.py, the parameter validators use isinstance(p, int) to check that HNSW parameters are integers:
param_validators: Dict[str, Validator] = {
"hnsw:construction_ef": lambda p: isinstance(p, int),
"hnsw:search_ef": lambda p: isinstance(p, int),
"hnsw:M": lambda p: isinstance(p, int),
"hnsw:num_threads": lambda p: isinstance(p, int),
"hnsw:resize_factor": lambda p: isinstance(p, (int, float)),
}
Since bool is a subclass of int in Python, isinstance(True, int) returns True. This means:
True (which equals 1) passes validation for construction_ef, search_ef, M, num_threads
False (which equals 0) also passes
- For
resize_factor, isinstance(True, (int, float)) is True
These are semantically invalid values for HNSW parameters. Setting construction_ef=True (1) or M=True (1) would produce a nearly unusable index.
Proposed Fix
Add and not isinstance(p, bool) to the integer validators, or use type(p) is int instead of isinstance(p, int).
Affected Files
chromadb/segment/impl/vector/hnsw_params.py (lines 12-16, 21-22)
Problem
In
chromadb/segment/impl/vector/hnsw_params.py, the parameter validators useisinstance(p, int)to check that HNSW parameters are integers:Since
boolis a subclass ofintin Python,isinstance(True, int)returnsTrue. This means:True(which equals1) passes validation forconstruction_ef,search_ef,M,num_threadsFalse(which equals0) also passesresize_factor,isinstance(True, (int, float))isTrueThese are semantically invalid values for HNSW parameters. Setting
construction_ef=True(1) orM=True(1) would produce a nearly unusable index.Proposed Fix
Add
and not isinstance(p, bool)to the integer validators, or usetype(p) is intinstead ofisinstance(p, int).Affected Files
chromadb/segment/impl/vector/hnsw_params.py(lines 12-16, 21-22)