
Memo supports 10 cloud AI services alongside local models. Each provider is configured independently with its own API key, model selection, and context window.
| Provider | Models |
|---|---|
| OpenAI | GPT-4o, GPT-4.1 |
| Google Gemini | Gemini 2.0 Flash, 2.5 Pro |
| Anthropic Claude | Claude Sonnet 4, Opus 4 |
| xAI Grok | Grok-2 |
| Groq | Llama 4, DeepSeek (fast inference) |
| OpenRouter | 300+ models through one API |
| Ollama | Any locally-running Ollama model |
| OpenCode Zen | Pay-as-you-go gateway, some models free |
| OpenCode Go | Subscription-based gateway |
| Kilo Code | AI Gateway — 368+ models via one API (new in v3.9.0) |
OpenRouter, Kilo Code and OpenCode Zen work like app stores — instead of typing a model name by hand, hit "Select" in the provider dialog and pick from the real, live catalog each API actually offers. Free models are sorted to the top under a green checkmark; OpenRouter derives free status from pricing data, Kilo Code from its direct isFree field, and OpenCode Zen from its -free id suffix. Browsing Kilo's catalog doesn't even require an API key first.
Providers that genuinely support per-model reasoning-effort control ("low/medium/high", thinking budgets) expose it in the same dialog, backed by live per-model capability discovery where the vendor's API offers it (Claude, Gemini, Ollama, OpenRouter). The picker hides itself where capability can't be verified — sending an effort level to a model that doesn't accept one is a hard request failure, not a silent no-op.
Enabled providers form a priority-ordered chain. When the primary provider fails or is rate-limited, Memo falls through to the next one automatically.
User → [OpenAI] → fail → [Gemini] → fail → [Claude] → success → User
After 3 consecutive failures, a provider is automatically disabled. A background health-check goroutine probes it periodically; if it recovers, the provider re-enables without user intervention.
The context budget (how much chat history is packed per request) follows the model, not the provider type. Set the "Context window (tokens)" field in the provider config to match your model's real window (e.g. 1000000 for 1M). Leave empty for sensible defaults (Gemini 1M, Claude 200K, others 128K).
API keys are stored encrypted on disk using AES-256-GCM with a machine-derived key. The key derivation uses the machine's hardware identifier — keys are unrecoverable if the machine key file (data/machine.key) is lost. Keys never appear in plaintext in config files or logs.
The Settings → API Providers tab shows a list of all 10 providers. Each entry:
flutter_svg)The bottom engine bar displays the currently active provider's logo and name with a green status dot, matching the local model indicator style.
Switch providers mid-conversation with /model — no restart, no lost context. The provider change takes effect on the next message.