Bring your own model
Every provider is reached through the same OpenAI-compatible chat-completions client with a different base URL and key. Switch providers without touching code, chain them for failover, or point everything at a local model and disconnect.
Supported providers
The Providers page shows the same list with a configured and active indicator per provider, sign-up links, and a curated model catalogue per provider for the model picker.
| Anthropic | paid with free credit on new accounts |
|---|---|
| OpenAI | paid |
| Google Gemini | free tier, then paid |
| Groq | free tier with rate limits; serves open reasoning models |
| OpenRouter | one key for hundreds of models with a rotating free tier |
| Perplexity | models with built-in web search |
| DeepSeek | paid, lowest cost |
| Mistral | free experimental tier; EU-hosted |
| Ollama | self-hosted on your own machine; nothing leaves the network |
| Together AI | open models, some free endpoints |
| Cerebras | very fast inference, free tier |
| Hyperbolic | hosted open models |
| Hugging Face | inference API across community models |
| Cohere | strong for summarisation |
| n8n | your own workflow exposing a chat-completions webhook |
| Cloudflare Workers AI | needs an API token and the account ID |
Selecting a provider
The active provider is an environment variable plus that provider’s key. Switching from the dashboard writes the new choice to the environment file so it survives restarts.
AI_PROVIDER=gemini GEMINI_API_KEY=... AI_HTTP_TIMEOUT_SECONDS=20
Air-gapped with Ollama
Run a model on the same host or on a machine in your network and point InRoots at it. The SDK requires a key value, so any placeholder works. Small models need roughly 8 GB of RAM; better ones need more. Combined with a local IP database on your host, a self-hosted chat server and spoken replies left off, nothing about your people leaves the perimeter.
AI_PROVIDER=ollama OLLAMA_API_KEY=ollama OLLAMA_BASE_URL=http://localhost:11434/v1
Model roles
- Reasoning models (gpt-oss, o-series) spend tokens thinking before answering; too small a budget returns an empty success. InRoots floors the budget at 400 tokens and requests low reasoning effort in the form each provider expects, then falls back to the reasoning text if the answer is empty.
| summary | summaries and the assistant; never budget-gated |
|---|---|
| fallback | classification and routing calls; subject to the daily budget |
| reasoning | accuracy-critical judgments such as whether a late reason is valid; upgraded to the provider’s strongest model, or AI_REASONING_MODEL |
Failover
Every call goes through one resilient entry point: the active provider first, then each configured provider in the failover order, trying the default model and then the catalogue models of each. If one provider is out of credit, rate-limited or rejects its key, the next answers. The order is editable by admins; providers you omit are appended so a newly added key still participates.
- A failsafe job every 15 minutes probes the active provider with a one-token request and, on failure, switches to the first working configured provider in the chain (automation key ai_failsafe, on by default).
- A provider-status probe warns the dashboard when a key has expired.
- Each fallback is written to the audit log as ai_provider_fallback.
gemini, openai, anthropic, openrouter, deepseek, mistral, groq, together, cerebras, cohere, hyperbolic, huggingface, ollama