MemPalace/mempalace · error · ValueError

embedding must be a non-empty 1D vector

Error message

embedding must be a non-empty 1D vector

What it means

Raised by _as_vector_array() when an embedding passed to add/upsert/query is not a non-empty 1D vector — np.asarray(...).ndim != 1 or size == 0. This is a plain ValueError (not BackendError), thrown before any Milvus call, catching malformed embeddings such as 2D nested lists, scalars, empty lists, or ragged inputs that numpy flattens oddly.

Source

Thrown at mempalace/backends/milvus.py:212

            parts.append("(" + " or ".join(part for part in nested if part) + ")")
        else:
            raise UnsupportedFilterError(f"where_document operator {key!r} not supported")
    return " and ".join(part for part in parts if part)


def _combine_filter(*filters: str) -> str:
    present = [flt for flt in filters if flt]
    if not present:
        return ""
    if len(present) == 1:
        return present[0]
    return "(" + ") and (".join(present) + ")"


def _as_vector_array(vector: list[float]) -> np.ndarray:
    arr = np.asarray(vector, dtype=np.float32)
    if arr.ndim != 1 or arr.size == 0:
        raise ValueError("embedding must be a non-empty 1D vector")
    return arr


def _normalize_vectors(embeddings: list[list[float]]) -> tuple[list[list[float]], int]:
    vectors = []
    dims = set()
    for embedding in embeddings:
        arr = _as_vector_array(embedding)
        vectors.append(arr.astype(float).tolist())
        dims.add(int(arr.size))
    if len(dims) > 1:
        raise DimensionMismatchError(f"milvus batch cannot mix embedding dimensions {sorted(dims)}")
    return vectors, dims.pop() if dims else 0


def _clean_text(value: Any) -> str:
    text = "" if value is None else str(value)
    return strip_lone_surrogates(text).replace("\x00", "")

View on GitHub (pinned to 06cb6987f0)

Solutions

  1. Check each embedding is a non-empty flat list of floats before calling add/query
  2. Fix batch shape: pass one row per id/document, not the whole matrix as one embedding
  3. Log and skip failed embedder calls rather than forwarding empty outputs

Example fix

# before
collection.add(ids=["1"], documents=["text"], embeddings=[[]])

# after
if not emb:  # embedder returned nothing
    raise RuntimeError("embedder returned empty vector")
collection.add(ids=["1"], documents=["text"], embeddings=[emb])
Defensive patterns

Strategy: validation

Validate before calling

import numpy as np

def valid_embeddings(embeddings) -> bool:
    try:
        for e in embeddings:
            arr = np.asarray(e, dtype=np.float32)
            if arr.ndim != 1 or arr.size == 0:
                return False
    except (TypeError, ValueError):
        return False
    return True

Type guard

def is_nonempty_1d_vector(v) -> bool:
    return isinstance(v, (list, tuple)) and len(v) > 0 and all(isinstance(x, (int, float)) and not isinstance(x, bool) for x in v)

Try / catch

try:
    collection.add(ids=ids, documents=docs, embeddings=embs)
except ValueError as e:
    if "non-empty 1D vector" in str(e):
        raise RuntimeError(f"embedder produced malformed vectors for {len(embs)} inputs") from e
    raise

Prevention

When it happens

Trigger: add(ids=["1"], embeddings=[[]]) (empty vector), embeddings=[[[0.1, 0.2]]] (nested list → ndim 2), embeddings=[0.5] (scalar → ndim 0), or query_texts with a query embedding of [] instead of a real vector.

Common situations: Embedding API failures that return empty arrays; passing a batch matrix where a single row is expected (or vice versa); chunking bugs that produce zero-length text embeddings.

Related errors


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