Yumi stores non-sensitive user preferences and sensory defaults inside a standard configuration directory in your home directory.
- Config Directory:
- Windows:
C:\Users\YourName\.yumi\ - macOS / Linux:
~/.yumi/
- Windows:
- Preferences File:
~/.yumi/config.json
🎛️ The config.json Layout
This file maps non-sensitive variables like active providers and selected personalities.
Example JSON structure:
{
"LLM_PROVIDER": "Groq",
"TTS_PROVIDER": "ElevenLabs",
"STT_PROVIDER": "local",
"PERSONALITY": "caring",
"WHISPER_MODEL_SIZE": "base"
}
🔒 Sensitive API Keys (OS Keychain Mappings)
All sensitive credential strings are saved to the OS secure database under dedicated aliases to prevent disk exposure:
| Config Key | Keychain Service Alias | Plaintext File Storage |
| :--- | :--- | :--- |
| GROQ_API_KEY | GROQ_API_KEY | ❌ No — OS Encrypted Keychain |
| OPENAI_API_KEY | OPENAI_API_KEY | ❌ No — OS Encrypted Keychain |
| ANTHROPIC_API_KEY | ANTHROPIC_API_KEY | ❌ No — OS Encrypted Keychain |
| ELEVENLABS_API_KEY | ELEVENLABS_API_KEY | ❌ No — OS Encrypted Keychain |
| ELEVENLABS_VOICE_ID | ELEVENLABS_VOICE_ID | ❌ No — OS Encrypted Keychain |
| CAMB_API_KEY | CAMB_API_KEY | ❌ No — OS Encrypted Keychain |
| CAMB_VOICE_ID | CAMB_VOICE_ID | ❌ No — OS Encrypted Keychain |
⚙️ Pydantic Configuration Model Settings (config.py)
On start, src/yumi/core/config.py runs a load script:
- Queries the non-sensitive parameters from
~/.yumi/config.json. - Queries the secure credentials from the OS Keychain.
- Injects all values into
os.environ. - Compiles the
Settings(BaseSettings)Pydantic container:class Settings(BaseSettings): tts_provider: str = Field(default="ElevenLabs", alias="TTS_PROVIDER") elevenlabs_api_key: str | None = Field(default=None, alias="ELEVENLABS_API_KEY") # ...
This ensures that the entire code ecosystem has secure, seamless access to the configuration via the global settings object!
You are now fully attuned to the operational mechanics of Yumi. Go ahead and start customizing your companion!