multica-ai/multica · error

no agent found matching

Error message

no agent found matching %q

What it means

After fetching the workspace's agents, resolveAgent matched the given name (case-insensitive substring) against zero agent names. The agent either does not exist in that workspace or its name shares no substring with the query.

Solutions

  1. List the workspace's agents to see exact names: GET /api/agents?workspace_id=<id> (or the corresponding list command).
  2. Check you are targeting the right workspace_id.
  3. Or use the agent's UUID directly, which skips name matching.

Example fix

# before
multica autopilot trigger create --name t1 --agent triagebot
# after (after checking the real name via agent list)
multica autopilot trigger create --name t1 --agent triage-bot
Defensive patterns

Strategy: validation

Validate before calling

# fail fast if the name matches no agent in the target workspace
multica api get "/api/agents?workspace_id=$WS" | jq -e --arg n "$AGENT" '.[] | select((.name | ascii_downcase | contains($n | ascii_downcase)))' >/dev/null \
  || { echo "no agent matches '$AGENT' in $WS" >&2; exit 2; }

Prevention

When it happens

Trigger: `--agent staging-bot` when no agent in the target workspace has 'staging-bot' in its name; agent belongs to a different workspace than workspace_id; agent was deleted or renamed.

Common situations: Renamed agents; environments (dev/staging/prod workspaces) each having differently named agents; typos in automation scripts.

Related errors


AI-assisted analysis of multica-ai/multica@2c0912b6ec (2026-08-15). Data as JSON: /api/errors/5ae6dd0e396eec3c. Report an issue: GitHub.

Appendix: source

Thrown at server/cmd/multica/cmd_autopilot.go:803

	var agents []map[string]any
	agentPath := "/api/agents?" + url.Values{"workspace_id": {client.WorkspaceID}}.Encode()
	if err := client.GetJSON(ctx, agentPath, &agents); err != nil {
		return "", fmt.Errorf("fetch agents: %w", err)
	}

	nameLower := strings.ToLower(nameOrID)
	type match struct{ ID, Name string }
	var matches []match
	for _, a := range agents {
		aName := strVal(a, "name")
		if strings.Contains(strings.ToLower(aName), nameLower) {
			matches = append(matches, match{ID: strVal(a, "id"), Name: aName})
		}
	}

	switch len(matches) {
	case 0:
		return "", fmt.Errorf("no agent found matching %q", nameOrID)
	case 1:
		return matches[0].ID, nil
	default:
		var parts []string
		for _, m := range matches {
			parts = append(parts, fmt.Sprintf("  %q (%s)", m.Name, truncateID(m.ID)))
		}
		return "", fmt.Errorf("ambiguous agent %q; matches:\n%s", nameOrID, strings.Join(parts, "\n"))
	}
}

View on GitHub (pinned to 2c0912b6ec)