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

Raised by QdrantCollection.query() when query_embeddings is an empty list ([]). Distinguishing 'no embeddings given' (135) from 'empty list', this guard prevents a zero-query response whose shape (empty vs per-query lists) would be ambiguous downstream.

Source

Thrown at mempalace/backends/qdrant.py:960

            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. Skip the call when there is nothing to search: if not queries: return []
  2. Guard batch code: embeddings = [embed(q) for q in queries]; if embeddings: collection.query(query_embeddings=embeddings)
  3. Treat empty input as a legitimate no-op at the caller's boundary rather than an error
  4. Add a unit test for the empty-batch path so it stays a no-op

Example fix

# before
results = collection.query(query_embeddings=[embedder.embed(q) for q in queries])  # queries=[] -> ValueError
// after
embeddings = [embedder.embed(q) for q in queries]
results = collection.query(query_embeddings=embeddings) if embeddings else None
Defensive patterns

Strategy: validation

Validate before calling

if not query_embeddings:
    return []  # empty batch of queries is a no-op

Prevention

When it happens

Trigger: Calling query(query_embeddings=[]) — typically batch-search code that maps a list of queries to embeddings and the input list was empty (e.g. searching for zero candidate re-ranking queries).

Common situations: A rerank/batch-search loop receiving an empty candidate set and still calling query; list comprehension over an empty query list producing []; upstream dedup/filtering that removed all queries.

Related errors


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