An intelligent, voice-enabled scheduling assistant powered by LangGraph and GPT-4o-mini
- 🎤 Voice Control - Speak naturally to schedule, list, or cancel meetings
- ☁️ Google Calendar Sync - Two-way synchronization with your Google Calendar
⚠️ Smart Conflict Detection - Automatically detects and warns about scheduling conflicts- 🧠 Context-Aware - Remembers your preferences and previous conversations
- 🔄 Multi-Platform - Supports Zoom, Teams, Google Meet, calls, and in-person meetings
- 💾 Local Backup - Maintains local storage alongside cloud sync
- 🌐 Natural Language - Just speak or type what you want, no commands to memorize
👤 You: schedule a meeting with John tomorrow at 2pm
🤖 Processing: 'schedule a meeting with John tomorrow at 2pm'
🎯 Intent: schedule_meeting
👥 Participants: John
📅 Date: tomorrow | Time: 2pm
✅ Found 1 available slot(s)
💾 Meeting created
✅ Synced to Google Calendar
✅ Meeting confirmed for Thursday, October 31 at 02:00 PM with John (30 minutes).- Python 3.8 or higher
- OpenAI API key (Get one here)
- (Optional) Google Calendar API credentials
- (Optional) Microphone for voice features
-
Clone the repository
git clone https://github.com/yourusername/scheduling-assistant.git cd scheduling-assistant -
Install dependencies
pip install -r requirements.txt
-
Set up environment variables
# Create .env file echo "OPENAI_API_KEY=your_openai_api_key_here" > .env
-
Run the assistant
python scheduling_assistant_fixed.py
That's it! 🎉
pip install langchain-core langgraph langchain-openai python-dotenvpip install SpeechRecognition pyttsx3 pyaudiopip install google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-clientpip install -r requirements.txtschedule a meeting with John tomorrow at 2pm
book a Zoom call with Sarah next Monday at 10am
set up a 1 hour meeting with the team this Friday afternoon
show my meetings today
list meetings tomorrow
what do I have scheduled this week
cancel a meeting
Then select from the numbered list.
voice
Toggle voice input/output on or off.
schedule a meeting with John, Sarah, and Bob tomorrow at 2pm
schedule a Teams call with Bob tomorrow at 3pm
book a Zoom meeting with the design team Friday
set up an in-person meeting with Jane next week
schedule a 60 minute meeting with the team tomorrow
book a 90 minute planning session next week
# First meeting
schedule a meeting with Sarah tomorrow
# Later...
schedule another meeting with her next week # "her" = Sarah
Create a .env file in the project root:
OPENAI_API_KEY=your_openai_api_key_here- Go to Google Cloud Console
- Create a new project
- Enable Google Calendar API
- Create OAuth 2.0 credentials (Desktop app)
- Download credentials as
credentials.json - Place
credentials.jsonin the project directory - Run the assistant - it will open a browser for authentication
Edit voice settings in VoiceAssistant.setup_voice():
self.engine.setProperty('rate', 175) # Speech rate (WPM)
self.engine.setProperty('volume', 0.9) # Volume (0.0-1.0)scheduling-assistant/
├── scheduling_assistant_fixed.py # Main application
├── .env # API keys (create this)
├── credentials.json # Google OAuth (download from Google)
├── token.pickle # Auto-generated auth token
├── events.json # Local meeting storage
├── chat_memory.json # Conversation history
├── requirements.txt # Python dependencies
├── README.md # This file
└── docs/ # Additional documentation
├── COMPLETE_DOCUMENTATION.md # Full technical docs
├── QUICK_REFERENCE.md # Developer cheat sheet
├── STATE_BREAKDOWN.md # State management guide
└── WORKFLOW_VISUALIZATION.md # Architecture diagrams
┌─────────────────────────────────────────┐
│ User Interface │
│ (Voice Input / Text Input) │
└──────────────┬──────────────────────────┘
│
┌──────────────▼──────────────────────────┐
│ LangGraph Workflow │
│ │
│ Classifier → Clarify → Route │
│ ↓ ↓ │
│ Tools ← ← ← ← ← Cancel │
│ ↓ │
│ Output │
└──────────────┬──────────────────────────┘
│
┌──────────────▼──────────────────────────┐
│ Data Layer │
│ │
│ Local Store | Google Calendar | Memory │
└──────────────────────────────────────────┘
- Classifier - Uses GPT-4o-mini to understand user intent
- Clarify - Asks for missing information interactively
- Route - Directs to appropriate handler based on intent
- Tools - Executes calendar operations (find slots, create meetings, etc.)
- Cancel - Specialized handler for meeting deletions
- Output - Formats responses and saves to memory
The assistant analyzes your natural language request using GPT-4o-mini to determine:
- Intent: What you want to do (schedule, list, cancel)
- Participants: Who's involved
- Time: When it should happen
- Duration: How long
- Platform: Where (Zoom, Teams, etc.)
The system searches for available times by:
- Checking your local calendar
- Querying Google Calendar (if enabled)
- Detecting conflicts automatically
- Suggesting the best available slot
Before confirming any meeting, it:
- Compares with all existing meetings
- Checks for time overlaps
- Warns you about conflicts
- Suggests alternative times if needed
Your meetings are:
- Saved locally (JSON file)
- Synced to Google Calendar
- Linked via unique IDs
- Deduplicated automatically
The assistant remembers:
- Recent conversations
- Last person you met with
- Your preferred platforms
- Meeting patterns
macOS:
brew install portaudio
pip install pyaudioUbuntu/Debian:
sudo apt-get install python3-pyaudio portaudio19-dev
pip install pyaudioWindows:
pip install pyaudio- Verify
credentials.jsonexists in project directory - Delete
token.pickleand re-run to re-authenticate - Check that Google Calendar API is enabled in Google Cloud Console
- Be more specific in your requests
- Use keywords: "schedule", "list", "show", "cancel"
- Check context with
memorycommand - Clear memory if needed:
clear memory
- Restart with a clearer, more complete request
- Ensure all required information is provided
- Check logs for underlying tool errors
| Feature | This Assistant | Google Calendar | Calendar Apps |
|---|---|---|---|
| Natural Language | ✅ | ❌ | ❌ |
| Voice Control | ✅ | ❌ | ❌ |
| Conflict Detection | ✅ | ||
| Context Memory | ✅ | ❌ | ❌ |
| Multi-Platform | ✅ | ||
| Local Backup | ✅ | ❌ | ❌ |
| Conversational | ✅ | ❌ | ❌ |
Contributions are welcome! Here are some ways you can help:
- 🐛 Report bugs
- 💡 Suggest new features
- 📝 Improve documentation
- 🔧 Submit pull requests
- Fork the repository
- Create a feature branch:
git checkout -b feature-name - Make your changes
- Add tests if applicable
- Commit:
git commit -am 'Add feature' - Push:
git push origin feature-name - Create a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- LangChain - For the amazing framework
- LangGraph - For workflow orchestration
- OpenAI - For GPT-4o-mini
- Google Calendar API - For calendar integration
- Complete Documentation - Full technical manual
- Quick Reference - Developer cheat sheet
- State Breakdown - Understanding state management
- Workflow Visualization - Architecture diagrams
- Email notifications
- Recurring meetings support
- Time zone conversion
- Integration with Slack/Teams
- Mobile app
- Meeting notes and transcription
- Smart rescheduling suggestions
- Multi-language support
- 📧 Email: support@example.com
- 💬 Discord: Join our server
- 🐦 Twitter: @scheduling_ai
- 📖 Docs: Full Documentation
If you find this project useful, please consider giving it a star! ⭐
This project handles sensitive data. Please ensure:
- Keep your
.envfile secure and never commit it - Don't share your
credentials.jsonortoken.pickle - Review code before running in production
- Use environment variables for all secrets
- 🚀 1,600+ lines of production code
- 📝 100+ pages of documentation
- 🎯 6 main workflow nodes
- 🛠️ 20+ state variables
- ⚡ Sub-second response time
Stuck? Here's what to try:
- Check the Troubleshooting section
- Review the Complete Documentation
- Look at code examples in Quick Reference
- Open an issue on GitHub
- Ask in our Discord community
- Use voice mode for hands-free operation:
voice - Check your conversation history:
memory - Be specific in requests for best results
- The assistant learns from context over time
- Use platform names for automatic platform selection
show my meetings today
schedule lunch with John at noon
what do I have this afternoon
voice
[Speak] "Schedule a meeting with the team tomorrow at 2pm for one hour"
[Listen] "Meeting confirmed for Thursday, October 31 at 02:00 PM..."
schedule a meeting with Sarah tomorrow at 2pm
⚠️ Warning: This meeting conflicts with 1 existing meeting(s).
list meetings tomorrow
cancel a meeting
[Select conflicting meeting]
schedule a meeting with Sarah tomorrow at 2pm
✅ Meeting confirmed (no conflicts)
Made with ❤️ using LangGraph and GPT-4o-mini