Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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<Tool> toolsBuilder = ImmutableList.<Tool>builder();
Expand All @@ -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<String> modelString) {
return modelString
.map(m -> ModelNameUtils.isGemini2Model(m) || ModelNameUtils.isGemini3Model(m))
.orElse(false);
}
}
5 changes: 5 additions & 0 deletions core/src/main/java/com/google/adk/utils/ModelNameUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -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/(.+)$");
Expand All @@ -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;
Expand Down
36 changes: 36 additions & 0 deletions core/src/test/java/com/google/adk/utils/ModelNameUtilsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down