MaxLink AI SolutionsMaxine AI

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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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

Tech stack

Runtime
Python 3.12uvhatchlingruff
API
FastAPIStarletteUvicornwebsocketsPydantic 2pydantic-settings
Agent
OpenAI Agents SDKRealtime speech-to-speechServer-side VADStreaming transcription
Retrieval
ChromaDBfastembedBAAI/bge-base-en-v1.5ONNX RuntimeSQLite
Client
Vanilla JSWeb Audio APIAudioWorkletgetUserMedia
Admin
Streamlitpandas
Deployment
DockernginxsupervisordHugging Face SpacesGitHub Actions
Next project

Hive