{"record":{"id":"e012e867874065de","repo":"RyanCodrai/turbovec","slug":"embedder-dimensions-must-be-set","errorCode":null,"errorMessage":"Embedder.dimensions must be set.","messagePattern":"Embedder\\.dimensions must be set\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"turbovec-python/python/turbovec/agno.py","lineNumber":188,"sourceCode":"        :param reranker: Optional Agno reranker applied to the result set\n            after vector retrieval.\n        :param path: Optional directory for save/load persistence. When\n            given to the constructor, :meth:`create` loads existing data\n            from this path if present.\n        \"\"\"\n        super().__init__(\n            id=id,\n            name=name,\n            description=description,\n            similarity_threshold=similarity_threshold,\n        )\n        if embedder is None:\n            raise ValueError(\n                \"`embedder` is required; turbovec needs the embedder's \"\n                \"`dimensions` to size the underlying index.\"\n            )\n        if embedder.dimensions is None:\n            raise ValueError(\"Embedder.dimensions must be set.\")\n        if bit_width not in (2, 3, 4):\n            raise ValueError(f\"bit_width must be 2, 3, or 4, got {bit_width}\")\n        if search_type != SearchType.vector:\n            raise ValueError(\n                f\"TurboQuantVectorDb only supports search_type=SearchType.vector; \"\n                f\"got {search_type}. Use LanceDb / Chroma / etc. for keyword \"\n                f\"or hybrid search.\"\n            )\n        if distance not in (Distance.cosine, Distance.max_inner_product):\n            raise ValueError(\n                f\"TurboQuantVectorDb supports distance=Distance.cosine or \"\n                f\"distance=Distance.max_inner_product; got {distance}. \"\n                f\"L2 distance is not supported by the underlying \"\n                f\"inner-product kernel.\"\n            )\n\n        self.embedder: Embedder = embedder\n        self.dimensions: int = embedder.dimensions","sourceCodeStart":170,"sourceCodeEnd":206,"githubUrl":"https://github.com/RyanCodrai/turbovec/blob/ccab9f325e6ce2a270a87daf01ae4e443bcf2d49/turbovec-python/python/turbovec/agno.py#L170-L206","documentation":"After checking the embedder exists, TurboQuantVectorDb reads embedder.dimensions to allocate the index. If dimensions is None (the embedder has not resolved its output dimension), a ValueError is raised because the index size cannot be determined.","triggerScenarios":"Passing an embedder whose dimensions attribute is None — typically an embedder constructed without an explicit dimensions/model config that resolves dimensions lazily, used before any embedding has been performed.","commonSituations":"Custom or lightweight embedder subclasses that never set dimensions; embedders that infer dimensions on first embed call; copying embedder config from another vector DB that does not need dimensions upfront.","solutions":["Set dimensions explicitly on the embedder, e.g. OpenAIEmbedder(dimensions=1536).","Use a different embedder class whose dimensions are known without an API call.","Verify model/params: some embedders expose dimensions only after configuring a specific model."],"exampleFix":"// before\nembedder = OpenAIEmbedder(model=\"text-embedding-3-large\")\n// after\nembedder = OpenAIEmbedder(model=\"text-embedding-3-large\", dimensions=3072)","handlingStrategy":"validation","validationCode":"if embedder.dimensions is None:\n    embedder.dimensions = KNOWN_DIMENSIONS[embedder.model]","typeGuard":"def dimensions_known(embedder: Embedder) -> bool:\n    return isinstance(getattr(embedder, \"dimensions\", None), int) and embedder.dimensions > 0","tryCatchPattern":"try:\n    db = TurboQuantVectorDb(embedder=embedder)\nexcept ValueError as e:\n    if \"dimensions\" in str(e):\n        embedder.dimensions = 1536  # or per-model lookup\n        db = TurboQuantVectorDb(embedder=embedder)","preventionTips":["Always pass explicit dimensions when constructing embedders.","Keep a model->dimensions lookup table for your embedders.","Avoid embedder subclasses that defer dimension resolution to first use."],"tags":["embedder","configuration","dimensions"],"backgroundTag":"missing-required-config-field","analyzedSha":"ccab9f325e6ce2a270a87daf01ae4e443bcf2d49","analyzedAt":"2026-09-06T08:39:18.516Z","contentChangedAt":"2026-09-06T08:39:18.516Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}