Providers & Accounts
The built-in provider catalog, adding accounts, priorities, and custom providers.
Provider vs account
- A provider is a type of upstream (OpenAI, Anthropic, Gemini, Exa, ...) with a built-in dialect and base URL.
- An account is your concrete credential on that provider — one provider can have many accounts.
Built-in catalog
The Providers page splits the catalog into four tabs. A provider appears under every tab its capabilities match — OpenAI, for example, is under all of them except search.
| Tab | Providers |
|---|---|
| AI Model Providers | openai, anthropic, openrouter, nvidia, gemini, mistral, together, fireworks, nebius, groq, cline, cloudflare, muse, voyage-ai, jina-ai, plus custom providers |
| AI Search Providers | exa, tavily, firecrawl, jina-ai, brave, serper |
| AI Voice Providers | openai, groq (STT), elevenlabs, deepgram, plus OpenAI-compatible custom providers |
| AI Image Generation | openai, gemini, together, muse, plus OpenAI-compatible custom providers |
What each capability unlocks on the gateway:
| Capability | Gateway endpoint |
|---|---|
| chat | /v1/chat/completions, /v1/messages, /v1/responses |
| embeddings | /v1/embeddings |
| image | /v1/images/generations |
| tts / stt | /v1/audio/speech, /v1/audio/transcriptions |
| search / fetch | /v1/search, /v1/web/fetch |
Chat providers speak the OpenAI dialect except anthropic (Anthropic dialect). OpenAI and Anthropic can be connected with an API key or by signing in on the official website (OAuth); the OpenAI sign-in is routed as the separate codex provider (Responses dialect, ChatGPT backend).
Account credentials are stored encrypted (envelope encryption with a key derived from APP_SECRET).
Adding an account
Via the dashboard (Providers → pick a provider → Connect) or the API. Chat providers sync their model list right after connecting; search, voice, and embedding-only providers (Exa, ElevenLabs, Voyage AI, …) only need the key, which is checked on first use because those APIs have no free test call. Test before saving:
curl -X POST http://localhost:8080/v1/validate-key \
-H "Authorization: Bearer <dashboard-jwt>" \
-H "Content-Type: application/json" \
-d '{ "provider": "openai", "auth_kind": "api_key", "api_key": "sk-..." }'Important fields when creating an account:
auth_kind—api_key,oauth, ornone.priority— the order used when one provider has multiple accounts.proxy_pool_id— bind the account to a proxy pool for outbound IP control.metadata.base_url— override the built-in base URL (useful for your own compatible endpoints).metadata.headers— extra headers per account.
Every account supports a connection test (POST /v1/accounts/:id/test) and quota reading (GET /v1/accounts/:id/quota) from the dashboard.
Custom providers
Have your own OpenAI/Anthropic/Responses-compatible endpoint? Register it as a custom provider (Providers → Custom) by picking its api_kind, then add accounts as usual. Its slug works immediately in model: "my-provider/model".