Just A Rather Very Intelligent System
A low-latency voice AI assistant built with LiveKit Agents, featuring:
- Sub-1 second end-to-end latency
- Hybrid STT: Deepgram Nova-3 (primary) + faster-whisper (fallback)
- Natural TTS: ElevenLabs (low-latency, high quality)
- Intelligent LLM: Auto-fallback between Claude and OpenAI (latency-first)
- Wake word: "Jarvis" via Picovoice Porcupine
- Extensible tools: System control, web search, and more
cd J.A.R.V.I.S
cp .env.example .env
# Edit .env with your API keys
make installEdit .env with your keys:
# Required
LIVEKIT_URL=wss://your-project.livekit.cloud
LIVEKIT_API_KEY=your_key
LIVEKIT_API_SECRET=your_secret
DEEPGRAM_API_KEY=your_key
ELEVENLABS_API_KEY=your_key
# At least one LLM
ANTHROPIC_API_KEY=your_key # For Claude
OPENAI_API_KEY=your_key # For GPT-4
# Wake word (optional for LiveKit mode)
PICOVOICE_ACCESS_KEY=your_key
JARVIS_WAKE_WORDS=jarvis
JARVIS_WAKE_SENSITIVITY=0.5
# Optional integrations
TWILIO_ACCOUNT_SID=your_sid
TWILIO_AUTH_TOKEN=your_token
TWILIO_FROM_NUMBER=+15551234567
HOME_ASSISTANT_URL=https://homeassistant.local:8123
HOME_ASSISTANT_TOKEN=your_token
MS_CLIENT_ID=your_client_id
MS_TENANT_ID=common
MS_CALENDAR_ID=
# UI (recommended)
JARVIS_UI_TOKEN=change_me
JARVIS_UI_HOST=127.0.0.1
JARVIS_UI_PORT=8080
JARVIS_UI_ALLOW_REMOTE=false# LiveKit mode (recommended)
make run
# Standalone mode with wake word
make run-standalone
# Or via installed script
jarvis-standalone
# Text command mode (tool runner)
python -m jarvis.text_mode
# Or via installed script
jarvis-text
# Web UI dashboard (local)
jarvis-ui
# macOS menu bar launcher (optional)
jarvis-tray┌─────────────────────────────────────────────────────────────────┐
│ J.A.R.V.I.S │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Wake Word │───▶│ VAD │───▶│ STT │ │
│ │ Porcupine │ │ Silero │ │ Deepgram / Whisper │ │
│ │ ("Jarvis") │ │ (<1ms) │ │ (streaming) │ │
│ └─────────────┘ └─────────────┘ └──────────┬──────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ LLM BRAIN ││
│ │ ┌─────────────────────────────────────────────────────┐ ││
│ │ │ Auto: Claude / OpenAI (latency-first) │ ││
│ │ └─────────────────────────────────────────────────────┘ ││
│ │ │ ││
│ │ ┌─────────────────────────────────────────────────────┐ ││
│ │ │ Tools: System │ Web Search │ Weather │ ... │ ││
│ │ └─────────────────────────────────────────────────────┘ ││
│ └─────────────────────────────────────────────────────────────┘│
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ TTS (streaming) ││
│ │ ElevenLabs (low-latency) ││
│ └─────────────────────────────────────────────────────────────┘│
│ │
└─────────────────────────────────────────────────────────────────┘
| Component | Target | Actual |
|---|---|---|
| Wake word | <50ms | ~20ms |
| VAD | <10ms | <1ms |
| STT (Deepgram) | <300ms | ~200ms |
| LLM (Claude) | <500ms | ~400ms |
| TTS (ElevenLabs) | <150ms | ~100ms |
| Total | <1s | ~660ms |
J.A.R.V.I.S/
├── jarvis/
│ ├── main.py # Entry point
│ ├── agent.py # LiveKit voice agent
│ ├── config.py # Configuration
│ ├── audio/ # Wake word, VAD
│ ├── stt/ # Speech-to-text
│ ├── llm/ # LLM integration
│ ├── tts/ # Text-to-speech
│ └── tools/ # Agent tools
├── tests/
├── .env.example
├── pyproject.toml
└── Makefile
get_current_time- Get time in any timezoneopen_application- Open apps on your computerrun_shell_command- Execute shell commands (with safety checks)get_system_info- System informationset_volume- Control system volumetoggle_dark_mode- Toggle dark mode (macOS)
web_search- Search the webfetch_url- Fetch content from URLsget_weather- Get weather for any cityget_definition- Look up word definitions
remember/recall_memory- Long-term memoryadd_note/list_notes- Notes storageadd_task/list_tasks/complete_task- Task managementforget_memory_by_tag/forget_memory_before- Memory hygiene
add_calendar_event/list_calendar_events- Local calendar eventsoutlook_list_events/outlook_create_event/outlook_delete_event- Outlook calendar
daily_brief- Weather + tasks + calendar snapshot
get_device_state/set_device_state/toggle_device
add_routine/list_routines/run_routine- Automation sequences
add_contact/list_contacts/find_contact
list_files/read_file/write_file/search_files
analyze_code/get_project_structure/count_lines/find_todos/diff_files/explain_code
github_list_repos/github_read_file/github_search_code/github_list_issues/github_list_prs
run_quick_command- fast allowlisted host executionrun_sandboxed_command- Docker sandbox (network off + read-only by default)
place_call/send_sms(Twilio)- Calls can use saved contact names when available.
add_alarm/list_alarms/cancel_alarm
get_battery_status/get_active_app/reveal_in_findersend_notificationplay_music/pause_music/next_track/previous_track/now_playinglist_apple_calendars/create_apple_calendar_eventcreate_apple_reminder
| Service | Free Tier | Sign Up |
|---|---|---|
| LiveKit Cloud | 50 hrs/month | cloud.livekit.io |
| Deepgram | $200 credit | console.deepgram.com |
| ElevenLabs | Paid subscription | elevenlabs.io |
| Twilio | Pay-as-you-go | twilio.com |
| Home Assistant | Self-hosted | home-assistant.io |
| Anthropic | Pay-as-you-go | console.anthropic.com |
| OpenAI | Pay-as-you-go | platform.openai.com |
| Picovoice | Free tier | console.picovoice.ai |
| Microsoft Graph | Free tier | learn.microsoft.com/graph |
# Install dev dependencies
make dev
# Run tests
make test
# Lint and format
make lint
make format
# Run with debug logging
make run-debugRun interactive benchmarks (tool calling + speed + your scoring):
make install
jarvis-bench --judge \
--model openai:gpt-4o-mini \
--model openai:gpt-5-nano \
--model openai:gpt-5-mini \
--model anthropic:claude-sonnet-4-20250514By default, benchmarks run with a focused toolset (only the expected tools for each scenario) to reduce noise and provider payload limits. To benchmark with all tools available:
jarvis-bench --toolset full --model openai:gpt-4o-miniIf jarvis-bench is not on your PATH, run:
python3 -m jarvis.bench.runner --judge --model openai:gpt-4o-miniSummarize results:
jarvis-bench-reportAuto-judge (LLM-as-judge) example:
jarvis-bench \
--model openai:gpt-4o-mini \
--auto-judge anthropic:claude-sonnet-4-20250514Notes:
- GPT-5 models may require different parameters; the benchmark runner handles this automatically.
- Auto pass for tool scenarios requires both calling the expected tool and producing a final user-facing answer.
- Smart home integration (Home Assistant)
- Local calendar and notes/tasks
- Phone calling (Twilio)
- Persistent memory/context (local SQLite)
- macOS Calendar + Reminders + Notifications
- Desktop UI
- Mobile app
MIT