Providers

Adding a provider is a row in a table — not a code change, not a release. Anything speaking the OpenAI API is already supported whether or not it is on the list below; the list exists so you do not have to go and find the base URL.

The Providers screen: backends grouped by api_base, each card showing model and backend counts, whether a credential is set, and how many are up

The Providers screen groups what you are actually talking to, by host. A provider is a grouping this screen invents rather than a record the API models — the database has models and backends, and "OpenRouter" is what a human calls every backend pointing at openrouter.ai. What each card answers is the question you actually have: how many models ride on it, whether a credential is set (never the credential itself), and how many of its backends are up.

The catalogue

80 providers work today — 78 reached as-is, 2 through their own wire format. The count and these tables are checked against each other by tests/doc_claims.rs, so the number cannot drift away from the rows.

A caveat these tables are explicit about, because the number is otherwise a boast: "works" here means "is a configuration row that this proxy will forward to correctly", which follows from the endpoint being OpenAI-shaped. The ones exercised against real traffic in this repo's tests and on its dev cluster are marked ✓. The rest carry the base URL their vendor documents — check it against their docs before pasting it into production, because vendors move them and this file cannot notice.

reached as-is (OpenAI-compatible)
OpenRouter ✓ (fronts ~400 models)https://openrouter.ai/api/v1
OpenAI · Groq · DeepSeek · xAIapi.openai.com · api.groq.com · api.deepseek.com · api.x.ai
Together · Fireworks · Nebius · AtlasCloudfour endpoints, four rows
Mistral · Perplexity · Cerebras · SambaNovaapi.mistral.ai/v1 · api.perplexity.ai · api.cerebras.ai/v1 · api.sambanova.ai/v1
DeepInfra · Novita · Hyperbolic · Lambdafour endpoints, four rows
Z.ai · BigModel · Aliyun DashScope · Qwen Cloud
Moonshot / Kimi · Baidu Qianfan · AIHubMix
MiniMax · Volcengine Ark · Tencent Hunyuan · SarvamChinese and Indian clouds, same row shape
Baseten · Featherless · FriendliAI · Chutes
Nscale · GMI Cloud · Scaleway · OVHcloud
Cloudflare Workers AI · Vercel AI Gateway · v0 · Poe
NanoGPT · CometAPI · Inception · Morph
Clarifai · Weights & Biases · GradientAI · AI21
Snowflake Cortex · Anyscale · Heroku · CompactifAI
GitHub Models · GitHub Copilot
Amazon Bedrockhttps://bedrock-runtime.<region>.amazonaws.com/openai/v1, Bedrock API key as a bearer token
Coherehttps://api.cohere.ai/compatibility/v1
Google Vertex AIhttps://<region>-aiplatform.googleapis.com/v1/projects/<project>/locations/<region>/endpoints/openapi — see the API reference for the service-account credential
Azure OpenAI · Azure AIhttps://<resource>.openai.azure.com/openai/deployments/<deployment> with auth_header: api-key and auth_scheme: "" — the key goes in its own header with no Bearer prefix
NVIDIA NIM · Databricks · HuggingFace TGIintegrate.api.nvidia.com/v1 · a serving endpoint · any TGI /v1
vLLM ✓ · SGLang · llama.cpp ✓ · Ollamaself-hosted, same row shape
LM Studio · KoboldCpp · TabbyAPI · text-generation-webuilocal servers, same row shape
Xinference · Llamafile · Docker Model Runner · Lemonadelocal servers, same row shape
Voyage AI · Jina AI · Infinity · TEIembeddings and rerank — /v1/embeddings, /v1/rerank
reached through their own wire format
Anthropic"protocol": "anthropic" — Messages API, x-api-key, SSE re-framed to OpenAI chunks
Gemini"protocol": "gemini"generateContent, model in the URL, x-goog-api-key

Adding one

Two ways, same result. A backend belongs to the model it serves, so you add a model first and then a backend under it.

In the UI, on Models:

The Models screen: each model with its backends, credential state, prices, cache TTL and context window

By API:

curl -sk -b /tmp/ck -X POST https://control:4001/admin/models \
  -H 'content-type: application/json' -d '{"name":"kimi-k2"}'    # -> {"id":7}

curl -sk -b /tmp/ck -X POST https://control:4001/admin/models/7/backends \
  -H 'content-type: application/json' -d '{
    "api_base": "https://api.moonshot.ai/v1",
    "upstream_model": "moonshot-v1-128k",
    "upstream_api_key": "sk-..."
  }'

Two backends under one model become one load-balanced pool — and two entries sharing a model_name in a LiteLLM config import to exactly that. It is the whole mechanism behind failover and traffic splitting — see virtual models for routing between different models.

Credentials

