Setup: gemini-3.8-live through the Gemini API (AI Studio endpoint), google-genai 2.25.0 (Python). One tool, book_slot, backed by a fake in-process service that commits 4 s after the call. A scripted user asks for a booking; 1 s after the toolCall arrives, the user says “Actually, stop. Don’t book it.” Input as typed text and, separately, as synthesized speech streamed in real time with VAD at its default. Variants: behavior unset (NON_BLOCKING default) and BLOCKING; stop before the call, during, and after the commit; scheduling SILENT on the response. 30 sessions, all timelines logged at millisecond resolution.
Observed:
toolCallCancellationnever arrived, in any variant. That includes BLOCKING calls whereinterrupted: truewas received 16 to 18 ms (text) or 139 to 152 ms (speech) after the stop.- After an interrupted BLOCKING call, the FunctionResponse sent for that call id looked ignored: the model either issued the same call again with a new id (two bookings), or told the user nothing had been booked although the response said
status: booked. - In the default mode, with the model silent after emitting the call, the stop produced no
interruptedand no cancellation. The model answered the stop as a new turn and, in text mode, said the booking was already made before any tool response had been sent.
The reference says the cancellation “occurs only in cases where the clients interrupt server turns”, which matches observation 3. Questions:
- With NON_BLOCKING as the default, is there any server-side signal that a pending tool call has been abandoned, or is that entirely the client’s responsibility?
- For BLOCKING, is the pending call discarded on interruption? If so, is the client supposed to receive a cancellation for it, and is the FunctionResponse for that id expected to be dropped?
Harness, raw JSONL timelines and the audio clips: GitHub - frontier-on-cloud/gemini-live-stop-test · GitHub
Caveats: fake service, synthetic single voice, N=3 per scenario.