MemPalace/mempalace · error · ValueError

query requires query_embeddings

Error message

query requires query_embeddings

What it means

PgVectorCollection.query() needs precomputed vectors because the backend stores and searches embeddings only; it has no embedder. If neither query_texts nor query_embeddings is supplied, the call is a programming error and raises this ValueError before any SQL runs.

Source

Thrown at mempalace/backends/pgvector.py:1084

            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(
                "pgvector 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,
            )
        self._ensure_open()
        if not self._table_exists():
            if self._marker_exists():
                raise CollectionNotInitializedError(self._collection_name)
            return QueryResult.empty(
                num_queries=len(query_embeddings),

View on GitHub (pinned to 06cb6987f0)

Solutions

  1. Pass query_embeddings=[vector] (list of 1D float lists) computed by your embedder.
  2. If you only have text, use the palace.get_collection() wrapper and pass query_texts instead.
  3. Guard the call: skip or early-return when the embeddings variable is None.

Example fix

# before
col.query(n_results=5, where=filters)

# after
col.query(query_embeddings=[embedder.embed("hello")], n_results=5, where=filters)
Defensive patterns

Strategy: validation

Validate before calling

if not query_embeddings:
    raise ValueError("cannot query without embeddings")
col.query(query_embeddings=query_embeddings, n_results=5)

Type guard

def has_query_vectors(qe) -> bool:
    return qe is not None and len(qe) > 0 and all(v is not None and len(v) > 0 for v in qe)

Try / catch

try:
    col.query(query_embeddings=vecs, n_results=5)
except ValueError as e:
    if "query_embeddings" in str(e) or "non-empty" in str(e):
        logger.warning("skipping query: no embeddings")
        return None
    raise

Prevention

When it happens

Trigger: Calling query() with no arguments, or passing only n_results/where/include and forgetting the vectors: col.query(n_results=5, where={"wing": "work"}).

Common situations: Refactoring a call site so the embeddings variable becomes None under some branch; optional-chaining bugs where query_embeddings=query_embs is skipped when query_embs is None.

Related errors


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