{"record":{"id":"b892c630a8dbc385","repo":"conductor-oss/conductor","slug":"agent-requires-one-of-message-parts-text-or-pr","errorCode":null,"errorMessage":"AGENT requires one of: message, parts, text, or prompt","messagePattern":"AGENT requires one of: message, parts, text, or prompt","errorType":"validation","errorClass":"NonRetryableException","httpStatus":null,"severity":"error","filePath":"ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/A2AWorkers.java","lineNumber":541,"sourceCode":"        result.setCallbackAfterSeconds(\n                usePush(request) ? pushBackstopSeconds(request) : pollInterval(request));\n    }\n\n    private A2AMessage buildMessage(A2ACallRequest request, Task task) {\n        A2AMessage message;\n        if (request.getMessage() != null && !request.getMessage().isEmpty()) {\n            message = objectMapper.convertValue(request.getMessage(), A2AMessage.class);\n        } else {\n            message = new A2AMessage();\n            List<Part> parts = new ArrayList<>();\n            if (request.getParts() != null && !request.getParts().isEmpty()) {\n                for (Map<String, Object> raw : request.getParts()) {\n                    parts.add(objectMapper.convertValue(raw, Part.class));\n                }\n            } else {\n                String text = StringUtils.firstNonBlank(request.getText(), request.getPrompt());\n                if (StringUtils.isBlank(text)) {\n                    throw new NonRetryableException(\n                            \"AGENT requires one of: message, parts, text, or prompt\");\n                }\n                Part part = new Part();\n                part.setKind(\"text\");\n                part.setText(text);\n                parts.add(part);\n            }\n            message.setParts(parts);\n        }\n        if (message.getRole() == null) {\n            message.setRole(\"user\");\n        }\n        if (message.getMessageId() == null) {\n            message.setMessageId(deterministicMessageId(task));\n        }\n        if (message.getKind() == null) {\n            message.setKind(\"message\");\n        }","sourceCodeStart":523,"sourceCodeEnd":559,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/A2AWorkers.java#L523-L559","documentation":"Thrown as NonRetryableException while building the outbound A2A message when none of message, parts, text, or prompt are supplied on the A2ACallRequest. The message builder needs at least one content source to construct an A2AMessage with parts. Because the input is fundamentally incomplete, it fails terminally rather than retrying the same empty payload.","triggerScenarios":"An AGENT workflow task whose input omits all four content fields; calling the worker with an A2ACallRequest where message is null/empty, parts is null/empty, and both text and prompt are blank.","commonSituations":"Workflow author forgot to wire input variables; upstream task produced no text so the templated field resolved to empty; a programmatic SDK caller constructed A2ACallRequest without setting content; typo in input key (e.g. 'txt' instead of 'text').","solutions":["Provide at least one of message, parts, text, or prompt in the task input.","If using text/prompt via template variables, verify the upstream task actually emitted the referenced variable (not null/empty).","Set a static fallback text in the task definition so the field is never blank.","Check for key typos: the worker reads request.getText() and request.getPrompt() exactly."],"exampleFix":"// before\n{ \"agentUrl\": \"https://agent/a2a\", \"agentType\": \"a2a\" }  // no content -> fails\n// after\n{ \"agentUrl\": \"https://agent/a2a\", \"agentType\": \"a2a\", \"text\": \"${task.generate.output.result}\" }","handlingStrategy":"validation","validationCode":"// Ensure at least one content source is present before building the message\nboolean hasContent =\n    (request.getMessage() != null && !request.getMessage().isEmpty())\n    || (request.getParts() != null && !request.getParts().isEmpty())\n    || StringUtils.isNoneBlank(request.getText(), request.getPrompt());\nif (!hasContent) {\n    throw new IllegalArgumentException(\"Supply one of message, parts, text, or prompt\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always wire a non-empty text/prompt template variable into AGENT tasks.","Fail empty upstream outputs before they reach the AGENT worker.","Add workflow-level input validation for required content fields."],"tags":["a2a","input-validation","non-retryable","configuration"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}