From 22d9d7cc30e75bfb629daed29001856fb7589687 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Mon, 23 Feb 2026 13:57:00 -0800 Subject: [PATCH] refactor: Replacing Optional in BaseToolSet with Nullable PiperOrigin-RevId: 874232234 --- .../com/google/adk/tools/BaseToolset.java | 32 ++++++++++++------- .../com/google/adk/tools/ToolPredicate.java | 14 ++++++++ .../google/adk/tools/mcp/McpAsyncToolset.java | 4 +-- .../com/google/adk/tools/mcp/McpToolset.java | 4 +-- 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/com/google/adk/tools/BaseToolset.java b/core/src/main/java/com/google/adk/tools/BaseToolset.java index 4d3482c57..c8ed6df4e 100644 --- a/core/src/main/java/com/google/adk/tools/BaseToolset.java +++ b/core/src/main/java/com/google/adk/tools/BaseToolset.java @@ -20,6 +20,7 @@ import io.reactivex.rxjava3.core.Flowable; import java.util.List; import java.util.Optional; +import javax.annotation.Nullable; /** Base interface for toolsets. */ public interface BaseToolset extends AutoCloseable { @@ -43,28 +44,35 @@ public interface BaseToolset extends AutoCloseable { void close() throws Exception; /** - * Helper method to be used by implementers that returns true if the given tool is in the provided - * list of tools of if testing against the given ToolPredicate returns true (otherwise false). + * Checks if a tool should be selected based on a filter. * * @param tool The tool to check. - * @param toolFilter An Optional containing either a ToolPredicate or a List of tool names. - * @param readonlyContext The current context. - * @return true if the tool is selected. + * @param toolFilter A ToolPredicate, a List of tool names, or null. + * @param readonlyContext The context for checking the tool, or null. */ default boolean isToolSelected( - BaseTool tool, Optional toolFilter, Optional readonlyContext) { - if (toolFilter.isEmpty()) { + BaseTool tool, @Nullable Object toolFilter, @Nullable ReadonlyContext readonlyContext) { + if (toolFilter == null) { return true; } - Object filter = toolFilter.get(); - if (filter instanceof ToolPredicate toolPredicate) { + + if (toolFilter instanceof ToolPredicate toolPredicate) { return toolPredicate.test(tool, readonlyContext); } - if (filter instanceof List) { - @SuppressWarnings("unchecked") - List toolNames = (List) filter; + + if (toolFilter instanceof List toolNames) { return toolNames.contains(tool.name()); } + return false; } + + /** + * @deprecated Use {@link #isToolSelected(BaseTool, Object, ReadonlyContext)} instead. + */ + @Deprecated + default boolean isToolSelected( + BaseTool tool, Optional toolFilter, Optional readonlyContext) { + return isToolSelected(tool, toolFilter.orElse(null), readonlyContext.orElse(null)); + } } diff --git a/core/src/main/java/com/google/adk/tools/ToolPredicate.java b/core/src/main/java/com/google/adk/tools/ToolPredicate.java index 86d739e70..6adf53c18 100644 --- a/core/src/main/java/com/google/adk/tools/ToolPredicate.java +++ b/core/src/main/java/com/google/adk/tools/ToolPredicate.java @@ -18,6 +18,7 @@ import com.google.adk.agents.ReadonlyContext; import java.util.Optional; +import javax.annotation.Nullable; /** * Functional interface to decide whether a tool should be exposed to the LLM based on the current @@ -31,6 +32,19 @@ public interface ToolPredicate { * @param tool The tool to check. * @param readonlyContext The current context. * @return true if the tool should be selected, false otherwise. + * @deprecated Use {@link #test(BaseTool, ReadonlyContext)} instead. */ + @Deprecated boolean test(BaseTool tool, Optional readonlyContext); + + /** + * Decides if the given tool is selected. + * + * @param tool The tool to check. + * @param readonlyContext The current context. + * @return true if the tool should be selected, false otherwise. + */ + default boolean test(BaseTool tool, @Nullable ReadonlyContext readonlyContext) { + return test(tool, Optional.ofNullable(readonlyContext)); + } } diff --git a/core/src/main/java/com/google/adk/tools/mcp/McpAsyncToolset.java b/core/src/main/java/com/google/adk/tools/mcp/McpAsyncToolset.java index 45a2fe333..73af9cc6a 100644 --- a/core/src/main/java/com/google/adk/tools/mcp/McpAsyncToolset.java +++ b/core/src/main/java/com/google/adk/tools/mcp/McpAsyncToolset.java @@ -170,9 +170,7 @@ public Flowable getTools(ReadonlyContext readonlyContext) { .map( tools -> tools.stream() - .filter( - tool -> - isToolSelected(tool, toolFilter, Optional.ofNullable(readonlyContext))) + .filter(tool -> isToolSelected(tool, toolFilter.orElse(null), readonlyContext)) .toList()) .onErrorResumeNext( err -> { diff --git a/core/src/main/java/com/google/adk/tools/mcp/McpToolset.java b/core/src/main/java/com/google/adk/tools/mcp/McpToolset.java index 3bf8f39d0..207243ceb 100644 --- a/core/src/main/java/com/google/adk/tools/mcp/McpToolset.java +++ b/core/src/main/java/com/google/adk/tools/mcp/McpToolset.java @@ -216,9 +216,7 @@ public Flowable getTools(ReadonlyContext readonlyContext) { new McpTool( tool, this.mcpSession, this.mcpSessionManager, this.objectMapper)) .filter( - tool -> - isToolSelected( - tool, toolFilter, Optional.ofNullable(readonlyContext)))); + tool -> isToolSelected(tool, toolFilter.orElse(null), readonlyContext))); }) .retryWhen( errorObservable ->