Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/google/adk/a2a/converters/from_adk_event.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)


Expand Down
49 changes: 49 additions & 0 deletions tests/unittests/a2a/converters/test_from_adk.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Loading