Skip to content

Commit e7d4187

Browse files
YuqiGuo105Mateusz Krawiec
authored andcommitted
Fix null Event ID in adk_request_confirmation events
Fixes #871 Events generated for tool confirmation requests (adk_request_confirmation) were being created with null IDs because the generateRequestConfirmationEvent() method was missing the .id(Event.generateEventId()) call in the Event builder. This commit: - Adds .id(Event.generateEventId()) to generateRequestConfirmationEvent() in Functions.java to ensure all confirmation request events have non-null UUIDs - Adds regression test generateRequestConfirmationEvent_generatesNonNullEventId() to FunctionsTest.java to verify the fix
1 parent 84dff10 commit e7d4187

2 files changed

Lines changed: 53 additions & 0 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,7 @@ public static Optional<Event> generateRequestConfirmationEvent(
682682

683683
return Optional.of(
684684
Event.builder()
685+
.id(Event.generateEventId())
685686
.invocationId(invocationContext.invocationId())
686687
.author(invocationContext.agent().name())
687688
.branch(invocationContext.branch().orElse(null))

core/src/test/java/com/google/adk/flows/llmflows/FunctionsTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,17 @@
2626
import com.google.adk.agents.RunConfig;
2727
import com.google.adk.agents.RunConfig.ToolExecutionMode;
2828
import com.google.adk.events.Event;
29+
import com.google.adk.events.EventActions;
30+
import com.google.adk.events.ToolConfirmation;
2931
import com.google.adk.testing.TestUtils;
3032
import com.google.common.collect.ImmutableList;
3133
import com.google.common.collect.ImmutableMap;
3234
import com.google.genai.types.Content;
3335
import com.google.genai.types.FunctionCall;
3436
import com.google.genai.types.FunctionResponse;
3537
import com.google.genai.types.Part;
38+
import java.util.Optional;
39+
import java.util.concurrent.ConcurrentHashMap;
3640
import org.junit.Test;
3741
import org.junit.runner.RunWith;
3842
import org.junit.runners.JUnit4;
@@ -389,4 +393,52 @@ public void getAskUserConfirmationFunctionCalls_eventWithConfirmationFunctionCal
389393
ImmutableList<FunctionCall> result = Functions.getAskUserConfirmationFunctionCalls(event);
390394
assertThat(result).containsExactly(confirmationCall1, confirmationCall2);
391395
}
396+
397+
@Test
398+
public void generateRequestConfirmationEvent_generatesNonNullEventId() {
399+
InvocationContext invocationContext = createInvocationContext(createRootAgent());
400+
String functionCallId = "function_call_123";
401+
402+
// Create a function call event with a function call that has an ID
403+
Event functionCallEvent =
404+
Event.builder()
405+
.id("event1")
406+
.invocationId(invocationContext.invocationId())
407+
.author(invocationContext.agent().name())
408+
.content(
409+
Content.fromParts(
410+
Part.builder()
411+
.functionCall(
412+
FunctionCall.builder()
413+
.id(functionCallId)
414+
.name("some_tool")
415+
.args(ImmutableMap.of())
416+
.build())
417+
.build()))
418+
.build();
419+
420+
// Create a function response event with requestedToolConfirmations
421+
ConcurrentHashMap<String, ToolConfirmation> toolConfirmations = new ConcurrentHashMap<>();
422+
toolConfirmations.put(functionCallId, ToolConfirmation.builder().build());
423+
424+
EventActions actionsWithConfirmation =
425+
EventActions.builder().requestedToolConfirmations(toolConfirmations).build();
426+
427+
Event functionResponseEvent =
428+
Event.builder()
429+
.id("event2")
430+
.invocationId(invocationContext.invocationId())
431+
.author(invocationContext.agent().name())
432+
.content(Content.fromParts(Part.fromText("response")))
433+
.actions(actionsWithConfirmation)
434+
.build();
435+
436+
Optional<Event> result =
437+
Functions.generateRequestConfirmationEvent(
438+
invocationContext, functionCallEvent, functionResponseEvent);
439+
440+
assertThat(result).isPresent();
441+
assertThat(result.get().id()).isNotNull();
442+
assertThat(result.get().id()).isNotEmpty();
443+
}
392444
}

0 commit comments

Comments
 (0)