Voice AI demos are cool — but most fail at one critical thing: doing real work.
Today, I’m sharing how to build a production-ready AI Dental Clinic Receptionist that can check a real Google Calendar and book appointments over the phone.
We’ll use SIPHON, an open-source Python framework, to build this with just a few lines of logic.
What This Agent Can Do
This tutorial walks you through building a voice agent that:
- Books new appointments using Google Calendar
- Modifies existing appointments
- Cancels appointments
- Verifies caller identity for privacy
- Runs 24/7 with no human intervention
⏱ Time to build: ~15 minutes
Architecture Flow

Prerequisites
Before you start, make sure you have:
System Requirements
Install SIPHON
pip install siphon-ai
Getting Started Guide
API Keys
Services
- LiveKit credentials (Cloud or self-hosted)
- Google Calendar with Service Account
Calendar Setup Guide
Helpful Documentation
Quick Start
Step 1: Create Project Structure
mkdir dental-clinic-receptionist
cd dental-clinic-receptionist
touch .env prompt.py agent.py inbound.py outbound.py
Edit .env:
OPENROUTER_API_KEY=your_key # LLM Provider
SARVAM_API_KEY=your_key # STT Provider
CARTESIA_API_KEY=your_key # TTS Provider
LIVEKIT_URL=wss://your-livekit-url
LIVEKIT_API_KEY=your_key
LIVEKIT_API_SECRET=your_secret
GOOGLE_CALENDAR_ID=*Emails are not allowed*
GOOGLE_CALENDAR_CREDENTIALS_PATH=/path/to/credentials.json
CALL_RECORDING=false
SAVE_METADATA=true
SAVE_TRANSCRIPTION=true
METADATA_LOCATION=Call_Metadata
TRANSCRIPTION_LOCATION=Transcriptions
AWS_S3_ENDPOINT=http://localhost:9000
AWS_S3_ACCESS_KEY_ID=minioadmin
AWS_S3_SECRET_ACCESS_KEY=minioadmin
AWS_S3_BUCKET=siphon
AWS_S3_REGION=us-east-1
AWS_S3_FORCE_PATH_STYLE=true
Step 3: Define the System Prompt
Create prompt.py.
The system prompt controls behavior, privacy, and conversation flow.
system_instructions = """
You are a professional dental clinic receptionist.
CAPABILITIES
- Book new appointments
- Modify existing appointments
- Cancel appointments
PRIVACY RULES
- ALWAYS verify caller identity (name + phone)
- Only show appointments for the verified caller
CONVERSATION STYLE
- Be warm and professional
- Ask one question at a time
- Confirm details by reading them back
"""
Full Prompt Example
Step 4: Create the Agent
Create agent.py:
from siphon.agent import Agent
from siphon.plugins import openrouter, sarvam, cartesia
from prompt import system_instructions
from dotenv import load_dotenv
load_dotenv()
llm = openrouter.LLM()
tts = cartesia.TTS()
stt = sarvam.STT()
agent = Agent(
agent_name="Dental-Clinic-Receptionist",
llm=llm,
tts=tts,
stt=stt,
system_instructions=system_instructions,
google_calendar=True
)
if __name__ == "__main__":
# agent.download_files() # Run once on fresh machines
agent.dev() # Local development
# agent.start() # Production
Agent Overview
Step 5: Enable Inbound Calls
Create inbound.py:
from siphon.telephony.inbound import Dispatch
from dotenv import load_dotenv
load_dotenv()
dispatch = Dispatch(
agent_name="Dental-Clinic-Receptionist",
dispatch_name="inbound-Dental-Clinic-Receptionist",
sip_number="" # Provided by your SIP provider
)
result = dispatch.agent()
print(result)
Run:
python inbound.py
Inbound Calling Guide
Step 6: Outbound Calls (Optional)
Use outbound calls for reminders or follow-ups.
Create outbound.py:
from siphon.telephony import Call
from dotenv import load_dotenv
load_dotenv()
call = Call(
agent_name="Dental-Clinic-Receptionist",
sip_trunk_setup={
"name": "Dental-Clinic-Receptionist",
"sip_address": "",
"sip_number": "",
"sip_username": "",
"sip_password": ""
},
number_to_call=""
)
result = call.start()
print(result)
Run:
python outbound.py
Outbound Calling Guide
Step 7: Start the Agent
python agent.py
Your AI receptionist is now live
Production Scaling
SIPHON supports horizontal scaling out of the box.
Just run multiple agent instances, and calls are automatically distributed.
Scaling Guide
What This Looks Like in Practice
Booking an Appointment
- Caller: “I need a cleaning next Tuesday at 2 PM”
- Agent verifies name + phone
- Checks Google Calendar
- Books and confirms
✏️ Modifying an Appointment
- Caller requests a change
- Agent verifies identity
- Shows only their appointments
- Reschedules and confirms
❌ Cancelling an Appointment
- Agent verifies identity
- Confirms appointment
- Cancels and acknowledges
Privacy by Design
- Identity verification required
- No cross-patient data exposure
Resources
⭐ Found this useful?
Give SIPHON a star on GitHub → https://github.com/blackdwarftech/siphon