One OpenAI-compatible endpoint over 17 providers, plus verbatim native passthrough. This page is generated from the gateway's live provider registry, so every value below reflects current behavior.
Base URL: https://llmproxy.api.sparkbright.me. Every request (except GET /health and the docs pages)
authenticates with a SparkBright app key:
Authorization: Bearer <your-app-key>
The app key controls rate limits and which providers the app may call. Provider API keys are held by the
gateway and injected server-side — clients never send upstream provider keys. An app restricted by
allowedProviders gets 403 for any other provider.
endpoints
POST /v1/chat/completions ·
GET /v1/models[?provider=] ·
GET /v1/models/pricing[?provider=] ·
GET /v1/providers ·
ANY /native/{provider}/{path...} ·
GET /health ·
GET / · GET /docs
POST /v1/chat/completionsAn OpenAI-shaped chat endpoint that works identically across providers. Pick the provider and model per request; the gateway renames the token param, clamps temperature, and drops unsupported params for you (see the parameter matrix).
{
"provider": "openai", // required — a provider id (see table below)
"model": "gpt-5.5", // required — a model id for that provider
"messages": [ // required — OpenAI chat messages
{ "role": "system", "content": "You are concise." },
{ "role": "user", "content": "Hello" }
],
"temperature": 0.7, // standard params, top-level (OpenAI style)
"max_tokens": 1024,
"stream": false,
"conversationId": "optional-id",// server-side 90-min history merge (non-stream)
"standardFormat": true // default true; false returns provider-raw body
}
Params may be sent top-level (OpenAI style) or inside a legacy options{} object,
in camelCase or snake_case; top-level wins. Recognized standard params:
max_tokens, temperature, top_p, top_k, stop,
seed, presence_penalty, frequency_penalty, response_format,
tools, tool_choice, parallel_tool_calls, reasoning_effort,
n, user.
{
"success": true,
"provider": "openai",
"model": "gpt-5.5",
"response": { /* OpenAI chat.completion shape (normalized) */
"choices": [{ "message": { "role": "assistant", "content": "..." }, "finish_reason": "stop" }]
},
"usage": { "prompt_tokens": 12, "completion_tokens": 34, "total_tokens": 46 },
"conversationId": "conv-...",
"metadata": {
"requestId": "req-...",
"timestamp": "2026-07-12T00:00:00.000Z",
"rateLimitRemaining": 58,
"dropped_params": ["top_k"] // params silently dropped for this provider
}
}
response is always normalized to the OpenAI chat.completion shape when
standardFormat is true (the default). Set standardFormat: false to receive the
provider's raw body instead. Inspect metadata.dropped_params to see exactly what the gateway removed.
curl -sS https://llmproxy.api.sparkbright.me/v1/chat/completions \
-H "Authorization: Bearer $SB_APP_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider": "openai",
"model": "gpt-5.5",
"messages": [{ "role": "user", "content": "Hello" }],
"max_tokens": 256
}'
const res = await fetch("https://llmproxy.api.sparkbright.me/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.SB_APP_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
provider: "anthropic",
model: "claude-sonnet-5",
messages: [{ role: "user", content: "Hello" }],
max_tokens: 256,
}),
});
const data = await res.json();
console.log(data.response.choices[0].message.content);
Set "stream": true to receive Server-Sent Events. The gateway pipes the upstream SSE straight through in
OpenAI delta shape (Anthropic's typed stream is translated to the same shape). Streamed responses have
no JSON wrapper and skip the conversation cache.
curl -N https://llmproxy.api.sparkbright.me/v1/chat/completions \
-H "Authorization: Bearer $SB_APP_KEY" \
-H "Content-Type: application/json" \
-d '{ "provider": "groq", "model": "openai/gpt-oss-120b",
"messages": [{ "role": "user", "content": "Count to 3" }], "stream": true }'
# data: {"choices":[{"delta":{"content":"1"}}]}
# data: {"choices":[{"delta":{"content":"2"}}]}
# ...
# data: [DONE]
Supply a conversationId on a non-stream request and the gateway merges prior turns from a 90-minute
server-side cache, appends the new turn, and stores the assistant reply. To keep multi-turn history you must supply
the same id from the first request onward. Omitted on streams.
The request shape is identical across providers — change provider and model and nothing else.
Because token-param renaming, temperature clamping, and unsupported-param dropping are handled per provider, the same
body is portable. Use GET /v1/models?provider=<id> to discover live model ids, and each provider's
default/cheap ids (below) as safe starting points.
GET /v1/models/pricingSame auth, query, and envelope as /v1/models, with a per-model pricing object
(USD per 1,000,000 tokens) and a provider-level cost summary attached. Alias:
/v1/models/cost. Each provider carries a cost_source:
api (pricing read live from the provider — OpenRouter, Together, SambaNova),
static (published rates the gateway maintains), or
none (no per-token cost — Ollama is local/self-hosted, Featherless
is a flat subscription). Models with no known price (e.g. openrouter/auto) return
pricing:null with a cost_reason.
curl -sS https://llmproxy.api.sparkbright.me/v1/models/pricing?provider=anthropic -H "Authorization: Bearer <app-key>"
{ "provider": "anthropic", "cost_source": "static", "cost_available": true,
"unit": "usd_per_1m_tokens", "currency": "USD",
"models": [ { "id": "claude-sonnet-5",
"pricing": { "input": 3, "output": 15, "source": "static", "unit": "usd_per_1m_tokens" } } ] }
ANY /native/{provider}/{path...}Forward a request verbatim to a provider's own API. The gateway does no body parsing, no param
validation, and no transformation — it injects provider auth (and required headers such as
anthropic-version), forwards method, query, and body, and streams the response back with the provider's
own status and content type. Use this to reach provider-specific features the standard route doesn't model.
The path after /native/{provider} is appended to that provider's native root:
| Provider | Forwards to (native root) | Native chat surface | Example call |
|---|---|---|---|
openai |
https://api.openai.com |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/openai/chat/completions |
anthropic |
https://api.anthropic.com |
POST /v1/messages |
POST https://llmproxy.api.sparkbright.me/native/anthropic/v1/messages |
google |
https://generativelanguage.googleapis.com |
POST /v1beta/models/{model}:generateContent |
POST https://llmproxy.api.sparkbright.me/native/google/v1beta/models/gemini-3.5-flash:generateContent |
groq |
https://api.groq.com |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/groq/chat/completions |
sambanova |
https://api.sambanova.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/sambanova/chat/completions |
moonshot |
https://api.moonshot.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/moonshot/chat/completions |
deepseek |
https://api.deepseek.com |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/deepseek/chat/completions |
alibaba |
https://dashscope-intl.aliyuncs.com |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/alibaba/chat/completions |
cohere |
https://api.cohere.com |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/cohere/chat/completions |
mistral |
https://api.mistral.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/mistral/chat/completions |
xai |
https://api.x.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/xai/chat/completions |
cerebras |
https://api.cerebras.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/cerebras/chat/completions |
perplexity |
https://api.perplexity.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/perplexity/chat/completions |
openrouter |
https://openrouter.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/openrouter/chat/completions |
together |
https://api.together.xyz |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/together/chat/completions |
featherless |
https://api.featherless.ai |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/featherless/chat/completions |
ollama |
http://localhost:11434 |
POST /chat/completions |
POST https://llmproxy.api.sparkbright.me/native/ollama/chat/completions |
Example: POST /native/anthropic/v1/messages reaches
https://api.anthropic.com/v1/messages with
x-api-key + anthropic-version injected.
Each cell shows two things: the native param name / range (top, grey) to use for a native passthrough call, and how the standard route maps that param for the provider (bottom; red = dropped). Table scrolls horizontally; the param column is pinned.
| param | openai | anthropic | google | groq | sambanova | moonshot | deepseek | alibaba | cohere | mistral | xai | cerebras | perplexity | openrouter | together | featherless | ollama |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
max_tokens |
max_completion_tokens
renamed → max_completion_tokens
|
max_tokens (required)
passed as max_tokens; required, defaults 4096
|
generationConfig.maxOutputTokens
passed as max_tokens
|
max_completion_tokens
renamed → max_completion_tokens
|
max_tokens
passed as max_tokens
|
max_completion_tokens
renamed → max_completion_tokens; defaults 4096 if unset
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_completion_tokens
renamed → max_completion_tokens
|
max_completion_tokens
renamed → max_completion_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
max_tokens
passed as max_tokens
|
temperature |
temperature 0–2
clamped to 0–2; dropped on reasoning models unless reasoning_effort none
|
temperature 0–1
clamped to 0–1
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
temperature 0–1
clamped to 0–1
|
temperature 0–2
clamped to 0–2
|
temperature 0–1.999
clamped to 0–1.999
|
temperature 0–2
clamped to 0–2
|
temperature 0–1.5
clamped to 0–1.5
|
temperature 0–2
clamped to 0–2
|
temperature 0–1.5
clamped to 0–1.5
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
temperature 0–2
clamped to 0–2
|
top_p |
top_p
passed; dropped on reasoning models
|
top_p
passed
|
topP
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_p
passed
|
top_k |
top_k (may 400)
dropped
|
top_k
passed
|
topK
passed
|
top_k (may 400)
dropped
|
top_k
passed
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k (may 400)
dropped
|
top_k
passed
|
top_k
passed
|
top_k
passed
|
top_k
passed
|
top_k
passed
|
stop |
stop
passed
|
stop_sequences[]
passed
|
stopSequences[]
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
stop
passed
|
seed |
seed
passed
|
—
dropped
|
seed
passed
|
seed
passed
|
seed (may 400)
dropped
|
seed (may 400)
dropped
|
seed (may 400)
dropped
|
seed
passed
|
seed
passed
|
random_seed
renamed → random_seed
|
seed
passed
|
seed
passed
|
seed (may 400)
dropped
|
seed
passed
|
seed
passed
|
seed
passed
|
seed
passed
|
presence_penalty |
presence_penalty
passed
|
—
dropped
|
presencePenalty
passed
|
presence_penalty
passed
|
presence_penalty (may 400)
dropped
|
presence_penalty
passed
|
presence_penalty (may 400)
dropped
|
presence_penalty (may 400)
dropped
|
presence_penalty
passed
|
presence_penalty
passed
|
presence_penalty
passed
|
presence_penalty (may 400)
dropped
|
presence_penalty
passed
|
presence_penalty
passed
|
presence_penalty
passed
|
presence_penalty
passed
|
presence_penalty
passed
|
frequency_penalty |
frequency_penalty
passed
|
—
dropped
|
frequencyPenalty
passed
|
frequency_penalty
passed
|
frequency_penalty (may 400)
dropped
|
frequency_penalty
passed
|
frequency_penalty (may 400)
dropped
|
frequency_penalty (may 400)
dropped
|
frequency_penalty
passed
|
frequency_penalty
passed
|
frequency_penalty
passed
|
frequency_penalty (may 400)
dropped
|
frequency_penalty
passed
|
frequency_penalty
passed
|
frequency_penalty
passed
|
frequency_penalty
passed
|
frequency_penalty
passed
|
response_format |
response_format
passed
|
— (use tools / JSON prompt)
dropped
|
responseMimeType / responseSchema
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format
passed
|
response_format (may 400)
dropped
|
response_format
passed
|
response_format
passed
|
response_format (may 400)
dropped
|
response_format
passed
|
tools |
tools
passed
|
tools[]
passed
|
tools[].functionDeclarations
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools
passed
|
tools (may 400)
dropped
|
tools
passed
|
tools
passed
|
tools (may 400)
dropped
|
tools
passed
|
tool_choice |
tool_choice
passed
|
tool_choice {auto|any|tool|none}
passed
|
toolConfig.functionCallingConfig
passed
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice
passed; "required" → "auto"
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice (may 400)
dropped
|
tool_choice
passed
|
tool_choice
passed
|
tool_choice (may 400)
dropped
|
tool_choice
passed
|
parallel_tool_calls |
parallel_tool_calls
passed
|
—
passed
|
—
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls (may 400)
dropped
|
parallel_tool_calls
passed
|
parallel_tool_calls
passed
|
parallel_tool_calls (may 400)
dropped
|
parallel_tool_calls
passed
|
stream |
stream
passed w/ stream_options
|
typed SSE
passed w/ stream_options
|
:streamGenerateContent?alt=sse
passed (no stream_options)
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed (no stream_options)
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
stream
passed w/ stream_options
|
reasoning_effort |
reasoning_effort
passed
|
— (thinking{budget_tokens})
dropped
|
— (thinkingConfig)
passed
|
reasoning_effort
passed
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort
passed
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort
passed
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
reasoning_effort (may 400)
dropped
|
"passed w/ stream_options" means the gateway adds stream_options:{include_usage:true} on
streams. "may 400" on a native cell means passthrough forwards the param but the provider itself may reject it.
Reasoning/thinking control is the least standardized param across providers — shape, allowed values, and even which
models accept it vary widely, and some providers (Groq, xAI) return HTTP 400 rather than silently
ignoring it on an unsupported model. Standard route below means the gateway forwards the literal
top-level reasoning_effort string on /v1/chat/completions (governed by
supports.reasoning_effort in the registry — see the parameter matrix). Providers
marked "not forwarded" still expose their own reasoning control on the native route — send the
provider's native param shape directly.
| Provider | Standard route | Native param | Allowed values | Model support |
|---|---|---|---|---|
openai |
forwarded verbatim | reasoning_effort | none, minimal, low, medium, high (xhigh/max on newest gpt-5.5+/5.6 models) | gpt-5.x reasoning family (gpt-5.4/5.4-nano/5.5/5.5-pro/5.6-sol); ignored on non-reasoning gpt-4.1 / gpt-4o. |
anthropic |
not forwarded (dropped) | thinking.budget_tokens (Sonnet/Opus pre-4.7) or thinking.effort (Opus 4.7+/5, Sonnet 5, Fable/Mythos 5) | budget_tokens: integer ≥1024 and < max_tokens; effort: low/medium/high on the newer adaptive-thinking models (scale still evolving). | Extended-thinking-capable Claude models — send via /native/anthropic/v1/messages; the standard route does not translate reasoning_effort into Anthropic's thinking{} shape. |
google |
forwarded verbatim | reasoning_effort (passed through to thinkingConfig on the OpenAI-compat layer) | low, medium, high (Gemini 3.x thinkingLevel); none/0 disables thinking on flash/flash-lite tiers only — Pro tier can't fully disable it. 2.5-family models instead map to a 0–24576 thinkingBudget (-1 = dynamic). | gemini-3.5-flash, gemini-3.1-pro, gemini-3.1-flash-lite, gemini-2.5-pro, gemini-2.5-flash. |
groq |
forwarded verbatim | reasoning_effort | gpt-oss-120b / gpt-oss-20b: low/medium/high (default medium); qwen3-32b: none/default. | openai/gpt-oss-120b, openai/gpt-oss-20b, qwen/qwen3-32b only — llama-3.1-8b-instant and moonshotai/kimi-k2-instruct return HTTP 400 if sent. |
sambanova |
not forwarded (dropped) | reasoning_effort (not forwarded by the gateway's standard route today) | low/medium/high (default medium); gpt-oss-120b recommends high for tool-calling quality. | gpt-oss-120b confirmed; DeepSeek-V3.2/MiniMax-M2.7 unconfirmed. DeepSeek-V3.1 instead uses a chat_template_kwargs.enable_thinking boolean, not reasoning_effort. Use /native/sambanova/chat/completions to control directly. |
moonshot |
not forwarded (dropped) | reasoning_effort (kimi-k3 only); a separate thinking{} object on kimi-k2.x | kimi-k3: low/high/max. | The gateway's current kimi-k2.5/2.6/2.7-code* lineup does not accept reasoning_effort — not forwarded on the standard route. |
deepseek |
not forwarded (dropped) | reasoning_effort / effort (not forwarded by the gateway's standard route today) | deepseek-v4-flash & deepseek-v4-pro: low/high/max (v4-pro currently pinned to high; remap planned). | v4-flash, v4-pro. Legacy deepseek-reasoner (R1) always reasons and ignores it. Use /native/deepseek/chat/completions to control directly; verify silent-ignore-vs-error behavior before relying on it. |
alibaba |
not forwarded (dropped) | enable_thinking (bool, extra_body) + thinking_budget (int token cap) — different shape than reasoning_effort, not forwarded on the standard route | enable_thinking toggles reasoning on hybrid models; thinking_budget caps tokens on any thinking-mode model. | Hybrid/toggleable: qwen3-max, qwen-plus, qwen-flash, qwen-turbo. Always-on thinking (ignores enable_thinking, honors thinking_budget): qwq-plus. qwen-max (legacy) unsupported. |
cohere |
not forwarded (dropped) | thinking: {type: "enabled"|"disabled", token_budget} — not forwarded on the standard route | token_budget: integer, roughly 1K–31K. | command-a-reasoning-08-2025 only (enabled by default); other command-a variants (03-2025, plus, vision) are undocumented for this and treated as unsupported. |
mistral |
not forwarded (dropped) | reasoning_effort (not forwarded on the standard route today) | none, high (only two confirmed levels). | mistral-small-latest, mistral-medium-latest. magistral-small/medium always reason natively without the param. Not supported on mistral-large-latest, ministral-3-8b, codestral-latest. |
xai |
forwarded verbatim | reasoning_effort | low, medium, high (default high; cannot be fully disabled). | grok-4.5 only — base grok-4 errors if sent. grok-4.20-multi-agent reuses the field name for agent-collaboration count, not reasoning depth — avoid sending reasoning_effort to it. |
cerebras |
not forwarded (dropped) | reasoning_effort (not forwarded on the standard route today) | gpt-oss-120b: low/medium(default)/high. zai-glm-4.7: low/medium/high/none (none disables). | gpt-oss-120b, zai-glm-4.7. gemma-4-31b reasoning support is unclear — treat as non-reasoning. |
perplexity |
not forwarded (dropped) | reasoning_effort (not forwarded on the standard route today) | Confirmed live only for sonar-deep-research; exact allowed values undocumented (commonly low/medium/high elsewhere). | sonar-deep-research only. sonar-reasoning/-pro reason internally with no effort control; sonar/sonar-pro are non-reasoning. |
openrouter |
forwarded verbatim | reasoning: {effort: min|low|medium|high|xhigh|max|none} or reasoning: {max_tokens: N} (send only one); legacy flat reasoning_effort still accepted for back-compat | Effort maps internally to a token budget (min 1024, max ~128k). | Applies across whichever underlying reasoning-capable model gets routed; non-reasoning models generally no-op it. quirks.passthroughExtras lets you send the nested reasoning{} object directly instead of the flat field. |
together |
not forwarded (dropped) | No unified param — varies per hosted model family; not forwarded on the standard route | GPT-OSS models: reasoning_effort low/medium/high. Hybrid (e.g. DeepSeek-V3.1): reasoning boolean toggle. Qwen3 family: chat_template_kwargs {enable_thinking}. DeepSeek-R1: always-on, no param — parse <think> tags from content. | Best approach: branch by model family per the values column; there is no single provider-wide field like OpenRouter's. |
featherless |
not forwarded (dropped) | chat_template_kwargs (enable_thinking / thinking / do_reasoning) — on/off only, not forwarded on the standard route | Boolean toggle, not a graded effort scale. | Only the minority of hosted models whose chat template supports thinking; most of the catalog is flat-rate open-weight non-reasoning models. |
ollama |
not forwarded (dropped) | reasoning_effort — supported on the OpenAI-compat /v1/chat/completions surface only (native /api/chat think:true/false is NOT honored there); not forwarded by the gateway's standard route today | high, medium, low, none. | Confirmed on qwen3.5, deepseek-r1, gpt-oss family. Ollama auto-enables thinking on capable models even with no param set. Use /native/ollama/chat/completions to control directly. |
| ID | Provider | Protocol | Token param | Temp | Default | Cheap | Models list | Extra standard params |
|---|---|---|---|---|---|---|---|---|
openai |
OpenAI | openai | max_completion_tokens |
0–2 | gpt-5.5 |
gpt-5.4-nano |
live | temperature, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls, reasoning_effort |
anthropic |
Anthropic | anthropic | max_tokens |
0–1 | claude-sonnet-5 |
claude-haiku-4-5 |
live | temperature, top_k, tools, tool_choice, parallel_tool_calls |
google |
Google Gemini | openai | max_tokens |
0–2 | gemini-3.5-flash |
gemini-3.1-flash-lite |
live | temperature, top_k, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls, reasoning_effort |
groq |
Groq | openai | max_completion_tokens |
0–2 | openai/gpt-oss-120b |
openai/gpt-oss-20b |
live | temperature, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls, reasoning_effort |
sambanova |
SambaNova | openai | max_tokens |
0–2 | Meta-Llama-3.3-70B-Instruct |
gemma-4-31B-it |
live | temperature, top_k, response_format, tools, tool_choice, parallel_tool_calls |
moonshot |
Moonshot (Kimi) | openai | max_completion_tokens |
0–1 | kimi-k2.6 |
kimi-k2.5 |
live | temperature, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
deepseek |
DeepSeek | openai | max_tokens |
0–2 | deepseek-v4-flash |
deepseek-v4-flash |
live | temperature, response_format, tools, tool_choice, parallel_tool_calls |
alibaba |
Alibaba Qwen (DashScope) | openai | max_tokens |
0–1.999 | qwen-plus |
qwen-flash |
live | temperature, seed, response_format, tools, tool_choice, parallel_tool_calls |
cohere |
Cohere | openai | max_tokens |
0–2 | command-a-03-2025 |
command-r7b-12-2024 |
fallback only | temperature, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
mistral |
Mistral | openai | max_tokens |
0–1.5 | mistral-large-latest |
mistral-small-latest |
live | temperature, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
xai |
xAI (Grok) | openai | max_completion_tokens |
0–2 | grok-4.5 |
grok-4.3 |
live | temperature, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls, reasoning_effort |
cerebras |
Cerebras | openai | max_completion_tokens |
0–1.5 | gpt-oss-120b |
gemma-4-31b |
live | temperature, seed, response_format, tools, tool_choice, parallel_tool_calls |
perplexity |
Perplexity (Sonar) | openai | max_tokens |
0–2 | sonar-pro |
sonar |
fallback only | temperature, top_k, presence_penalty, frequency_penalty |
openrouter |
OpenRouter | openai | max_tokens |
0–2 | openrouter/auto |
meta-llama/llama-3.3-70b-instruct:free |
live | temperature, top_k, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls, reasoning_effort |
together |
Together AI | openai | max_tokens |
0–2 | meta-llama/Llama-3.3-70B-Instruct-Turbo |
meta-llama/Llama-3.1-8B-Instruct-Turbo |
live | temperature, top_k, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
featherless |
Featherless AI | openai | max_tokens |
0–2 | meta-llama/Meta-Llama-3.1-8B-Instruct |
meta-llama/Meta-Llama-3.1-8B-Instruct |
live | temperature, top_k, seed, presence_penalty, frequency_penalty |
ollama |
Ollama | openai | max_tokens |
0–2 | llama3.3 |
llama3.2 |
live | temperature, top_k, seed, presence_penalty, frequency_penalty, response_format, tools, tool_choice, parallel_tool_calls |
| Standard base | https://api.openai.com/v1 |
|---|---|
| Native root | https://api.openai.com |
| Auth (standard) | bearer |
| Token param | max_completion_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | gpt-5.5 |
| Cheap model | gpt-5.4-nano |
| Fallback list | gpt-5.6-sol, gpt-5.5-pro, gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.2, gpt-5.1, gpt-4.1, gpt-4.1-mini, gpt-4o, gpt-4o-mini |
| /v1/models | live via /models |
| Always dropped | none |
| Quirks | Reasoning models (gpt-5*/o-series) drop temperature & top_p unless reasoning_effort is none. |
| Docs | https://platform.openai.com/docs/api-reference |
| Standard base | https://api.anthropic.com |
|---|---|
| Native root | https://api.anthropic.com |
| Auth (standard) | x-api-key + anthropic-version: 2023-06-01 |
| Token param | max_tokens |
| Temperature | 0 – 1 (clamped) |
| Default model | claude-sonnet-5 |
| Cheap model | claude-haiku-4-5 |
| Fallback list | claude-fable-5, claude-opus-4-8, claude-sonnet-5, claude-haiku-4-5-20251001 |
| /v1/models | live via /v1/models |
| Always dropped | none |
| Quirks | max_tokens is required; the gateway defaults it to 4096. |
| Docs | https://docs.anthropic.com/en/api |
| Standard base | https://generativelanguage.googleapis.com/v1beta/openai |
|---|---|
| Native root | https://generativelanguage.googleapis.com |
| Auth (standard) | bearer / native x-goog-api-key |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | gemini-3.5-flash |
| Cheap model | gemini-3.1-flash-lite |
| Fallback list | gemini-3.1-pro, gemini-3.5-flash, gemini-3.1-flash-lite, gemini-2.5-pro, gemini-2.5-flash |
| /v1/models | live via /models |
| Always dropped | none |
| Quirks | No stream_options; usage arrives in the final stream chunk automatically. |
| Docs | https://ai.google.dev/gemini-api/docs |
| Standard base | https://api.groq.com/openai/v1 |
|---|---|
| Native root | https://api.groq.com |
| Auth (standard) | bearer |
| Token param | max_completion_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | openai/gpt-oss-120b |
| Cheap model | openai/gpt-oss-20b |
| Fallback list | openai/gpt-oss-120b, openai/gpt-oss-20b, llama-3.1-8b-instant, moonshotai/kimi-k2-instruct, qwen/qwen3-32b |
| /v1/models | live via /models |
| Always dropped | logprobs, top_logprobs, logit_bias, n |
| Docs | https://console.groq.com/docs |
| Standard base | https://api.sambanova.ai/v1 |
|---|---|
| Native root | https://api.sambanova.ai |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | Meta-Llama-3.3-70B-Instruct |
| Cheap model | gemma-4-31B-it |
| Fallback list | DeepSeek-V3.1, DeepSeek-V3.2, Meta-Llama-3.3-70B-Instruct, MiniMax-M2.7, gemma-4-31B-it, gpt-oss-120b |
| /v1/models | live via /models |
| Always dropped | presence_penalty, frequency_penalty, logprobs, top_logprobs, logit_bias |
| Docs | https://docs.sambanova.ai |
| Standard base | https://api.moonshot.ai/v1 |
|---|---|
| Native root | https://api.moonshot.ai |
| Auth (standard) | bearer |
| Token param | max_completion_tokens |
| Temperature | 0 – 1 (clamped) |
| Default model | kimi-k2.6 |
| Cheap model | kimi-k2.5 |
| Fallback list | kimi-k2.7-code, kimi-k2.7-code-highspeed, kimi-k2.6, kimi-k2.5 |
| /v1/models | live via /models |
| Always dropped | none |
| Quirks | Bad low default for max tokens — the gateway sets 4096 when you omit it. tool_choice:"required" is unsupported and is coerced to "auto". |
| Docs | https://platform.moonshot.ai/docs |
| Standard base | https://api.deepseek.com |
|---|---|
| Native root | https://api.deepseek.com |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | deepseek-v4-flash |
| Cheap model | deepseek-v4-flash |
| Fallback list | deepseek-v4-flash, deepseek-v4-pro |
| /v1/models | live via /models |
| Always dropped | presence_penalty, frequency_penalty, seed, top_k |
| Docs | https://api-docs.deepseek.com |
| Standard base | https://dashscope-intl.aliyuncs.com/compatible-mode/v1 |
|---|---|
| Native root | https://dashscope-intl.aliyuncs.com |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 1.999 (clamped) |
| Default model | qwen-plus |
| Cheap model | qwen-flash |
| Fallback list | qwen3-max, qwen-max, qwen-plus, qwen-flash, qwen-turbo, qwq-plus |
| /v1/models | live via /models |
| Always dropped | frequency_penalty, top_k |
| Docs | https://www.alibabacloud.com/help/en/model-studio |
| Standard base | https://api.cohere.com/compatibility/v1 |
|---|---|
| Native root | https://api.cohere.com |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | command-a-03-2025 |
| Cheap model | command-r7b-12-2024 |
| Fallback list | command-a-plus-05-2026, command-a-03-2025, command-a-reasoning-08-2025, command-a-vision-07-2025, command-r7b-12-2024 |
| /v1/models | no live list — fallback ids only |
| Always dropped | none |
| Docs | https://docs.cohere.com |
| Standard base | https://api.mistral.ai/v1 |
|---|---|
| Native root | https://api.mistral.ai |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 1.5 (clamped) |
| Default model | mistral-large-latest |
| Cheap model | mistral-small-latest |
| Fallback list | mistral-large-latest, mistral-medium-latest, mistral-small-latest, ministral-3-8b, codestral-latest |
| /v1/models | live via /models |
| Always dropped | logit_bias, logprobs, top_logprobs, top_k |
| Quirks | seed is renamed to random_seed. No stream_options; usage arrives in the final stream chunk automatically. |
| Docs | https://docs.mistral.ai |
| Standard base | https://api.x.ai/v1 |
|---|---|
| Native root | https://api.x.ai |
| Auth (standard) | bearer |
| Token param | max_completion_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | grok-4.5 |
| Cheap model | grok-4.3 |
| Fallback list | grok-4.5, grok-4.3, grok-4.20, grok-build-0.1 |
| /v1/models | live via /models |
| Always dropped | logit_bias |
| Docs | https://docs.x.ai |
| Standard base | https://api.cerebras.ai/v1 |
|---|---|
| Native root | https://api.cerebras.ai |
| Auth (standard) | bearer |
| Token param | max_completion_tokens |
| Temperature | 0 – 1.5 (clamped) |
| Default model | gpt-oss-120b |
| Cheap model | gemma-4-31b |
| Fallback list | zai-glm-4.7, gemma-4-31b, gpt-oss-120b |
| /v1/models | live via /models |
| Always dropped | presence_penalty, frequency_penalty, logit_bias |
| Docs | https://inference-docs.cerebras.ai |
| Standard base | https://api.perplexity.ai |
|---|---|
| Native root | https://api.perplexity.ai |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | sonar-pro |
| Cheap model | sonar |
| Fallback list | sonar, sonar-pro, sonar-reasoning, sonar-reasoning-pro, sonar-deep-research |
| /v1/models | no live list — fallback ids only |
| Always dropped | logit_bias |
| Docs | https://docs.perplexity.ai |
| Standard base | https://openrouter.ai/api/v1 |
|---|---|
| Native root | https://openrouter.ai |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | openrouter/auto |
| Cheap model | meta-llama/llama-3.3-70b-instruct:free |
| Fallback list | openrouter/auto, meta-llama/llama-3.3-70b-instruct:free, deepseek/deepseek-chat:free |
| /v1/models | live via /models |
| Always dropped | none |
| Quirks | Unknown/extra params are forwarded (e.g. models[], provider, route, transforms). |
| Docs | https://openrouter.ai/docs |
| Standard base | https://api.together.xyz/v1 |
|---|---|
| Native root | https://api.together.xyz |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | meta-llama/Llama-3.3-70B-Instruct-Turbo |
| Cheap model | meta-llama/Llama-3.1-8B-Instruct-Turbo |
| Fallback list | meta-llama/Llama-3.3-70B-Instruct-Turbo, deepseek-ai/DeepSeek-V3, Qwen/Qwen2.5-72B-Instruct-Turbo, meta-llama/Llama-3.1-8B-Instruct-Turbo, moonshotai/Kimi-K2-Instruct |
| /v1/models | live via /models |
| Always dropped | none |
| Docs | https://docs.together.ai |
| Standard base | https://api.featherless.ai/v1 |
|---|---|
| Native root | https://api.featherless.ai |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | meta-llama/Meta-Llama-3.1-8B-Instruct |
| Cheap model | meta-llama/Meta-Llama-3.1-8B-Instruct |
| Fallback list | meta-llama/Meta-Llama-3.1-8B-Instruct, meta-llama/Meta-Llama-3.1-70B-Instruct, Qwen/Qwen2.5-72B-Instruct |
| /v1/models | live via /models |
| Always dropped | none |
| Docs | https://featherless.ai/docs |
| Standard base | http://localhost:11434/v1 |
|---|---|
| Native root | http://localhost:11434 |
| Auth (standard) | bearer |
| Token param | max_tokens |
| Temperature | 0 – 2 (clamped) |
| Default model | llama3.3 |
| Cheap model | llama3.2 |
| Fallback list | llama3.3, qwen2.5, gpt-oss:20b, deepseek-r1 |
| /v1/models | live via /models |
| Always dropped | none |
| Quirks | Base URL overridable via env OLLAMA_BASE_URL (local/self-hosted). |
| Docs | https://github.com/ollama/ollama/blob/main/docs/openai.md |
OpenRouter (provider: "openrouter") fronts hundreds of upstreams and exposes a pool of
free models. Params unsupported by the chosen upstream are silently dropped, not errored.
GET https://llmproxy.api.sparkbright.me/v1/models?provider=openrouter (or OpenRouter's own
GET /models), then keep entries whose pricing.prompt == "0" and
pricing.completion == "0" (they are strings). Free ids carry a :free suffix."model": "meta-llama/llama-3.3-70b-instruct:free". The suffix is mandatory to force the free tier.models array of ids tried in order —
{ "model": "a:free", "models": ["a:free", "b:free"] } (forwarded because OpenRouter allows extra params)."model": "openrouter/auto" lets OpenRouter pick a model for the prompt.429.When a provider returns a non-2xx response, the gateway returns the same HTTP status and preserves the provider's own error body verbatim:
{
"success": false,
"error": {
"type": "provider_error",
"provider": "openai",
"status": 400,
"message": "<best short message>",
"provider_error": { /* the provider's raw JSON body, verbatim (or raw text) */ },
"request_id": "req-..."
}
}
On the native route the provider's response is passed through untouched (status, content-type, body).
Mid-stream provider errors are piped through unchanged. Gateway-side problems use standard 4xx types
— invalid_request_error, authentication_error, rate_limit_error.
GET /v1/providers returns the full registry as JSON (secrets excluded): for every provider its
protocol, baseUrl, nativeBaseUrl, authStyle, tokenParam,
temperature range, supports flags, dropParams, quirks,
models (default/cheap/fallback/list), and docs.
This is the same data that generates this page.
Recommended agent flow for choosing a model dynamically:
GET /v1/providers once to learn which providers exist, their capabilities, and their default/cheap ids.supports.tools for function calling,
supports.response_format for JSON mode, supports.reasoning_effort for reasoning control.GET /v1/models?provider=<id> for the chosen provider to get live model ids
(falls back to the registry's fallback list if the provider has no live list or is unreachable);
each response also carries default and cheap for that provider.POST /v1/chat/completions with the selected provider + model. Read
metadata.dropped_params to confirm which of your params the provider actually honored.error.provider_error (verbatim) and either retry with a
fallback model or switch providers.Prefer each provider's default for quality and cheap for cost/latency. Do not
hardcode model ids long-term — resolve them from /v1/models so you follow provider deprecations automatically.
SparkBright LLM Gateway · 17 providers · generated from src/registry.js at request time.