diff --git a/core/src/main/java/com/google/adk/codeexecutors/BuiltInCodeExecutor.java b/core/src/main/java/com/google/adk/codeexecutors/BuiltInCodeExecutor.java index 972082dde..bd6ae1e32 100644 --- a/core/src/main/java/com/google/adk/codeexecutors/BuiltInCodeExecutor.java +++ b/core/src/main/java/com/google/adk/codeexecutors/BuiltInCodeExecutor.java @@ -25,6 +25,7 @@ import com.google.genai.types.GenerateContentConfig; import com.google.genai.types.Tool; import com.google.genai.types.ToolCodeExecution; +import java.util.Optional; /** * A code executor that uses the Model's built-in code executor. @@ -43,7 +44,7 @@ public CodeExecutionResult executeCode( /** Pre-process the LLM request for Gemini 2.0+ models to use the code execution tool. */ public void processLlmRequest(LlmRequest.Builder llmRequestBuilder) { LlmRequest llmRequest = llmRequestBuilder.build(); - if (ModelNameUtils.isGemini2Model(llmRequest.model().orElse(null))) { + if (isBuiltInCodeExecutionSupported(llmRequest.model())) { GenerateContentConfig.Builder configBuilder = llmRequest.config().map(c -> c.toBuilder()).orElseGet(GenerateContentConfig::builder); ImmutableList.Builder toolsBuilder = ImmutableList.builder(); @@ -56,4 +57,10 @@ public void processLlmRequest(LlmRequest.Builder llmRequestBuilder) { throw new IllegalArgumentException( "Gemini code execution tool is not supported for model " + llmRequest.model().orElse("")); } + + private static boolean isBuiltInCodeExecutionSupported(Optional modelString) { + return modelString + .map(m -> ModelNameUtils.isGemini2Model(m) || ModelNameUtils.isGemini3Model(m)) + .orElse(false); + } } diff --git a/core/src/main/java/com/google/adk/utils/ModelNameUtils.java b/core/src/main/java/com/google/adk/utils/ModelNameUtils.java index cf0f2221e..8e2685ab1 100644 --- a/core/src/main/java/com/google/adk/utils/ModelNameUtils.java +++ b/core/src/main/java/com/google/adk/utils/ModelNameUtils.java @@ -25,6 +25,7 @@ public final class ModelNameUtils { private static final String GEMINI_PREFIX = "gemini-"; private static final Pattern GEMINI_2_PATTERN = Pattern.compile("^gemini-2\\..*"); + private static final Pattern GEMINI_3_PATTERN = Pattern.compile("^gemini-3\\..*"); private static final String GEMINI_CLASS = "com.google.adk.models.Gemini"; private static final Pattern PATH_PATTERN = Pattern.compile("^projects/[^/]+/locations/[^/]+/publishers/[^/]+/models/(.+)$"); @@ -39,6 +40,10 @@ public static boolean isGemini2Model(String modelString) { return matchesModelPattern(modelString, GEMINI_2_PATTERN); } + public static boolean isGemini3Model(String modelString) { + return matchesModelPattern(modelString, GEMINI_3_PATTERN); + } + private static boolean matchesModelPattern(String modelString, Pattern pattern) { if (modelString == null) { return false; diff --git a/core/src/test/java/com/google/adk/utils/ModelNameUtilsTest.java b/core/src/test/java/com/google/adk/utils/ModelNameUtilsTest.java index 20dda7034..188ef4d32 100644 --- a/core/src/test/java/com/google/adk/utils/ModelNameUtilsTest.java +++ b/core/src/test/java/com/google/adk/utils/ModelNameUtilsTest.java @@ -71,6 +71,42 @@ public void isGemini2Model_withNullModel_returnsFalse() { assertThat(ModelNameUtils.isGemini2Model(null)).isFalse(); } + @Test + public void isGemini3Model_withGemini3Model_returnsTrue() { + assertThat(ModelNameUtils.isGemini3Model("gemini-3.0-pro")).isTrue(); + } + + @Test + public void isGemini3Model_withNonGemini3Model_returnsFalse() { + assertThat(ModelNameUtils.isGemini3Model("gemini-1.5-pro")).isFalse(); + } + + @Test + public void isGemini3Model_withPathBasedGemini3Model_returnsTrue() { + assertThat( + ModelNameUtils.isGemini3Model( + "projects/test-project/locations/us-central1/publishers/google/models/gemini-3.0-flash")) + .isTrue(); + } + + @Test + public void isGemini3Model_withPathBasedNonGemini3Model_returnsFalse() { + assertThat( + ModelNameUtils.isGemini3Model( + "projects/test-project/locations/us-central1/publishers/google/models/gemini-1.5-pro")) + .isFalse(); + } + + @Test + public void isGemini3Model_withApigeeGemini3Model_returnsTrue() { + assertThat(ModelNameUtils.isGemini3Model("apigee/gemini-3.0-flash")).isTrue(); + } + + @Test + public void isGemini3Model_withNullModel_returnsFalse() { + assertThat(ModelNameUtils.isGemini3Model(null)).isFalse(); + } + @Test public void isGeminiModel_withGeminiModel_returnsTrue() { assertThat(ModelNameUtils.isGeminiModel("gemini-1.5-flash")).isTrue();