<#C088ZNU7QQ5> Hi need help with gemini live flash...
# ask-ai
b
#C088ZNU7QQ5 Hi need help with gemini live flash 3.1model , the TTFT latency is too high
✅ 1
t
Thanks for reaching out, rohit. I'm an AI assistant and I'm here to help. Give me a moment while I research this topic.
Thanks — I’m responding to your note about high TTFT latency with the Gemini Live Flash 3.1 model. A few facts first: • Gemini 3.1 Flash has compatibility limitations with LiveKit Agents (some mid-session updates and async features are ignored), and that can affect responsiveness. • Target LLM TTFT is <300ms; e2e should be <800ms (STT <200ms, LLM TTFT <300ms, TTS TTFB <300ms). Quick steps to diagnose and reduce TTFT (please try these and tell me results): 1. Measure current breakdown ◦ Enable
ConversationItemAddedEvent
metrics and report
llm_node_ttft
,
tts_node_ttfb
, and
e2e_latency
. This shows which component is slow. 1. Reduce model thinking time ◦ Set
thinkingConfig.thinkingLevel
to
"minimal"
for lowest internal latency. 1. Use streaming everywhere ◦ Ensure STT, LLM, and TTS are in streaming mode (no batch calls). 1. Avoid mid-session updates ◦ Stop using
update_instructions()
,
generate_reply()
or
send_client_content
after the first turn (these are ignored by Gemini 3.1 and can add overhead). 1. Check network and region ◦ Test network RTT to the model/TTS endpoints and move to a closer region or reduce hops if possible. 1. Try an alternate model ◦ If low latency is critical, test Gemini 2.5 Flash (it lacks the 3.1 mid-session restrictions) and compare TTFT. Please share: • The metric values for
llm_node_ttft
and
e2e_latency
from your session logs, and whether you’re using streaming for STT/LLM/TTS. I’ll use those to recommend next steps. Sources: Gemini Live API plugin | LiveKit Documentation | Build Your First AI Voice Agent in Python: Complete Tutorial | LiveKit | Build Your First AI Voice Agent in Python: Complete Tutorial | LiveKit, with interactive elements
b
We are using s2s model gemini-3.1-flash-live-preview
t
Thanks — I’m following up about your s2s model
gemini-3.1-flash-live-preview
. Could you share the measured latency metrics from your session logs so I can pinpoint the issue: •
llm_node_ttft
•
tts_node_ttfb
•
e2e_latency
Also confirm: • Are STT, LLM, and TTS all running in streaming mode? • Any use of mid-session calls like
update_instructions()
,
send_client_content
after the first turn, or
generate_reply()
? With those values and answers I’ll recommend the next concrete steps. , with interactive elements
b
This is the langfuse snippet
t
Thanks — I’m following up on the Langfuse snippet. Please paste the Langfuse snippet (or the specific metric values) showing: •
llm_node_ttft
•
tts_node_ttfb
•
e2e_latency
And confirm: • Are STT, LLM, and TTS all running in streaming mode? • Are you calling
update_instructions()
,
send_client_content
after the first turn, or
generate_reply()
during the session? Once I have those I’ll pinpoint the bottleneck and recommend concrete fixes. , with interactive elements
b
yes we are using Hello as user input for generating initial inroduction
generate_reply("Helow)
t
Thanks — I see you called
generate_reply("Helow")
as the initial user input for the session with
gemini-3.1-flash-live-preview
. Important:
generate_reply()
is not supported by Gemini 3.1 Flash Live Preview and its calls are ignored. That can add overhead and increase perceived TTFT. Please switch to the standard request–response flow (send the user input as the initial turn rather than using
generate_reply()
). Next steps to reduce TTFT: • Set
thinkingConfig.thinkingLevel
to "minimal". • Ensure STT, LLM, and TTS are all in streaming mode (no batch processing). • Stop using mid-session calls like
update_instructions()
,
send_client_content
after the first turn, or
generate_reply()
during the session. • If possible, test with Gemini 2.5 Flash to compare latency. Please paste the Langfuse metric values for: •
llm_node_ttft
•
tts_node_ttfb
•
e2e_latency
and confirm that STT/LLM/TTS are streaming. I’ll analyze those numbers and recommend any remaining fixes. , with interactive elements
b
", "ttft": 1.25,
t
Thanks — I see
ttft: 1.25s
. That’s well above the target of <300 ms, so let’s pinpoint where the extra latency is coming from. Please provide: •
tts_node_ttfb
•
e2e_latency
• Confirm whether STT, LLM, and TTS are all running in streaming mode. Immediate actions to reduce TTFT (apply now and report results): 1. Stop using
generate_reply()
— Gemini 3.1 Flash ignores it and it adds overhead; send the user input as the normal initial turn instead. 2. Set
thinkingConfig.thinkingLevel
to "minimal". 3. Ensure STT, LLM, and TTS are all using streaming (no batch calls). 4. Avoid mid-session calls like
update_instructions()
or
send_client_content
after the first turn. 5. Check network RTT to model/TTS endpoints and use a closer region if possible. 6. If latency remains high, run a comparison test with Gemini 2.5 Flash. Share the requested metrics and whether streaming is enabled and I’ll recommend the next concrete step. , with interactive elements
b
{"message": "received server content but no active generation.", "level": "WARNING", "name": "livekit.plugins.google", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T132714.294766+00:00"} what is this error
t
Thanks — that warning means the LiveKit Google plugin received content from the model endpoint at a time when no active generation was running. Common causes and next steps: • Cause: You’re using unsupported mid-session calls (e.g.,
generate_reply()
,
update_instructions()
, or
send_client_content
after the first turn) with
gemini-3.1-flash-live-preview
. Gemini 3.1 ignores those calls and the agent can log "received server content but no active generation." • Effect: Ignored/unsynchronized responses can add overhead and increase perceived TTFT. What to do now: • Stop using
generate_reply()
and send the user input as the normal initial turn. • Ensure STT, LLM, and TTS are all in streaming mode. • Set
thinkingConfig.thinkingLevel
to
"minimal"
. • Avoid mid-session updates like
update_instructions()
or
send_client_content
after the first turn. If you still see the warning after making those changes, paste these items: • Full log around the warning (a few lines before/after) •
llm_node_ttft
,
tts_node_ttfb
,
e2e_latency
• Whether streaming is enabled for STT/LLM/TTS I’ll analyze those and recommend next steps. , with interactive elements
b
Bot speech created (source=generate_reply) → Starting grace period (4.0s)", "level": "INFO", "name": "orchestrator.bargein_guard", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:24.150005+00:00"}
{"message": "[voice_assistant_room_3901] 🛡️ Grace period STARTED (4.0s) - customer MUTED (audio disconnected)", "level": "INFO", "name": "orchestrator.bargein_guard",
whst does this mean? that explicit call to generate_reply wa made?
Copy code
@self.session.on("speech_created")
def on_speech_created(event: SpeechCreatedEvent):
    # Only apply grace period to bot-initiated speech (not user-initiated)
    if not event.user_initiated:
        <http://logger.info|logger.info>(
            "[%s] 🎤 Bot speech created (source=%s) → Starting grace period (%.1fs)",
            self.room_name, event.source, GRACE_PERIOD_SECONDS
        )
This is code block
t
Thanks — I’m responding to the logs and code you shared. What the logs mean • The
Bot speech created (source=generate_reply)
line shows your system did call
generate_reply
(the event source is
generate_reply
). • The orchestrator then started a 4.0s “grace period” and muted the customer to prevent barge‑in while the bot would speak. • The earlier warning "received server content but no active generation" appears because Gemini 3.1 Flash Live Preview ignores mid‑session calls like `generate_reply`; the plugin received content from the model when there was no supported active generation, producing that warning. Why this matters for TTFT • Calling
generate_reply()
with Gemini 3.1 introduces ignored/unsynchronized flows and extra overhead, which increases perceived TTFT. • Gemini 3.1 does not accept mid‑session updates (
generate_reply()
,
update_instructions()
,
send_client_content
), so those calls should be avoided. Recommended immediate changes • Stop using `generate_reply()`; send the user input as the normal initial turn instead. • Ensure STT, LLM, and TTS are running in streaming mode. • Set
thinkingConfig.thinkingLevel
to
"minimal"
. • Remove mid‑session
update_instructions()
/
send_client_content()
calls. If you want, paste: • A few log lines before/after the warning and the grace‑period info, •
llm_node_ttft
,
tts_node_ttfb
, and
e2e_latency
metric values, and I’ll pinpoint the remaining bottleneck and next steps. , with interactive elements
b
more. logs
{"message": "[voice_assistant_room_3901] 🤖 Starting agent session...", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:26:59.955064+00:00"}
2026-04-21T13:27:00.033833571Z {"message": "update_instructions is not compatible with 'gemini-3.1-flash-live-preview' and will be ignored.", "level": "WARNING", "name": "livekit.plugins.google", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:00.025560+00:00"}
{"message": "update_chat_ctx is not compatible with 'gemini-3.1-flash-live-preview' and will be ignored.", "level": "WARNING", "name": "livekit.plugins.google", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:00.025716+00:00"}
{"message": "[voice_assistant_room_3901] ✅ Agent session started", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:00.042101+00:00"}
{"message": "[voice_assistant_room_3901] 🎯 Interruption tracking enabled", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:00.142825+00:00"}
{"message": "[voice_assistant_room_3901] 🎧 Track subscription handler registered", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:00.142988+00:00"}
{"message": "RealtimeModel metrics", "level": "INFO", "name": "livekit.agents", "model_name": "gemini-3.1-flash-live-preview", "model_provider": "Gemini", "ttft": -1, "input_tokens": 0, "cached_input_tokens": 0, "input_text_tokens": 0, "input_cached_text_tokens": 0, "input_image_tokens": 0, "input_cached_image_tokens": 0, "input_audio_tokens": 0, "input_cached_audio_tokens": 0, "output_tokens": 0, "output_text_tokens": 0, "output_audio_tokens": 0, "output_image_tokens": 0, "total_tokens": 0, "tokens_per_second": 0.0, "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:00.310545+00:00"}
not authenticated
{"message": "[voice_assistant_room_3901] 🎧 Audio track subscribed: participant=sip_target_8097313121, track=TR_AMVdkr44CfXFDC", "level": "INFO", "name": "audio_frame_processor", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:00.363293+00:00"}
{"message": "[voice_assistant_room_3901] ✅ WebRTC VAD initialized: aggressiveness=2, sample_rate=16000, frame_duration=20ms", "level": "INFO", "name": "audio_frame_processor", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:00.363431+00:00"}
{"message": "[voice_assistant_room_3901] 📡 Audio stream created, reading frames...", "level": "INFO", "name": "audio_frame_processor", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:00.364091+00:00"}
{"message": "livekit_ffi::server::audio_stream:135:livekit_ffi::server::audio_stream - failed to initialize the audio filter. it will not be enabled for this session.", "level": "ERROR", "name": "livekit", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:00.371294+00:00"}
2026-04-21T13:27:09.284785896Z {"message": "[voice_assistant_room_3901] ✅ SIP participant created with identity: sip_target_8097313121 with sip_status: active and id:PA_6KKBkXDWLNGi", "level": "INFO", "name": "orchestrator.call_orch_service", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.283914+00:00"}
{"message": "[voice_assistant_room_3901] ⏳ Waiting for participant 'sip_target_8097313121' (timeout: 60s)", "level": "INFO", "name": "orchestrator.call_orch_service", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.284071+00:00"}
{"message": "8.3 [voice_assistant_room_3901] ✅ Participant joined: sip_target_8097313121 (sid=PA_6KKBkXDWLNGi)", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.284248+00:00"}
[voice_assistant_room_3901] 🎙️ Starting recording...", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.288604+00:00"}
{"message": "Failed to resolve voicebot_bucket for bank_code '1': name 'bank_code' is not defined", "level": "WARNING", "name": "orchestrator.recording_service", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.288687+00:00"}
{"message": "[voice_assistant_room_3901] 🎙️ Starting recording: /2026-04-21/cust_001/voice_assistant_room_3901_.ogg", "level": "INFO", "name": "orchestrator.recording_service", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.288719+00:00"}
{"message": "[voice_assistant_room_3901] ✅ Recording started: /2026-04-21/cust_001/voice_assistant_room_3901_.ogg", "level": "INFO", "name": "orchestrator.recording_service", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.845855+00:00"}
{"message": "8.4 [voice_assistant_room_3901] ✅ Recording started: /2026-04-21/cust_001/voice_assistant_room_3901_.ogg", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.845980+00:00"}
{"message": "[voice_assistant_room_3901] 🛡️ Starting uninterruptible introduction (timeout=15.0s, voicemail_detection=True)", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.846036+00:00"}
{"message": "[voice_assistant_room_3901] 👂 Listening for voicemail indicators (2.0s)...", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.846087+00:00"}
{"message": "[voice_assistant_room_3901] 🎙️ Voicemail detection started", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:09.846123+00:00"}
2026-04-21T13:27:11.848754234Z {"message": "[voice_assistant_room_3901] ✅ Voicemail detection stopped - human detected", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:11.847197+00:00"}
{"message": "[voice_assistant_room_3901] ✅ Human detected - proceeding with intro", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:11.847352+00:00"}
{"message": "[voice_assistant_room_3901] ⏭️ Skipping introduction guard for Google model", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:11.847406+00:00"}
{"message": "[voice_assistant_room_3901] 🛡️ Introduction completed - customer audio now connected", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:11.847455+00:00"}
{"message": "[voice_assistant_room_3901] 🛡️ BargeinGuard initialized (grace period: 4.0s)", "level": "INFO", "name": "orchestrator.bargein_guard", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:11.847553+00:00"}
{"message": "[voice_assistant_room_3901] 🛡️ Barge-in guard enabled", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:11.847608+00:00"}
{"message": "[voice_assistant_room_3901] 👂 Waiting for call to end (max 180 seconds timeout)...", "level": "INFO", "name": "orchestrator.session_orchestrator", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:11.847655+00:00"}
{"message": "[voice_assistant_room_3901] 👂 Call lifecycle monitoring started (target: sip_target_8097313121, timeout: none)", "level": "INFO", "name": "orchestrator.call_orch_service", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:11.847846+00:00"}
2026-04-21T13:27:14.295189671Z {"message": "received server content but no active generation.", "level": "WARNING", "name": "livekit.plugins.google", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:14.294766+00:00"}
2026-04-21T13:27:24.150903731Z {"message": "[voice_assistant_room_3901] 🎤 Bot speech created (source=generate_reply) → Starting grace period (4.0s)", "level": "INFO", "name": "orchestrator.bargein_guard", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:24.150005+00:00"}
{"message": "[voice_assistant_room_3901] 🛡️ Grace period STARTED (4.0s) - customer MUTED (audio disconnected)", "level": "INFO", "name": "orchestrator.bargein_guard", "pid": 145, "job_id": "AJ_t5e43HdFoiQE", "room_id": "RM_9ueP89AypxxM", "timestamp": "2026-04-21T13:27:24.150688+00:00"}
t
Thanks — I reviewed your full logs and code. Quick summary, cause, and concrete next steps. What the logs show • You did call mid‑session APIs:
generate_reply()
(log: "source=generate_reply") and there are warnings that
update_instructions
/
update_chat_ctx
are ignored for
gemini-3.1-flash-live-preview
. • The Google plugin logged: "received server content but no active generation." That happens when the model endpoint returns content while the agent/plugin has no supported active generation (because mid‑session calls are ignored). • The orchestrator then started a 4s grace period and muted the caller for the bot reply (expected behavior when bot speech is created). • Additional warnings/errors in the logs to note: "not authenticated" and "failed to initialize the audio filter" — these won’t be the primary TTFT cause but are worth fixing. Why this increases TTFT • Gemini 3.1 Flash ignores mid‑session calls (generate_reply, update_instructions, update_chat_ctx, send_client_content after first turn). Those ignored/unsynchronized flows create overhead, warnings, and perceived latency. • The model’s internal thinking time can also add latency if not configured for minimum thinking. Immediate concrete actions (apply now) 1. Stop using mid‑session methods with this model: ◦ Remove
generate_reply()
,
update_instructions()
,
update_chat_ctx()
, and any
send_client_content
after the first turn. Send the user input as the normal initial turn instead. 1. Set thinking to minimal: ◦ Set
thinkingConfig.thinkingLevel = "minimal"
. 1. Use streaming for all components: ◦ Ensure STT, LLM, and TTS are configured in streaming mode (no batch processing). 1. Fix auxiliary warnings: ◦ Resolve the "not authenticated" source (check plugin credentials) and the audio filter init error (audio library/deps). 1. Compare models if needed: ◦ If latency still unacceptable, run the same flow with Gemini 2.5 Flash (no mid‑session restrictions) to compare TTFT. What I need from you to pinpoint remaining bottlenecks • Metric values:
llm_node_ttft
,
tts_node_ttfb
, and
e2e_latency
for this session. • Confirm whether STT/LLM/TTS are currently streaming. • A few log lines immediately before the "received server content but no active generation." warning (if different from what you pasted). Apply steps 1–3 and send the requested metrics/log snippet and I’ll tell you the next targeted fix. , with interactive elements
b
i am using gemini live flash model 3.1 and getting 1011 error from gemini regarding quota
t
Thanks — I’m responding about the Gemini 3.1 quota/1011 error and next steps. What 1011 means • Error 1011 indicates you’ve hit a quota or rate limit on the Gemini Live API. Immediate checks • Tell me whether you’re using a Google API key (direct plugin) or LiveKit Inference (LiveKit Cloud). • Paste the redacted log line showing the exact 1011 error and the timestamp. • Share recent usage metrics (requests/min or inference credits) if available. How to resolve • If using a Google API key: check quotas and request an increase in Google AI Studio (usage and quota pages). • If using LiveKit Inference: check Inference quotas and credit usage in the LiveKit Cloud dashboard and upgrade your plan or buy more credits. • Reduce retries/backoff frequency to avoid hitting rate limits during bursts. Concurrent recommendations to keep TTFT down • Stop using unsupported mid‑session calls (
generate_reply()
,
update_instructions()
,
update_chat_ctx()
,
send_client_content
after first turn) with
gemini-3.1-flash-live-preview
. • Set
thinkingConfig.thinkingLevel = "minimal"
. • Ensure STT, LLM, and TTS are all streaming. • Consider running a comparison test with Gemini 2.5 Flash if low latency and full mid‑session support are required. Send me: • Whether you use Google API key or LiveKit Inference, • The exact 1011 log line (redacted), • Any quota/usage numbers you can grab. I’ll point to the precise next steps to restore service and reduce TTFT. Sources: LiveKit Inference | Fast, reliable access to voice AI models | LiveKit | Introducing LiveKit Inference: A unified model interface for voice AI | Liv..., with interactive elements