diff --git a/src/components/configurator/VoiceAgentProvider.tsx b/src/components/configurator/VoiceAgentProvider.tsx index b1ecaab..0890fbd 100644 --- a/src/components/configurator/VoiceAgentProvider.tsx +++ b/src/components/configurator/VoiceAgentProvider.tsx @@ -278,14 +278,12 @@ export default function VoiceAgentProvider({ locale, children }: VoiceAgentProvi wsRef.current = ws; ws.onopen = () => { - // Send setup message with config + // Send setup message — must use "config" key per Gemini Live API spec ws.send(JSON.stringify({ - setup: { + config: { model: `models/${model}`, - generationConfig: { - responseModalities: config.responseModalities, - speechConfig: config.speechConfig, - }, + responseModalities: config.responseModalities, + speechConfig: config.speechConfig, systemInstruction: { parts: [{ text: config.systemInstruction }], }, @@ -300,7 +298,10 @@ export default function VoiceAgentProvider({ locale, children }: VoiceAgentProvi const base64 = arrayBufferToBase64(event.data.data.int16arrayBuffer); ws.send(JSON.stringify({ realtimeInput: { - mediaChunks: [{ mimeType: 'audio/pcm;rate=16000', data: base64 }], + audio: { + data: base64, + mimeType: 'audio/pcm;rate=16000', + }, }, })); } @@ -308,9 +309,11 @@ export default function VoiceAgentProvider({ locale, children }: VoiceAgentProvi ws.onmessage = async (event) => { const msg = JSON.parse(event.data as string); + console.log('[VoiceAgent] Message:', JSON.stringify(msg).slice(0, 200)); - // Setup complete - if (msg.setupComplete) { + // Setup complete — Gemini sends back a setupComplete message + if (msg.setupComplete !== undefined) { + console.log('[VoiceAgent] Setup complete, session active'); setStatus('active'); trackAmplitude(); return;