From 67b602f245f564238ea22298a37bf70049e56a12 Mon Sep 17 00:00:00 2001 From: Maciej Szwaja Date: Fri, 6 Mar 2026 11:01:57 -0800 Subject: [PATCH] feat!: use @Nullable fields in Event class PiperOrigin-RevId: 879717644 --- .../com/google/adk/a2a/RemoteA2AAgent.java | 2 +- .../adk/a2a/converters/ResponseConverter.java | 2 +- .../adk/a2a/executor/AgentExecutorTest.java | 6 +- .../java/com/google/adk/agents/BaseAgent.java | 4 +- .../java/com/google/adk/events/Event.java | 224 ++++++------------ .../adk/flows/llmflows/BaseLlmFlow.java | 28 +-- .../adk/flows/llmflows/CodeExecution.java | 6 +- .../google/adk/flows/llmflows/Contents.java | 4 +- .../google/adk/flows/llmflows/Functions.java | 10 +- .../java/com/google/adk/runner/Runner.java | 4 +- .../adk/sessions/SessionJsonConverter.java | 9 +- .../java/com/google/adk/events/EventTest.java | 2 + .../adk/flows/llmflows/ContentsTest.java | 4 +- .../adk/flows/llmflows/FunctionsTest.java | 8 +- .../google/adk/plugins/LoggingPluginTest.java | 2 - .../sessions/SessionJsonConverterTest.java | 7 +- 16 files changed, 113 insertions(+), 209 deletions(-) diff --git a/a2a/src/main/java/com/google/adk/a2a/RemoteA2AAgent.java b/a2a/src/main/java/com/google/adk/a2a/RemoteA2AAgent.java index b8ff39808..b391f2985 100644 --- a/a2a/src/main/java/com/google/adk/a2a/RemoteA2AAgent.java +++ b/a2a/src/main/java/com/google/adk/a2a/RemoteA2AAgent.java @@ -436,7 +436,7 @@ private boolean mergeAggregatedContentIntoEvent(Event event) { } Content aggregatedContent = Content.builder().role("model").parts(parts).build(); - event.setContent(Optional.of(aggregatedContent)); + event.setContent(aggregatedContent); ImmutableList.Builder newMetadata = ImmutableList.builder(); event.customMetadata().ifPresent(newMetadata::addAll); diff --git a/a2a/src/main/java/com/google/adk/a2a/converters/ResponseConverter.java b/a2a/src/main/java/com/google/adk/a2a/converters/ResponseConverter.java index ccbb1b9cf..57a84b58f 100644 --- a/a2a/src/main/java/com/google/adk/a2a/converters/ResponseConverter.java +++ b/a2a/src/main/java/com/google/adk/a2a/converters/ResponseConverter.java @@ -76,7 +76,7 @@ private static Optional handleTaskUpdate( boolean isLastChunk = Objects.equals(artifactEvent.isLastChunk(), true); Event eventPart = artifactToEvent(artifactEvent.getArtifact(), context); - eventPart.setPartial(Optional.of(isAppend || !isLastChunk)); + eventPart.setPartial(isAppend || !isLastChunk); // append=true, lastChunk=false: emit as partial, update aggregation // append=false, lastChunk=false: emit as partial, reset aggregation // append=true, lastChunk=true: emit as partial, update aggregation and emit as non-partial diff --git a/a2a/src/test/java/com/google/adk/a2a/executor/AgentExecutorTest.java b/a2a/src/test/java/com/google/adk/a2a/executor/AgentExecutorTest.java index 5570f40d0..647aaf21f 100644 --- a/a2a/src/test/java/com/google/adk/a2a/executor/AgentExecutorTest.java +++ b/a2a/src/test/java/com/google/adk/a2a/executor/AgentExecutorTest.java @@ -361,7 +361,7 @@ private RequestContext createRequestContext() { public void process_statefulAggregation_tracksArtifactIdAndAppendForAuthor() { Event partial1 = Event.builder() - .partial(Optional.of(true)) + .partial(true) .author("agent_author") .content( Content.builder() @@ -370,7 +370,7 @@ public void process_statefulAggregation_tracksArtifactIdAndAppendForAuthor() { .build(); Event partial2 = Event.builder() - .partial(Optional.of(true)) + .partial(true) .author("agent_author") .content( Content.builder() @@ -379,7 +379,7 @@ public void process_statefulAggregation_tracksArtifactIdAndAppendForAuthor() { .build(); Event finalEvent = Event.builder() - .partial(Optional.of(false)) + .partial(false) .author("agent_author") .content( Content.builder() diff --git a/core/src/main/java/com/google/adk/agents/BaseAgent.java b/core/src/main/java/com/google/adk/agents/BaseAgent.java index 226e61abe..d74ba9ca5 100644 --- a/core/src/main/java/com/google/adk/agents/BaseAgent.java +++ b/core/src/main/java/com/google/adk/agents/BaseAgent.java @@ -409,7 +409,7 @@ private Single> callCallback( .id(Event.generateEventId()) .invocationId(invocationContext.invocationId()) .author(name()) - .branch(invocationContext.branch()) + .branch(invocationContext.branch().orElse(null)) .actions(callbackContext.eventActions()) .content(content) .build()); @@ -426,7 +426,7 @@ private Single> callCallback( .id(Event.generateEventId()) .invocationId(invocationContext.invocationId()) .author(name()) - .branch(invocationContext.branch()) + .branch(invocationContext.branch().orElse(null)) .actions(callbackContext.eventActions()); return Single.just(Optional.of(eventBuilder.build())); diff --git a/core/src/main/java/com/google/adk/events/Event.java b/core/src/main/java/com/google/adk/events/Event.java index 91dc79a56..2677b635d 100644 --- a/core/src/main/java/com/google/adk/events/Event.java +++ b/core/src/main/java/com/google/adk/events/Event.java @@ -49,21 +49,21 @@ public class Event extends JsonBaseModel { private String id; private String invocationId; private String author; - private Optional content = Optional.empty(); + private @Nullable Content content; private EventActions actions; - private Optional> longRunningToolIds = Optional.empty(); - private Optional partial = Optional.empty(); - private Optional turnComplete = Optional.empty(); - private Optional errorCode = Optional.empty(); - private Optional errorMessage = Optional.empty(); - private Optional finishReason = Optional.empty(); - private Optional usageMetadata = Optional.empty(); - private Optional avgLogprobs = Optional.empty(); - private Optional interrupted = Optional.empty(); - private Optional branch = Optional.empty(); - private Optional groundingMetadata = Optional.empty(); - private Optional> customMetadata = Optional.empty(); - private Optional modelVersion = Optional.empty(); + private @Nullable Set longRunningToolIds; + private @Nullable Boolean partial; + private @Nullable Boolean turnComplete; + private @Nullable FinishReason errorCode; + private @Nullable String errorMessage; + private @Nullable FinishReason finishReason; + private @Nullable GenerateContentResponseUsageMetadata usageMetadata; + private @Nullable Double avgLogprobs; + private @Nullable Boolean interrupted; + private @Nullable String branch; + private @Nullable GroundingMetadata groundingMetadata; + private @Nullable List customMetadata; + private @Nullable String modelVersion; private long timestamp; private Event() {} @@ -104,10 +104,10 @@ public void setAuthor(String author) { @JsonProperty("content") public Optional content() { - return content; + return Optional.ofNullable(content); } - public void setContent(Optional content) { + public void setContent(@Nullable Content content) { this.content = content; } @@ -126,10 +126,10 @@ public void setActions(EventActions actions) { */ @JsonProperty("longRunningToolIds") public Optional> longRunningToolIds() { - return longRunningToolIds; + return Optional.ofNullable(longRunningToolIds); } - public void setLongRunningToolIds(Optional> longRunningToolIds) { + public void setLongRunningToolIds(@Nullable Set longRunningToolIds) { this.longRunningToolIds = longRunningToolIds; } @@ -139,73 +139,79 @@ public void setLongRunningToolIds(Optional> longRunningToolIds) { */ @JsonProperty("partial") public Optional partial() { - return partial; + return Optional.ofNullable(partial); } - public void setPartial(Optional partial) { + public void setPartial(@Nullable Boolean partial) { this.partial = partial; } @JsonProperty("turnComplete") public Optional turnComplete() { - return turnComplete; + return Optional.ofNullable(turnComplete); } - public void setTurnComplete(Optional turnComplete) { + public void setTurnComplete(@Nullable Boolean turnComplete) { this.turnComplete = turnComplete; } @JsonProperty("errorCode") public Optional errorCode() { - return errorCode; + return Optional.ofNullable(errorCode); } @JsonProperty("finishReason") public Optional finishReason() { - return finishReason; + return Optional.ofNullable(finishReason); } - public void setErrorCode(Optional errorCode) { + public void setErrorCode(@Nullable FinishReason errorCode) { this.errorCode = errorCode; } + @Deprecated + @SuppressWarnings("checkstyle:IllegalType") public void setFinishReason(Optional finishReason) { + this.finishReason = finishReason.orElse(null); + } + + public void setFinishReason(@Nullable FinishReason finishReason) { this.finishReason = finishReason; } @JsonProperty("errorMessage") public Optional errorMessage() { - return errorMessage; + return Optional.ofNullable(errorMessage); } - public void setErrorMessage(Optional errorMessage) { + public void setErrorMessage(@Nullable String errorMessage) { this.errorMessage = errorMessage; } @JsonProperty("usageMetadata") public Optional usageMetadata() { - return usageMetadata; + return Optional.ofNullable(usageMetadata); } - public void setUsageMetadata(Optional usageMetadata) { + public void setUsageMetadata(@Nullable GenerateContentResponseUsageMetadata usageMetadata) { this.usageMetadata = usageMetadata; } @JsonProperty("avgLogprobs") public Optional avgLogprobs() { - return avgLogprobs; + return Optional.ofNullable(avgLogprobs); } - public void setAvgLogprobs(Optional avgLogprobs) { + public void setAvgLogprobs(@Nullable Double avgLogprobs) { this.avgLogprobs = avgLogprobs; } @JsonProperty("interrupted") public Optional interrupted() { - return interrupted; + return Optional.ofNullable(interrupted); } - public void setInterrupted(Optional interrupted) { + public void setInterrupted(@Nullable Boolean interrupted) { this.interrupted = interrupted; } @@ -216,7 +222,7 @@ public void setInterrupted(Optional interrupted) { */ @JsonProperty("branch") public Optional branch() { - return branch; + return Optional.ofNullable(branch); } /** @@ -227,40 +233,36 @@ public Optional branch() { * @param branch Branch identifier. */ public void branch(@Nullable String branch) { - this.branch = Optional.ofNullable(branch); - } - - public void branch(Optional branch) { this.branch = branch; } /** The grounding metadata of the event. */ @JsonProperty("groundingMetadata") public Optional groundingMetadata() { - return groundingMetadata; + return Optional.ofNullable(groundingMetadata); } - public void setGroundingMetadata(Optional groundingMetadata) { + public void setGroundingMetadata(@Nullable GroundingMetadata groundingMetadata) { this.groundingMetadata = groundingMetadata; } /** The custom metadata of the event. */ @JsonProperty("customMetadata") public Optional> customMetadata() { - return customMetadata; + return Optional.ofNullable(customMetadata); } public void setCustomMetadata(@Nullable List customMetadata) { - this.customMetadata = Optional.ofNullable(customMetadata); + this.customMetadata = customMetadata; } /** The model version used to generate the response. */ @JsonProperty("modelVersion") public Optional modelVersion() { - return modelVersion; + return Optional.ofNullable(modelVersion); } - public void setModelVersion(Optional modelVersion) { + public void setModelVersion(@Nullable String modelVersion) { this.modelVersion = modelVersion; } @@ -345,22 +347,22 @@ public static class Builder { private String id; private String invocationId; private String author; - private Optional content = Optional.empty(); + private @Nullable Content content; private EventActions actions; - private Optional> longRunningToolIds = Optional.empty(); - private Optional partial = Optional.empty(); - private Optional turnComplete = Optional.empty(); - private Optional errorCode = Optional.empty(); - private Optional errorMessage = Optional.empty(); - private Optional finishReason = Optional.empty(); - private Optional usageMetadata = Optional.empty(); - private Optional avgLogprobs = Optional.empty(); - private Optional interrupted = Optional.empty(); - private Optional branch = Optional.empty(); - private Optional groundingMetadata = Optional.empty(); - private Optional> customMetadata = Optional.empty(); - private Optional modelVersion = Optional.empty(); - private Optional timestamp = Optional.empty(); + private @Nullable Set longRunningToolIds; + private @Nullable Boolean partial; + private @Nullable Boolean turnComplete; + private @Nullable FinishReason errorCode; + private @Nullable String errorMessage; + private @Nullable FinishReason finishReason; + private @Nullable GenerateContentResponseUsageMetadata usageMetadata; + private @Nullable Double avgLogprobs; + private @Nullable Boolean interrupted; + private @Nullable String branch; + private @Nullable GroundingMetadata groundingMetadata; + private @Nullable List customMetadata; + private @Nullable String modelVersion; + private @Nullable Long timestamp; @JsonCreator private static Builder create() { @@ -391,12 +393,6 @@ public Builder author(String value) { @CanIgnoreReturnValue @JsonProperty("content") public Builder content(@Nullable Content value) { - this.content = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder content(Optional value) { this.content = value; return this; } @@ -415,12 +411,6 @@ Optional actions() { @CanIgnoreReturnValue @JsonProperty("longRunningToolIds") public Builder longRunningToolIds(@Nullable Set value) { - this.longRunningToolIds = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder longRunningToolIds(Optional> value) { this.longRunningToolIds = value; return this; } @@ -428,12 +418,6 @@ public Builder longRunningToolIds(Optional> value) { @CanIgnoreReturnValue @JsonProperty("partial") public Builder partial(@Nullable Boolean value) { - this.partial = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder partial(Optional value) { this.partial = value; return this; } @@ -441,12 +425,6 @@ public Builder partial(Optional value) { @CanIgnoreReturnValue @JsonProperty("turnComplete") public Builder turnComplete(@Nullable Boolean value) { - this.turnComplete = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder turnComplete(Optional value) { this.turnComplete = value; return this; } @@ -454,12 +432,6 @@ public Builder turnComplete(Optional value) { @CanIgnoreReturnValue @JsonProperty("errorCode") public Builder errorCode(@Nullable FinishReason value) { - this.errorCode = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder errorCode(Optional value) { this.errorCode = value; return this; } @@ -467,12 +439,6 @@ public Builder errorCode(Optional value) { @CanIgnoreReturnValue @JsonProperty("errorMessage") public Builder errorMessage(@Nullable String value) { - this.errorMessage = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder errorMessage(Optional value) { this.errorMessage = value; return this; } @@ -480,12 +446,6 @@ public Builder errorMessage(Optional value) { @CanIgnoreReturnValue @JsonProperty("finishReason") public Builder finishReason(@Nullable FinishReason value) { - this.finishReason = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder finishReason(Optional value) { this.finishReason = value; return this; } @@ -493,12 +453,6 @@ public Builder finishReason(Optional value) { @CanIgnoreReturnValue @JsonProperty("usageMetadata") public Builder usageMetadata(@Nullable GenerateContentResponseUsageMetadata value) { - this.usageMetadata = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder usageMetadata(Optional value) { this.usageMetadata = value; return this; } @@ -506,12 +460,6 @@ public Builder usageMetadata(Optional valu @CanIgnoreReturnValue @JsonProperty("avgLogprobs") public Builder avgLogprobs(@Nullable Double value) { - this.avgLogprobs = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder avgLogprobs(Optional value) { this.avgLogprobs = value; return this; } @@ -519,12 +467,6 @@ public Builder avgLogprobs(Optional value) { @CanIgnoreReturnValue @JsonProperty("interrupted") public Builder interrupted(@Nullable Boolean value) { - this.interrupted = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder interrupted(Optional value) { this.interrupted = value; return this; } @@ -532,84 +474,52 @@ public Builder interrupted(Optional value) { @CanIgnoreReturnValue @JsonProperty("timestamp") public Builder timestamp(long value) { - this.timestamp = Optional.of(value); - return this; - } - - @CanIgnoreReturnValue - public Builder timestamp(Optional value) { this.timestamp = value; return this; } // Getter for builder's timestamp, used in build() Optional timestamp() { - return timestamp; + return Optional.ofNullable(timestamp); } @CanIgnoreReturnValue @JsonProperty("branch") public Builder branch(@Nullable String value) { - this.branch = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder branch(Optional value) { this.branch = value; return this; } // Getter for builder's branch, used in build() Optional branch() { - return branch; + return Optional.ofNullable(branch); } @CanIgnoreReturnValue @JsonProperty("groundingMetadata") public Builder groundingMetadata(@Nullable GroundingMetadata value) { - this.groundingMetadata = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder groundingMetadata(Optional value) { this.groundingMetadata = value; return this; } Optional groundingMetadata() { - return groundingMetadata; + return Optional.ofNullable(groundingMetadata); } @CanIgnoreReturnValue @JsonProperty("customMetadata") public Builder customMetadata(@Nullable List value) { - this.customMetadata = Optional.ofNullable(value); + this.customMetadata = value; return this; } - Optional> customMetadata() { - return customMetadata; - } - @CanIgnoreReturnValue @JsonProperty("modelVersion") public Builder modelVersion(@Nullable String value) { - this.modelVersion = Optional.ofNullable(value); - return this; - } - - @CanIgnoreReturnValue - public Builder modelVersion(Optional value) { this.modelVersion = value; return this; } - Optional modelVersion() { - return modelVersion; - } - public Event build() { Event event = new Event(); event.setId(id); @@ -627,7 +537,7 @@ public Event build() { event.setInterrupted(interrupted); event.branch(branch); event.setGroundingMetadata(groundingMetadata); - event.setCustomMetadata(customMetadata.orElse(null)); + event.setCustomMetadata(customMetadata); event.setModelVersion(modelVersion); event.setActions(actions().orElseGet(() -> EventActions.builder().build())); event.setTimestamp(timestamp().orElseGet(() -> Instant.now().toEpochMilli())); @@ -664,7 +574,7 @@ public Builder toBuilder() { .interrupted(this.interrupted) .branch(this.branch) .groundingMetadata(this.groundingMetadata) - .customMetadata(this.customMetadata.orElse(null)) + .customMetadata(this.customMetadata) .modelVersion(this.modelVersion); if (this.timestamp != 0) { builder.timestamp(this.timestamp); 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 1249728d8..6ed9ccaa3 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 @@ -351,7 +351,7 @@ private Flowable runOneStep(InvocationContext context) { .id(Event.generateEventId()) .invocationId(context.invocationId()) .author(context.agent().name()) - .branch(context.branch()) + .branch(context.branch().orElse(null)) .build(); mutableEventTemplate.setTimestamp(0L); @@ -535,7 +535,7 @@ public void onError(Throwable e) { Event.builder() .invocationId(invocationContext.invocationId()) .author(invocationContext.agent().name()) - .branch(invocationContext.branch()); + .branch(invocationContext.branch().orElse(null)); Flowable receiveFlow = connection @@ -639,17 +639,17 @@ private Event buildModelResponseEvent( Event baseEventForLlmResponse, LlmRequest llmRequest, LlmResponse llmResponse) { Event.Builder eventBuilder = baseEventForLlmResponse.toBuilder() - .content(llmResponse.content()) - .partial(llmResponse.partial()) - .errorCode(llmResponse.errorCode()) - .errorMessage(llmResponse.errorMessage()) - .interrupted(llmResponse.interrupted()) - .turnComplete(llmResponse.turnComplete()) - .groundingMetadata(llmResponse.groundingMetadata()) - .avgLogprobs(llmResponse.avgLogprobs()) - .finishReason(llmResponse.finishReason()) - .usageMetadata(llmResponse.usageMetadata()) - .modelVersion(llmResponse.modelVersion()); + .content(llmResponse.content().orElse(null)) + .partial(llmResponse.partial().orElse(null)) + .errorCode(llmResponse.errorCode().orElse(null)) + .errorMessage(llmResponse.errorMessage().orElse(null)) + .interrupted(llmResponse.interrupted().orElse(null)) + .turnComplete(llmResponse.turnComplete().orElse(null)) + .groundingMetadata(llmResponse.groundingMetadata().orElse(null)) + .avgLogprobs(llmResponse.avgLogprobs().orElse(null)) + .finishReason(llmResponse.finishReason().orElse(null)) + .usageMetadata(llmResponse.usageMetadata().orElse(null)) + .modelVersion(llmResponse.modelVersion().orElse(null)); Event event = eventBuilder.build(); @@ -661,7 +661,7 @@ private Event buildModelResponseEvent( Functions.getLongRunningFunctionCalls(event.functionCalls(), llmRequest.tools()); logger.debug("longRunningToolIds: {}", longRunningToolIds); if (!longRunningToolIds.isEmpty()) { - event.setLongRunningToolIds(Optional.of(longRunningToolIds)); + event.setLongRunningToolIds(longRunningToolIds); } } return event; diff --git a/core/src/main/java/com/google/adk/flows/llmflows/CodeExecution.java b/core/src/main/java/com/google/adk/flows/llmflows/CodeExecution.java index be0504dd4..f7c3c51ef 100644 --- a/core/src/main/java/com/google/adk/flows/llmflows/CodeExecution.java +++ b/core/src/main/java/com/google/adk/flows/llmflows/CodeExecution.java @@ -229,7 +229,7 @@ private static Flowable runPreProcessor( Event.builder() .invocationId(invocationContext.invocationId()) .author(llmAgent.name()) - .content(Optional.of(codeContent)) + .content(codeContent) .build(); return Flowable.defer( @@ -309,7 +309,7 @@ private static Flowable runPostProcessor( Event.builder() .invocationId(invocationContext.invocationId()) .author(llmAgent.name()) - .content(Optional.of(responseContent)) + .content(responseContent) .actions(EventActions.builder().build()) .build(); @@ -456,7 +456,7 @@ private static Single postProcessCodeExecutionResult( return Event.builder() .invocationId(invocationContext.invocationId()) .author(invocationContext.agent().name()) - .content(Optional.of(resultContent)) + .content(resultContent) .actions(eventActionsBuilder.build()) .build(); }); diff --git a/core/src/main/java/com/google/adk/flows/llmflows/Contents.java b/core/src/main/java/com/google/adk/flows/llmflows/Contents.java index a770808d4..ca8e0a051 100644 --- a/core/src/main/java/com/google/adk/flows/llmflows/Contents.java +++ b/core/src/main/java/com/google/adk/flows/llmflows/Contents.java @@ -760,9 +760,7 @@ private static Event mergeFunctionResponseEvents(List functionResponseEve } return baseEvent.toBuilder() - .content( - Optional.of( - Content.builder().role(baseContent.role().get()).parts(partsInMergedEvent).build())) + .content(Content.builder().role(baseContent.role().get()).parts(partsInMergedEvent).build()) .build(); } 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 269764046..ecc2bb412 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 @@ -122,7 +122,7 @@ public static void populateClientFunctionCallId(Event modelResponseEvent) { new IllegalStateException( "Content role is missing in event: " + modelResponseEvent.id())); Content newContent = Content.builder().role(role).parts(newParts).build(); - modelResponseEvent.setContent(Optional.of(newContent)); + modelResponseEvent.setContent(newContent); } } @@ -468,8 +468,8 @@ private static Optional mergeParallelFunctionResponseEvents( .id(Event.generateEventId()) .invocationId(baseEvent.invocationId()) .author(baseEvent.author()) - .branch(baseEvent.branch()) - .content(Optional.of(Content.builder().role("user").parts(mergedParts).build())) + .branch(baseEvent.branch().orElse(null)) + .content(Content.builder().role("user").parts(mergedParts).build()) .actions(mergedActionsBuilder.build()) .timestamp(baseEvent.timestamp()) .build()); @@ -624,7 +624,7 @@ private static Event buildResponseEvent( .id(Event.generateEventId()) .invocationId(invocationContext.invocationId()) .author(invocationContext.agent().name()) - .branch(invocationContext.branch()) + .branch(invocationContext.branch().orElse(null)) .content(Content.builder().role("user").parts(partFunctionResponse).build()) .actions(toolContext.eventActions()) .build(); @@ -684,7 +684,7 @@ public static Optional generateRequestConfirmationEvent( Event.builder() .invocationId(invocationContext.invocationId()) .author(invocationContext.agent().name()) - .branch(invocationContext.branch()) + .branch(invocationContext.branch().orElse(null)) .content(contentBuilder.build()) .longRunningToolIds(longRunningToolIds) .build()); 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 f2cb5b9d5..4371300fb 100644 --- a/core/src/main/java/com/google/adk/runner/Runner.java +++ b/core/src/main/java/com/google/adk/runner/Runner.java @@ -340,7 +340,7 @@ private Single appendNewMessageToSession( .id(Event.generateEventId()) .invocationId(invocationContext.invocationId()) .author("user") - .content(Optional.of(newMessage)); + .content(newMessage); // Add state delta if provided if (stateDelta != null && !stateDelta.isEmpty()) { @@ -540,7 +540,7 @@ private Flowable runAgentWithFreshSession( .id(Event.generateEventId()) .invocationId(contextWithUpdatedSession.invocationId()) .author("model") - .content(Optional.of(content)) + .content(content) .build()); // Agent execution 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 71b072695..97cc0f56d 100644 --- a/core/src/main/java/com/google/adk/sessions/SessionJsonConverter.java +++ b/core/src/main/java/com/google/adk/sessions/SessionJsonConverter.java @@ -208,9 +208,12 @@ static Event fromApiEvent(Map apiEvent) { .timestamp(convertToInstant(apiEvent.get("timestamp")).toEpochMilli()) .errorCode( Optional.ofNullable(apiEvent.get("errorCode")) - .map(value -> new FinishReason((String) value))) + .map(value -> new FinishReason((String) value)) + .orElse(null)) .errorMessage( - Optional.ofNullable(apiEvent.get("errorMessage")).map(value -> (String) value)) + Optional.ofNullable(apiEvent.get("errorMessage")) + .map(value -> (String) value) + .orElse(null)) .build(); Map eventMetadata = (Map) apiEvent.get("eventMetadata"); if (eventMetadata != null) { @@ -236,7 +239,7 @@ static Event fromApiEvent(Map apiEvent) { Optional.ofNullable((Boolean) eventMetadata.get("turnComplete")).orElse(false)) .interrupted( Optional.ofNullable((Boolean) eventMetadata.get("interrupted")).orElse(false)) - .branch(Optional.ofNullable((String) eventMetadata.get("branch"))) + .branch((String) eventMetadata.get("branch")) .groundingMetadata(groundingMetadata) .usageMetadata(usageMetadata) .longRunningToolIds( diff --git a/core/src/test/java/com/google/adk/events/EventTest.java b/core/src/test/java/com/google/adk/events/EventTest.java index cbfb6ef0b..a4feab5c1 100644 --- a/core/src/test/java/com/google/adk/events/EventTest.java +++ b/core/src/test/java/com/google/adk/events/EventTest.java @@ -76,6 +76,7 @@ public final class EventTest { .avgLogprobs(0.5) .interrupted(true) .timestamp(123456789L) + .modelVersion("model_version") .build(); @Test @@ -99,6 +100,7 @@ public void event_builder_works() { assertThat(EVENT.interrupted()).hasValue(true); assertThat(EVENT.timestamp()).isEqualTo(123456789L); assertThat(EVENT.actions()).isEqualTo(EVENT_ACTIONS); + assertThat(EVENT.modelVersion()).hasValue("model_version"); } @Test diff --git a/core/src/test/java/com/google/adk/flows/llmflows/ContentsTest.java b/core/src/test/java/com/google/adk/flows/llmflows/ContentsTest.java index 3041a855b..85e78666d 100644 --- a/core/src/test/java/com/google/adk/flows/llmflows/ContentsTest.java +++ b/core/src/test/java/com/google/adk/flows/llmflows/ContentsTest.java @@ -784,7 +784,7 @@ private static Event createUserEvent(String id, String text) { return Event.builder() .id(id) .author(USER) - .content(Optional.of(Content.fromParts(Part.fromText(text)))) + .content(Content.fromParts(Part.fromText(text))) .invocationId("invocationId") .build(); } @@ -794,7 +794,7 @@ private static Event createUserEvent( return Event.builder() .id(id) .author(USER) - .content(Optional.of(Content.fromParts(Part.fromText(text)))) + .content(Content.fromParts(Part.fromText(text))) .invocationId(invocationId) .timestamp(timestamp) .build(); diff --git a/core/src/test/java/com/google/adk/flows/llmflows/FunctionsTest.java b/core/src/test/java/com/google/adk/flows/llmflows/FunctionsTest.java index 97092f68c..d5db4d4b3 100644 --- a/core/src/test/java/com/google/adk/flows/llmflows/FunctionsTest.java +++ b/core/src/test/java/com/google/adk/flows/llmflows/FunctionsTest.java @@ -33,7 +33,6 @@ import com.google.genai.types.FunctionCall; import com.google.genai.types.FunctionResponse; import com.google.genai.types.Part; -import java.util.Optional; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -43,12 +42,7 @@ public final class FunctionsTest { private static final Event EVENT_WITH_NO_CONTENT = - Event.builder() - .id("event1") - .invocationId("invocation1") - .author("agent") - .content(Optional.empty()) - .build(); + Event.builder().id("event1").invocationId("invocation1").author("agent").build(); private static final Event EVENT_WITH_NO_PARTS = Event.builder() diff --git a/core/src/test/java/com/google/adk/plugins/LoggingPluginTest.java b/core/src/test/java/com/google/adk/plugins/LoggingPluginTest.java index 764525ff0..a08599c9a 100644 --- a/core/src/test/java/com/google/adk/plugins/LoggingPluginTest.java +++ b/core/src/test/java/com/google/adk/plugins/LoggingPluginTest.java @@ -65,9 +65,7 @@ public class LoggingPluginTest { Event.builder() .id("event_id") .author("author") - .content(Optional.empty()) .actions(EventActions.builder().build()) - .longRunningToolIds(Optional.empty()) .build(); private final LlmRequest.Builder llmRequestBuilder = LlmRequest.builder().model("default").contents(ImmutableList.of()); 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 f6120cf08..335f7f1d0 100644 --- a/core/src/test/java/com/google/adk/sessions/SessionJsonConverterTest.java +++ b/core/src/test/java/com/google/adk/sessions/SessionJsonConverterTest.java @@ -22,7 +22,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.junit.Test; @@ -49,12 +48,12 @@ public void convertEventToJson_fullEvent_success() throws JsonProcessingExceptio .author("user") .invocationId("inv-123") .timestamp(Instant.parse("2023-01-01T00:00:00Z").toEpochMilli()) - .errorCode(Optional.of(new FinishReason("OTHER"))) - .errorMessage(Optional.of("Something was not found")) + .errorCode(new FinishReason("OTHER")) + .errorMessage("Something was not found") .partial(true) .turnComplete(true) .interrupted(false) - .branch(Optional.of("branch-1")) + .branch("branch-1") .content(Content.fromParts(Part.fromText("Hello"))) .actions(actions) .build();