MemPalace/mempalace · error · ValueError

query input must be a non-empty list

Error message

query input must be a non-empty list

What it means

query() rejects an empty query_embeddings list ([]) before issuing any database work. A batch query with zero vectors has no meaningful result, and returning an empty QueryResult would silently hide caller bugs, so the backend fails fast.

Source

Thrown at mempalace/backends/pgvector.py:1086

    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),
                embeddings_requested=bool(include and "embeddings" in include),
            )

View on GitHub (pinned to 06cb6987f0)

Solutions

  1. Check for an empty query list before calling query() and skip or short-circuit.
  2. Fix the upstream embedding step so it cannot hand an empty batch to query().
  3. If the empty batch is legitimate, return [] results at your own layer instead of calling the backend.

Example fix

# before
col.query(query_embeddings=embed(texts), n_results=5)  # texts == []

# after
results = col.query(query_embeddings=embed(texts), n_results=5) if texts else []
Defensive patterns

Strategy: validation

Validate before calling

results = col.query(query_embeddings=vecs, n_results=5) if vecs else []

Type guard

def is_non_empty_batch(v) -> bool:
    return isinstance(v, (list, tuple)) and len(v) > 0

Try / catch

try:
    col.query(query_embeddings=vecs, n_results=5)
except ValueError as e:
    if "non-empty list" in str(e):
        return []
    raise

Prevention

When it happens

Trigger: Calling query(query_embeddings=[]) — typically because the caller batch-embedded an empty list of texts and passed the result straight through.

Common situations: Looping over user requests where one request contains zero queries; embedding-pipeline steps that return [] on empty input and are forwarded unconditionally.

Related errors


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