vxcontrol/pentagi · error

unknown tool: %s

Error message

unknown tool: %s

What it means

Error "unknown tool: %s" thrown in vxcontrol/pentagi.

Source

Thrown at backend/pkg/tools/browser.go:142

		_, _ = b.scp.PutScreenshot(ctx, screen, url, b.taskID, b.subtaskID)
	}
	return result, nil
}

func (b *browser) Handle(ctx context.Context, name string, args json.RawMessage) (string, error) {
	if !b.IsAvailable() {
		return "", fmt.Errorf("browser is not available")
	}

	var action Browser
	logger := logrus.WithContext(ctx).WithFields(enrichLogrusFields(b.flowID, b.taskID, b.subtaskID, logrus.Fields{
		"tool": name,
		"args": string(args),
	}))

	if name != "browser" {
		logger.Error("unknown tool")
		return "", fmt.Errorf("unknown tool: %s", name)
	}

	if err := json.Unmarshal(args, &action); err != nil {
		logger.WithError(err).Error("failed to unmarshal browser action")
		return "", fmt.Errorf("failed to unmarshal browser action: %w", err)
	}

	// LLMs occasionally wrap the URL with an incidental leading/trailing
	// newline, carriage return, or space (e.g. copy-pasted from command
	// output); net/url.Parse rejects control characters outright, failing the
	// whole call over whitespace that carries no meaning. Strip it here so it
	// never reaches resolveUrl.
	action.Url = strings.TrimSpace(action.Url)

	if action.Action == "" {
		// The LLM occasionally omits the required 'action' field even though the
		// tool schema marks it required. 'markdown' is the safest default: it is
		// the most commonly used and most versatile content format, so infer it

View on GitHub (pinned to ea665308ba)

When it happens

Trigger: Thrown at backend/pkg/tools/browser.go:142 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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