@@ -42,11 +42,19 @@ public A2AAgentHandler(
4242 /// <inheritdoc/>
4343 public Task ExecuteAsync ( RequestContext context , AgentEventQueue eventQueue , CancellationToken cancellationToken )
4444 {
45+ // Handle task updates
4546 if ( context . IsContinuation )
4647 {
4748 return this . HandleTaskUpdateAsync ( context , eventQueue , cancellationToken ) ;
4849 }
4950
51+ // Handle messages received via streaming endpoint
52+ if ( context . StreamingResponse )
53+ {
54+ return this . HandleNewMessageStreamingAsync ( context , eventQueue , cancellationToken ) ;
55+ }
56+
57+ // Handle new messages received via non-streaming endpoint
5058 return this . HandleNewMessageAsync ( context , eventQueue , cancellationToken ) ;
5159 }
5260
@@ -108,6 +116,34 @@ private async Task HandleNewMessageAsync(RequestContext context, AgentEventQueue
108116 }
109117 }
110118
119+ private async Task HandleNewMessageStreamingAsync ( RequestContext context , AgentEventQueue eventQueue , CancellationToken cancellationToken )
120+ {
121+ var contextId = context . ContextId ?? Guid . NewGuid ( ) . ToString ( "N" ) ;
122+ var session = await this . _hostAgent . GetOrCreateSessionAsync ( contextId , cancellationToken ) . ConfigureAwait ( false ) ;
123+
124+ // AIAgent does not support resuming from arbitrary prior tasks.
125+ // Throw explicitly so the client gets a clear error rather than a response
126+ // that silently ignores the referenced task context.
127+ if ( context . Message ? . ReferenceTaskIds is { Count : > 0 } )
128+ {
129+ throw new NotSupportedException ( "ReferenceTaskIds is not supported. AIAgent cannot resume from arbitrary prior task context." ) ;
130+ }
131+
132+ List < ChatMessage > chatMessages = context . Message is not null ? [ context . Message . ToChatMessage ( ) ] : [ ] ;
133+
134+ var options = context . Metadata is { Count : > 0 }
135+ ? new AgentRunOptions { AdditionalProperties = context . Metadata . ToAdditionalProperties ( ) }
136+ : null ;
137+
138+ await foreach ( var update in this . _hostAgent . RunStreamingAsync ( chatMessages , session , options , cancellationToken ) . ConfigureAwait ( false ) )
139+ {
140+ var message = CreateMessageFromUpdate ( contextId , update ) ;
141+ await eventQueue . EnqueueMessageAsync ( message , cancellationToken ) . ConfigureAwait ( false ) ;
142+ }
143+
144+ await this . _hostAgent . SaveSessionAsync ( contextId , session , cancellationToken ) . ConfigureAwait ( false ) ;
145+ }
146+
111147 private async Task HandleTaskUpdateAsync ( RequestContext context , AgentEventQueue eventQueue , CancellationToken cancellationToken )
112148 {
113149 var contextId = context . ContextId ?? Guid . NewGuid ( ) . ToString ( "N" ) ;
@@ -174,6 +210,16 @@ private static Message CreateMessageFromResponse(string contextId, AgentResponse
174210 Metadata = response . AdditionalProperties ? . ToA2AMetadata ( )
175211 } ;
176212
213+ private static Message CreateMessageFromUpdate ( string contextId , AgentResponseUpdate update ) =>
214+ new ( )
215+ {
216+ MessageId = update . ResponseId ?? Guid . NewGuid ( ) . ToString ( "N" ) ,
217+ ContextId = contextId ,
218+ Role = Role . Agent ,
219+ Parts = update . ToParts ( ) ,
220+ Metadata = update . AdditionalProperties ? . ToA2AMetadata ( )
221+ } ;
222+
177223 private static List < ChatMessage > ExtractChatMessagesFromTaskHistory ( AgentTask ? agentTask )
178224 {
179225 if ( agentTask ? . History is not { Count : > 0 } )
0 commit comments