diff --git a/src/google/adk/a2a/converters/from_adk_event.py b/src/google/adk/a2a/converters/from_adk_event.py index d64c1940fa..e68996ea87 100644 --- a/src/google/adk/a2a/converters/from_adk_event.py +++ b/src/google/adk/a2a/converters/from_adk_event.py @@ -266,6 +266,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..f657ea3176 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) -> None: + from google.adk.a2a.converters.from_adk_event import _serialize_value + + self.serialize = _serialize_value + + 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) -> None: + value = [1, "two", {"three": 3}] + result = self.serialize(value) + assert result == value + assert isinstance(result, list) + + def test_int_preserved(self) -> None: + result = self.serialize(42) + assert result == 42 + assert isinstance(result, int) + + def test_float_preserved(self) -> None: + result = self.serialize(3.14) + assert result == 3.14 + assert isinstance(result, float) + + def test_bool_preserved(self) -> None: + assert self.serialize(True) is True + assert self.serialize(False) is False + + def test_string_preserved(self) -> None: + assert self.serialize("hello") == "hello" + + def test_none_returns_none(self) -> None: + assert self.serialize(None) is None + + def test_non_json_type_stringified(self) -> None: + """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)