Version: @livekit/agents-plugin-google@1.9.0, @livekit/agents@1.9.0; also present on main.
With realtimeInputConfig.automaticActivityDetection.disabled = true, RealtimeModel.capabilities.turnDetection becomes false, and AgentActivity.userTurnCompleted() correctly routes end-of-turn to realtimeSession.commitAudio() (agents/src/voice/agent_activity.ts:2966). In the Google plugin both methods are empty (plugins/google/src/realtime/realtime_api.ts:1932-1934), so nothing is sent to the server.
async commitAudio() {}
async clearAudio() {}
activityEnd is emitted only from inside generateReply(). The consequence is that an application using local VAD can open a user turn via startUserActivity() but has no supported way to close one, except by also requesting a generation — which on placeholder models injects a synthetic {role:"user", text:"."} turn.
Downstream effect: candidate input transcripts flush in markCurrentGenerationDone(), so with no generation there is no final transcript, and an application-owned turn state machine cannot function.
Expected: commitAudio() sends { realtime_input: { activityEnd: {} } } when manualActivityDetection is true (and clears inUserActivity); clearAudio() has a corresponding behaviour or is documented as unsupported for this provider.
Version:
@livekit/agents-plugin-google@1.9.0,@livekit/agents@1.9.0; also present onmain.With
realtimeInputConfig.automaticActivityDetection.disabled = true,RealtimeModel.capabilities.turnDetectionbecomesfalse, andAgentActivity.userTurnCompleted()correctly routes end-of-turn torealtimeSession.commitAudio()(agents/src/voice/agent_activity.ts:2966). In the Google plugin both methods are empty (plugins/google/src/realtime/realtime_api.ts:1932-1934), so nothing is sent to the server.activityEndis emitted only from insidegenerateReply(). The consequence is that an application using local VAD can open a user turn viastartUserActivity()but has no supported way to close one, except by also requesting a generation — which on placeholder models injects a synthetic{role:"user", text:"."}turn.Downstream effect: candidate input transcripts flush in
markCurrentGenerationDone(), so with no generation there is no final transcript, and an application-owned turn state machine cannot function.Expected:
commitAudio()sends{ realtime_input: { activityEnd: {} } }whenmanualActivityDetectionis true (and clearsinUserActivity);clearAudio()has a corresponding behaviour or is documented as unsupported for this provider.