Case study
Sara — a phone agent that holds a real conversation
A bilingual English and Gulf Arabic voice agent answering live inbound sales calls for a car care company in Abu Dhabi. It quotes nineteen priced services, remembers what was said earlier in the call, and passes 95% of 255 automated assertions.
The problem
Inbound sales calls were being missed. A car care business takes bookings by phone, and every unanswered ring is a job that goes to a competitor — but staffing a line through evenings and weekends costs more than the calls are worth.
The obvious fix is an IVR menu, and it is the wrong one. Callers do not know which menu branch a ceramic coating quote lives under, and they will not sit through four options to find out. What the business actually needed was something that could be asked a question and answer it with a real price.
Why this pipeline
The hard constraint on a phone agent is not accuracy, it is latency. A person will tolerate a pause of roughly a second before they assume the line has dropped and start talking over you. Everything in the design follows from that budget.
So each stage was chosen for speed rather than capability. Speech recognition streams rather than waiting for the caller to finish. Generation runs on Groq because the tokens arrive fast enough to start speaking before the sentence is finished. Retrieval is a vector lookup against the price list rather than stuffing the whole catalogue into the prompt — cheaper, and it keeps the model from inventing a service that is not sold.
Session state sits in Redis because the agent needs to remember what was said thirty seconds ago without a database round trip. That is what lets a caller say “and how much for the bigger one?” and get a sensible answer.
Getting it to bilingual
Gulf Arabic was the part that could not be bought off the shelf. Callers switch between Arabic and English inside a single sentence, often inside a single clause, and a model told to answer in one language will fight them.
The routing layer detects the language of each turn rather than the call, so the agent follows the caller instead of forcing a choice at the start. Persona and tone are held separately from the language so the agent does not become a different character when it switches.
Proving it works
A voice agent cannot be tested by listening to it. There are too many ways a conversation can go, and the failures that matter — quoting the wrong price, forgetting the car model, answering a question that was not asked — only show up in the specific turn where they happen.
So the behaviour is pinned by 255 automated assertions covering intent, pricing accuracy, retrieval grounding, memory across turns and persona consistency. The suite currently passes 95%. The scenarios that run as full-length conversations, rather than isolated turns, pass 100% — which is the number that matters most, because that is the shape of a real call.
What it runs on
FastAPI on Google Cloud Run, with Twilio handling the media stream in both directions. Streaming speech-to-text and text-to-speech at both ends, Groq for generation, Pinecone for retrieval and Redis for session state.
It is a private client system, so there is no public URL to visit — which is why the card in the work grid draws a waveform instead of showing a screenshot.
Stack
- Twilio media streaming
- Streaming STT
- Streaming TTS
- Groq
- Pinecone retrieval
- Intent routing
- Persona control
- FastAPI
- Google Cloud Run
- Redis session state