@@ -482,7 +482,7 @@ async def _process_streaming_request(
482482 request_obj , context
483483 )
484484
485- return self ._create_response (context , handler_result )
485+ return await self ._create_response (context , handler_result )
486486
487487 async def _process_non_streaming_request (
488488 self ,
@@ -562,9 +562,9 @@ async def _process_non_streaming_request(
562562 )
563563 return self ._generate_error_response (request_id , error )
564564
565- return self ._create_response (context , handler_result )
565+ return await self ._create_response (context , handler_result )
566566
567- def _create_response (
567+ async def _create_response (
568568 self ,
569569 context : ServerCallContext ,
570570 handler_result : AsyncGenerator [dict [str , Any ]] | dict [str , Any ],
@@ -587,15 +587,35 @@ def _create_response(
587587 if exts := context .activated_extensions :
588588 headers [HTTP_EXTENSION_HEADER ] = ', ' .join (sorted (exts ))
589589 if isinstance (handler_result , AsyncGenerator ):
590+ try :
591+ # Prime to see if it fails upfront
592+ first_item = await handler_result .__anext__ ()
593+ except StopAsyncIteration :
594+
595+ async def empty_generator () -> AsyncGenerator [dict [str , str ], None ]:
596+ if False :
597+ yield {}
598+
599+ return EventSourceResponse (empty_generator (), headers = headers )
600+ except Exception as e :
601+ logger .debug ('Upfront exception in streaming handler: %s' , e )
602+ if not isinstance (e , A2AError | JSONRPCError ):
603+ e = InternalError (message = str (e ))
604+ request_id = context .state .get ('request_id' )
605+ error_payload = build_error_response (request_id , e )
606+ return JSONResponse (error_payload , headers = headers )
607+
590608 # Result is a stream of dict objects
591609 async def event_generator (
592610 stream : AsyncGenerator [dict [str , Any ]],
593- ) -> AsyncGenerator [dict [str , str ]]:
611+ first_item : dict [str , Any ],
612+ ) -> AsyncGenerator [dict [str , str ], None ]:
613+ yield {'data' : json .dumps (first_item )}
594614 async for item in stream :
595615 yield {'data' : json .dumps (item )}
596616
597617 return EventSourceResponse (
598- event_generator (handler_result ), headers = headers
618+ event_generator (handler_result , first_item ), headers = headers
599619 )
600620
601621 # handler_result is a dict (JSON-RPC response)
0 commit comments