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.
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
- delete requires either ids= or where=
- Embedding API at returned non-vector embeddings (shape )
- embedding dimension must be positive
- embedding must be a non-empty 1D vector
AI-assisted analysis of MemPalace/mempalace@06cb6987f0 (2026-08-15).
Data as JSON: /api/errors/8a7d6f1603d05fa6.
Report an issue: GitHub.
Appendix: 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)