@@ -420,7 +420,7 @@ async def _handle_sse_response(
420420
421421 try :
422422 event_source = EventSource (response )
423- async for sse in event_source .aiter_sse (): # pragma: no branch
423+ async for sse in event_source .aiter_sse ():
424424 # Track last event ID for potential reconnection
425425 if sse .id :
426426 last_event_id = sse .id
@@ -440,13 +440,17 @@ async def _handle_sse_response(
440440 if is_complete :
441441 await response .aclose ()
442442 return # Normal completion, no reconnect needed
443- except Exception as e : # pragma: no cover
444- logger .debug (f"SSE stream ended: { e } " )
445443
446- # Stream ended without response - reconnect if we received an event with ID
447- if last_event_id is not None : # pragma: no branch
448- logger .info ("SSE stream disconnected, reconnecting..." )
449- await self ._handle_reconnection (ctx , last_event_id , retry_interval_ms )
444+ # Stream ended without response - try to reconnect if we have an event ID
445+ if last_event_id is not None :
446+ logger .info ("SSE stream disconnected, reconnecting..." )
447+ await self ._handle_reconnection (ctx , last_event_id , retry_interval_ms )
448+ else :
449+ # No event ID received, can't reconnect - report error
450+ raise Exception ("SSE stream ended without completing" )
451+ except Exception as exc :
452+ logger .exception ("Error handling SSE response" )
453+ await self ._send_error_response (ctx , exc )
450454
451455 async def _handle_reconnection (
452456 self ,
@@ -455,11 +459,16 @@ async def _handle_reconnection(
455459 retry_interval_ms : int | None = None ,
456460 attempt : int = 0 ,
457461 ) -> None :
458- """Reconnect with Last-Event-ID to resume stream after server disconnect."""
462+ """Reconnect with Last-Event-ID to resume stream after server disconnect.
463+
464+ Raises:
465+ Exception: If max reconnection attempts exceeded or reconnection fails.
466+ """
459467 # Bail if max retries exceeded
460- if attempt >= MAX_RECONNECTION_ATTEMPTS : # pragma: no cover
461- logger .debug (f"Max reconnection attempts ({ MAX_RECONNECTION_ATTEMPTS } ) exceeded" )
462- return
468+ if attempt >= MAX_RECONNECTION_ATTEMPTS :
469+ raise Exception (
470+ f"SSE stream reconnection failed after { MAX_RECONNECTION_ATTEMPTS } attempts"
471+ )
463472
464473 # Always wait - use server value or default
465474 delay_ms = retry_interval_ms if retry_interval_ms is not None else DEFAULT_RECONNECTION_DELAY_MS
@@ -506,7 +515,7 @@ async def _handle_reconnection(
506515 # Stream ended again without response - reconnect again (reset attempt counter)
507516 logger .info ("SSE stream disconnected, reconnecting..." )
508517 await self ._handle_reconnection (ctx , reconnect_last_event_id , reconnect_retry_ms , 0 )
509- except Exception as e : # pragma: no cover
518+ except Exception as e :
510519 logger .debug (f"Reconnection failed: { e } " )
511520 # Try to reconnect again if we still have an event ID
512521 await self ._handle_reconnection (ctx , last_event_id , retry_interval_ms , attempt + 1 )
0 commit comments