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
- Check each embedding is a non-empty flat list of floats before calling add/query
- Fix batch shape: pass one row per id/document, not the whole matrix as one embedding
- 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
- Assert embedder output length matches input count and is non-empty
- Skip or fail loudly on empty embedder results; never forward them
- Check ndim==1 before batch insert
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
- embedding dimension must be positive
- Milvus filter field {name!r} is not a safe identifier
- $in requires a non-empty list for {field!r}
- $nin requires a non-empty list for {field!r}
- milvus batch cannot mix embedding dimensions {sorted(dims)}
AI-assisted analysis of MemPalace/mempalace@06cb6987f0 (2026-08-15).
Data as JSON: /api/errors/8a7d6f1603d05fa6.
Report an issue: GitHub.