microsoft/semantic-kernel · error · VectorStoreModelValidationError

Chroma only supports one vector field, but {len(self.definit

Error message

Chroma only supports one vector field, but {len(self.definition.vector_fields)} were provided.

What it means

A VectorStoreModelValidationError raised in _validate_data_model() when the collection definition declares more than one vector field. Chroma only supports a single embedding space per collection, so this is a hard constraint enforced during model validation (called at collection init / bind time).

Source

Thrown at python/semantic_kernel/connectors/chroma.py:197

        self.client.create_collection(name=self.collection_name, embedding_function=self.embedding_func, **kwargs)

    @override
    async def ensure_collection_deleted(self, **kwargs: Any) -> None:
        """Delete the collection."""
        try:
            self.client.delete_collection(name=self.collection_name)
        except ValueError:
            logger.info(f"Collection {self.collection_name} could not be deleted because it doesn't exist.")
        except Exception as e:
            raise VectorStoreOperationException(
                f"Failed to delete collection {self.collection_name} with error: {e}"
            ) from e

    def _validate_data_model(self):
        super()._validate_data_model()
        if len(self.definition.vector_fields) > 1:
            raise VectorStoreModelValidationError(
                f"Chroma only supports one vector field, but {len(self.definition.vector_fields)} were provided."
            )

    @override
    def _serialize_dicts_to_store_models(self, records: Sequence[dict[str, Any]], **kwargs: Any) -> Sequence[Any]:
        vector_field = self.definition.vector_fields[0]
        id_field_name = self.definition.key_name
        store_models = []
        for record in records:
            store_model = {
                "id": record[id_field_name],
                "metadata": {
                    k: v
                    for k, v in record.items()
                    if k not in [id_field_name, vector_field.storage_name or vector_field.name]
                },
            }
            if self.embedding_func:

View on GitHub (pinned to c028a0c7dc)

Solutions

  1. Reduce the data model to a single VectorStoreRecordVectorField for use with Chroma.
  2. If you need multiple vectors per record, split records across separate Chroma collections (one per vector) keyed by the same id, or use a connector that supports multiple vector fields.

Example fix

// before
@vectorstoremodel
class Doc:
    id: str
    dense: VectorStoreRecordVectorField(dimensions=1536)
    sparse: VectorStoreRecordVectorField(dimensions=300)
// after
# keep only one vector field for Chroma
@vectorstoremodel
class Doc:
    id: str
    dense: VectorStoreRecordVectorField(dimensions=1536)
Defensive patterns

Strategy: validation

Validate before calling

assert len(definition.vector_fields) <= 1, (
    f"Chroma supports 1 vector field, got {len(definition.vector_fields)}"
)

Type guard

def has_single_vector_field(definition) -> bool:
    return len(definition.vector_fields) == 1

Try / catch

from semantic_kernel.exceptions.vector_store_exceptions import VectorStoreModelValidationError
try:
    ChromaCollection(record_type=Doc, ...)
except VectorStoreModelValidationError as e:
    if "only supports one vector field" in str(e):
        # split the model across collections
        ...

Prevention

When it happens

Trigger: Defining a VectorStoreCollectionDefinition or record model with two or more VectorStoreRecordVectorField entries and instantiating a ChromaCollection bound to it.

Common situations: Multi-vector schemas (e.g. storing a dense and a sparse vector, or embeddings from two models) that work in the in-memory connector but are ported to Chroma; merging two record definitions during refactoring.

Related errors


AI-assisted analysis of microsoft/semantic-kernel@c028a0c7dc (2026-08-13). Data as JSON: /api/errors/a460f2600e15c262. Report an issue: GitHub.