diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index b97932d042..4c1cf92cc3 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