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
- Configure at least one search engine key (e.g. GOOGLE_API_KEY/Tavily) in .env and restart.
- Verify Docker socket access and sandbox tool images.
- Check the wrapped error in logs to see which sub-tool failed.
- 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
- Configure at least one search provider key
- Validate .env against .env.example after every upgrade
- Test Docker access before launching flows
- Check backend startup logs for tool-wiring warnings
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
- failed to get coder handler: %w
- failed to get installer handler: %w
- failed to get ask advice handler: %w
- failed to get searcher handler: %w
- Internal
AI-assisted analysis of vxcontrol/pentagi@ea665308ba (2026-09-01).
Data as JSON: /api/errors/7f49bf4721dba3cc.
Report an issue: GitHub.