A call-center agent you talk to, not a phone tree you survive.
Maxine is a real-time, speech-to-speech voice agent for a national indoor-air-quality franchise network — duct cleaning, HVAC restoration and dryer vent work across the US and Canada. A caller opens a page, clicks once, and holds an ordinary spoken conversation about services, locations and scheduling.
- Company
- MaxLink AI Solutions
- Industry
- Cloud communications · Contact center · Voice AI
- Engagement
- Real-time voice agent build
- Year
- 2026
Overview
Franchise call handling is mostly the same twenty questions — which services are offered, whether there is a location nearby, what a given job actually involves — asked at all hours and answered by whoever picks up. Maxine takes the call instead. Audio runs both ways over one socket, so replies begin while the caller is still finishing their sentence, and interrupting works the way it does with a person. The engineering that matters is not the talking — it is making sure the answer is true.
What we built
- 01A browser call surface: mic audio captured as PCM16 in an AudioWorklet, streamed over a WebSocket to FastAPI, relayed into an OpenAI Realtime session, and played back through a separate AudioContext — with barge-in, so a caller can interrupt mid-sentence
- 02A hybrid retrieval split the agent chooses between per question: a structured SQLite catalog for exact, filterable facts, and a local ChromaDB index for descriptive ones
- 03A voice-shaped prompt layer: per-job pricing instead of quoted dollar figures, phone numbers read digit-by-digit, and an explicit rule against hanging up on a caller who is merely saying thanks
- 04A Streamlit admin dashboard so non-developers can edit locations, services, contacts and the knowledge base without touching SQL or git — with a drift banner when the live database and the committed source of truth disagree
- 05A single-container deployment: nginx fronting the API and the dashboard on one port, supervisord keeping both alive, and the search index built at image build time so the first caller never waits on a cold start
Where the answer comes from
Two knowledge sources, and the agent is instructed to pick deliberately rather than search everything every time. A question that spans both calls both.
- Structured catalogSQLite · 41 locations, 22 services, 7 support contacts
- Exact facts that need filtering. “Is there a location near Tampa?”
- Vector indexChromaDB · 43 knowledge sections, chunked at headings
- Descriptive and conceptual questions. “Why does dryer vent cleaning matter?”
Guardrails
- Never quotes a dollar figure — pricing is per-job, after a free on-site estimate
- Never invents a phone number; it reads real ones back digit-by-digit so they survive being spoken
- “Thanks” is not a request to end the call — only a clear goodbye is, and the farewell is spoken before the socket closes
- A hard call cap and an idle-socket timeout, so a forgotten tab cannot run up a bill