diff --git a/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/GoogleGenAiChatOptions.java b/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/GoogleGenAiChatOptions.java index 8c7237caff..72a9c73a64 100644 --- a/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/GoogleGenAiChatOptions.java +++ b/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/GoogleGenAiChatOptions.java @@ -186,7 +186,7 @@ public class GoogleGenAiChatOptions implements ToolCallingChatOptions, Structure /** * Use Google search Grounding feature */ - private final Boolean googleSearchRetrieval; + private final @Nullable Boolean googleSearchRetrieval; /** * Optional. When true, the API response will include server-side tool calls and @@ -194,7 +194,7 @@ public class GoogleGenAiChatOptions implements ToolCallingChatOptions, Structure * This allows clients to observe the server's tool invocations without executing them. * Only supported with MLDev (Google AI) API, not Vertex AI. */ - private final Boolean includeServerSideToolInvocations; + private final @Nullable Boolean includeServerSideToolInvocations; private final @Nullable List safetySettings; @@ -240,8 +240,8 @@ protected GoogleGenAiChatOptions(@Nullable String model, @Nullable Double freque this.useCachedContent = useCachedContent; this.autoCacheThreshold = autoCacheThreshold; this.autoCacheTtl = autoCacheTtl; - this.googleSearchRetrieval = Boolean.TRUE.equals(googleSearchRetrieval); - this.includeServerSideToolInvocations = Boolean.TRUE.equals(includeServerSideToolInvocations); + this.googleSearchRetrieval = googleSearchRetrieval; + this.includeServerSideToolInvocations = includeServerSideToolInvocations; this.safetySettings = (safetySettings != null ? List.copyOf(safetySettings) : null); this.labels = (labels != null ? Map.copyOf(labels) : null); this.serviceTier = serviceTier; diff --git a/models/spring-ai-google-genai/src/test/java/org/springframework/ai/google/genai/GoogleGenAiChatOptionsTest.java b/models/spring-ai-google-genai/src/test/java/org/springframework/ai/google/genai/GoogleGenAiChatOptionsTest.java index 07940f5b27..f1fe1bcac3 100644 --- a/models/spring-ai-google-genai/src/test/java/org/springframework/ai/google/genai/GoogleGenAiChatOptionsTest.java +++ b/models/spring-ai-google-genai/src/test/java/org/springframework/ai/google/genai/GoogleGenAiChatOptionsTest.java @@ -212,6 +212,45 @@ public void testEqualsAndHashCodeWithIncludeServerSideToolInvocations() { assertThat(options1).isNotEqualTo(options3); } + @Test + public void testOptionalBooleanDefaultsRemainUnset() { + GoogleGenAiChatOptions options = GoogleGenAiChatOptions.builder().build(); + + assertThat(options.getGoogleSearchRetrieval()).isNull(); + assertThat(options.getIncludeServerSideToolInvocations()).isNull(); + } + + @Test + public void testCombineWithPreservesOptionalBooleanDefaults() { + GoogleGenAiChatOptions defaults = GoogleGenAiChatOptions.builder() + .googleSearchRetrieval(true) + .includeServerSideToolInvocations(true) + .build(); + GoogleGenAiChatOptions requestOptions = GoogleGenAiChatOptions.builder().temperature(0.2).build(); + + GoogleGenAiChatOptions merged = defaults.mutate().combineWith(requestOptions.mutate()).build(); + + assertThat(merged.getGoogleSearchRetrieval()).isTrue(); + assertThat(merged.getIncludeServerSideToolInvocations()).isTrue(); + } + + @Test + public void testCombineWithOverridesOptionalBooleansWhenExplicitlySet() { + GoogleGenAiChatOptions defaults = GoogleGenAiChatOptions.builder() + .googleSearchRetrieval(true) + .includeServerSideToolInvocations(true) + .build(); + GoogleGenAiChatOptions requestOptions = GoogleGenAiChatOptions.builder() + .googleSearchRetrieval(false) + .includeServerSideToolInvocations(false) + .build(); + + GoogleGenAiChatOptions merged = defaults.mutate().combineWith(requestOptions.mutate()).build(); + + assertThat(merged.getGoogleSearchRetrieval()).isFalse(); + assertThat(merged.getIncludeServerSideToolInvocations()).isFalse(); + } + @Test public void testServiceTierWithBuilder() { GoogleGenAiChatOptions options = GoogleGenAiChatOptions.builder()