"Connection refused" or "No LLM endpoints available"
- LLM server not running. Start LM Studio/llama-server first.
- Wrong port in settings. Default expects
http://127.0.0.1:1234/v1 - Check LM Studio has "Start Server" enabled and "Allow LAN" if needed.
"Failed to load module" warnings on startup
- Usually harmless to core functionality. Missing optional dependencies for optional features.
- If a specific feature is broken, check logs for the actual error.
403 Forbidden
- Try http:// and https://
- Delete cookies for this site
- Test in private browsing window
- Delete secret key
~/.config/sapphire/secret_key - Restart Sapphire app
Blank page or "Unauthorized"
- Clear browser cookies for localhost:8073
- Try incognito window
- Delete
~/.config/sapphire/secret_keyand restart the app
Certificate warning on first visit
- Expected with self-signed certs. Accept once (Advanced → Proceed) and the browser remembers it.
- Cert is persistent (valid 10 years), stored in
user/ssl/. Not regenerated on restart.
UI loads but chat doesn't respond
- Check browser console (F12) for errors
- Verify LLM server is responding:
curl http://127.0.0.1:1234/v1/models
Sample rate detection error on speakers
- Cheap USB speakers may not support certain sample rates, so choose "auto detect" or "default"
- Auto detect will route through OS audio defaults, which can resample the audio to be compatible
Default audio seems to not work via TTS
- Settings > Audio - then change your device to auto-detect
- Selecting specific audio devices like default or a specific mic can work too
- Auto-detect sometimes fails test due to it being open, but it may actually work so try it
Wakeword recorder does not detect when to stop recording (webcam mic)
- Change your Recorder Background Percentile in STT settings higher
- This is VAD voice activity detection thinking your BG noise is speech so it keeps recording
- Lapel/lav and headsets mics may be ~10-20, but with webcam or other weak mics, raise to ~40
No TTS audio output
- Verify TTS is enabled in Settings > TTS
- Check TTS server started:
grep "kokoro" user/logs/ - Test system audio:
aplay /usr/share/sounds/alsa/Front_Center.wav - Check PulseAudio/PipeWire is running
STT not transcribing
- Check STT is enabled in Settings > STT
- For GPU: verify CUDA is working (
nvidia-smi) - Try CPU mode: set faster whisper device to cpu in settings
- Turn up your mic volume to 70% or 100%
- Check your OS/system default mic - it tries to read from this
- If Web UI, check browser mic permissions AND windows mic permissions
Wake word not triggering
- Check which wakeword you are using in settings
- Make sure you pip installed install/requirements-wakeword.txt
- Check wakeword is enabled in settings, reboot app after
- Turn your mic volume up to 70-100%
- Set system mic to the mic you want wakeword on
- Try using Hey Mycroft as a wakeword instead of Hey Sapphire
- Reduce sensitivity threshold to 0.5
- Test a different mic
If you broke your default prompts
- Settings > System tab
- You can reset all prompts to default, or merge the defaults back into yours
LM Studio (simple) test failing
- Open LM studio, click Developer in lower left to show advanced options, click green Developer tab, toggle server on, load a model
- Go back to Sapphire: Settings > LLM > LM Studio > test button
Anthropic Claude not responding
- conda activate sapphire && pip install anthropic
- Check API key (some are for Claude Code only)
- Put new API key in Settings > LLM > Claude
No thinking/reasoning visible
- Not all models support thinking. Check provider supports it.
- Claude: Enable "Extended Thinking" in LLM settings
- GPT-5.x: Uses Responses API, set reasoning_summary to "detailed"
- Fireworks: Only works with thinking-enabled models (Qwen3-Thinking, Kimi-K2-Thinking)
- Local models via LM Studio: May need specific model that outputs
<think>tags
Thinking breaks when switching providers
- Thinking should transfer between chats
- Note, models cannot see their past think tags in some cases (Claude)
- Check if the model you are on supports thinking
Claude prompt caching not working (always MISS)
- Spice changes system prompt every turn — disable if caching matters
- Datetime injection also breaks cache
- "State vars in prompt" breaks cache (changes on state updates)
- Check logs for
[CACHE] Dynamic content detected - tools only, system prompt not cached
Claude caching enabled but costs seem high
- First request is always a MISS (writing to cache costs 25% more)
- Cache expires after TTL (5m default, can set to 1h)
- If prompts change often, cache never gets reused
"No executor found for function"
- Function exists in toolset but Python file missing or has errors
- Check
functions/directory for the module - Look for import errors in logs
Web search returns no results
- Rate limited by DuckDuckGo. Wait and retry.
- If using SOCKS proxy, verify it's working (see SOCKS.md)
- Enable verbose tool debugging in settings for more logging
Task not running at scheduled time
- Check enabled toggle is on (green) in the Tasks tab
- Verify cron syntax is correct (minute hour day month weekday)
- Check cooldown hasn't blocked it (see Activity tab for "skipped - cooldown")
- Low chance % may have rolled unfavorably (see Activity tab for "skipped - chance")
"Invalid cron schedule" error
- Cron format:
minute hour day month weekday - Use
*for any,*/Nfor every N,1-5for ranges - Example:
0 9 * * *= 9:00 AM daily - Weekday: 0 or 7 = Sunday, 1-6 = Mon-Sat
Task runs but no TTS audio
- Check "Enable TTS" is checked in task editor
- Verify TTS is working for regular chat first
- Background tasks still use TTS if enabled
croniter not installed
- Run:
pip install croniter - Continuity requires this package for cron parsing
Connection test failing
- Verify URL includes port (e.g.,
http://192.168.1.50:8123) - Check Home Assistant is running and accessible from this machine
- Try the URL in a browser first
"401 Unauthorized" error
- Token is invalid or expired
- Create a new Long-Lived Access Token in HA profile
- Make sure you copied the full token (~180+ characters)
Token shows "too short" warning
- HA tokens are typically 180+ characters
- If shorter, you may have copied it incorrectly
- Create a new token and copy the entire string
Entity not found
- Check exact spelling (entity_id or friendly name)
- Entity may be blacklisted - check blacklist patterns
- Use
ha_list_lights_and_switchesto see available entities
Notifications not sending
- Find your service in HA: Developer Tools → Actions → search "notify"
- Enter just the service name without "notify." prefix
- Example:
mobile_app_pixel_7notnotify.mobile_app_pixel_7 - Make sure HA companion app is installed on your phone
HA tools not available
- Add Home Assistant functions to your active toolset
- Check Settings → Plugins → Home Assistant is configured
- Test connection before trying to use tools
Slow responses
- LLM is the bottleneck. Use a 4B or smaller model to test
- Reduce
LLM_MAX_HISTORYto send less context, it gets slower over time - Kokoro is slow(er) on my i5-8250u. Nvidia is way faster, or faster CPU too.
High memory usage
- Large LLM models need RAM. 4B model needs ~7GB after KV cache.
- Use quantized models in Q4_K_M to reduce memory
- STT with base Whisper models uses ~2-3GB.
- TTS (Kokoro) uses ~2-3GB.
Try Sapphire first. Most won't need this. Only do this if STT and TTS are not using your GPU. It's a nightly build of torch with cuda 12.8 that may work better with the Linux open-kernel drivers if you get stuck. Don't use this if you don't need it.
pip install torch torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128Nuke the conda environment and reinstall from scratch. Your user/ data is preserved. Use this if your pip packages are messed up. It just reinstalls the packages, doesn't touch Sapphire.
conda deactivate && conda remove -n sapphire --all -y && conda create -n sapphire python=3.11 -y && conda activate sapphire && pip install -r requirements.txt && python main.pyNuclear option - fresh start:
# Stop Sapphire
pkill -f "python main.py"
# Remove user data (keeps code)
rm -rf user/
rm ~/.config/sapphire/secret_key
# Restart
python main.pyYou'll need to re-run setup and reconfigure settings.