I fix production voice agents that drop, go silent, or mistime SIP answer. Hundreds of production AI phone calls. Send the failing call's trace and let's work;)
AI voice agents on a phone call fail to dial out after a restart.
Symptom: Rerunning provisioning leaves two trunks with different ids.
Cause: Trunk APIs create rather than upsert.
Fix: Match trunks by name to update them in place.
Read more here: https://t.co/GAYKAiSb0a
AI voice agents drop live calls when timers guess wrong, and block dials when sessions leak.
Value: A configured 5-minute poll repairs drift.
What it is: Calls end only when the media server confirms the room is gone.
Why it matters: Ending calls by age drops long conversations.
Standard text engines do not suit multimodal inference. Nari Labs shared an open-sourced Qwen3-TTS engine on Hacker News because vLLM struggles with multimodal inference. If you run custom models, check time to first audio to manage turn taking.
Source: https://t.co/ixCXki1S8e
Phone calls do not route after reboot because telephony config is derived.
Belief: Telephony setup is persistent.
Actually: It clears on restart.
Why: State is volatile, so the script polls for health and pushes the config using a token.
Read more here: https://t.co/LfYtN7YTy3
We saw AI voice agents on phone calls drop short first answers.
Belief: The model ignores one-word replies.
Actually: The echo-cancellation warm-up ate them.
Why: A 3.0 s window forces silence to block echo, erasing fast phone responses.
Read more here: https://t.co/TUS2wamOFa
Evict the cache and retry once on a narrow "trunk does not exist" error.
Persistence handles the common case.
Resolve-by-name survives the rest.
Measure: check from outside the container that the Redis data directory is actually mounted.
Read more here: https://t.co/LfYtN7YTy3
Mechanism: SIP trunks live in Redis.
A stock Redis container has no persistence, so recreating it empties the store.
My provisioning path recreated the trunks and got brand-new identifiers.
Every trunk id I cached in my database became stale.
Fix: I turned on append-only persistence with a mounted data directory.
I bound Redis to loopback with protected mode on.
I stopped treating a trunk id as a durable key.
I resolve trunks by name and cache the id instead.
I always prefer native event loop monitoring over attaching profilers to debug stalls. The livekit-agents 1.8.2 update surfaces asyncio blocking calls in Agent Insights. If you run voice agents, check your event loop for synchronous blocks.
Source: https://t.co/FzrY51sEU7
Assuming a fixed sleep secures the final voice agent's goodbye is false, causing truncated speech or dead air. The sleep guesses a variable utterance length, and session close interrupts playout. I await playout capped at 6 s instead, and shield the 5 s room delete from timeouts.