feat: Allow cancellation of in-progress Gemini requests and pre-execution checks

- Implements cancellation for Gemini requests while they are actively being processed by the model.
- Extends cancellation support to the  logic within tools. This allows users to cancel operations during the phase where the system is determining if a tool execution requires user confirmation, which can include potentially long-running pre-flight checks or LLM-based corrections.
- Underlying LLM calls for edit corrections (within  and ) and next speaker checks can now also be cancelled.
- Previously, cancellation of the main request was not possible until text started streaming, and pre-execution checks were not cancellable.
- This change leverages the updated SDK's ability to accept an abort token and threads s throughout the request, tool execution, and pre-execution check lifecycle.

Fixes https://github.com/google-gemini/gemini-cli/issues/531
This commit is contained in:
Taylor Mullen
2025-05-27 23:40:25 -07:00
committed by N. Taylor Mullen
parent bfeaac8441
commit f2f2ecf9d8
16 changed files with 260 additions and 61 deletions

View File

@@ -95,9 +95,11 @@ async function main() {
const geminiClient = new GeminiClient(config);
const chat = await geminiClient.startChat();
try {
for await (const event of geminiClient.sendMessageStream(chat, [
{ text: input },
])) {
for await (const event of geminiClient.sendMessageStream(
chat,
[{ text: input }],
new AbortController().signal,
)) {
if (event.type === 'content') {
process.stdout.write(event.value);
}

View File

@@ -142,7 +142,10 @@ export function useToolScheduler(
const { request: r, tool } = initialCall;
try {
const userApproval = await tool.shouldConfirmExecute(r.args);
const userApproval = await tool.shouldConfirmExecute(
r.args,
abortController.signal,
);
if (userApproval) {
// Confirmation is needed. Update status to 'awaiting_approval'.
setToolCalls(
@@ -183,7 +186,7 @@ export function useToolScheduler(
}
});
},
[isRunning, setToolCalls, toolRegistry],
[isRunning, setToolCalls, toolRegistry, abortController.signal],
);
const cancel = useCallback(