Skip to content
Changelog

We now surface embedding failures during knowledge ingestion

ContributorSannya SingalSoftware Engineer

September 1, 20261 min read

When a chunk failed to embed, Agno used to hide it. An embedder could return an empty vector, a file could be marked complete when half its chunks never embedded, and a status check could report success on content that was actually broken. We reworked this so a failed embedding is visible and recoverable.

What we added:

  • A partial content status. Files where some chunks embedded and others did not are now marked partial. They stay searchable but are flagged as incomplete. The ContentStatus API enum gains partial, so /openapi.json now lists ["processing", "completed", "partial", "failed"]. No schema migration is needed, since the status column is already varchar.
  • Optional embedding retries during ingestion, off by default. Set Knowledge(max_embedding_retries=3, embedding_retry_backoff=1.0) to turn them on. Auth failures fail on the first attempt, and each retry re-embeds the whole document.
  • Actionable failure messages. A failure now names the chunk count, the embedder, the reason, and the recovery step, in place of the old "Could not insert embedding."

What changed, and what to check when you upgrade:

  • Embedders now raise EmbeddingError instead of returning an empty vector. A vector DB's search() now raises where it used to return []. Knowledge.search() is unaffected.
  • AWS Bedrock embedding failures now raise EmbeddingError, not ModelProviderError. Any except ModelProviderError handler around Bedrock embedding will stop catching them, so update those handlers to catch EmbeddingError.
  • GET /knowledge/content/{id}/status now returns 404 for missing or non-owned content, instead of 200 with status: "failed".
  • skip_if_exists=True no longer skips failed or partial content. Incomplete content is re-embedded rather than left marked complete.

Learn more about embedders in the documentation.

Shipped around the same time