Tandläkare Svensson AI-receptionist — ring och se bokningen dyka upp live
📞 076-686 72 26

Kom igång på under en timme

Allt du behöver för att bygga en AI-receptionist som tar emot samtal och bokar tider. Följ guiden steg för steg.

Förutsättningar

Steg för steg

  1. Skaffa ett telefonnummer via 46elks

    Registrera dig på 46elks.com och allokera ett WebSocket-nummer. Peka numret mot din server:

    # Allokera ett nummer med WebSocket-routing
    curl -X POST https://api.46elks.com/a1/numbers \
      -u "API_USER:API_PASS" \
      -d country=se \
      -d number_type=mobile \
      -d voice_start="ws://din-server.se:8401"
    Tips

    WebSocket-nummer levererar samtalet direkt som en WS-anslutning — inget behov av webhooks eller SIP.

  2. Sätt upp WebSocket-servern

    Skapa en minimal aiohttp-server som tar emot samtal från 46elks:

    from aiohttp import web
    import json
    
    async def handle_call(request):
        """Ta emot inkommande samtal från 46elks."""
        ws = web.WebSocketResponse()
        await ws.prepare(request)
    
        # Första meddelandet = samtalsinformation
        first = await ws.receive_str()
        data = json.loads(first)
        caller = data.get("from", "okänt")
        print(f"Samtal från {caller}")
    
        # Starta audio-streams
        await ws.send_str(json.dumps({
            "t": "start_stream",
            "stream": "caller",
            "codec": "pcm/24000"
        }))
    
        # Här kopplar du in Deepgram (steg 3)
        await bridge_to_deepgram(ws, caller)
        return ws
    
    app = web.Application()
    app.router.add_get("/", handle_call)
    web.run_app(app, port=8401)
  3. Koppla in Deepgram Voice Agent

    Anslut till Deepgrams Voice Agent och konfigurera språk, modell och systemmeddelande:

    import aiohttp
    
    async def connect_deepgram(api_key, system_prompt):
        """Anslut till Deepgram Voice Agent."""
        session = aiohttp.ClientSession()
        ws = await session.ws_connect(
            "wss://agent.deepgram.com/v1/agent/converse",
            headers={"Authorization": f"Token {api_key}"}
        )
    
        # Konfigurera agenten
        await ws.send_str(json.dumps({
            "type": "Settings",
            "audio": {
                "input":  {"encoding": "linear16", "sample_rate": 24000},
                "output": {"encoding": "linear16", "sample_rate": 24000}
            },
            "agent": {
                "listen":  {"provider": {"type": "deepgram", "model": "nova-3", "language": "sv"}},
                "think":   {"provider": {"type": "open_ai", "model": "gpt-4o-mini"},
                           "prompt": system_prompt,
                           "functions": []  # Lägg till verktyg här (steg 4)
                },
                "speak":   {"provider": {"type": "deepgram"}},
                "greeting": "Hej! Vad kan jag hjälpa dig med?"
            }
        }))
        return ws, session
  4. Lägg till verktyg och funktioner

    Definiera de funktioner som AI:n ska kunna anropa. Här är ett schema för att kolla lediga tider:

    TOOLS = [
        {
            "name": "check_availability",
            "description": "Kolla lediga tider för ett datum.",
            "parameters": {
                "type": "object",
                "properties": {
                    "date": {"type": "string", "description": "YYYY-MM-DD"}
                },
                "required": ["date"]
            }
        }
    ]
    
    # Hantera function calls från Deepgram
    async def handle_function_call(event, dg_ws):
        for fn in event.get("functions", []):
            if fn["name"] == "check_availability":
                args = json.loads(fn["arguments"])
                result = check_db(args["date"])  # Din databasfråga
                await dg_ws.send_str(json.dumps({
                    "type": "FunctionCallResponse",
                    "id": fn["id"],
                    "name": fn["name"],
                    "content": json.dumps(result)
                }))
  5. Deploya med nginx + systemd

    Kör servern som en systemd-tjänst och lägg nginx framför för HTTPS:

    # /etc/systemd/system/ai-receptionist.service
    [Unit]
    Description=AI Receptionist
    After=network.target
    
    [Service]
    Type=simple
    User=deploy
    WorkingDirectory=/home/deploy/ai-receptionist
    ExecStart=/usr/bin/python3 server.py
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    # nginx — proxy för webb, direkt för 46elks WS
    server {
        server_name ai.din-doman.se;
    
        location / {
            proxy_pass http://localhost:8400;
            proxy_set_header Host $host;
        }
    }
    
    # 46elks WS går direkt till port 8401 (ingen nginx)
    Viktigt

    46elks WebSocket-nummer ansluter direkt till din server — gå inte via nginx för samtalsportarna. Öppna porten i brandväggen (t.ex. ufw allow 8401).

Anpassa till din bransch

Grunden är densamma oavsett bransch — det enda du behöver ändra är system prompten och verktygen. Här är några idéer:

🦷

Tandläkare

Bokningar, behandlingstyper, prislista, akuttider. Precis som den här demon.

Frisör

Klippning, färgning, stylist-val. Lägg till öppettider och personalschema.

🍽

Restaurang

Bordsbokning, antal gäster, specialkost. “Vi har ett bord för fyra klockan 19.”

🚗

Bilverkstad

Service, däckbyte, besiktning. AI:n kan fråga efter bilmodell och registreringsnummer.

Kom igång idag

Registrera dig hos 46elks och Deepgram — du kan ha en fungerande AI-receptionist inom en timme.

Läs mer