01
Speech-native voice
Chose Ultravox for listening, reasoning and speaking in one call over a speech-to-text, LLM and text-to-speech chain run by the backend.
The backend only sends Ultravox a call config. Twilio streams the caller’s audio straight to the join URL it returns.
Trade-off: Voice, latency and tool calling all depend on one vendor’s API.
02
One number, one agent
Chose A Twilio number per agent over one shared line with a phone menu.
The dialled number picks the agent, so each line has its own greeting, prompt and voice. Callers hear a fallback message when it’s busy.
Trade-off: Every agent needs its own Twilio number.
03
Documents off the request path
Chose A Redis-backed Bull queue for parsing and embedding uploads over processing each file inside the upload request.
Uploads return at once. A worker moves each entry from pending to indexed, retrying up to three times with exponential backoff.
Trade-off: Redis becomes a required service alongside Postgres.