{"record":{"id":"7f49bf4721dba3cc","repo":"vxcontrol/pentagi","slug":"failed-to-get-pentester-handler-w","errorCode":null,"errorMessage":"failed to get pentester handler: %w","messagePattern":"failed to get pentester handler: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/pkg/providers/assistant.go","lineNumber":189,"sourceCode":"\t\treturn fmt.Errorf(\"failed to get coder handler: %w\", err)\n\t}\n\n\tinstaller, err := ap.fp.GetInstallerHandler(ctx, nil, nil)\n\tif err != nil {\n\t\tlogger.WithError(err).Error(\"failed to get installer handler\")\n\t\treturn fmt.Errorf(\"failed to get installer handler: %w\", err)\n\t}\n\n\tmemorist, err := ap.fp.GetMemoristHandler(ctx, nil, nil)\n\tif err != nil {\n\t\tlogger.WithError(err).Error(\"failed to get memorist handler\")\n\t\treturn fmt.Errorf(\"failed to get memorist handler: %w\", err)\n\t}\n\n\tpentester, err := ap.fp.GetPentesterHandler(ctx, nil, nil)\n\tif err != nil {\n\t\tlogger.WithError(err).Error(\"failed to get pentester handler\")\n\t\treturn fmt.Errorf(\"failed to get pentester handler: %w\", err)\n\t}\n\n\tsearcher, err := ap.fp.GetSubtaskSearcherHandler(ctx, nil, nil)\n\tif err != nil {\n\t\tlogger.WithError(err).Error(\"failed to get searcher handler\")\n\t\treturn fmt.Errorf(\"failed to get searcher handler: %w\", err)\n\t}\n\n\tctx, observation := obs.Observer.NewObservation(ctx)\n\texecutorAgent := observation.Agent(\n\t\tlangfuse.WithAgentName(fmt.Sprintf(\"assistant %d for flow %d: %s\", ap.id, ap.fp.ID(), ap.fp.Title())),\n\t\tlangfuse.WithAgentInput(chain),\n\t\tlangfuse.WithAgentMetadata(langfuse.Metadata{\n\t\t\t\"assistant_id\": ap.id,\n\t\t\t\"flow_id\":      ap.fp.ID(),\n\t\t\t\"msg_chain_id\": ap.msgChainID,\n\t\t\t\"provider\":     ap.fp.Type(),\n\t\t\t\"image\":        ap.fp.Image(),","sourceCodeStart":171,"sourceCodeEnd":207,"githubUrl":"https://github.com/vxcontrol/pentagi/blob/ea665308baaff015b226f308438a68d929d0f29b/backend/pkg/providers/assistant.go#L171-L207","documentation":"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.","triggerScenarios":"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.","commonSituations":"Deployment with no search provider key set (all searchers unavailable); Docker socket inaccessible; partial .env leaving required tool config empty.","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."],"exampleFix":"// before\npentester, err := ap.fp.GetPentesterHandler(ctx, nil, nil)\nif err != nil {\n    return fmt.Errorf(\"failed to get pentester handler: %w\", err)\n}\n// after\npentester, err := ap.fp.GetPentesterHandler(ctx, &taskID, &subtaskID)\nif err != nil {\n    logger.WithError(err).Error(\"pentester init failed — verify docker + search config\")\n    return fmt.Errorf(\"failed to get pentester handler: %w\", err)\n}","handlingStrategy":"try-catch","validationCode":"missing := []string{}\nfor _, k := range []string{\"GOOGLE_API_KEY\", \"TAVILY_API_KEY\", \"DUCKDUCKGO_ENABLED\"} {\n    if os.Getenv(k) == \"\" { missing = append(missing, k) }\n}\nif len(missing) == 3 { return errors.New(\"no search engine configured; pentester handler init will fail\") }","typeGuard":null,"tryCatchPattern":"pentester, err := ap.fp.GetPentesterHandler(ctx, nil, nil)\nif err != nil {\n    logger.WithError(err).Error(\"pentester handler init failed\")\n    return fmt.Errorf(\"failed to get pentester handler: %w\", err)\n}","preventionTips":["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"],"tags":["tools","search","docker","handler-init"],"backgroundTag":"tool-handler-init-failed","analyzedSha":"ea665308baaff015b226f308438a68d929d0f29b","analyzedAt":"2026-09-01T14:16:31.421Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}