From 229654e20a6ffc733854e3c0de9049bbad494228 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Wed, 14 Jan 2026 06:24:33 -0800 Subject: [PATCH] feat: Allow EventsCompactionConfig to have a null summarizer initially The Runner will now attempt to automatically create an LlmEventSummarizer from the agent's model if the provided EventsCompactionConfig does not have a summarizer. The SlidingWindowEventCompactor now includes a check to ensure a summarizer is present before compaction. PiperOrigin-RevId: 856184722 --- .../java/com/google/adk/runner/Runner.java | 25 ++++++++++++++++++- .../summarizer/EventsCompactionConfig.java | 9 ++++++- .../SlidingWindowEventCompactor.java | 6 ++++- .../com/google/adk/runner/RunnerTest.java | 4 +-- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/google/adk/runner/Runner.java b/core/src/main/java/com/google/adk/runner/Runner.java index 6a705059..740b5469 100644 --- a/core/src/main/java/com/google/adk/runner/Runner.java +++ b/core/src/main/java/com/google/adk/runner/Runner.java @@ -29,12 +29,14 @@ import com.google.adk.events.EventActions; import com.google.adk.flows.llmflows.ResumabilityConfig; import com.google.adk.memory.BaseMemoryService; +import com.google.adk.models.Model; import com.google.adk.plugins.BasePlugin; import com.google.adk.plugins.PluginManager; import com.google.adk.sessions.BaseSessionService; import com.google.adk.sessions.InMemorySessionService; import com.google.adk.sessions.Session; import com.google.adk.summarizer.EventsCompactionConfig; +import com.google.adk.summarizer.LlmEventSummarizer; import com.google.adk.summarizer.SlidingWindowEventCompactor; import com.google.adk.tools.BaseTool; import com.google.adk.tools.FunctionTool; @@ -252,7 +254,7 @@ protected Runner( this.memoryService = memoryService; this.pluginManager = new PluginManager(plugins); this.resumabilityConfig = resumabilityConfig; - this.eventsCompactionConfig = eventsCompactionConfig; + this.eventsCompactionConfig = createEventsCompactionConfig(agent, eventsCompactionConfig); } /** @@ -786,5 +788,26 @@ private boolean hasLiveRequestQueueParameter(FunctionTool functionTool) { .anyMatch(parameter -> parameter.getType().equals(LiveRequestQueue.class)); } + @Nullable + private static EventsCompactionConfig createEventsCompactionConfig( + BaseAgent agent, @Nullable EventsCompactionConfig config) { + if (config == null || config.summarizer() != null) { + return config; + } + LlmEventSummarizer summarizer = + Optional.of(agent) + .filter(LlmAgent.class::isInstance) + .map(LlmAgent.class::cast) + .flatMap(LlmAgent::model) + .flatMap(Model::model) + .map(LlmEventSummarizer::new) + .orElseThrow( + () -> + new IllegalArgumentException( + "No BaseLlm model available for event compaction")); + return new EventsCompactionConfig( + config.compactionInterval(), config.overlapSize(), summarizer); + } + // TODO: run statelessly } diff --git a/core/src/main/java/com/google/adk/summarizer/EventsCompactionConfig.java b/core/src/main/java/com/google/adk/summarizer/EventsCompactionConfig.java index 8a92dfb0..76604130 100644 --- a/core/src/main/java/com/google/adk/summarizer/EventsCompactionConfig.java +++ b/core/src/main/java/com/google/adk/summarizer/EventsCompactionConfig.java @@ -16,6 +16,8 @@ package com.google.adk.summarizer; +import javax.annotation.Nullable; + /** * Configuration for event compaction. * @@ -27,4 +29,9 @@ * @param summarizer An event summarizer to use for compaction. */ public record EventsCompactionConfig( - int compactionInterval, int overlapSize, BaseEventSummarizer summarizer) {} + int compactionInterval, int overlapSize, @Nullable BaseEventSummarizer summarizer) { + + public EventsCompactionConfig(int compactionInterval, int overlapSize) { + this(compactionInterval, overlapSize, null); + } +} diff --git a/core/src/main/java/com/google/adk/summarizer/SlidingWindowEventCompactor.java b/core/src/main/java/com/google/adk/summarizer/SlidingWindowEventCompactor.java index 9c1da3ad..ac0176de 100644 --- a/core/src/main/java/com/google/adk/summarizer/SlidingWindowEventCompactor.java +++ b/core/src/main/java/com/google/adk/summarizer/SlidingWindowEventCompactor.java @@ -16,6 +16,8 @@ package com.google.adk.summarizer; +import static com.google.common.base.Preconditions.checkArgument; + import com.google.adk.events.Event; import com.google.adk.events.EventCompaction; import com.google.adk.sessions.BaseSessionService; @@ -97,11 +99,13 @@ public SlidingWindowEventCompactor(EventsCompactionConfig config) { */ @Override public Completable compact(Session session, BaseSessionService sessionService) { + BaseEventSummarizer summarizer = config.summarizer(); + checkArgument(summarizer != null, "Missing BaseEventSummarizer for event compaction"); logger.debug("Running event compaction for session {}", session.id()); return Completable.fromMaybe( getCompactionEvents(session) - .flatMap(config.summarizer()::summarizeEvents) + .flatMap(summarizer::summarizeEvents) .flatMapSingle(e -> sessionService.appendEvent(session, e))); } diff --git a/core/src/test/java/com/google/adk/runner/RunnerTest.java b/core/src/test/java/com/google/adk/runner/RunnerTest.java index 379daa43..994acca2 100644 --- a/core/src/test/java/com/google/adk/runner/RunnerTest.java +++ b/core/src/test/java/com/google/adk/runner/RunnerTest.java @@ -40,7 +40,6 @@ import com.google.adk.plugins.BasePlugin; import com.google.adk.sessions.Session; import com.google.adk.summarizer.EventsCompactionConfig; -import com.google.adk.summarizer.LlmEventSummarizer; import com.google.adk.testing.TestLlm; import com.google.adk.testing.TestUtils; import com.google.adk.testing.TestUtils.EchoTool; @@ -134,8 +133,7 @@ public void eventsCompaction_enabled() { Runner runner = Runner.builder() - .eventsCompactionConfig( - new EventsCompactionConfig(1, 0, new LlmEventSummarizer(testLlm))) + .eventsCompactionConfig(new EventsCompactionConfig(1, 0)) .agent(agent) .sessionService(this.runner.sessionService()) .appName(this.runner.appName())