From d0014b848c9d8455138b51c1d814718f47c2234f Mon Sep 17 00:00:00 2001 From: Yufeng He <40085740+he-yufeng@users.noreply.github.com> Date: Sat, 30 May 2026 21:22:08 +0800 Subject: [PATCH] fix(eval): preserve custom eval metadata --- src/google/adk/evaluation/common.py | 2 +- tests/unittests/evaluation/test_eval_case.py | 24 ++++++++++++++++++++ 2 files changed, 25 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..51a1a2521d 100644 --- a/tests/unittests/evaluation/test_eval_case.py +++ b/tests/unittests/evaluation/test_eval_case.py @@ -22,6 +22,7 @@ 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 @@ -281,3 +282,26 @@ def test_conversation_and_conversation_scenario_mutual_exclusion(): # these two should not cause exceptions EvalCase(eval_id='test_id', conversation=[]) EvalCase(eval_id='test_id', conversation_scenario=test_conversation_scenario) + + +def test_eval_models_preserve_extra_metadata(): + session_input = SessionInput( + app_name='app', + user_id='user', + category='search', + tier='low', + ) + eval_case = EvalCase( + eval_id='case', + conversation=[], + session_input=session_input, + benchmark='smoke', + ) + + assert session_input.model_extra == {'category': 'search', 'tier': 'low'} + assert eval_case.model_extra == {'benchmark': 'smoke'} + + dumped = eval_case.model_dump(by_alias=True) + assert dumped['benchmark'] == 'smoke' + assert dumped['sessionInput']['category'] == 'search' + assert dumped['sessionInput']['tier'] == 'low'