From 0c451a80a9aee8cf5dbaaffe7c0e5696c80c7b33 Mon Sep 17 00:00:00 2001 From: Enjoy Kumawat Date: Wed, 8 Apr 2026 01:44:38 +0530 Subject: [PATCH 1/2] fix: preserve JSON-native types in A2A _serialize_value() Github-Issue: #5183 --- .../adk/a2a/converters/from_adk_event.py | 4 ++ .../unittests/a2a/converters/test_from_adk.py | 49 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/google/adk/a2a/converters/from_adk_event.py b/src/google/adk/a2a/converters/from_adk_event.py index 05bf16d167..7a59307f8d 100644 --- a/src/google/adk/a2a/converters/from_adk_event.py +++ b/src/google/adk/a2a/converters/from_adk_event.py @@ -249,6 +249,10 @@ def _serialize_value(value: Any) -> Optional[Any]: logger.warning("Failed to serialize Pydantic model, falling back: %s", e) return str(value) + # Pass through JSON-native types as-is + if isinstance(value, (dict, list, int, float, bool, str)): + return value + return str(value) diff --git a/tests/unittests/a2a/converters/test_from_adk.py b/tests/unittests/a2a/converters/test_from_adk.py index 23546c58b0..e55fc9e73c 100644 --- a/tests/unittests/a2a/converters/test_from_adk.py +++ b/tests/unittests/a2a/converters/test_from_adk.py @@ -106,3 +106,52 @@ def test_convert_event_to_a2a_events_none_artifacts(self): """Test convert_event_to_a2a_events with None agents_artifacts.""" with pytest.raises(ValueError, match="Agents artifacts cannot be None"): convert_event_to_a2a_events(self.mock_event, None) + + +class TestSerializeValue: + """Tests for _serialize_value preserving JSON-native types.""" + + def setup_method(self): + from google.adk.a2a.converters.from_adk_event import _serialize_value + + self.serialize = _serialize_value + + def test_dict_preserved(self): + value = {"key": "val", "nested": {"a": 1}} + result = self.serialize(value) + assert result == value + assert isinstance(result, dict) + + def test_list_preserved(self): + value = [1, "two", {"three": 3}] + result = self.serialize(value) + assert result == value + assert isinstance(result, list) + + def test_int_preserved(self): + result = self.serialize(42) + assert result == 42 + assert isinstance(result, int) + + def test_float_preserved(self): + result = self.serialize(3.14) + assert result == 3.14 + assert isinstance(result, float) + + def test_bool_preserved(self): + assert self.serialize(True) is True + assert self.serialize(False) is False + + def test_string_preserved(self): + assert self.serialize("hello") == "hello" + + def test_none_returns_none(self): + assert self.serialize(None) is None + + def test_non_json_type_stringified(self): + """Non-JSON-native types should still be converted to str.""" + from datetime import datetime + + dt = datetime(2025, 1, 1) + result = self.serialize(dt) + assert isinstance(result, str) From 5070c054ce7959d6db571b644f94bffbe6c5e17d Mon Sep 17 00:00:00 2001 From: Enjoy Kumawat Date: Thu, 9 Apr 2026 13:08:09 +0530 Subject: [PATCH 2/2] style: add return type annotations to new test methods --- .../unittests/a2a/converters/test_from_adk.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/unittests/a2a/converters/test_from_adk.py b/tests/unittests/a2a/converters/test_from_adk.py index e55fc9e73c..f657ea3176 100644 --- a/tests/unittests/a2a/converters/test_from_adk.py +++ b/tests/unittests/a2a/converters/test_from_adk.py @@ -111,44 +111,44 @@ def test_convert_event_to_a2a_events_none_artifacts(self): class TestSerializeValue: """Tests for _serialize_value preserving JSON-native types.""" - def setup_method(self): + def setup_method(self) -> None: from google.adk.a2a.converters.from_adk_event import _serialize_value self.serialize = _serialize_value - def test_dict_preserved(self): + def test_dict_preserved(self) -> None: value = {"key": "val", "nested": {"a": 1}} result = self.serialize(value) assert result == value assert isinstance(result, dict) - def test_list_preserved(self): + def test_list_preserved(self) -> None: value = [1, "two", {"three": 3}] result = self.serialize(value) assert result == value assert isinstance(result, list) - def test_int_preserved(self): + def test_int_preserved(self) -> None: result = self.serialize(42) assert result == 42 assert isinstance(result, int) - def test_float_preserved(self): + def test_float_preserved(self) -> None: result = self.serialize(3.14) assert result == 3.14 assert isinstance(result, float) - def test_bool_preserved(self): + def test_bool_preserved(self) -> None: assert self.serialize(True) is True assert self.serialize(False) is False - def test_string_preserved(self): + def test_string_preserved(self) -> None: assert self.serialize("hello") == "hello" - def test_none_returns_none(self): + def test_none_returns_none(self) -> None: assert self.serialize(None) is None - def test_non_json_type_stringified(self): + def test_non_json_type_stringified(self) -> None: """Non-JSON-native types should still be converted to str.""" from datetime import datetime