From 0e37368e39e20b7bf6633787ac2e5ec4bbed7a47 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Thu, 26 Mar 2026 17:41:10 -0700 Subject: [PATCH] fix: include intermediate subagent final response events in evaluation intermediate data PiperOrigin-RevId: 890136196 --- .../adk/evaluation/evaluation_generator.py | 13 ++++++----- .../evaluation/test_evaluation_generator.py | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/google/adk/evaluation/evaluation_generator.py b/src/google/adk/evaluation/evaluation_generator.py index 725bddc11c..f8fb6795aa 100644 --- a/src/google/adk/evaluation/evaluation_generator.py +++ b/src/google/adk/evaluation/evaluation_generator.py @@ -280,6 +280,7 @@ def convert_events_to_eval_invocations( invocations = [] for invocation_id, events in events_by_invocation_id.items(): final_response = None + final_event = None user_content = Content(parts=[]) invocation_timestamp = 0 app_details = None @@ -304,15 +305,17 @@ def convert_events_to_eval_invocations( if event.content and event.content.parts: if event.is_final_response(): final_response = event.content - else: - for p in event.content.parts: - if p.function_call or p.function_response or p.text: - events_to_add.append(event) - break + final_event = event + + for p in event.content.parts: + if p.function_call or p.function_response or p.text: + events_to_add.append(event) + break invocation_events = [ InvocationEvent(author=e.author, content=e.content) for e in events_to_add + if e is not final_event ] invocations.append( Invocation( diff --git a/tests/unittests/evaluation/test_evaluation_generator.py b/tests/unittests/evaluation/test_evaluation_generator.py index 29ac75ffb5..a4aa8691fd 100644 --- a/tests/unittests/evaluation/test_evaluation_generator.py +++ b/tests/unittests/evaluation/test_evaluation_generator.py @@ -204,6 +204,28 @@ def test_multi_agent( assert events[2].author == "sub_agent_1" assert events[3].author == "sub_agent_2" + def test_convert_multi_agent_final_responses( + self, + ): + """Tests that only the last final response is excluded from intermediate data.""" + events = [ + _build_event("user", [types.Part(text="Hello")], "inv1"), + _build_event("agent1", [types.Part(text="First response")], "inv1"), + _build_event("agent2", [types.Part(text="Second response")], "inv1"), + ] + + invocations = EvaluationGenerator.convert_events_to_eval_invocations(events) + + assert len(invocations) == 1 + invocation = invocations[0] + assert invocation.final_response.parts[0].text == "Second response" + + intermediate_events = invocation.intermediate_data.invocation_events + # agent1 is included because it is not the final_event (which is agent2) + assert len(intermediate_events) == 1 + assert intermediate_events[0].author == "agent1" + assert intermediate_events[0].content.parts[0].text == "First response" + class TestGetAppDetailsByInvocationId: """Test cases for EvaluationGenerator._get_app_details_by_invocation_id method."""