Skip to content

Commit a2d7349

Browse files
google-genai-botcopybara-github
authored andcommitted
refactor: BaseAgent: Unwrap List from Optional, improve test coverage
PiperOrigin-RevId: 860210309
1 parent 0dd5278 commit a2d7349

File tree

4 files changed

+46
-15
lines changed

4 files changed

+46
-15
lines changed

core/src/main/java/com/google/adk/agents/BaseAgent.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ public abstract class BaseAgent {
5959

6060
private final List<? extends BaseAgent> subAgents;
6161

62-
private final Optional<List<? extends BeforeAgentCallback>> beforeAgentCallback;
63-
private final Optional<List<? extends AfterAgentCallback>> afterAgentCallback;
62+
private final List<? extends BeforeAgentCallback> beforeAgentCallback;
63+
private final List<? extends AfterAgentCallback> afterAgentCallback;
6464

6565
/**
6666
* Creates a new BaseAgent.
@@ -83,8 +83,9 @@ public BaseAgent(
8383
this.description = description;
8484
this.parentAgent = null;
8585
this.subAgents = subAgents != null ? subAgents : ImmutableList.of();
86-
this.beforeAgentCallback = Optional.ofNullable(beforeAgentCallback);
87-
this.afterAgentCallback = Optional.ofNullable(afterAgentCallback);
86+
this.beforeAgentCallback =
87+
beforeAgentCallback != null ? beforeAgentCallback : ImmutableList.of();
88+
this.afterAgentCallback = afterAgentCallback != null ? afterAgentCallback : ImmutableList.of();
8889

8990
// Establish parent relationships for all sub-agents if needed.
9091
for (BaseAgent subAgent : this.subAgents) {
@@ -171,11 +172,11 @@ public List<? extends BaseAgent> subAgents() {
171172
return subAgents;
172173
}
173174

174-
public Optional<List<? extends BeforeAgentCallback>> beforeAgentCallback() {
175+
public List<? extends BeforeAgentCallback> beforeAgentCallback() {
175176
return beforeAgentCallback;
176177
}
177178

178-
public Optional<List<? extends AfterAgentCallback>> afterAgentCallback() {
179+
public List<? extends AfterAgentCallback> afterAgentCallback() {
179180
return afterAgentCallback;
180181
}
181182

@@ -185,7 +186,7 @@ public Optional<List<? extends AfterAgentCallback>> afterAgentCallback() {
185186
* <p>This method is only for use by Agent Development Kit.
186187
*/
187188
public List<? extends BeforeAgentCallback> canonicalBeforeAgentCallbacks() {
188-
return beforeAgentCallback.orElse(ImmutableList.of());
189+
return beforeAgentCallback;
189190
}
190191

191192
/**
@@ -194,7 +195,7 @@ public List<? extends BeforeAgentCallback> canonicalBeforeAgentCallbacks() {
194195
* <p>This method is only for use by Agent Development Kit.
195196
*/
196197
public List<? extends AfterAgentCallback> canonicalAfterAgentCallbacks() {
197-
return afterAgentCallback.orElse(ImmutableList.of());
198+
return afterAgentCallback;
198199
}
199200

200201
/**
@@ -239,8 +240,7 @@ public Flowable<Event> runAsync(InvocationContext parentContext) {
239240
() ->
240241
callCallback(
241242
beforeCallbacksToFunctions(
242-
invocationContext.pluginManager(),
243-
beforeAgentCallback.orElse(ImmutableList.of())),
243+
invocationContext.pluginManager(), beforeAgentCallback),
244244
invocationContext)
245245
.flatMapPublisher(
246246
beforeEventOpt -> {
@@ -257,7 +257,7 @@ public Flowable<Event> runAsync(InvocationContext parentContext) {
257257
callCallback(
258258
afterCallbacksToFunctions(
259259
invocationContext.pluginManager(),
260-
afterAgentCallback.orElse(ImmutableList.of())),
260+
afterAgentCallback),
261261
invocationContext)
262262
.flatMapPublisher(Flowable::fromOptional));
263263

core/src/test/java/com/google/adk/agents/BaseAgentTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,4 +316,24 @@ public void canonicalCallbacks_returnsListWhenPresent() {
316316
assertThat(agent.canonicalBeforeAgentCallbacks()).containsExactly(bc);
317317
assertThat(agent.canonicalAfterAgentCallbacks()).containsExactly(ac);
318318
}
319+
320+
@Test
321+
public void runLive_invokesRunLiveImpl() {
322+
var runLiveImpl = TestCallback.<Void>returningEmpty();
323+
Content runLiveImplContent = Content.fromParts(Part.fromText("live_output"));
324+
TestBaseAgent agent =
325+
new TestBaseAgent(
326+
TEST_AGENT_NAME,
327+
TEST_AGENT_DESCRIPTION,
328+
/* beforeAgentCallbacks= */ ImmutableList.of(),
329+
/* afterAgentCallbacks= */ ImmutableList.of(),
330+
runLiveImpl.asRunLiveImplSupplier(runLiveImplContent));
331+
InvocationContext invocationContext = TestUtils.createInvocationContext(agent);
332+
333+
List<Event> results = agent.runLive(invocationContext).toList().blockingGet();
334+
335+
assertThat(results).hasSize(1);
336+
assertThat(results.get(0).content()).hasValue(runLiveImplContent);
337+
assertThat(runLiveImpl.wasCalled()).isTrue();
338+
}
319339
}

core/src/test/java/com/google/adk/agents/ConfigAgentUtilsTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,10 +1204,8 @@ public void fromConfig_withConfiguredCallbacks_resolvesCallbacks()
12041204
assertThat(agent).isInstanceOf(LlmAgent.class);
12051205
LlmAgent llm = (LlmAgent) agent;
12061206

1207-
assertThat(agent.beforeAgentCallback()).isPresent();
1208-
assertThat(agent.beforeAgentCallback().get()).hasSize(2);
1209-
assertThat(agent.afterAgentCallback()).isPresent();
1210-
assertThat(agent.afterAgentCallback().get()).hasSize(1);
1207+
assertThat(agent.beforeAgentCallback()).hasSize(2);
1208+
assertThat(agent.afterAgentCallback()).hasSize(1);
12111209

12121210
assertThat(llm.beforeModelCallback()).isPresent();
12131211
assertThat(llm.beforeModelCallback().get()).hasSize(1);

core/src/test/java/com/google/adk/testing/TestCallback.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ public Supplier<Flowable<Event>> asRunAsyncImplSupplier(String contentText) {
102102
return asRunAsyncImplSupplier(Content.fromParts(Part.fromText(contentText)));
103103
}
104104

105+
/**
106+
* Returns a {@link Supplier} that marks this callback as called and returns a {@link Flowable}
107+
* with an event containing the given content.
108+
*/
109+
public Supplier<Flowable<Event>> asRunLiveImplSupplier(Content content) {
110+
return () ->
111+
Flowable.defer(
112+
() -> {
113+
markAsCalled();
114+
return Flowable.just(Event.builder().content(content).build());
115+
});
116+
}
117+
105118
@SuppressWarnings("unchecked") // This cast is safe if T is Content.
106119
public BeforeAgentCallback asBeforeAgentCallback() {
107120
return ctx -> (Maybe<Content>) callMaybe();

0 commit comments

Comments
 (0)