Interface ClientEvent
- All Known Implementing Classes:
MessageEvent,TaskEvent,TaskUpdateEvent
ClientEvent is the base type for all events that clients receive during agent interactions. The sealed interface ensures type safety by restricting implementations to three known subtypes:
MessageEvent- contains complete messages with content partsTaskEvent- contains complete task state, typically final statesTaskUpdateEvent- contains incremental task updates (status or artifact changes)
Event flow: When a client sends a message to an agent, the agent's response is delivered as a stream of ClientEvent instances to registered event consumers. The event type and sequence depend on the agent's capabilities and the task's lifecycle:
Simple blocking response:
User → Agent Agent → MessageEvent (contains agent's text response)
Streaming task execution:
User → Agent Agent → TaskEvent (SUBMITTED) Agent → TaskUpdateEvent (WORKING) Agent → TaskUpdateEvent (artifact update with partial results) Agent → TaskUpdateEvent (artifact update with more results) Agent → TaskUpdateEvent (COMPLETED)
Typical usage pattern:
client.addConsumer((event, agentCard) -> {
switch (event) {
case MessageEvent me -> {
// Simple message response
System.out.println("Response: " + me.getMessage().parts());
}
case TaskEvent te -> {
// Complete task state (usually final)
Task task = te.getTask();
System.out.println("Task " + task.id() + ": " + task.status().state());
}
case TaskUpdateEvent tue -> {
// Incremental update
Task currentTask = tue.getTask();
UpdateEvent update = tue.getUpdateEvent();
if (update instanceof TaskStatusUpdateEvent statusUpdate) {
System.out.println("Status changed to: " +
currentTask.status().state());
} else if (update instanceof TaskArtifactUpdateEvent artifactUpdate) {
System.out.println("New content: " +
artifactUpdate.artifact().parts());
}
}
}
});
Legacy vs current protocol: In older versions of the A2A protocol, agents returned
MessageEvent for simple responses and TaskEvent for task-based responses.
The current protocol (v1.0+) uses TaskUpdateEvent for streaming updates during
task execution, providing finer-grained visibility into agent progress.