From 7fa4cee60968d11c4d6b058f777b246550f7d3f8 Mon Sep 17 00:00:00 2001 From: Thumma Dinesh Date: Fri, 23 Jan 2026 17:53:05 +0530 Subject: [PATCH] fix: Add explicit [DONE] signal to SSE stream endpoint Fixes issue where /run_sse endpoint sometimes fails to close the SSE connection after the model's final response, causing client-side hangs. Changes: - Add 'data: [DONE]' termination signal after all events streamed - Send [DONE] in error path as well for consistency - Update test to filter out [DONE] signal --- src/google/adk/cli/adk_web_server.py | 4 ++++ tests/unittests/cli/test_fast_api.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index 4404d62e4e..0d31ec8bfc 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -1557,6 +1557,9 @@ async def event_generator(): "Generated event in agent run streaming: %s", sse_event ) yield f"data: {sse_event}\n\n" + + # Send termination signal after all events have been streamed + yield "data: [DONE]\n\n" except Exception as e: logger.exception("Error in event_generator: %s", e) # Yield a proper Event object for the error @@ -1570,6 +1573,7 @@ async def event_generator(): "data:" f" {error_event.model_dump_json(by_alias=True, exclude_none=True)}\n\n" ) + yield "data: [DONE]\n\n" # Returns a streaming response with the proper media type for SSE return StreamingResponse( diff --git a/tests/unittests/cli/test_fast_api.py b/tests/unittests/cli/test_fast_api.py index 0c69605349..7cf9eeb351 100755 --- a/tests/unittests/cli/test_fast_api.py +++ b/tests/unittests/cli/test_fast_api.py @@ -1005,7 +1005,7 @@ async def run_async_with_artifact_delta( sse_events = [ json.loads(line.removeprefix("data: ")) for line in response.text.splitlines() - if line.startswith("data: ") + if line.startswith("data: ") and line != "data: [DONE]" ] assert len(sse_events) == 2