diff --git a/contrib/sarvam-ai/pom.xml b/contrib/sarvam-ai/pom.xml
index 4b6a6b069..22a28d0bc 100644
--- a/contrib/sarvam-ai/pom.xml
+++ b/contrib/sarvam-ai/pom.xml
@@ -20,7 +20,7 @@
com.google.adk
google-adk-parent
- 1.4.1-SNAPSHOT
+ 1.5.1-SNAPSHOT
../../pom.xml
diff --git a/core/pom.xml b/core/pom.xml
index a75682651..2fe68eb8c 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -310,6 +310,16 @@
4.12.0
test
+
+ org.json
+ json
+ 20180813
+
+
+ org.mapdb
+ mapdb
+ 3.0.8
+
diff --git a/core/src/main/java/com/google/adk/models/GeminiLlmConnection.java b/core/src/main/java/com/google/adk/models/GeminiLlmConnection.java
index 20b78921a..fbc9bf3e1 100644
--- a/core/src/main/java/com/google/adk/models/GeminiLlmConnection.java
+++ b/core/src/main/java/com/google/adk/models/GeminiLlmConnection.java
@@ -164,6 +164,21 @@ static Optional convertToServerResponse(LiveServerMessage message)
} else if (message.setupComplete().isPresent()) {
logger.debug("Received setup complete.");
return Optional.empty();
+ } else if (message.sessionResumptionUpdate().isPresent()) {
+ logger.debug(
+ "Received session resumption update: {}", message.sessionResumptionUpdate().get());
+ return Optional.empty();
+ } else if (message.goAway().isPresent()) {
+ logger.debug("Received go away: {}", message.goAway().get());
+ return Optional.empty();
+ } else if (message.voiceActivityDetectionSignal().isPresent()) {
+ logger.debug(
+ "Received voice activity detection signal: {}",
+ message.voiceActivityDetectionSignal().get());
+ return Optional.empty();
+ } else if (message.voiceActivity().isPresent()) {
+ logger.debug("Received voice activity: {}", message.voiceActivity().get());
+ return Optional.empty();
} else if (message.usageMetadata().isEmpty()) {
logger.warn("Received unknown or empty server message: {}", message.toJson());
builder
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 043f56fa3..de92209fb 100644
--- a/core/src/main/java/com/google/adk/runner/Runner.java
+++ b/core/src/main/java/com/google/adk/runner/Runner.java
@@ -749,7 +749,23 @@ protected Flowable runLiveImpl(
updatedInvocationContext
.agent()
.runLive(updatedInvocationContext)
- .doOnNext(event -> this.sessionService.appendEvent(session, event)))
+ .doOnNext(event -> this.sessionService.appendEvent(session, event))
+ .concatMapSingle(
+ event -> {
+ return updatedInvocationContext
+ .pluginManager()
+ .onEventCallback(updatedInvocationContext, event)
+ .defaultIfEmpty(event);
+ })
+ // Run afterRunCallback once the live run completes so plugins can flush
+ // or log aggregates (e.g. total token usage for the session).
+ .concatWith(
+ Completable.defer(
+ () -> {
+ return updatedInvocationContext
+ .pluginManager()
+ .afterRunCallback(updatedInvocationContext);
+ })))
.doOnError(
throwable -> {
Span span = Span.current();
diff --git a/core/src/test/java/com/google/adk/models/GeminiLlmConnectionTest.java b/core/src/test/java/com/google/adk/models/GeminiLlmConnectionTest.java
index 6a95e1532..43c5bbf3f 100644
--- a/core/src/test/java/com/google/adk/models/GeminiLlmConnectionTest.java
+++ b/core/src/test/java/com/google/adk/models/GeminiLlmConnectionTest.java
@@ -190,6 +190,22 @@ public void convertToServerResponse_withSetupComplete_returnsEmpty() {
assertThat(result.isPresent()).isFalse();
}
+ @Test
+ public void convertToServerResponse_withSessionResumptionUpdate_returnsEmpty() {
+ LiveServerMessage message =
+ LiveServerMessage.builder()
+ .sessionResumptionUpdate(
+ com.google.genai.types.LiveServerSessionResumptionUpdate.builder()
+ .newHandle("handle-123")
+ .resumable(true)
+ .build())
+ .build();
+
+ Optional result = GeminiLlmConnection.convertToServerResponse(message);
+
+ assertThat(result.isPresent()).isFalse();
+ }
+
@Test
public void convertToServerResponse_withUnknownMessage_returnsErrorResponse() {
LiveServerMessage message = LiveServerMessage.builder().build();