From 4de0d8c590a96d218985c4b6bad806021390b4f2 Mon Sep 17 00:00:00 2001 From: Hemasekhar Puchuginjala Date: Tue, 14 Jul 2026 13:58:48 +0530 Subject: [PATCH] fix: prevent dropping grounding-only responses in BaseLlmFlow --- .../adk/flows/llmflows/BaseLlmFlow.java | 3 +- .../adk/flows/llmflows/BaseLlmFlowTest.java | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/google/adk/flows/llmflows/BaseLlmFlow.java b/core/src/main/java/com/google/adk/flows/llmflows/BaseLlmFlow.java index 7d62c8505..91cc225f2 100644 --- a/core/src/main/java/com/google/adk/flows/llmflows/BaseLlmFlow.java +++ b/core/src/main/java/com/google/adk/flows/llmflows/BaseLlmFlow.java @@ -746,7 +746,8 @@ private Flowable buildPostprocessingEvents( && (context.runConfig().streamingMode() != StreamingMode.BIDI || updatedResponse.usageMetadata().isEmpty()) && updatedResponse.inputTranscription().isEmpty() - && updatedResponse.outputTranscription().isEmpty()) { + && updatedResponse.outputTranscription().isEmpty() + && updatedResponse.groundingMetadata().isEmpty()) { return processorEvents; } diff --git a/core/src/test/java/com/google/adk/flows/llmflows/BaseLlmFlowTest.java b/core/src/test/java/com/google/adk/flows/llmflows/BaseLlmFlowTest.java index d25f386df..1761871e6 100644 --- a/core/src/test/java/com/google/adk/flows/llmflows/BaseLlmFlowTest.java +++ b/core/src/test/java/com/google/adk/flows/llmflows/BaseLlmFlowTest.java @@ -48,6 +48,7 @@ import com.google.genai.types.FunctionCall; import com.google.genai.types.FunctionDeclaration; import com.google.genai.types.GenerateContentResponseUsageMetadata; +import com.google.genai.types.GroundingMetadata; import com.google.genai.types.Part; import com.google.genai.types.Transcription; import io.opentelemetry.context.Context; @@ -1002,4 +1003,40 @@ public void getRequestProcessorFromTools_throwsOnUnsupportedType() { .hasMessageThat() .contains("Object in tools list is not of a supported type: java.lang.String"); } + + @Test + public void postprocess_onlyGroundingMetadata_returnsEvent() { + GroundingMetadata groundingMetadata = + GroundingMetadata.builder() + .webSearchQueries(ImmutableList.of("What is the capital of France?")) + .build(); + + LlmResponse llmResponse = LlmResponse.builder().groundingMetadata(groundingMetadata).build(); + + InvocationContext invocationContext = + createInvocationContext(createTestAgent(createTestLlm(llmResponse))); + BaseLlmFlow baseLlmFlow = createBaseLlmFlowWithoutProcessors(); + Event baseEvent = + Event.builder() + .invocationId(invocationContext.invocationId()) + .author(invocationContext.agent().name()) + .build(); + + // 2. Act: Run the post-processor + List events = + baseLlmFlow + .postprocess( + invocationContext, + baseEvent, + LlmRequest.builder().build(), + llmResponse, + Context.current()) + .toList() + .blockingGet(); + + assertThat(events).hasSize(1); + Event event = getOnlyElement(events); + assertThat(event.content()).isEmpty(); + assertThat(event.groundingMetadata()).hasValue(groundingMetadata); + } }