Skip to content

fix: preserve JSON-native types in A2A metadata serialization#5181

Open
YizukiAme wants to merge 2 commits intogoogle:mainfrom
YizukiAme:clean/a2a-metadata-serialization
Open

fix: preserve JSON-native types in A2A metadata serialization#5181
YizukiAme wants to merge 2 commits intogoogle:mainfrom
YizukiAme:clean/a2a-metadata-serialization

Conversation

@YizukiAme
Copy link
Copy Markdown

@YizukiAme YizukiAme commented Apr 7, 2026

Fixes #5183

Problem

_serialize_value() in from_adk_event.py falls through to str() for JSON-native Python types (dict, list, bool, int, float), corrupting structured metadata values into their string representations during A2A event conversion.

For example, a custom_metadata dict like {"retry": True, "max_attempts": 3} gets serialized as "{'retry': True, 'max_attempts': 3}" — a Python repr string instead of a proper JSON object.

Fix

  • Preserve JSON-native types directly: dict, list, str, bool, int, float are now returned as-is since they are already valid JSON values.
  • JSON normalization fallback: For other JSON-serializable objects (e.g., custom classes with __dict__), normalize via json.loads(json.dumps(value)) before falling back to str().
  • Added regression test for structured custom_metadata round-trip to ensure values are not corrupted to strings.

Logs After Fix

$ uv run pytest tests/unittests/a2a/converters/test_event_round_trip.py -v

tests/unittests/a2a/converters/test_event_round_trip.py::test_custom_metadata_structured_roundtrip PASSED

========== 143 passed, 124 warnings in 9.12s ==========

Testing Plan

uv run pytest tests/unittests/a2a/converters/ -v

All 143 A2A converter tests pass. The new test_custom_metadata_structured_roundtrip test verifies that dict, list, bool, int, and float values survive the _serialize_value() → metadata round-trip without being corrupted to strings.

@YizukiAme YizukiAme marked this pull request as draft April 7, 2026 07:54
@YizukiAme YizukiAme marked this pull request as ready for review April 7, 2026 08:04
@YizukiAme YizukiAme force-pushed the clean/a2a-metadata-serialization branch from 7ef9c09 to 6f6c3b7 Compare April 9, 2026 01:30
@rohityan rohityan self-assigned this Apr 9, 2026
@YizukiAme YizukiAme force-pushed the clean/a2a-metadata-serialization branch from 6f6c3b7 to f8be4ae Compare April 9, 2026 09:54
@rohityan rohityan added the a2a [Component] This issue is related a2a support inside ADK. label Apr 9, 2026
@rohityan rohityan added the request clarification [Status] The maintainer need clarification or more information from the author label Apr 9, 2026
@rohityan
Copy link
Copy Markdown
Collaborator

rohityan commented Apr 9, 2026

Hi @YizukiAme , Thank you for your contribution! We appreciate you taking the time to submit this pull request. Can you address my review comment.

@YizukiAme YizukiAme force-pushed the clean/a2a-metadata-serialization branch from d493008 to 732687d Compare April 9, 2026 19:27
YizukiAme and others added 2 commits April 10, 2026 03:30
Signed-off-by: Yizuki_Ame <yinzimike@gmail.com>
Address review feedback: _serialize_value() now recurses into dict/list
values so that nested non-serializable types (datetime, set, etc.) are
gracefully handled instead of being passed through raw.

- str/bool/int/float: return as-is (JSON leaf types)
- dict: recurse into values, coerce keys to str
- list/tuple: recurse into elements
- set/frozenset: convert to sorted list, recurse
- Other: try json.loads(json.dumps(value, default=str)) fallback
- Added regression test for datetime and set inside custom_metadata
@YizukiAme YizukiAme force-pushed the clean/a2a-metadata-serialization branch from 732687d to 0aacc2b Compare April 9, 2026 19:30
@YizukiAme YizukiAme requested a review from rohityan April 9, 2026 19:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

a2a [Component] This issue is related a2a support inside ADK. request clarification [Status] The maintainer need clarification or more information from the author

Projects

None yet

Development

Successfully merging this pull request may close these issues.

A2A _serialize_value() corrupts JSON-native metadata types to strings

2 participants