mirror of
https://github.com/encounter/adk-python.git
synced 2026-07-09 18:19:28 -07:00
fix: Stream errors as simple JSON objects in ADK web server SSE
The ADK web server's /run_sse endpoint now yields a JSON object like {"error": "..."} when an exception occurs during event generation. The adk_web_server_client is updated to detect this error payload and raise a RuntimeError.
Close #4291
Co-authored-by: George Weale <gweale@google.com>
PiperOrigin-RevId: 863475838
This commit is contained in:
committed by
Copybara-Service
parent
d0102ecea3
commit
798d0053c8
@@ -1474,17 +1474,7 @@ class AdkWebServer:
|
||||
yield f"data: {sse_event}\n\n"
|
||||
except Exception as e:
|
||||
logger.exception("Error in event_generator: %s", e)
|
||||
# Yield a proper Event object for the error
|
||||
error_event = Event(
|
||||
author="system",
|
||||
content=types.Content(
|
||||
role="model", parts=[types.Part(text=f"Error: {e}")]
|
||||
),
|
||||
)
|
||||
yield (
|
||||
"data:"
|
||||
f" {error_event.model_dump_json(by_alias=True, exclude_none=True)}\n\n"
|
||||
)
|
||||
yield f"data: {json.dumps({'error': str(e)})}\n\n"
|
||||
|
||||
# Returns a streaming response with the proper media type for SSE
|
||||
return StreamingResponse(
|
||||
|
||||
@@ -228,6 +228,7 @@ class AdkWebServerClient:
|
||||
ValueError: If mode is provided but test_case_dir or user_message_index is None
|
||||
httpx.HTTPStatusError: If the request fails
|
||||
json.JSONDecodeError: If event data cannot be parsed
|
||||
RuntimeError: If the server streams an error payload
|
||||
"""
|
||||
# Add recording parameters to state_delta for conformance tests
|
||||
if mode:
|
||||
@@ -262,6 +263,8 @@ class AdkWebServerClient:
|
||||
async for line in response.aiter_lines():
|
||||
if line.startswith("data:") and (data := line[5:].strip()):
|
||||
event_data = json.loads(data)
|
||||
if isinstance(event_data, dict) and "error" in event_data:
|
||||
raise RuntimeError(event_data["error"])
|
||||
yield Event.model_validate(event_data)
|
||||
else:
|
||||
logger.debug("Non data line received: %s", line)
|
||||
|
||||
Reference in New Issue
Block a user