upstream_api_key is encrypted at rest with FASTLLM_ENCRYPTION_KEY before it reaches Postgres, and the admin API never reads one back — the UI shows whether a credential is set, never what it is.

Two knobs exist because not every vendor puts the key in authorization: Bearer:

auth_headerthe header name. Default authorization
auth_schemethe prefix. Default Bearer; "" sends the key bare

Azure OpenAI is the case that needs both: auth_header: api-key and auth_scheme: "". Amazon Bedrock, despite the reputation, needs neither — its OpenAI-compatible endpoint takes a Bedrock API key as an ordinary bearer token, so it is a plain row like any other and there is no request signing.

Two providers speak their own language

Anthropic and Gemini do not expose an OpenAI-shaped endpoint, so they are reached through a translator rather than a base URL:

flowchart LR
    C["client<br/>OpenAI request"] --> P{"backend<br/>protocol?"}
    P -->|openai| B1["upstream<br/>bytes forwarded unchanged"]
    P -->|anthropic| T1["translate →<br/>Messages API<br/>x-api-key"] --> B2["api.anthropic.com"]
    P -->|gemini| T2["translate →<br/>generateContent<br/>model in the URL"] --> B3["generativelanguage<br/>.googleapis.com"]
    B1 --> R1["response returned<br/>byte-for-byte"]
    B2 --> R2["SSE re-framed<br/>to OpenAI chunks"]
    B3 --> R2

Tool calling translates in both directions, streaming included, as do image and audio inputs. Translation is opt-in per backend: it costs parsing, and the whole latency argument for this gateway rests on not parsing. An openai backend's response body is never deserialised, which is why the two paths in that diagram are drawn differently — one forwards bytes, the other builds them.

The translation limits, field by field, are in the API reference.

Verified base URLs

Most providers are OpenAI-compatible, so they need no code at all — just a backend row pointing at their base URL. That includes OpenRouter, which itself fronts Anthropic, Gemini and several hundred other models in OpenAI format:

curl -X POST https://control/admin/models/$MODEL_ID/backends \
  -H 'content-type: application/json' -b "$SESSION" \
  -d '{"api_base":"https://openrouter.ai/api/v1",
       "upstream_model":"anthropic/claude-sonnet-4",
       "upstream_api_key":"sk-or-..."}'

Verified base URLs for the OpenAI-compatible set:

providerapi_base
OpenRouterhttps://openrouter.ai/api/v1
OpenAIhttps://api.openai.com/v1
Groqhttps://api.groq.com/openai/v1
DeepSeekhttps://api.deepseek.com/v1
xAIhttps://api.x.ai/v1
Togetherhttps://api.together.xyz/v1
Fireworkshttps://api.fireworks.ai/inference/v1
Nebiushttps://api.studio.nebius.ai/v1
AtlasCloudhttps://api.atlascloud.ai/v1
AIHubMixhttps://aihubmix.com/v1
Z.aihttps://api.z.ai/api/paas/v4
BigModelhttps://open.bigmodel.cn/api/paas/v4
Aliyun DashScopehttps://dashscope.aliyuncs.com/compatible-mode/v1
Qwen Cloudhttps://dashscope-intl.aliyuncs.com/compatible-mode/v1
Moonshot / Kimihttps://api.moonshot.cn/v1, https://api.moonshot.ai/v1
Baidu Qianfanhttps://qianfan.baidubce.com/v2
GitHub Modelshttps://models.github.ai/inference
Ollamahttp://localhost:11434
Coherehttps://api.cohere.ai/compatibility/v1
Amazon Bedrockhttps://bedrock-runtime.<region>.amazonaws.com/openai/v1
Google Vertex AIhttps://<region>-aiplatform.googleapis.com/v1/projects/<project>/locations/<region>/endpoints/openapi

Bedrock needs no request signing. Its OpenAI-compatible endpoint takes a Bedrock API key as an ordinary bearer token, so it is a plain backend row like any other — create the key in the Bedrock console and put it in upstream_api_key.

What is deliberately absent

Deliberately absent, and not counted: providers whose API is not OpenAI-shaped and would need a fourth translator in src/protocol/ — Replicate, Predibase, Petals, Triton, WatsonX, OCI Generative AI, AWS SageMaker. Also absent are the non-LLM services a gateway has no business proxying blind: speech (Deepgram, ElevenLabs), image generation (Stability, Black Forest Labs, Recraft, Fal, RunwayML), vector stores (Milvus), and other people's gateways (Helicone, LiteLLM itself). Counting those would inflate the number without making anything work.

Where next

API and administrationVerified base URLs, and the per-field translation limits
What it can doRouting between providers, not just to them
OperationsWhere the encryption key lives, and why it cannot be regenerated