Interface ClientEvent

All Known Implementing Classes:
MessageEvent, TaskEvent, TaskUpdateEvent

public sealed interface ClientEvent permits MessageEvent, TaskEvent, TaskUpdateEvent
A sealed interface representing events received by an A2A client from an agent.

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 parts
  • TaskEvent - contains complete task state, typically final states
  • TaskUpdateEvent - 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.

See Also: