diff --git a/core/src/main/java/com/google/adk/apps/App.java b/core/src/main/java/com/google/adk/apps/App.java index 18e8753c7..897e24490 100644 --- a/core/src/main/java/com/google/adk/apps/App.java +++ b/core/src/main/java/com/google/adk/apps/App.java @@ -104,6 +104,12 @@ public Builder plugins(List plugins) { return this; } + @CanIgnoreReturnValue + public Builder plugins(Plugin... plugins) { + this.plugins = ImmutableList.copyOf(plugins); + return this; + } + @CanIgnoreReturnValue public Builder eventsCompactionConfig(EventsCompactionConfig eventsCompactionConfig) { this.eventsCompactionConfig = eventsCompactionConfig; diff --git a/core/src/main/java/com/google/adk/plugins/PluginManager.java b/core/src/main/java/com/google/adk/plugins/PluginManager.java index a63d9a402..56dea936a 100644 --- a/core/src/main/java/com/google/adk/plugins/PluginManager.java +++ b/core/src/main/java/com/google/adk/plugins/PluginManager.java @@ -23,6 +23,8 @@ import com.google.adk.models.LlmResponse; import com.google.adk.tools.BaseTool; import com.google.adk.tools.ToolContext; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableList; import com.google.genai.types.Content; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Flowable; @@ -81,6 +83,21 @@ public Optional getPlugin(String pluginName) { return plugins.stream().filter(p -> p.getName().equals(pluginName)).findFirst(); } + /** + * Returns the list of registered plugins. + * + *

This method is intended for testing purposes only. + * + *

Note that it returns a copy of the plugins list to prevent modification of the original + * list. + * + * @return The list of registered plugins. + */ + @VisibleForTesting + public List getPlugins() { + return ImmutableList.copyOf(plugins); + } + // --- Callback Runners --- public Maybe runOnUserMessageCallback( diff --git a/core/src/main/java/com/google/adk/runner/Runner.java b/core/src/main/java/com/google/adk/runner/Runner.java index ea7cb80f6..58fc27f47 100644 --- a/core/src/main/java/com/google/adk/runner/Runner.java +++ b/core/src/main/java/com/google/adk/runner/Runner.java @@ -132,6 +132,13 @@ public Builder plugins(List plugins) { return this; } + @CanIgnoreReturnValue + public Builder plugins(Plugin... plugins) { + Preconditions.checkState(this.app == null, "plugins() cannot be called when app is set."); + this.plugins = ImmutableList.copyOf(plugins); + return this; + } + public Runner build() { BaseAgent buildAgent; String buildAppName; diff --git a/core/src/test/java/com/google/adk/runner/RunnerTest.java b/core/src/test/java/com/google/adk/runner/RunnerTest.java index 42452c6a0..8a0a84b08 100644 --- a/core/src/test/java/com/google/adk/runner/RunnerTest.java +++ b/core/src/test/java/com/google/adk/runner/RunnerTest.java @@ -1188,6 +1188,14 @@ public void close_closesPluginsAndCodeExecutors() { verify(plugin).close(); } + @Test + public void buildRunnerWithPlugins_success() { + BasePlugin plugin1 = mockPlugin("test1"); + BasePlugin plugin2 = mockPlugin("test2"); + Runner runner = Runner.builder().agent(agent).appName("test").plugins(plugin1, plugin2).build(); + assertThat(runner.pluginManager().getPlugins()).containsExactly(plugin1, plugin2); + } + public static class Tools { private Tools() {}