conductor-oss/conductor · error · NonRetryableException

Unsupported agentType '<agentType>' (only 'a2a' is supported

Error message

Unsupported agentType '<agentType>' (only 'a2a' is supported)

What it means

Thrown as NonRetryableException by requireA2a when agentType is not recognized as an A2A runtime type. A2AService.isA2aAgentType returns true only for null, blank, or 'a2a' (case-insensitive); any other concrete value (e.g. 'conductor', 'azure-foundry') fails this stricter guard used in code paths that only support pure A2A. Note the main execute() path has a separate, friendlier message listing 'a2a' and 'conductor'.

Source

Thrown at ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/A2AWorkers.java:716

        return objectMapper.convertValue(result.getOutputData(), outputType);
    }

    private <T> T parse(Task task, Class<T> type) {
        return objectMapper.convertValue(task.getInputData(), type);
    }

    private static <T extends TaskResult> T fail(T result, String reason, boolean nonRetryable) {
        result.setStatus(
                nonRetryable
                        ? TaskResult.Status.FAILED_WITH_TERMINAL_ERROR
                        : TaskResult.Status.FAILED);
        result.setReasonForIncompletion(reason);
        return result;
    }

    private static void requireA2a(String agentType) {
        if (!A2AService.isA2aAgentType(agentType)) {
            throw new NonRetryableException(
                    "Unsupported agentType '" + agentType + "' (only 'a2a' is supported)");
        }
    }

    private static void recordOutcome(TaskResult result) {
        if (result.getStatus() != null && result.getStatus() != TaskResult.Status.IN_PROGRESS) {
            A2AMetrics.clientCall(result.getStatus().name().toLowerCase());
        }
    }

    private static boolean isEmptyMessage(A2AMessage message) {
        return message == null || message.getParts() == null || message.getParts().isEmpty();
    }

    private static long asLong(Object value, long defaultValue) {
        return value instanceof Number number ? number.longValue() : defaultValue;
    }

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Set agentType to 'a2a' (or omit it / leave blank to default to A2A) for A2A workers.
  2. If you intended the embedded Conductor agent runtime, route through the conductor-agent code path instead of the requireA2a-guarded one.
  3. Trim whitespace and check for typos in the agentType input value.
  4. Confirm the worker/endpoint you are calling actually supports the agentType you supplied.

Example fix

// before
{ "agentType": "conductor", "agentUrl": "https://agent/a2a" }
// after
{ "agentType": "a2a", "agentUrl": "https://agent/a2a" }
Defensive patterns

Strategy: validation

Validate before calling

// Normalize/validate agentType before calling a2a-only paths
String t = request.getAgentType();
if (!A2AService.isA2aAgentType(t)) {
    // either set to "a2a" or route to the conductor-agent path
    request.setAgentType("a2a");
}

Type guard

// Narrow to an a2a-compatible agentType
boolean isA2a = A2AService.isA2aAgentType(request.getAgentType());

Prevention

When it happens

Trigger: Calling a code path guarded by requireA2a() with agentType set to 'conductor', 'azure-foundry', or any custom/misspelled value. This guard is stricter than the execute() entry guard.

Common situations: Passing agentType='conductor' into an A2A-only helper; typo such as 'a2A' is fine (case-insensitive) but 'a2a ' with trailing space fails; a workflow copied from a conductor-agent template but executed through an a2a-only path.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/314a37654a656e85. Report an issue: GitHub.