conductor-oss/conductor · warning · A2AException
Streaming produced no events (stream may have dropped); will
Error message
Streaming produced no events (stream may have dropped); will retry
What it means
Thrown as A2AException (a retryable failure) during a streaming A2A call when sendResult.isTask() is false AND the returned A2AMessage is empty (null, or null/empty parts). It means the SSE/stream transport opened but delivered no usable events, so the call is treated as a transient drop and will be retried. Unlike NonRetryableException, this maps to a retryable task failure, not a terminal one.
Source
Thrown at ai/src/main/java/org/conductoross/conductor/ai/tasks/worker/A2AWorkers.java:402
return null;
}
return StringUtils.trimToNull(agent.path("a2a").path("agentCard").path("url").asText(null));
}
private void startRemote(Task task, TaskResult result, A2ACallRequest request) {
try {
A2AMessage message = buildMessage(request, task);
SendResult sendResult;
if (request.isStreaming()) {
sendResult =
a2aService.streamMessage(
request.getAgentUrl(),
message,
buildConfiguration(request, task, result, false),
request.getHeaders(),
maxDurationSeconds(request));
if (!sendResult.isTask() && isEmptyMessage(sendResult.getMessage())) {
throw new A2AException(
"Streaming produced no events (stream may have dropped); will retry");
}
} else {
boolean usePush = usePush(request);
sendResult =
a2aService.sendMessage(
request.getAgentUrl(),
message,
buildConfiguration(request, task, result, usePush),
request.getHeaders());
}
applySendResult(result, request, sendResult);
} catch (NonRetryableException e) {
fail(result, e.getMessage(), true);
} catch (Exception e) {
fail(result, "Failed to call agent: " + e.getMessage(), false);
}
}View on GitHub (pinned to cf7c3e4a8a)
Solutions
- Retry the workflow task — this is designed to be retried (it is an A2AException, not NonRetryableException).
- If it persists, test the remote agent's streaming endpoint directly with curl to confirm it emits SSE data events.
- Check proxy/LB SSE settings (disable buffering, raise idle timeout) between Conductor and the agent.
- If the agent does not support streaming, set request.isStreaming()=false to use the non-streaming sendMessage path.
- Verify the remote agent returns either a JSON-RPC task object or a non-empty message in the stream.
Example fix
// before request.setStreaming(true); // agent emits no events -> retry storm // after request.setStreaming(false); // use unary send when agent lacks real streaming
Defensive patterns
Strategy: retry
Try / catch
// A2AException is retryable by design; let the task runner retry, or catch to add backoff/jitter.
try {
sendResult = a2aService.streamMessage(...);
} catch (A2AException e) {
// transient stream drop — schedule a retry with backoff
result.setStatus(TaskResult.Status.IN_PROGRESS);
result.setCallbackAfterSeconds(retryBackoffSeconds);
} Prevention
- Configure SSE-friendly proxies (disable buffering, raise idle timeout) on the path to the agent.
- Disable streaming (isStreaming=false) for agents that do not emit real SSE events.
- Monitor retry frequency for a given agent to detect chronic stream drops.
When it happens
Trigger: Calling an A2A agent with request.isStreaming()=true where the stream closes immediately, emits only keep-alive/comment events, or the server returns a 200 with an empty event body. Also when the remote agent returns a non-task message object with zero parts.
Common situations: Upstream agent crash mid-handshake; load balancer/proxy buffering or dropping SSE frames; network interruption that closes the stream before the first data event; agent that does not actually implement streaming and returns an empty 200; TLS/proxy timeout truncating the stream.
Related errors
- A2A stream to {endpoint} failed: {message}
- A2A call '{method}' to {endpoint} failed: {message}
- No data found in SSE response: {sseBody}
- Invalid JSON-RPC response from {endpoint} for '{method}': mi
- A2A stream interrupted
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/e553a1abf8abf584.
Report an issue: GitHub.