Skip to content

Commit bed4cbc

Browse files
committed
feat: Add process LLM request API to BaseToolset
1 parent 509c4aa commit bed4cbc

4 files changed

Lines changed: 473 additions & 16 deletions

File tree

core/src/main/java/com/google/adk/flows/llmflows/BaseLlmFlow.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import com.google.adk.models.LlmRequest;
3939
import com.google.adk.models.LlmResponse;
4040
import com.google.adk.telemetry.Tracing;
41+
import com.google.adk.tools.BaseTool;
42+
import com.google.adk.tools.BaseToolset;
4143
import com.google.adk.tools.ToolContext;
4244
import com.google.common.collect.ImmutableList;
4345
import com.google.common.collect.Iterables;
@@ -99,10 +101,24 @@ private Flowable<Event> preprocess(
99101
RequestProcessor toolsProcessor =
100102
(ctx, req) -> {
101103
LlmRequest.Builder builder = req.toBuilder();
102-
return agent
103-
.canonicalTools(new ReadonlyContext(ctx))
104+
ReadonlyContext readonlyContext = new ReadonlyContext(ctx);
105+
return Flowable.fromIterable(agent.toolsUnion())
104106
.concatMapCompletable(
105-
tool -> tool.processLlmRequest(builder, ToolContext.builder(ctx).build()))
107+
toolOrToolset -> {
108+
ToolContext toolContext = ToolContext.builder(ctx).build();
109+
if (toolOrToolset instanceof BaseToolset toolset) {
110+
return toolset
111+
.processLlmRequest(builder, toolContext)
112+
.andThen(
113+
toolset
114+
.getTools(readonlyContext)
115+
.concatMapCompletable(
116+
tool -> tool.processLlmRequest(builder, toolContext)));
117+
} else if (toolOrToolset instanceof BaseTool tool) {
118+
return tool.processLlmRequest(builder, toolContext);
119+
}
120+
return Completable.complete();
121+
})
106122
.andThen(
107123
Single.fromCallable(
108124
() -> RequestProcessingResult.create(builder.build(), ImmutableList.of())));

core/src/main/java/com/google/adk/tools/BaseToolset.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package com.google.adk.tools;
1818

1919
import com.google.adk.agents.ReadonlyContext;
20+
import com.google.adk.models.LlmRequest;
21+
import io.reactivex.rxjava3.core.Completable;
2022
import io.reactivex.rxjava3.core.Flowable;
2123
import java.util.List;
2224
import org.jspecify.annotations.Nullable;
@@ -32,6 +34,21 @@ public interface BaseToolset extends AutoCloseable {
3234
*/
3335
Flowable<BaseTool> getTools(ReadonlyContext readonlyContext);
3436

37+
/**
38+
* Called during LLM request preprocessing, before the toolset's individual tools are processed.
39+
* Allows the toolset to modify the LLM request, e.g. to append system instructions.
40+
*
41+
* <p>The default implementation is a no-op.
42+
*
43+
* @param llmRequestBuilder The builder for the LLM request to be modified.
44+
* @param toolContext The tool context providing access to session state and agent information.
45+
* @return A {@link Completable} that completes when processing is done.
46+
*/
47+
default Completable processLlmRequest(
48+
LlmRequest.Builder llmRequestBuilder, ToolContext toolContext) {
49+
return Completable.complete();
50+
}
51+
3552
/**
3653
* Performs cleanup and releases resources held by the toolset.
3754
*

0 commit comments

Comments
 (0)