Så byggde vi AI-tandläkaren
En enkel arkitektur med tre delar: telefoni via 46elks, röst-AI från Deepgram och en SQLite-databas för bokningar. Allt körs på en enkel Linux-server.
Arkitekturöversikt
När en patient ringer kommer samtalet in via 46elks som en WebSocket-anslutning. Servern bridgar ljudet till Deepgram Voice Agent som hör vad patienten säger, tänker ut ett svar och pratar tillbaka. När AI:n behöver kolla schemat eller boka en tid anropas funktioner mot vår SQLite-databas.
Patient → Telefon → 46elks (WebSocket) → Server → Deepgram Voice Agent → Tool calls → SQLite
Telefonin — 46elks
46elks är ett svenskt telekom-API som gör det enkelt att ta emot och ringa samtal programmatiskt. Vi använder deras WebSocket-baserade telefoni — när någon ringer vårt nummer skickas samtalet som en WebSocket-anslutning till vår server.
- Svenskt nummer — ett vanligt 07-nummer som vem som helst kan ringa
- WebSocket-protokoll — ljud strömmas som base64-kodat PCM (24 kHz, 16-bit, mono)
- Enkelt API — allokera nummer, konfigurera routing, klart
- Låg latens — direkt WebSocket-anslutning utan mellanlager
Minimal WebSocket-bridge
Så här ser kopplingen mellan 46elks och Deepgram ut i sin enklaste form:
async def bridge_call(elks_ws, deepgram_ws):
"""Bridga ljud mellan 46elks och Deepgram."""
async def elks_to_deepgram():
async for msg in elks_ws:
event = json.loads(msg.data)
if event.get("t") == "audio":
audio = base64.b64decode(event["data"])
await deepgram_ws.send_bytes(audio)
async def deepgram_to_elks():
async for msg in deepgram_ws:
if msg.type == WSMsgType.BINARY:
audio_b64 = base64.b64encode(msg.data).decode()
await elks_ws.send_str(json.dumps({
"t": "audio", "data": audio_b64
}))
await asyncio.gather(elks_to_deepgram(), deepgram_to_elks())
Röst-AI — Deepgram Voice Agent
Deepgram Voice Agent är en helthetslösning för röstbaserade AI-agenter. Den hanterar hela kedjan:
Tal-till-text (STT)
Nova-3 med svenska — uppfattar naturligt tal med hög precision, även med dialekt.
LLM-resonerande
GPT-4o-mini förstår sammanhanget och bestämmer vad som ska göras — svara, boka eller kolla schema.
Text-till-tal (TTS)
Deepgrams egna röstmodell ger naturligt klingande svar med låg latens.
Function calling
AI:n kan anropa funktioner — kolla lediga tider, boka och avboka — direkt under samtalet.
Tool call-schema för bokning
Så här definierar vi bokningsfunktionen som Deepgram kan anropa:
{
"name": "book_appointment",
"description": "Boka en tid åt en patient.",
"parameters": {
"type": "object",
"properties": {
"patient_name": { "type": "string" },
"date": { "type": "string", "description": "YYYY-MM-DD" },
"time": { "type": "string", "description": "HH:MM" },
"treatment": { "type": "string" }
},
"required": ["patient_name", "date", "time", "treatment"]
}
}
Realtidsdashboard
Dashboarden är en ren HTML/CSS/JS-sida som pollar servern var tredje sekund. När en ny bokning görs visas den omedelbart i kalendern med en pulsande animation, och en toast-notis glider in från höger.
- Polling var 3:e sekund — enkel och pålitlig, ingen WebSocket-komplexitet för dashboarden
- Live-kalender — dagvy med personal-kolumner, färgkodade behandlingar
- Toast-notiser — nya bokningar, samtal och avbokningar visas direkt
- Aktivitetsflöde — sidobar med kronologisk lista över alla händelser
Bygg din egen
Intresserad av att bygga något liknande? Kolla vår steg-för-steg-guide eller registrera dig hos 46elks.