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();