Live Calls & AI Voice
Buyers can talk to your team — and to Mr. Nelson — straight from the chat. Every listing and project chat has Llamar (voice) and Video buttons. Because Onoots is authenticated-first, the buyer is a real conversation participant, so calls connect with their own session — no links, no downloads.
How it works
- The buyer sends a first message (which opens the conversation), then taps Llamar or Video. A LiveKit room opens; your agent joins from the CRM thread and they meet in the same room.
- Incoming calls work both ways: if an agent starts the call from the CRM, the buyer’s chat shows a pulsing Unirse a la llamada button.
- Calls are authorized by the conversation’s participants and brokers only.
Live calls require LiveKit to be configured (LIVEKIT_URL,
LIVEKIT_API_KEY, LIVEKIT_API_SECRET). If it isn’t, the call buttons simply
report that calls are unavailable.
AI Voice (Mr. Nelson answers — powered by Claude)
Optionally, an AI voice agent can answer buyer calls — a concierge that greets the buyer, understands what they’re looking for, and helps in real time (in Spanish or English). A human agent can still join at any time.
The brain is Claude (the same model family as the text concierge). Because Claude is text-only, voice is a pipeline:
Deepgram (speech→text) → Claude (the brain) → ElevenLabs (text→speech) + Silero VADIt runs as a separate persistent worker (Python, on Railway — not a Vercel function) and is off by default. To enable it:
- Provider keys — on the worker:
ANTHROPIC_API_KEY(Claude),DEEPGRAM_API_KEY(STT),ELEVENLABS_API_KEY(TTS), plus the sharedLIVEKIT_URL/LIVEKIT_API_KEY/LIVEKIT_API_SECRET. - Deploy the worker — from
swarm/voice:It registers with LiveKit aspip install -r requirements.txt python agent.py startonoots-voice(explicit dispatch only). - Switch it on — set
VOICE_AI_ENABLED=1in the Vercel app. From then on, starting a call also dispatches the voice agent into the room.
The agent is instructed never to invent prices, availability, or legal / financial guarantees — it defers those to a human advisor. It greets and behaves according to the persona, listing topic, and locale passed at dispatch.
Architecture at a glance
buyer taps Llamar
→ POST /api/conversations/[id]/calls (authorized by the buyer's session)
→ call_session + LiveKit room
→ (if VOICE_AI_ENABLED) dispatch "onoots-voice" into the room
→ Python voice worker joins: Deepgram → Claude → ElevenLabs
→ human agent can join from the CRM thread at any time