{"record":{"id":"4cd2c811c9747c3d","repo":"cocoindex-io/cocoindex","slug":"vectorschemaprovider-is-required-for-numpy-ndarray-4cd2c8","errorCode":null,"errorMessage":"VectorSchemaProvider is required for NumPy ndarray type.","messagePattern":"VectorSchemaProvider is required for NumPy ndarray type\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/cocoindex/connectors/lancedb/_target.py","lineNumber":176,"sourceCode":"    Use `LanceType` annotation with `typing.Annotated` to override the default.\n    \"\"\"\n    type_info = analyze_type_info(python_type)\n\n    # Check for LanceType annotation override\n    for annotation in type_info.annotations:\n        if isinstance(annotation, LanceType):\n            return _TypeMapping(annotation.pa_type, annotation.encoder)\n\n    base_type = type_info.base_type\n\n    # Check direct leaf type mappings\n    if base_type in _LEAF_TYPE_MAPPINGS:\n        return _LEAF_TYPE_MAPPINGS[base_type]\n\n    # NumPy ndarray: map to fixed-size list; dimension is handled at the schema layer\n    if base_type is np.ndarray:\n        if vector_schema is None:\n            raise ValueError(\"VectorSchemaProvider is required for NumPy ndarray type.\")\n\n        if vector_schema.size <= 0:\n            raise ValueError(f\"Invalid vector dimension: {vector_schema.size}\")\n\n        # Default to float32 for vectors; use float16 for half-precision\n        pa_elem = (\n            pa.float16()\n            if vector_schema.dtype in (np.half, np.float16)\n            else pa.float32()\n        )\n        # Create fixed-size list type for vector\n        return _TypeMapping(pa.list_(pa_elem, list_size=vector_schema.size))\n\n    elif vector_schema is not None:\n        raise ValueError(\n            f\"VectorSchemaProvider is only supported for NumPy ndarray type. Got type: {python_type}\"\n        )\n","sourceCodeStart":158,"sourceCodeEnd":194,"githubUrl":"https://github.com/cocoindex-io/cocoindex/blob/e84aa99b3292c5270a4b313b2a7137ad9ce8ab3b/python/cocoindex/connectors/lancedb/_target.py#L158-L194","documentation":"_get_type_mapping maps Python types to Arrow types for a LanceDB table. A np.ndarray column requires a VectorSchemaProvider (column_spec) to supply the vector dimension; without one the mapping cannot determine the fixed-size list size, so a ValueError is raised.","triggerScenarios":"Declaring a LanceDB target whose record type has an `np.ndarray` field, without passing a `column_specs` entry mapping that column to a VectorSchemaProvider.","commonSituations":"Building a LanceDB table with embedding vector columns and forgetting the column spec; examples that predate the VectorSchemaProvider requirement; relying on inference that CocoIndex intentionally does not do for ndarray dimensions.","solutions":["Add a column spec for the ndarray column: `column_specs={\"embedding\": VectorSchemaProvider(size=768)}` when constructing/from_class-ing the target.","Alternatively, store vectors as a structure the library can infer if supported by your connector version.","Check docs for VectorSchemaProvider usage in the LanceDB connector."],"exampleFix":"// before\nawait LanceDbTarget.from_class(MyRecord, primary_key=[\"id\"])  # MyRecord.embedding: np.ndarray\n// after\nfrom cocoindex.connectors.lancedb import VectorSchemaProvider\nawait LanceDbTarget.from_class(\n    MyRecord,\n    primary_key=[\"id\"],\n    column_specs={\"embedding\": VectorSchemaProvider(size=768)},\n)","handlingStrategy":"validation","validationCode":"from dataclasses import fields\nimport numpy as np\nfrom cocoindex.connectors.lancedb import VectorSchemaProvider\nndarray_cols = [f.name for f in fields(MyRecord) if f.type is np.ndarray or f.type == np.ndarray]\nmissing = [c for c in ndarray_cols if c not in column_specs]\nif missing:\n    raise ValueError(f\"Add VectorSchemaProvider column_specs for: {missing}\")","typeGuard":null,"tryCatchPattern":"try:\n    target = await LanceDbTarget.from_class(MyRecord, primary_key=[\"id\"], column_specs=column_specs)\nexcept ValueError as e:\n    if \"VectorSchemaProvider is required\" in str(e):\n        ...  # add the missing column_spec and retry\n    raise","preventionTips":["Always supply column_specs for every np.ndarray field.","Keep a single helper that builds column_specs from your embedding model's known dimension.","Read the connector docs on VectorSchemaProvider before defining record types with vectors."],"tags":["python","lancedb","vector","schema"],"backgroundTag":"missing-required-argument","analyzedSha":"e84aa99b3292c5270a4b313b2a7137ad9ce8ab3b","analyzedAt":"2026-09-08T15:59:19.997Z","contentChangedAt":"2026-09-08T15:59:19.997Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}