diff --git a/core/src/main/java/com/google/adk/agents/LlmAgent.java b/core/src/main/java/com/google/adk/agents/LlmAgent.java index 28103a89d..ce349d8fb 100644 --- a/core/src/main/java/com/google/adk/agents/LlmAgent.java +++ b/core/src/main/java/com/google/adk/agents/LlmAgent.java @@ -16,7 +16,6 @@ package com.google.adk.agents; -import static com.google.common.collect.ImmutableList.toImmutableList; import static java.util.stream.Collectors.joining; import com.fasterxml.jackson.core.JsonProcessingException; @@ -698,31 +697,29 @@ public Single canonicalGlobalInstruction(ReadonlyContext context) { * @param context The context to retrieve the session state. * @return The resolved list of tools as a {@link Single} wrapped list of {@link BaseTool}. */ - public Single> canonicalTools(Optional context) { - List>> toolSingles = new ArrayList<>(); + public Flowable> canonicalTools(Optional context) { + List>> toolFlowables = new ArrayList<>(); for (Object toolOrToolset : toolsUnion) { if (toolOrToolset instanceof BaseTool baseTool) { - toolSingles.add(Single.just(ImmutableList.of(baseTool))); + toolFlowables.add(Flowable.just(ImmutableList.of(baseTool))); } else if (toolOrToolset instanceof BaseToolset baseToolset) { - toolSingles.add(baseToolset.getTools(context.orElse(null))); + toolFlowables.add(baseToolset.getTools(context.orElse(null))); } else { throw new IllegalArgumentException( "Object in tools list is not of a supported type: " + toolOrToolset.getClass().getName()); } } - return Single.concat(toolSingles) - .toList() - .map(listOfLists -> listOfLists.stream().flatMap(List::stream).collect(toImmutableList())); + return Flowable.concat(toolFlowables).flatMap(Flowable::fromIterable).toList().toFlowable(); } /** Overload of canonicalTools that defaults to an empty context. */ - public Single> canonicalTools() { + public Flowable> canonicalTools() { return canonicalTools(Optional.empty()); } /** Convenience overload of canonicalTools that accepts a non-optional ReadonlyContext. */ - public Single> canonicalTools(ReadonlyContext context) { + public Flowable> canonicalTools(ReadonlyContext context) { return canonicalTools(Optional.ofNullable(context)); } 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 be8fcbbbd..dad641e00 100644 --- a/core/src/main/java/com/google/adk/tools/BaseToolset.java +++ b/core/src/main/java/com/google/adk/tools/BaseToolset.java @@ -1,7 +1,7 @@ package com.google.adk.tools; import com.google.adk.agents.ReadonlyContext; -import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.core.Flowable; import java.util.List; import java.util.Optional; @@ -12,9 +12,9 @@ public interface BaseToolset extends AutoCloseable { * Return all tools in the toolset based on the provided context. * * @param readonlyContext Context used to filter tools available to the agent. - * @return A Single emitting a list of tools available under the specified context. + * @return A Flowable emitting a list of tools available under the specified context. */ - Single> getTools(ReadonlyContext readonlyContext); + Flowable> getTools(ReadonlyContext readonlyContext); /** * Performs cleanup and releases resources held by the toolset. 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 5854f572b..ca937465e 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 @@ -26,7 +26,7 @@ import io.modelcontextprotocol.client.McpSyncClient; import io.modelcontextprotocol.client.transport.ServerParameters; import io.modelcontextprotocol.spec.McpSchema.ListToolsResult; -import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.core.Flowable; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -151,8 +151,8 @@ public McpToolset(ServerParameters connectionParams) { } @Override - public Single> getTools(ReadonlyContext readonlyContext) { - return Single.fromCallable( + public Flowable> getTools(ReadonlyContext readonlyContext) { + return Flowable.fromCallable( () -> { for (int i = 0; i < MAX_RETRIES; i++) { try { diff --git a/core/src/test/java/com/google/adk/tools/BaseToolsetTest.java b/core/src/test/java/com/google/adk/tools/BaseToolsetTest.java index 46383df25..e71d68487 100644 --- a/core/src/test/java/com/google/adk/tools/BaseToolsetTest.java +++ b/core/src/test/java/com/google/adk/tools/BaseToolsetTest.java @@ -5,7 +5,7 @@ import com.google.adk.agents.ReadonlyContext; import com.google.common.collect.ImmutableList; -import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.core.Flowable; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; @@ -23,15 +23,15 @@ public void testGetTools() { BaseToolset toolset = new BaseToolset() { @Override - public Single> getTools(ReadonlyContext readonlyContext) { - return Single.just(ImmutableList.of(mockTool1, mockTool2)); + public Flowable> getTools(ReadonlyContext readonlyContext) { + return Flowable.just(ImmutableList.of(mockTool1, mockTool2)); } @Override public void close() throws Exception {} }; - List tools = toolset.getTools(mockContext).blockingGet(); + List tools = toolset.getTools(mockContext).blockingFirst(); assertThat(tools).containsExactly(mockTool1, mockTool2); } } diff --git a/dev/src/main/java/com/google/adk/web/AgentGraphGenerator.java b/dev/src/main/java/com/google/adk/web/AgentGraphGenerator.java index d44cb03fb..d9903295e 100644 --- a/dev/src/main/java/com/google/adk/web/AgentGraphGenerator.java +++ b/dev/src/main/java/com/google/adk/web/AgentGraphGenerator.java @@ -105,7 +105,7 @@ private static void buildGraphRecursive( if (agent instanceof LlmAgent) { LlmAgent llmAgent = (LlmAgent) agent; - List tools = llmAgent.canonicalTools().blockingGet(); + List tools = llmAgent.canonicalTools().blockingFirst(); if (tools != null) { for (BaseTool tool : tools) { if (tool != null) {