Skip to content

Commit 780b0ab

Browse files
he-yufengDeanChensj
authored andcommitted
fix(eval): preserve custom eval metadata
Merge #5922 ## Summary - allow evaluation models to preserve caller-provided metadata fields - add a regression test covering extra fields on `SessionInput` and `EvalCase` Fixes #5906 ## To verify - `PYTHONPATH=src python -m pytest tests/unittests/evaluation/test_eval_case.py -q` - `python -m pyink --check src/google/adk/evaluation/common.py tests/unittests/evaluation/test_eval_case.py` - `python -m ruff check src/google/adk/evaluation/common.py tests/unittests/evaluation/test_eval_case.py` - `git diff --check` Co-authored-by: Shangjie Chen <deanchen@google.com> COPYBARA_INTEGRATE_REVIEW=#5922 from he-yufeng:fix/eval-extra-metadata-fresh 12bfd3c PiperOrigin-RevId: 933397529
1 parent ff95d2f commit 780b0ab

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

src/google/adk/evaluation/eval_case.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from typing import Union
2020

2121
from google.genai import types as genai_types
22+
import pydantic
2223
from pydantic import Field
2324
from pydantic import model_validator
2425
from typing_extensions import TypeAlias
@@ -115,6 +116,8 @@ class Invocation(EvalBaseModel):
115116
class SessionInput(EvalBaseModel):
116117
"""Values that help initialize a Session."""
117118

119+
model_config = pydantic.ConfigDict(extra="allow")
120+
118121
app_name: str
119122
"""The name of the app."""
120123

@@ -132,6 +135,8 @@ class SessionInput(EvalBaseModel):
132135
class EvalCase(EvalBaseModel):
133136
"""An eval case."""
134137

138+
model_config = pydantic.ConfigDict(extra="allow")
139+
135140
eval_id: str
136141
"""Unique identifier for the evaluation case."""
137142

tests/unittests/evaluation/test_eval_case.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,38 @@
2222
from google.adk.evaluation.eval_case import IntermediateData
2323
from google.adk.evaluation.eval_case import InvocationEvent
2424
from google.adk.evaluation.eval_case import InvocationEvents
25+
from google.adk.evaluation.eval_case import SessionInput
2526
from google.genai import types as genai_types
2627
import pytest
2728

2829

30+
def test_eval_models_preserve_extra_metadata():
31+
session_input = SessionInput(
32+
app_name='app',
33+
user_id='user',
34+
eval_group='retrieval',
35+
source='nightly',
36+
)
37+
38+
assert session_input.model_extra == {
39+
'eval_group': 'retrieval',
40+
'source': 'nightly',
41+
}
42+
assert session_input.model_dump()['eval_group'] == 'retrieval'
43+
44+
eval_case = EvalCase(
45+
eval_id='case_1',
46+
conversation=[],
47+
session_input=session_input,
48+
owner='platform',
49+
)
50+
51+
assert eval_case.model_extra == {'owner': 'platform'}
52+
dumped = eval_case.model_dump()
53+
assert dumped['owner'] == 'platform'
54+
assert dumped['session_input']['source'] == 'nightly'
55+
56+
2957
def test_get_all_tool_calls_with_none_input():
3058
"""Tests that an empty list is returned when intermediate_data is None."""
3159
assert get_all_tool_calls(None) == []

0 commit comments

Comments
 (0)