{"record":{"id":"e20ccace4c602338","repo":"chroma-core/chroma","slug":"nomic-only-supports-text-queries-not-images","errorCode":null,"errorMessage":"Nomic only supports text queries, not images","messagePattern":"Nomic only supports text queries, not images","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"chromadb/utils/embedding_functions/nomic_embedding_function.py","lineNumber":68,"sourceCode":"        self.api_key = os.getenv(api_key_env_var)\n        self.query_config = query_config\n        if not self.api_key:\n            raise ValueError(f\"The {api_key_env_var} environment variable is not set.\")\n        self.embed = embed\n\n    def __call__(self, input: Documents) -> Embeddings:\n        if not all(isinstance(item, str) for item in input):\n            raise ValueError(\"Nomic only supports text documents, not images\")\n        output = self.embed.text(\n            model=self.model,\n            texts=input,\n            task_type=self.task_type,\n        )\n        return [np.array(data.embedding) for data in output.data]\n\n    def embed_query(self, input: Documents) -> Embeddings:\n        if not all(isinstance(item, str) for item in input):\n            raise ValueError(\"Nomic only supports text queries, not images\")\n\n        task_type = (\n            self.query_config.get(\"task_type\") if self.query_config else self.task_type\n        )\n        output = self.embed.text(\n            model=self.model,\n            texts=input,\n            task_type=task_type,\n        )\n        return [np.array(data.embedding) for data in output.data]\n\n    @staticmethod\n    def name() -> str:\n        return \"nomic\"\n\n    def default_space(self) -> Space:\n        return \"cosine\"\n","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/chroma-core/chroma/blob/aecdd12c8a891610db8653630b066b32ceb678b5/chromadb/utils/embedding_functions/nomic_embedding_function.py#L50-L86","documentation":"NomicEmbeddingFunction.embed_query performs the same all(isinstance(item, str)) check as __call__ but on the query path, raising ValueError when any query element is not a str. The query path exists so query_config[\"task_type\"] can override the default task type (e.g. search_query vs search_document), but the text-only restriction is identical. It fires on collection.query(query_texts=[...]) when a non-string sneaks in.","triggerScenarios":"collection.query(query_texts=[[uri_obj]]) or query_texts=[[None]]) where an element is not str; frontends that pass the raw value of an input field (number, None, dict) into query_texts; reusing multimodal query building code (image URIs) from an OpenCLIP-backed collection against a Nomic-backed one.","commonSituations":"Search API endpoints that forward user input without normalization (None when the field is blank, int for numeric queries); sharing query-preparation helpers between multimodal and text-only collections; notebooks that pass numpy string scalars.","solutions":["Normalize query input at the boundary: q = [str(x) for x in query_texts[0]] before calling collection.query","Reject None/numeric query fields with a 400-style validation error in your API layer instead of letting the EF raise","For image queries, use an EF that supports them (OpenCLIP) rather than Nomic"],"exampleFix":"// before\ncollection.query(query_texts=[[None]], n_results=3)  # ValueError: Nomic only supports text queries, not images\n\n// after\nq = [str(x) for x in [user_input] if x is not None]\nif not q:\n    raise ValueError(\"query text required\")\ncollection.query(query_texts=[q], n_results=3)","handlingStrategy":"type-guard","validationCode":"query = [q for q in user_queries if isinstance(q, str) and q]\nif not query:\n    raise ValueError(\"at least one non-empty string query required\")","typeGuard":"def is_text_queries(q: list) -> bool:\n    \"\"\"True when the query list is non-empty and all str (Nomic embed_query requirement).\"\"\"\n    return isinstance(q, list) and len(q) > 0 and all(isinstance(item, str) for item in q)","tryCatchPattern":"try:\n    results = collection.query(query_texts=[queries], n_results=5)\nexcept ValueError as e:\n    if \"only supports text queries\" in str(e):\n        queries = [str(x) for x in queries if x is not None]\n        results = collection.query(query_texts=[queries], n_results=5)\n    else:\n        raise","preventionTips":["Validate user-supplied query fields (reject None/numeric) at the API boundary","Share a normalize_query() helper across all search endpoints","Don't reuse multimodal query-building code with a Nomic-backed collection"],"tags":["nomic","embedding-function","type-validation","query","chroma"],"backgroundTag":"invalid-input-type","analyzedSha":"aecdd12c8a891610db8653630b066b32ceb678b5","analyzedAt":"2026-08-16T21:53:27.228Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}