vxcontrol/pentagi · error

knowledge: embedding provider is not available

Error message

knowledge: embedding provider is not available

What it means

requireEmbedder guards operations that must vectorize text (doSearch, CreateDocument, doUpdate). It fails when ks.embedder is nil OR embedder.IsAvailable() returns false — i.e. an embedder object exists (or is absent) but its backing provider is unreachable/unconfigured at call time. Unlike requireStore, this can fire even when a store exists, when the embedding provider degrades.

Source

Thrown at backend/pkg/database/knowledge/knowledge.go:246

		}
		if filter.Manual != nil && doc.Manual != *filter.Manual {
			continue
		}
		result = append(result, doc)
	}
	return result
}

func (ks *knowledgeStore) requireStore() error {
	if ks.store == nil {
		return fmt.Errorf("knowledge: embedding provider is not configured")
	}
	return nil
}

func (ks *knowledgeStore) requireEmbedder() error {
	if ks.embedder == nil || !ks.embedder.IsAvailable() {
		return fmt.Errorf("knowledge: embedding provider is not available")
	}
	return nil
}

// ---- ListDocuments (admin) --------------------------------------------------

func (ks *knowledgeStore) ListDocuments(ctx context.Context, filter *model.KnowledgeFilter, withContent bool) ([]*model.KnowledgeDocument, error) {
	var docs []*model.KnowledgeDocument

	if filter != nil && filter.FlowID != nil {
		rows, err := ks.db.ListFlowKnowledgeDocuments(ctx, nsOf(strconv.FormatInt(*filter.FlowID, 10)))
		if err != nil {
			return nil, fmt.Errorf("knowledge: list by flow: %w", err)
		}
		for _, r := range rows {
			docs = append(docs, rowToModel(r.ID, r.Document, nullStr(r.Cmetadata), withContent))
		}
	} else {

View on GitHub (pinned to ea665308ba)

Solutions

  1. Check the embedding provider's status in the Settings UI and re-authenticate or fix its API key.
  2. Verify the embedding endpoint is reachable (curl the Ollama/provider URL from inside the container).
  3. Switch to a different available embedding provider.
  4. Add a startup/periodic availability check and surface the degraded state in the UI before users trigger writes.

Example fix

// before
if err := ks.requireEmbedder(); err != nil {
    return fmt.Errorf("create doc: %w", err)
}
// after
if err := ks.requireEmbedder(); err != nil {
    logger.Warn("embedding provider unavailable, queuing document")
    return ks.enqueuePendingDocument(doc) // fallback instead of hard failure
}
Defensive patterns

Strategy: fallback

Validate before calling

if !embedder.IsAvailable() {
    // provider down or unauthenticated — degrade before calling write/search paths
    return ErrEmbeddingUnavailable
}

Type guard

func isEmbedderUnavailable(err error) bool {
    return err != nil && strings.Contains(err.Error(), "embedding provider is not available")
}

Try / catch

if err := ks.requireEmbedder(); err != nil {
    switch {
    case isEmbedderUnavailable(err):
        return queueForLater(doc) // retry when provider recovers
    default:
        return fmt.Errorf("knowledge write: %w", err)
    }
}

Prevention

When it happens

Trigger: Calling CreateDocument, search (doSearch), or doUpdate when the embedding provider's IsAvailable() is false: missing API key on the selected provider, provider health check failing, Ollama endpoint down, or no embedder was injected at construction.

Common situations: Embedding provider credentials rotated/expired; self-hosted embedding server (Ollama) stopped; user selected a provider without embedding support; network egress blocked from the container to the provider.

Related errors


AI-assisted analysis of vxcontrol/pentagi@ea665308ba (2026-09-01). Data as JSON: /api/errors/9d19fa627235552a. Report an issue: GitHub.