What happened?
This is continuation from #1074 as splitting into two issues are suggested by @ishymko
Copied the issue description below for context
Response Stream Array-Wrapping Crash (Transport Layer Mismatch)
By default, Google wraps streaming RPC responses (Flow<StreamResponse>) inside a JSON array [ {"task": ...} ] to frame stream chunk boundaries on the wire.
- The Mismatch: The SDK's legacy compatibility transport (
CompatRestTransport inside a2a/compat/v0_3/rest_transport.py) fails to request standard SSE transcoding from Google because it does not append the standard ?alt=sse query parameter to the stream endpoint URL. This forces Google to fall back to default plain JSON array-wrapped streams.
- The Crash: Standard transports in
a2a/client/transports/rest.py parse stream events using standard Parse (from google.protobuf.json_format):
event: StreamResponse = Parse(sse_data, StreamResponse())
Because standard Parse strictly expects a single JSON object {...}, the leading and trailing array brackets ([ and ]) cause json_format.Parse to crash immediately on the very first chunk:
google.protobuf.json_format.ParseError: Failed to parse {'task': {...}} field: unhashable type: 'dict'.
Thanks for pointing this issue is not specific to v0.3 but v1 as well. Regarding the workaround mentioned in #1074 (comment) , yes it will work with the workaround but this mean all the customer/developer who integrated with Google A2A APIs will require this workaround introduces developer friction. Is there any way we could make this smoother so developer can use SDK with Google A2A API out of the box? Thanks!
Code of Conduct
What happened?
This is continuation from #1074 as splitting into two issues are suggested by @ishymko
Copied the issue description below for context
Response Stream Array-Wrapping Crash (Transport Layer Mismatch)
By default, Google wraps streaming RPC responses (
Flow<StreamResponse>) inside a JSON array[ {"task": ...} ]to frame stream chunk boundaries on the wire.CompatRestTransportinsidea2a/compat/v0_3/rest_transport.py) fails to request standard SSE transcoding from Google because it does not append the standard?alt=ssequery parameter to the stream endpoint URL. This forces Google to fall back to default plain JSON array-wrapped streams.a2a/client/transports/rest.pyparse stream events using standardParse(fromgoogle.protobuf.json_format):Parsestrictly expects a single JSON object{...}, the leading and trailing array brackets ([and]) causejson_format.Parseto crash immediately on the very first chunk:Thanks for pointing this issue is not specific to v0.3 but v1 as well. Regarding the workaround mentioned in #1074 (comment) , yes it will work with the workaround but this mean all the customer/developer who integrated with Google A2A APIs will require this workaround introduces developer friction. Is there any way we could make this smoother so developer can use SDK with Google A2A API out of the box? Thanks!
Code of Conduct