{"record":{"id":"c93206d6b143d8ab","repo":"chroma-core/chroma","slug":"preferred-providers-must-be-a-list-of-strings","errorCode":null,"errorMessage":"Preferred providers must be a list of strings","messagePattern":"Preferred providers must be a list of strings","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"chromadb/utils/embedding_functions/onnx_mini_lm_l6_v2.py","lineNumber":59,"sourceCode":"    ARCHIVE_FILENAME = \"onnx.tar.gz\"\n    MODEL_DOWNLOAD_URL = (\n        \"https://chroma-onnx-models.s3.amazonaws.com/all-MiniLM-L6-v2/onnx.tar.gz\"\n    )\n    _MODEL_SHA256 = \"913d7300ceae3b2dbc2c50d1de4baacab4be7b9380491c27fab7418616a16ec3\"\n\n    def __init__(self, preferred_providers: Optional[List[str]] = None) -> None:\n        \"\"\"\n        Initialize the ONNXMiniLM_L6_V2 embedding function.\n\n        Args:\n            preferred_providers (List[str], optional): The preferred ONNX runtime providers.\n                Defaults to None.\n        \"\"\"\n        # convert the list to set for unique values\n        if preferred_providers and not all(\n            [isinstance(i, str) for i in preferred_providers]\n        ):\n            raise ValueError(\"Preferred providers must be a list of strings\")\n        # check for duplicate providers\n        if preferred_providers and len(preferred_providers) != len(\n            set(preferred_providers)\n        ):\n            raise ValueError(\"Preferred providers must be unique\")\n\n        self._preferred_providers = preferred_providers\n\n        try:\n            # Equivalent to import onnxruntime\n            self.ort = importlib.import_module(\"onnxruntime\")\n        except ImportError:\n            raise ValueError(\n                \"The onnxruntime python package is not installed. Please install it with `pip install onnxruntime`\"\n            )\n        try:\n            # Equivalent to from tokenizers import Tokenizer\n            self.Tokenizer = importlib.import_module(\"tokenizers\").Tokenizer","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/chroma-core/chroma/blob/aecdd12c8a891610db8653630b066b32ceb678b5/chromadb/utils/embedding_functions/onnx_mini_lm_l6_v2.py#L41-L77","documentation":"ONNXMiniLM_L6_V2.__init__ validates the optional preferred_providers argument: if it is non-empty and any element fails isinstance(i, str), it raises ValueError(\"Preferred providers must be a list of strings\"). Providers are ONNX Runtime execution-provider names (e.g. \"CPUExecutionProvider\", \"CUDAExecutionProvider\") passed straight into an InferenceSession later, so non-string entries indicate a malformed config.","triggerScenarios":"ONNXMiniLM_L6_V2(preferred_providers=[\"CUDAExecutionProvider\", 0]) or [None] or [b\"CPUExecutionProvider\"]; building the list dynamically from config that contains ints/enums (e.g. an OrtProvider enum not converted to .name); passing a nested list like [[\"CUDAExecutionProvider\"]] instead of a flat one.","commonSituations":"Loading preferred_providers from YAML/JSON where an entry parsed as a number or null; porting code from onnxruntime Python API examples that use enum objects; copy-pasting provider dicts ({\"CUDAExecutionProvider\": {...}}) where a plain string list is expected.","solutions":["Pass a flat list of provider-name strings: [\"CUDAExecutionProvider\", \"CPUExecutionProvider\"]","Coerce before constructing: providers = [str(p) for p in providers if p is not None]","If config comes from an enum, map it to its name: [p.name for p in provider_enums]"],"exampleFix":"// before\nfn = ONNXMiniLM_L6_V2(preferred_providers=[\"CUDAExecutionProvider\", 1])  # ValueError\n\n// after\nfn = ONNXMiniLM_L6_V2(preferred_providers=[\"CUDAExecutionProvider\", \"CPUExecutionProvider\"])","handlingStrategy":"validation","validationCode":"def validate_providers(providers):\n    if providers is None:\n        return None\n    if not all(isinstance(p, str) for p in providers):\n        providers = [str(p) for p in providers if p is not None]\n    return list(providers)\nfn = ONNXMiniLM_L6_V2(preferred_providers=validate_providers(cfg.get(\"providers\")))","typeGuard":"def is_provider_list(p) -> bool:\n    \"\"\"True when p is None or a non-empty flat list of provider-name strings.\"\"\"\n    return p is None or (isinstance(p, list) and len(p) > 0 and all(isinstance(i, str) for i in p))","tryCatchPattern":null,"preventionTips":["Keep provider lists as plain string constants in config, never enums or dicts","Validate config values against the EF constructor contract before instantiating","Add schema validation (all strings) wherever providers enter from user input"],"tags":["onnx","embedding-function","config-validation","execution-providers","chroma"],"backgroundTag":"invalid-config-value","analyzedSha":"aecdd12c8a891610db8653630b066b32ceb678b5","analyzedAt":"2026-08-16T21:53:27.228Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}