vxcontrol/pentagi · error

failed to get pentester handler: %w

Error message

failed to get pentester handler: %w

What it means

PerformAgentChain wraps the error from fp.GetPentesterHandler(ctx, nil, nil), which builds the pentester tool handler (the largest toolset: terminals, searchers, Docker tools). Construction failed so the assistant chain aborts.

Source

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

		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),
		langfuse.WithAgentMetadata(langfuse.Metadata{
			"assistant_id": ap.id,
			"flow_id":      ap.fp.ID(),
			"msg_chain_id": ap.msgChainID,
			"provider":     ap.fp.Type(),
			"image":        ap.fp.Image(),

View on GitHub (pinned to ea665308ba)

Solutions

  1. Configure at least one search engine key (e.g. GOOGLE_API_KEY/Tavily) in .env and restart.
  2. Verify Docker socket access and sandbox tool images.
  3. Check the wrapped error in logs to see which sub-tool failed.
  4. Complete configuration via the installer wizard.

Example fix

// before
pentester, err := ap.fp.GetPentesterHandler(ctx, nil, nil)
if err != nil {
    return fmt.Errorf("failed to get pentester handler: %w", err)
}
// after
pentester, err := ap.fp.GetPentesterHandler(ctx, &taskID, &subtaskID)
if err != nil {
    logger.WithError(err).Error("pentester init failed — verify docker + search config")
    return fmt.Errorf("failed to get pentester handler: %w", err)
}
Defensive patterns

Strategy: try-catch

Validate before calling

missing := []string{}
for _, k := range []string{"GOOGLE_API_KEY", "TAVILY_API_KEY", "DUCKDUCKGO_ENABLED"} {
    if os.Getenv(k) == "" { missing = append(missing, k) }
}
if len(missing) == 3 { return errors.New("no search engine configured; pentester handler init will fail") }

Try / catch

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

Prevention

When it happens

Trigger: Pentester handler factory fails wiring any sub-tool: Docker client error, no search engine configured/available, missing tool env keys, or DB/template lookup failure.

Common situations: Deployment with no search provider key set (all searchers unavailable); Docker socket inaccessible; partial .env leaving required tool config empty.

Related errors


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