{"record":{"id":"7d7f599cfd7303ff","repo":"MemPalace/mempalace","slug":"query-requires-query-embeddings-7d7f59","errorCode":null,"errorMessage":"query requires query_embeddings","messagePattern":"query requires query_embeddings","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mempalace/backends/qdrant.py","lineNumber":958,"sourceCode":"            metadatas=outer_metas,\n            distances=outer_dists,\n            embeddings=outer_embeds if spec.embeddings else None,\n        )\n\n    def query(\n        self,\n        *,\n        query_texts=None,\n        query_embeddings=None,\n        n_results=10,\n        where=None,\n        where_document=None,\n        include=None,\n    ) -> QueryResult:\n        if query_texts is not None:\n            raise ValueError(\"qdrant requires query_embeddings; use palace.get_collection wrapper\")\n        if query_embeddings is None:\n            raise ValueError(\"query requires query_embeddings\")\n        if not query_embeddings:\n            raise ValueError(\"query input must be a non-empty list\")\n        _validate_where(where)\n        _validate_where(where_document)\n        if _requires_local_filter(where, where_document):\n            return self._query_local_exact(\n                query_embeddings=query_embeddings,\n                n_results=n_results,\n                where=where,\n                where_document=where_document,\n                include=include,\n            )\n        if not self._remote_exists():\n            if self._marker_exists():\n                raise CollectionNotInitializedError(self._collection_name)\n            return QueryResult.empty(\n                num_queries=len(query_embeddings),\n                embeddings_requested=bool(include and \"embeddings\" in include),","sourceCodeStart":940,"sourceCodeEnd":976,"githubUrl":"https://github.com/MemPalace/mempalace/blob/06cb6987f02610784fefbad4b2bd5d026d164ba6/mempalace/backends/qdrant.py#L940-L976","documentation":"Raised by QdrantCollection.query() when both query_texts is None and query_embeddings is None — i.e. the caller supplied no query at all. Since this backend cannot embed internally, embeddings are mandatory and cannot be inferred from text either.","triggerScenarios":"Calling query() with only n_results/where/include but no query input; a search function whose embedder call failed silently and passed None through; a UI layer where the empty-search-box case forwards None instead of short-circuiting.","commonSituations":"Empty user search input not guarded upstream; embedder exception swallowed by a broad except that sets embeddings=None; conditional code that skips embedding on an edge branch.","solutions":["Short-circuit empty queries upstream: if not query: return [] before calling query()","If embeddings were computed but lost, check for swallowed exceptions in the embed path (remove bare except)","Pass query_embeddings=[embedder.embed(q)] for a single query (list of vectors, one per query)","For text search use the palace wrapper, which validates text input before embedding"],"exampleFix":"# before\ntry:\n    qe = [embedder.embed(text)]\nexcept Exception:\n    qe = None\ncollection.query(query_embeddings=qe)  # None -> ValueError\n// after\nqe = [embedder.embed(text)]  # let errors propagate\ncollection.query(query_embeddings=qe)","handlingStrategy":"validation","validationCode":"if query_embeddings is None:\n    query_embeddings = [embedder.embed(query_text)]","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Reject empty search input at the UI/service boundary","Never swallow embedder exceptions into a None embeddings value"],"tags":["api-misuse","search","validation","qdrant"],"backgroundTag":null,"analyzedSha":"06cb6987f02610784fefbad4b2bd5d026d164ba6","analyzedAt":"2026-08-15T03:03:36.213Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}