MemPalace/mempalace · error · ValueError

query requires query_embeddings

Error message

query requires query_embeddings

What it means

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.

Source

Thrown at mempalace/backends/qdrant.py:958

            metadatas=outer_metas,
            distances=outer_dists,
            embeddings=outer_embeds if spec.embeddings else None,
        )

    def query(
        self,
        *,
        query_texts=None,
        query_embeddings=None,
        n_results=10,
        where=None,
        where_document=None,
        include=None,
    ) -> QueryResult:
        if query_texts is not None:
            raise ValueError("qdrant requires query_embeddings; use palace.get_collection wrapper")
        if query_embeddings is None:
            raise ValueError("query requires query_embeddings")
        if not query_embeddings:
            raise ValueError("query input must be a non-empty list")
        _validate_where(where)
        _validate_where(where_document)
        if _requires_local_filter(where, where_document):
            return self._query_local_exact(
                query_embeddings=query_embeddings,
                n_results=n_results,
                where=where,
                where_document=where_document,
                include=include,
            )
        if not self._remote_exists():
            if self._marker_exists():
                raise CollectionNotInitializedError(self._collection_name)
            return QueryResult.empty(
                num_queries=len(query_embeddings),
                embeddings_requested=bool(include and "embeddings" in include),

View on GitHub (pinned to 06cb6987f0)

Solutions

  1. Short-circuit empty queries upstream: if not query: return [] before calling query()
  2. If embeddings were computed but lost, check for swallowed exceptions in the embed path (remove bare except)
  3. Pass query_embeddings=[embedder.embed(q)] for a single query (list of vectors, one per query)
  4. For text search use the palace wrapper, which validates text input before embedding

Example fix

# before
try:
    qe = [embedder.embed(text)]
except Exception:
    qe = None
collection.query(query_embeddings=qe)  # None -> ValueError
// after
qe = [embedder.embed(text)]  # let errors propagate
collection.query(query_embeddings=qe)
Defensive patterns

Strategy: validation

Validate before calling

if query_embeddings is None:
    query_embeddings = [embedder.embed(query_text)]

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of MemPalace/mempalace@06cb6987f0 (2026-08-15). Data as JSON: /api/errors/7d7f599cfd7303ff. Report an issue: GitHub.