From 1d17dd753391b07b9ea7d379e42e86010cf82b40 Mon Sep 17 00:00:00 2001 From: Yufeng He <40085740+he-yufeng@users.noreply.github.com> Date: Mon, 1 Jun 2026 06:39:07 +0800 Subject: [PATCH] fix(eval): preserve custom eval metadata --- src/google/adk/evaluation/common.py | 2 +- tests/unittests/evaluation/test_eval_case.py | 28 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/google/adk/evaluation/common.py b/src/google/adk/evaluation/common.py index 34fbae195d..3b45d5450b 100644 --- a/src/google/adk/evaluation/common.py +++ b/src/google/adk/evaluation/common.py @@ -22,6 +22,6 @@ class EvalBaseModel(pydantic.BaseModel): model_config = pydantic.ConfigDict( alias_generator=alias_generators.to_camel, populate_by_name=True, - extra="forbid", + extra="allow", arbitrary_types_allowed=True, ) diff --git a/tests/unittests/evaluation/test_eval_case.py b/tests/unittests/evaluation/test_eval_case.py index acf21f6a35..c10aecc151 100644 --- a/tests/unittests/evaluation/test_eval_case.py +++ b/tests/unittests/evaluation/test_eval_case.py @@ -22,10 +22,38 @@ from google.adk.evaluation.eval_case import IntermediateData from google.adk.evaluation.eval_case import InvocationEvent from google.adk.evaluation.eval_case import InvocationEvents +from google.adk.evaluation.eval_case import SessionInput from google.genai import types as genai_types import pytest +def test_eval_models_preserve_extra_metadata(): + session_input = SessionInput( + app_name='app', + user_id='user', + eval_group='retrieval', + source='nightly', + ) + + assert session_input.model_extra == { + 'eval_group': 'retrieval', + 'source': 'nightly', + } + assert session_input.model_dump()['eval_group'] == 'retrieval' + + eval_case = EvalCase( + eval_id='case_1', + conversation=[], + session_input=session_input, + owner='platform', + ) + + assert eval_case.model_extra == {'owner': 'platform'} + dumped = eval_case.model_dump() + assert dumped['owner'] == 'platform' + assert dumped['session_input']['source'] == 'nightly' + + def test_get_all_tool_calls_with_none_input(): """Tests that an empty list is returned when intermediate_data is None.""" assert get_all_tool_calls(None) == []