AI phone agent that makes outbound calls on your behalf. Tell it who to call and what to accomplish — it handles the conversation and reports back with results via email.
Built on Vapi for voice orchestration, Claude for intelligence, Deepgram for speech-to-text and text-to-speech, and Resend for email notifications.
conda create -n voicevalet python=3.10 -y
conda activate voicevalet
pip install -r requirements.txtcp .env.example .envEdit .env and add:
VAPI_API_KEY— from Vapi DashboardVAPI_PHONE_NUMBER_ID— buy a phone number in Vapi Dashboard, copy its IDUSER_FULL_NAME— your name (the agent will say "calling on behalf of...")USER_PHONE_NUMBER— your callback numberRESEND_API_KEY— from Resend (for email notifications)NOTIFICATION_EMAIL— email address to receive call results
cp user_profile.example.json user_profile.jsonEdit user_profile.json with your personal details. This file is gitignored and never committed. It has four sections:
- personal — name, date of birth, address, email, phone
- vehicle — make, model, year, color, VIN, license plate
- insurance — provider, policy number, coverage type, agent info
- medical — doctor, pharmacy, insurance ID, allergies
In the Vapi Dashboard, add your API keys under Provider Keys:
- Anthropic — for Claude LLM
- Deepgram — for speech-to-text and text-to-speech
python create_assistant.pyCopy the returned assistant ID into your .env as VAPI_ASSISTANT_ID.
python make_call.py --phone +14155551234
# With context for the call:
python make_call.py --phone +14155551234 --message "Schedule an oil change for Thursday"
# With profile data shared with the agent:
python make_call.py --phone +14155551234 --message "Schedule an oil change" --profile vehicle,personalFlags:
--phone(required) — destination number in E.164 format--message— context/goal for the call (agent uses it naturally, won't read verbatim)--profile— comma-separated profile sections to share:personal,vehicle,insurance,medical--assistant-id— override the assistant ID from.env
After the call ends, a summary with the full transcript is emailed to your NOTIFICATION_EMAIL.
config/settings.py — Environment variable management
config/profile.py — User profile loader and formatter
utils/logger.py — Rich-based logging
agents/base_agent.py — System prompt and assistant configuration
services/vapi_client.py — Vapi REST API client
services/email_service.py — Resend email notifications
create_assistant.py — Assistant setup script
make_call.py — Outbound call CLI
user_profile.example.json — Profile template (committed)
user_profile.json — Your actual profile data (gitignored)
VoiceValet currently uses Deepgram asteria for text-to-speech. The voice provider and voice ID are configured in services/vapi_client.py and can be changed when creating a new assistant.
Supported Deepgram voices: asteria, luna, stella, athena, hera, orion, arcas, perseus, angus, orpheus, helios, zeus.
- Phase 1 (current) — General-purpose conversational agent with email notifications and user profiles
- Phase 2 — Specialized appointment booking agent
- Phase 3 — Insurance rate shopping agent
- Phase 4 — Web dashboard for call management