Skip to content

[BUG](api): HNSW parameter validators accept bool values due to isinstance(p, int) #7288

Description

@rtmalikian

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions