{"record":{"id":"9d19fa627235552a","repo":"vxcontrol/pentagi","slug":"knowledge-embedding-provider-is-not-available","errorCode":null,"errorMessage":"knowledge: embedding provider is not available","messagePattern":"knowledge: embedding provider is not available","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/pkg/database/knowledge/knowledge.go","lineNumber":246,"sourceCode":"\t\t}\n\t\tif filter.Manual != nil && doc.Manual != *filter.Manual {\n\t\t\tcontinue\n\t\t}\n\t\tresult = append(result, doc)\n\t}\n\treturn result\n}\n\nfunc (ks *knowledgeStore) requireStore() error {\n\tif ks.store == nil {\n\t\treturn fmt.Errorf(\"knowledge: embedding provider is not configured\")\n\t}\n\treturn nil\n}\n\nfunc (ks *knowledgeStore) requireEmbedder() error {\n\tif ks.embedder == nil || !ks.embedder.IsAvailable() {\n\t\treturn fmt.Errorf(\"knowledge: embedding provider is not available\")\n\t}\n\treturn nil\n}\n\n// ---- ListDocuments (admin) --------------------------------------------------\n\nfunc (ks *knowledgeStore) ListDocuments(ctx context.Context, filter *model.KnowledgeFilter, withContent bool) ([]*model.KnowledgeDocument, error) {\n\tvar docs []*model.KnowledgeDocument\n\n\tif filter != nil && filter.FlowID != nil {\n\t\trows, err := ks.db.ListFlowKnowledgeDocuments(ctx, nsOf(strconv.FormatInt(*filter.FlowID, 10)))\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"knowledge: list by flow: %w\", err)\n\t\t}\n\t\tfor _, r := range rows {\n\t\t\tdocs = append(docs, rowToModel(r.ID, r.Document, nullStr(r.Cmetadata), withContent))\n\t\t}\n\t} else {","sourceCodeStart":228,"sourceCodeEnd":264,"githubUrl":"https://github.com/vxcontrol/pentagi/blob/ea665308baaff015b226f308438a68d929d0f29b/backend/pkg/database/knowledge/knowledge.go#L228-L264","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Check the embedding provider's status in the Settings UI and re-authenticate or fix its API key.","Verify the embedding endpoint is reachable (curl the Ollama/provider URL from inside the container).","Switch to a different available embedding provider.","Add a startup/periodic availability check and surface the degraded state in the UI before users trigger writes."],"exampleFix":"// before\nif err := ks.requireEmbedder(); err != nil {\n    return fmt.Errorf(\"create doc: %w\", err)\n}\n// after\nif err := ks.requireEmbedder(); err != nil {\n    logger.Warn(\"embedding provider unavailable, queuing document\")\n    return ks.enqueuePendingDocument(doc) // fallback instead of hard failure\n}","handlingStrategy":"fallback","validationCode":"if !embedder.IsAvailable() {\n    // provider down or unauthenticated — degrade before calling write/search paths\n    return ErrEmbeddingUnavailable\n}","typeGuard":"func isEmbedderUnavailable(err error) bool {\n    return err != nil && strings.Contains(err.Error(), \"embedding provider is not available\")\n}","tryCatchPattern":"if err := ks.requireEmbedder(); err != nil {\n    switch {\n    case isEmbedderUnavailable(err):\n        return queueForLater(doc) // retry when provider recovers\n    default:\n        return fmt.Errorf(\"knowledge write: %w\", err)\n    }\n}","preventionTips":["Monitor embedding provider health (IsAvailable) and alert on degradation.","Configure at least one backup embedding provider.","Self-hosted embedders (Ollama): add container health checks and auto-restart.","Queue knowledge writes during provider outages instead of dropping them."],"tags":["go","embeddings","provider-unavailable","knowledge-base"],"backgroundTag":"embedding-provider-unavailable","analyzedSha":"ea665308baaff015b226f308438a68d929d0f29b","analyzedAt":"2026-09-01T14:16:31.421Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}