Skip to content

Commit 6b385e4

Browse files
VectorPeakcopybara-github
authored andcommitted
fix: avoid mutating event validation input
Merge #6314 PiperOrigin-RevId: 943391685
1 parent 555171a commit 6b385e4

2 files changed

Lines changed: 21 additions & 0 deletions

File tree

src/google/adk/events/event.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ def _accept_convenience_kwargs(cls, data: Any) -> Any:
171171
if not isinstance(data, dict):
172172
return data
173173

174+
data = dict(data)
174175
field_names: set[str] = set(cls.model_fields.keys())
175176
for f in cls.model_fields.values():
176177
if f.alias:

tests/unittests/events/test_event.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
"""Unit tests for the helper methods on the Event class."""
1818

19+
import copy
20+
1921
from google.adk.events.event import Event
2022
from google.adk.events.event import NodeInfo
2123
from google.adk.events.event_actions import EventActions
@@ -372,6 +374,24 @@ def test_round_trip_via_content(self):
372374
assert restored.message is not None
373375
assert restored.message.parts[0].text == 'Hello!'
374376

377+
def test_model_validate_does_not_mutate_input_dict(self):
378+
data = {
379+
'message': 'Hello!',
380+
'state': {'key': 'value'},
381+
'route': 'next',
382+
'node_path': 'root.node',
383+
}
384+
original = copy.deepcopy(data)
385+
386+
event = Event.model_validate(data)
387+
388+
assert data == original
389+
assert event.content is not None
390+
assert event.content.parts[0].text == 'Hello!'
391+
assert event.actions.state_delta == {'key': 'value'}
392+
assert event.actions.route == 'next'
393+
assert event.node_info.path == 'root.node'
394+
375395

376396
class TestMessageWithOtherKwargs:
377397
"""Tests message combined with other convenience kwargs."""

0 commit comments

Comments
 (0)