Skip to Content
Product GuidesLive Calls & AI Voice

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 VAD

It runs as a separate persistent worker (Python, on Railway — not a Vercel function) and is off by default. To enable it:

  1. Provider keys — on the worker: ANTHROPIC_API_KEY (Claude), DEEPGRAM_API_KEY (STT), ELEVENLABS_API_KEY (TTS), plus the shared LIVEKIT_URL / LIVEKIT_API_KEY / LIVEKIT_API_SECRET.
  2. Deploy the worker — from swarm/voice:
    pip install -r requirements.txt python agent.py start
    It registers with LiveKit as onoots-voice (explicit dispatch only).
  3. Switch it on — set VOICE_AI_ENABLED=1 in 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
Last updated on