From 66bc30ab118b23fea78708d530e8540d81c6d3f5 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Tue, 13 Jan 2026 11:34:27 -0800 Subject: [PATCH] refactor: Performance improvements Removed some logging and removed creation of unnecessary objects. PiperOrigin-RevId: 855814280 --- .../com/google/adk/agents/CallbackPlugin.java | 4 +- .../com/google/adk/events/EventActions.java | 126 +++++++++--------- .../google/adk/flows/llmflows/Functions.java | 2 +- ...equestConfirmationLlmRequestProcessor.java | 4 +- .../adk/sessions/InMemorySessionService.java | 6 +- .../adk/sessions/SessionJsonConverter.java | 28 ++-- .../java/com/google/adk/tools/AgentTool.java | 2 +- .../sessions/SessionJsonConverterTest.java | 17 ++- 8 files changed, 96 insertions(+), 93 deletions(-) diff --git a/core/src/main/java/com/google/adk/agents/CallbackPlugin.java b/core/src/main/java/com/google/adk/agents/CallbackPlugin.java index 1d90f218c..791e9455c 100644 --- a/core/src/main/java/com/google/adk/agents/CallbackPlugin.java +++ b/core/src/main/java/com/google/adk/agents/CallbackPlugin.java @@ -15,8 +15,6 @@ */ package com.google.adk.agents; -import static com.google.common.collect.ImmutableList.toImmutableList; - import com.google.adk.agents.Callbacks.AfterAgentCallback; import com.google.adk.agents.Callbacks.AfterAgentCallbackBase; import com.google.adk.agents.Callbacks.AfterAgentCallbackSync; @@ -74,7 +72,7 @@ public String getName() { @SuppressWarnings("unchecked") // The builder ensures that the type is correct. private ImmutableList getCallbacks(Class type) { - return callbacks.get(type).stream().map(callback -> (T) callback).collect(toImmutableList()); + return (ImmutableList) callbacks.get(type); } public ImmutableList getBeforeAgentCallback() { diff --git a/core/src/main/java/com/google/adk/events/EventActions.java b/core/src/main/java/com/google/adk/events/EventActions.java index 93fdd756b..487cca2af 100644 --- a/core/src/main/java/com/google/adk/events/EventActions.java +++ b/core/src/main/java/com/google/adk/events/EventActions.java @@ -30,20 +30,40 @@ @JsonDeserialize(builder = EventActions.Builder.class) public class EventActions { - private Optional skipSummarization = Optional.empty(); - private ConcurrentMap stateDelta = new ConcurrentHashMap<>(); - private ConcurrentMap artifactDelta = new ConcurrentHashMap<>(); - private Optional transferToAgent = Optional.empty(); - private Optional escalate = Optional.empty(); - private ConcurrentMap> requestedAuthConfigs = - new ConcurrentHashMap<>(); - private ConcurrentMap requestedToolConfirmations = - new ConcurrentHashMap<>(); - private Optional endInvocation = Optional.empty(); - private Optional compaction = Optional.empty(); + private Optional skipSummarization; + private ConcurrentMap stateDelta; + private ConcurrentMap artifactDelta; + private Optional transferToAgent; + private Optional escalate; + private ConcurrentMap> requestedAuthConfigs; + private ConcurrentMap requestedToolConfirmations; + private Optional endInvocation; + private Optional compaction; /** Default constructor for Jackson. */ - public EventActions() {} + public EventActions() { + this.skipSummarization = Optional.empty(); + this.stateDelta = new ConcurrentHashMap<>(); + this.artifactDelta = new ConcurrentHashMap<>(); + this.transferToAgent = Optional.empty(); + this.escalate = Optional.empty(); + this.requestedAuthConfigs = new ConcurrentHashMap<>(); + this.requestedToolConfirmations = new ConcurrentHashMap<>(); + this.endInvocation = Optional.empty(); + this.compaction = Optional.empty(); + } + + private EventActions(Builder builder) { + this.skipSummarization = builder.skipSummarization; + this.stateDelta = builder.stateDelta; + this.artifactDelta = builder.artifactDelta; + this.transferToAgent = builder.transferToAgent; + this.escalate = builder.escalate; + this.requestedAuthConfigs = builder.requestedAuthConfigs; + this.requestedToolConfirmations = builder.requestedToolConfirmations; + this.endInvocation = builder.endInvocation; + this.compaction = builder.compaction; + } @JsonProperty("skipSummarization") public Optional skipSummarization() { @@ -191,19 +211,27 @@ public int hashCode() { /** Builder for {@link EventActions}. */ public static class Builder { - private Optional skipSummarization = Optional.empty(); - private ConcurrentMap stateDelta = new ConcurrentHashMap<>(); - private ConcurrentMap artifactDelta = new ConcurrentHashMap<>(); - private Optional transferToAgent = Optional.empty(); - private Optional escalate = Optional.empty(); - private ConcurrentMap> requestedAuthConfigs = - new ConcurrentHashMap<>(); - private ConcurrentMap requestedToolConfirmations = - new ConcurrentHashMap<>(); - private Optional endInvocation = Optional.empty(); - private Optional compaction = Optional.empty(); - - public Builder() {} + private Optional skipSummarization; + private ConcurrentMap stateDelta; + private ConcurrentMap artifactDelta; + private Optional transferToAgent; + private Optional escalate; + private ConcurrentMap> requestedAuthConfigs; + private ConcurrentMap requestedToolConfirmations; + private Optional endInvocation; + private Optional compaction; + + public Builder() { + this.skipSummarization = Optional.empty(); + this.stateDelta = new ConcurrentHashMap<>(); + this.artifactDelta = new ConcurrentHashMap<>(); + this.transferToAgent = Optional.empty(); + this.escalate = Optional.empty(); + this.requestedAuthConfigs = new ConcurrentHashMap<>(); + this.requestedToolConfirmations = new ConcurrentHashMap<>(); + this.endInvocation = Optional.empty(); + this.compaction = Optional.empty(); + } private Builder(EventActions eventActions) { this.skipSummarization = eventActions.skipSummarization(); @@ -284,48 +312,20 @@ public Builder compaction(EventCompaction value) { @CanIgnoreReturnValue public Builder merge(EventActions other) { - if (other.skipSummarization().isPresent()) { - this.skipSummarization = other.skipSummarization(); - } - if (other.stateDelta() != null) { - this.stateDelta.putAll(other.stateDelta()); - } - if (other.artifactDelta() != null) { - this.artifactDelta.putAll(other.artifactDelta()); - } - if (other.transferToAgent().isPresent()) { - this.transferToAgent = other.transferToAgent(); - } - if (other.escalate().isPresent()) { - this.escalate = other.escalate(); - } - if (other.requestedAuthConfigs() != null) { - this.requestedAuthConfigs.putAll(other.requestedAuthConfigs()); - } - if (other.requestedToolConfirmations() != null) { - this.requestedToolConfirmations.putAll(other.requestedToolConfirmations()); - } - if (other.endInvocation().isPresent()) { - this.endInvocation = other.endInvocation(); - } - if (other.compaction().isPresent()) { - this.compaction = other.compaction(); - } + other.skipSummarization().ifPresent(this::skipSummarization); + this.stateDelta.putAll(other.stateDelta()); + this.artifactDelta.putAll(other.artifactDelta()); + other.transferToAgent().ifPresent(this::transferToAgent); + other.escalate().ifPresent(this::escalate); + this.requestedAuthConfigs.putAll(other.requestedAuthConfigs()); + this.requestedToolConfirmations.putAll(other.requestedToolConfirmations()); + other.endInvocation().ifPresent(this::endInvocation); + other.compaction().ifPresent(this::compaction); return this; } public EventActions build() { - EventActions eventActions = new EventActions(); - eventActions.setSkipSummarization(this.skipSummarization); - eventActions.setStateDelta(this.stateDelta); - eventActions.setArtifactDelta(this.artifactDelta); - eventActions.setTransferToAgent(this.transferToAgent); - eventActions.setEscalate(this.escalate); - eventActions.setRequestedAuthConfigs(this.requestedAuthConfigs); - eventActions.setRequestedToolConfirmations(this.requestedToolConfirmations); - eventActions.setEndInvocation(this.endInvocation); - eventActions.setCompaction(this.compaction); - return eventActions; + return new EventActions(this); } } } diff --git a/core/src/main/java/com/google/adk/flows/llmflows/Functions.java b/core/src/main/java/com/google/adk/flows/llmflows/Functions.java index ed4ebc882..8536e470c 100644 --- a/core/src/main/java/com/google/adk/flows/llmflows/Functions.java +++ b/core/src/main/java/com/google/adk/flows/llmflows/Functions.java @@ -368,7 +368,7 @@ public static Set getLongRunningFunctionCalls( continue; } BaseTool tool = tools.get(functionCall.name().get()); - if (tool.longRunning()) { + if (tool != null && tool.longRunning()) { longRunningFunctionCalls.add(functionCall.id().orElse("")); } } diff --git a/core/src/main/java/com/google/adk/flows/llmflows/RequestConfirmationLlmRequestProcessor.java b/core/src/main/java/com/google/adk/flows/llmflows/RequestConfirmationLlmRequestProcessor.java index b0846a091..5008718bf 100644 --- a/core/src/main/java/com/google/adk/flows/llmflows/RequestConfirmationLlmRequestProcessor.java +++ b/core/src/main/java/com/google/adk/flows/llmflows/RequestConfirmationLlmRequestProcessor.java @@ -60,7 +60,7 @@ public Single processRequest( InvocationContext invocationContext, LlmRequest llmRequest) { ImmutableList events = ImmutableList.copyOf(invocationContext.session().events()); if (events.isEmpty()) { - logger.info( + logger.trace( "No events are present in the session. Skipping request confirmation processing."); return Single.just(RequestProcessingResult.create(llmRequest, ImmutableList.of())); } @@ -93,7 +93,7 @@ public Single processRequest( } } if (responses.isEmpty()) { - logger.info("No request confirmation function responses found."); + logger.trace("No request confirmation function responses found."); return Single.just(RequestProcessingResult.create(llmRequest, ImmutableList.of())); } diff --git a/core/src/main/java/com/google/adk/sessions/InMemorySessionService.java b/core/src/main/java/com/google/adk/sessions/InMemorySessionService.java index cef671de4..80c277fce 100644 --- a/core/src/main/java/com/google/adk/sessions/InMemorySessionService.java +++ b/core/src/main/java/com/google/adk/sessions/InMemorySessionService.java @@ -127,7 +127,7 @@ public Maybe getSession( Session sessionCopy = copySession(storedSession); // Apply filtering based on config directly to the mutable list in the copy - GetSessionConfig config = configOpt.orElse(GetSessionConfig.builder().build()); + GetSessionConfig config = configOpt.orElseGet(() -> GetSessionConfig.builder().build()); List eventsInCopy = sessionCopy.events(); config @@ -257,8 +257,8 @@ public Single appendEvent(Session session, Event event) { // --- Update the session stored in this service --- sessions - .getOrDefault(appName, new ConcurrentHashMap<>()) - .getOrDefault(userId, new ConcurrentHashMap<>()) + .computeIfAbsent(appName, k -> new ConcurrentHashMap<>()) + .computeIfAbsent(userId, k -> new ConcurrentHashMap<>()) .put(sessionId, session); mergeWithGlobalState(appName, userId, session); diff --git a/core/src/main/java/com/google/adk/sessions/SessionJsonConverter.java b/core/src/main/java/com/google/adk/sessions/SessionJsonConverter.java index 45a75eb84..5d3c88af3 100644 --- a/core/src/main/java/com/google/adk/sessions/SessionJsonConverter.java +++ b/core/src/main/java/com/google/adk/sessions/SessionJsonConverter.java @@ -94,6 +94,9 @@ static String convertEventToJson(Event event) { actionsJson.put("transferAgent", event.actions().transferToAgent()); actionsJson.put("escalate", event.actions().escalate()); actionsJson.put("requestedAuthConfigs", event.actions().requestedAuthConfigs()); + actionsJson.put("requestedToolConfirmations", event.actions().requestedToolConfirmations()); + actionsJson.put("endInvocation", event.actions().endInvocation()); + actionsJson.put("compaction", event.actions().compaction()); eventJson.put("actions", actionsJson); } if (event.content().isPresent()) { @@ -146,26 +149,25 @@ private static Content convertMapToContent(Object rawContentValue) { */ @SuppressWarnings("unchecked") static Event fromApiEvent(Map apiEvent) { - EventActions eventActions = new EventActions(); + EventActions.Builder eventActionsBuilder = EventActions.builder(); if (apiEvent.get("actions") != null) { Map actionsMap = (Map) apiEvent.get("actions"); - eventActions.setSkipSummarization( - Optional.ofNullable(actionsMap.get("skipSummarization")).map(value -> (Boolean) value)); - eventActions.setStateDelta( + if (actionsMap.get("skipSummarization") != null) { + eventActionsBuilder.skipSummarization((Boolean) actionsMap.get("skipSummarization")); + } + eventActionsBuilder.stateDelta( actionsMap.get("stateDelta") != null ? new ConcurrentHashMap<>((Map) actionsMap.get("stateDelta")) : new ConcurrentHashMap<>()); - eventActions.setArtifactDelta( + eventActionsBuilder.artifactDelta( actionsMap.get("artifactDelta") != null ? convertToArtifactDeltaMap(actionsMap.get("artifactDelta")) : new ConcurrentHashMap<>()); - eventActions.setTransferToAgent( - actionsMap.get("transferAgent") != null - ? (String) actionsMap.get("transferAgent") - : null); - eventActions.setEscalate( - Optional.ofNullable(actionsMap.get("escalate")).map(value -> (Boolean) value)); - eventActions.setRequestedAuthConfigs( + eventActionsBuilder.transferToAgent((String) actionsMap.get("transferAgent")); + if (actionsMap.get("escalate") != null) { + eventActionsBuilder.escalate((Boolean) actionsMap.get("escalate")); + } + eventActionsBuilder.requestedAuthConfigs( Optional.ofNullable(actionsMap.get("requestedAuthConfigs")) .map(SessionJsonConverter::asConcurrentMapOfConcurrentMaps) .orElse(new ConcurrentHashMap<>())); @@ -176,7 +178,7 @@ static Event fromApiEvent(Map apiEvent) { .id((String) Iterables.getLast(Splitter.on('/').split(apiEvent.get("name").toString()))) .invocationId((String) apiEvent.get("invocationId")) .author((String) apiEvent.get("author")) - .actions(eventActions) + .actions(eventActionsBuilder.build()) .content( Optional.ofNullable(apiEvent.get("content")) .map(SessionJsonConverter::convertMapToContent) diff --git a/core/src/main/java/com/google/adk/tools/AgentTool.java b/core/src/main/java/com/google/adk/tools/AgentTool.java index 48d3c9746..a531361f2 100644 --- a/core/src/main/java/com/google/adk/tools/AgentTool.java +++ b/core/src/main/java/com/google/adk/tools/AgentTool.java @@ -109,7 +109,7 @@ public Optional declaration() { public Single> runAsync(Map args, ToolContext toolContext) { if (this.skipSummarization) { - toolContext.actions().setSkipSummarization(true); + toolContext.setActions(toolContext.actions().toBuilder().skipSummarization(true).build()); } Optional agentInputSchema = Optional.empty(); diff --git a/core/src/test/java/com/google/adk/sessions/SessionJsonConverterTest.java b/core/src/test/java/com/google/adk/sessions/SessionJsonConverterTest.java index 8c60b01e9..b77d6f267 100644 --- a/core/src/test/java/com/google/adk/sessions/SessionJsonConverterTest.java +++ b/core/src/test/java/com/google/adk/sessions/SessionJsonConverterTest.java @@ -28,13 +28,16 @@ public final class SessionJsonConverterTest { @Test public void convertEventToJson_fullEvent_success() throws JsonProcessingException { - EventActions actions = new EventActions(); - actions.setSkipSummarization(Optional.of(true)); - actions.setStateDelta(new ConcurrentHashMap<>(ImmutableMap.of("key", "value"))); - actions.setArtifactDelta( - new ConcurrentHashMap<>(ImmutableMap.of("artifact", Part.fromText("artifact_text")))); - actions.setTransferToAgent("agent"); - actions.setEscalate(Optional.of(true)); + EventActions actions = + EventActions.builder() + .skipSummarization(true) + .stateDelta(new ConcurrentHashMap<>(ImmutableMap.of("key", "value"))) + .artifactDelta( + new ConcurrentHashMap<>( + ImmutableMap.of("artifact", Part.fromText("artifact_text")))) + .transferToAgent("agent") + .escalate(true) + .build(); Event event = Event.builder()