diff --git a/src/google/adk/events/event.py b/src/google/adk/events/event.py index b4304d30fc..6445bcf1ef 100644 --- a/src/google/adk/events/event.py +++ b/src/google/adk/events/event.py @@ -171,6 +171,7 @@ def _accept_convenience_kwargs(cls, data: Any) -> Any: if not isinstance(data, dict): return data + data = dict(data) field_names: set[str] = set(cls.model_fields.keys()) for f in cls.model_fields.values(): if f.alias: diff --git a/tests/unittests/events/test_event.py b/tests/unittests/events/test_event.py index afcc64db7e..8c1fb8794e 100644 --- a/tests/unittests/events/test_event.py +++ b/tests/unittests/events/test_event.py @@ -16,6 +16,8 @@ """Unit tests for the helper methods on the Event class.""" +import copy + from google.adk.events.event import Event from google.adk.events.event import NodeInfo from google.adk.events.event_actions import EventActions @@ -372,6 +374,24 @@ def test_round_trip_via_content(self): assert restored.message is not None assert restored.message.parts[0].text == 'Hello!' + def test_model_validate_does_not_mutate_input_dict(self): + data = { + 'message': 'Hello!', + 'state': {'key': 'value'}, + 'route': 'next', + 'node_path': 'root.node', + } + original = copy.deepcopy(data) + + event = Event.model_validate(data) + + assert data == original + assert event.content is not None + assert event.content.parts[0].text == 'Hello!' + assert event.actions.state_delta == {'key': 'value'} + assert event.actions.route == 'next' + assert event.node_info.path == 'root.node' + class TestMessageWithOtherKwargs: """Tests message combined with other convenience kwargs."""