vxcontrol/pentagi · error

failed to get memorist handler

Error message

failed to get memorist handler: %w

What it means

Wraps a failure from fp.GetMemoristHandler during assistant worker setup (backend/pkg/providers/assistant.go). The memorist (memory/summarization) agent's LLM handler could not be constructed, typically due to an unavailable or misconfigured LLM provider. The assistant worker cannot start without it.

Solutions

  1. Ensure the pgvector extension is installed and migrations ran (`CREATE EXTENSION vector`; check backend startup logs).
  2. Configure a valid embedding provider key (EMBEDDING_* env or settings UI).
  3. Verify Postgres connectivity and the wrapped DB error in logs.
  4. Re-run `docker compose` with the official image that bundles pgvector.

Example fix

// before
memorist, err := ap.fp.GetMemoristHandler(ctx, nil, nil)
if err != nil {
    return fmt.Errorf("failed to get memorist handler: %w", err)
}
// after
memorist, err := ap.fp.GetMemoristHandler(ctx, &taskID, &subtaskID)
if err != nil {
    logger.WithError(err).Error("memorist init failed — check pgvector & embedding config")
    return fmt.Errorf("failed to get memorist handler: %w", err)
}
Defensive patterns

Strategy: validation

Validate before calling

var ext string
if err := db.QueryRow(`SELECT extname FROM pg_extension WHERE extname='vector'`).Scan(&ext); err != nil {
    return errors.New("pgvector extension not installed — memorist handler cannot start")
}

Try / catch

memorist, err := ap.fp.GetMemoristHandler(ctx, nil, nil)
if err != nil {
    if isMissingExtension(err) { return fmt.Errorf("install pgvector: %w", err) }
    return fmt.Errorf("failed to get memorist handler: %w", err)
}

Prevention

When it happens

Trigger: Memorist handler factory fails: pgvector extension missing, embeddings table/schema absent (migrations not run), embedder not configured, or DB connection error.

Common situations: Postgres without the pgvector extension installed; fresh DB where migrations didn't run; no embedding provider key configured so the embedder is nil; DB outage.

Related errors


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

Appendix: source

Thrown at backend/pkg/providers/assistant.go:183

		return fmt.Errorf("failed to get ask advice handler: %w", err)
	}

	coder, err := ap.fp.GetCoderHandler(ctx, nil, nil)
	if err != nil {
		logger.WithError(err).Error("failed to get coder handler")
		return fmt.Errorf("failed to get coder handler: %w", err)
	}

	installer, err := ap.fp.GetInstallerHandler(ctx, nil, nil)
	if err != nil {
		logger.WithError(err).Error("failed to get installer handler")
		return fmt.Errorf("failed to get installer handler: %w", err)
	}

	memorist, err := ap.fp.GetMemoristHandler(ctx, nil, nil)
	if err != nil {
		logger.WithError(err).Error("failed to get memorist handler")
		return fmt.Errorf("failed to get memorist handler: %w", err)
	}

	pentester, err := ap.fp.GetPentesterHandler(ctx, nil, nil)
	if err != nil {
		logger.WithError(err).Error("failed to get pentester handler")
		return fmt.Errorf("failed to get pentester handler: %w", err)
	}

	searcher, err := ap.fp.GetSubtaskSearcherHandler(ctx, nil, nil)
	if err != nil {
		logger.WithError(err).Error("failed to get searcher handler")
		return fmt.Errorf("failed to get searcher handler: %w", err)
	}

	ctx, observation := obs.Observer.NewObservation(ctx)
	executorAgent := observation.Agent(
		langfuse.WithAgentName(fmt.Sprintf("assistant %d for flow %d: %s", ap.id, ap.fp.ID(), ap.fp.Title())),
		langfuse.WithAgentInput(chain),

View on GitHub (pinned to ea665308ba)