From 09bf9a99d70bacd67ae741bbebbfad71e8fed821 Mon Sep 17 00:00:00 2001 From: A Vertex SDK engineer Date: Wed, 29 Oct 2025 16:24:54 -0700 Subject: [PATCH] fix: GenAI Client(evals) - Update send online eval service request default value and avoid None value PiperOrigin-RevId: 825754697 --- tests/unit/vertexai/genai/test_evals.py | 84 ++++++++++++++++++++++- vertexai/_genai/_evals_metric_handlers.py | 23 +++---- 2 files changed, 90 insertions(+), 17 deletions(-) diff --git a/tests/unit/vertexai/genai/test_evals.py b/tests/unit/vertexai/genai/test_evals.py index 2c6442818d..d72b48a2fc 100644 --- a/tests/unit/vertexai/genai/test_evals.py +++ b/tests/unit/vertexai/genai/test_evals.py @@ -3749,7 +3749,7 @@ def test_eval_case_to_agent_data_events_only(self): assert agent_data.agent_config is None assert agent_data.events.event[0].parts[0].text == "intermediate event" - def test_eval_case_to_agent_data_empty_events(self): + def test_eval_case_to_agent_data_empty_event_content(self): intermediate_events = [ vertexai_genai_types.Event( event_id="event1", @@ -3774,8 +3774,86 @@ def test_eval_case_to_agent_data_empty_events(self): ) assert agent_data.agent_config is None - assert agent_data.events is None - assert not agent_data.events_text + assert not agent_data.events.event + + def test_eval_case_to_agent_data_empty_intermediate_events_list(self): + agent_info = vertexai_genai_types.evals.AgentInfo( + name="agent1", + instruction="instruction1", + tool_declarations=[], + ) + + eval_case = vertexai_genai_types.EvalCase( + prompt=genai_types.Content(parts=[genai_types.Part(text="Hello")]), + responses=[ + vertexai_genai_types.ResponseCandidate( + response=genai_types.Content(parts=[genai_types.Part(text="Hi")]) + ) + ], + agent_info=agent_info, + ) + + agent_data = ( + _evals_metric_handlers.PredefinedMetricHandler._eval_case_to_agent_data( + eval_case + ) + ) + + assert not agent_data.events.event + + def test_eval_case_to_agent_data_agent_info_empty_tools(self): + agent_info = vertexai_genai_types.evals.AgentInfo( + name="agent1", + instruction="instruction1", + tool_declarations=[], + ) + eval_case = vertexai_genai_types.EvalCase( + prompt=genai_types.Content(parts=[genai_types.Part(text="Hello")]), + responses=[ + vertexai_genai_types.ResponseCandidate( + response=genai_types.Content(parts=[genai_types.Part(text="Hi")]) + ) + ], + agent_info=agent_info, + intermediate_events=None, + ) + + agent_data = ( + _evals_metric_handlers.PredefinedMetricHandler._eval_case_to_agent_data( + eval_case + ) + ) + + assert agent_data.agent_config.developer_instruction.text == "instruction1" + assert not agent_data.agent_config.tools.tool + + def test_eval_case_to_agent_data_agent_info_empty(self): + intermediate_events = [ + vertexai_genai_types.Event( + event_id="event1", + content=genai_types.Content( + parts=[genai_types.Part(text="intermediate event")] + ), + ) + ] + eval_case = vertexai_genai_types.EvalCase( + prompt=genai_types.Content(parts=[genai_types.Part(text="Hello")]), + responses=[ + vertexai_genai_types.ResponseCandidate( + response=genai_types.Content(parts=[genai_types.Part(text="Hi")]) + ) + ], + agent_info=None, + intermediate_events=intermediate_events, + ) + + agent_data = ( + _evals_metric_handlers.PredefinedMetricHandler._eval_case_to_agent_data( + eval_case + ) + ) + + assert agent_data.agent_config is None @pytest.mark.usefixtures("google_auth_mock") diff --git a/vertexai/_genai/_evals_metric_handlers.py b/vertexai/_genai/_evals_metric_handlers.py index acbeda2afd..322d3aff71 100644 --- a/vertexai/_genai/_evals_metric_handlers.py +++ b/vertexai/_genai/_evals_metric_handlers.py @@ -854,8 +854,9 @@ def _eval_case_to_agent_data( return None tools = None developer_instruction = None - events = None agent_config = None + tool_declarations = [] + event_contents = [] if eval_case.agent_info: agent_info = eval_case.agent_info @@ -865,7 +866,8 @@ def _eval_case_to_agent_data( ) if agent_info.tool_declarations: tool_declarations = agent_info.tool_declarations - tools = types.evals.Tools(tool=tool_declarations) + tools = types.evals.Tools(tool=tool_declarations) + if tools or developer_instruction: agent_config = types.evals.AgentConfig( tools=tools, @@ -878,19 +880,12 @@ def _eval_case_to_agent_data( for event in eval_case.intermediate_events if event.content ] - if event_contents: - events = types.evals.Events(event=event_contents) + events = types.evals.Events(event=event_contents) - if events: - return types.evals.AgentData( - agent_config=agent_config, - events=events, - ) - else: - return types.evals.AgentData( - agent_config=agent_config, - events_text="", - ) + return types.evals.AgentData( + agent_config=agent_config, + events=events, + ) def _build_request_payload( self, eval_case: types.EvalCase, response_index: int