Configuring providers without env vars
Every credential below (OPENAI_API_KEY, ANTHROPIC_API_KEY, …) can
instead be set from the Providers page in the admin dashboard
(/admin/dashboard) — no restart required. This is the easiest way to run
GoModel with zero provider env vars: start the gateway with none configured
(the catalog starts empty; the gateway still boots and serves the dashboard),
then add providers from the UI. A provider added this way registers into the
running gateway immediately.
Providers declared via env vars or config.yaml always take precedence: a
name configured either way is read-only in the dashboard (shown with a
“Config” badge), the same rule GoModel already applies to MCP servers,
virtual models, and rate limits. API keys and service-account secrets are
masked (***) once saved — editing a provider re-sends *** for anything you
didn’t change, and the gateway keeps the stored value. Disabling a provider
(rather than deleting it) unregisters it from routing but keeps its
configuration on file. The same multi-key rotation env vars support
(api_keys, an ordered list) is available from the dashboard form.
Routing a provider through a proxy
Each provider can send its upstream requests through its own forward proxy. Setproxy_url on the provider (or <PROVIDER>[_SUFFIX]_PROXY_URL as an env
var, or the Proxy URL field under Advanced settings in the dashboard’s
Providers page). http://, https://, socks5:// and socks5h:// proxies
are supported, with optional user:password@ credentials:
HTTP_PROXY / HTTPS_PROXY / NO_PROXY say for the whole process. A
per-provider proxy_url takes precedence over those variables for that
provider only, so a proxied and a direct instance of the same provider type can
run side by side — use separate provider names when different API keys need
different proxies. Every request the provider makes goes through it, including
model discovery, so an unreachable proxy shows up as an unhealthy provider on
the status page. The proxy password is never returned by the admin API or the
status endpoint (socks5://user:xxxxx@...); re-sending that masked form on an
edit keeps the stored password. Google service-account token exchange for
Vertex-backed providers is not routed through the provider proxy.
Supported providers
Example model identifiers are illustrative and subject to change; consult provider catalogs for current models. Feature columns reflect gateway API support, not every individual model capability exposed by an upstream provider.
✅ Supported ❌ Unsupported
Provider notes
- llm-d — point
LLMD_BASE_URLat the Router/EPP service and declareLLMD_MODELSwhen the route does not serve/v1/models. The dedicated provider injects trusted inference-objective and user-path fairness headers. - Z.ai GLM Coding Plan — set
ZAI_BASE_URL=https://api.z.ai/api/coding/paas/v4. - MiniMax regions and current text models — the default global endpoint is
https://api.minimax.io/v1; accounts on the China platform should setMINIMAX_BASE_URL=https://api.minimaxi.com/v1. The current text model IDs areMiniMax-M3(1,000,000-token context; text, image, and video input) andMiniMax-M2.7(204,800-token context; text input). Per-million-token USD pricing is 2.40 output, and 0.30 input, 0.06 cached input, and $0.375 cache writes for M2.7. M3 supports adaptive or disabled thinking; M2.7 always thinks. - Amazon Bedrock Mantle — GPT-5.6 Sol, Terra, and Luna accept only the
Responses API on Mantle. GoModel sends
/v1/responsesrequests directly to AWS and selects the required/openai/v1/responsesupstream path. - Fireworks AI — model IDs are account-scoped paths such as
accounts/fireworks/models/gpt-oss-120b; use them verbatim in requests and inFIREWORKS_MODELS. - ElevenLabs — a voice-only provider:
/v1/audio/speech(text-to-speech) and/v1/audio/transcriptions(speech-to-text) are supported, but chat,/v1/responses, and embeddings are not (the ❌s above reflect that, not a gateway limitation). The OpenAIvoicefield must be an ElevenLabs voice_id. See the ElevenLabs guide for supported audio formats and speech-to-text models. - Chutes AI — defaults to
https://llm.chutes.ai/v1and discovers its current model IDs, context limits, capabilities, and pricing from the live catalog. GoModel translates/v1/responsesrequests to chat completions; Chutes’ shared LLM endpoint does not expose embeddings. Passthrough support requires explicit operator opt-in by addingchutestoENABLED_PASSTHROUGH_PROVIDERS. - Meta (Muse Spark) — the Meta Model API is OpenAI-compatible; set
META_API_KEYand route tomuse-spark-1.1. Muse Spark models are not in the upstream model catalog yet, so declarecontext_windowandpricingunderproviders.meta.modelsmetadata inconfig.yamlif you want cost tracking and context-window reporting. - Kilo AI — model IDs use
provider/model(for example,anthropic/claude-sonnet-4.5) and are forwarded unchanged. GoModel serves/v1/responsesby translating it to Kilo’s chat-completions endpoint. If another configured provider exposes the same raw model ID, select Kilo explicitly withkilo/anthropic/claude-sonnet-4.5; GoModel removes only the outerkilo/routing qualifier before forwarding. - Xiaomi MiMo — TTS (
mimo-v2.5-tts*) and ASR (mimo-v2.5-asr) are served through/v1/audio/speechand/v1/audio/transcriptions(translated to MiMo’s chat-completions audio dialect) as well as directly via chat completions; for 1M context append[1m]to the model ID and list it inXIAOMI_MODELS. - OpenCode Go (OpenCode Zen) — routes per model: most models use
OpenAI-style
/chat/completions, while/messages-only models (defaultqwen3.7-max, override withOPENCODE_GO_MESSAGES_MODELS) are sent to the Anthropic-native endpoint. Chat requests without a reasoning parameter getreasoning_effort: "low"injected, because some models always think and reject requests that omit it (override withOPENCODE_GO_DEFAULT_REASONING_EFFORT). SetOPENCODE_GO_API_KEY; the base URL defaults tohttps://opencode.ai/zen/go/v1. - ChatGPT subscription — serves
/v1/responsesonly, billed against the ChatGPT plan’s quota rather than API credit. The upstream accepts a strict parameter allowlist and streams only; GoModel adapts requests and collapses the stream for non-streaming callers. SetCHATGPT_API_KEYto the access token fromcodex login. Reported cost is not real spend: these model IDs also exist on the OpenAI Platform, so the registry attaches their per-token prices to flat-rate subscription traffic — keep budgets andcostload balancing off it. - Kimi Code — no per-token pricing; quota refreshes weekly and is also
constrained by a rolling 5-hour window. Usage-cost tracking reports zero for
Kimi Code, so
costload-balancing cannot price it; prefer conservative retry strategies. - Hetzner (experimental) — Hetzner declares the inference API experimental:
expect breaking changes and no SLA. The model catalogue and rate-limit windows
change while the experiment runs; query the live
/v1/modelsendpoint and the official docs instead of relying on snapshots. The example model ID in the table above (Qwen/Qwen3.6-35B-A3B-FP8) is the entry from the official Hetzner docs as of 2026-08-17 and may differ at read time. Free while experimental, so usage-cost tracking reports zero andcostload-balancing cannot price it. No embeddings endpoint; chat,/v1/responses(via chat), model listing, and passthrough only. Passthrough is a generic forwarder — the ✅ marks adapter capability; Hetzner’s tolerance for arbitrary upstream paths is unverified while the API is experimental.hetzneris included in the defaultENABLED_PASSTHROUGH_PROVIDERSallowlist so/p/hetzner/...routes work without operator opt-in; remove it from the list to gate them. - Configured model lists — available for every provider with
<PROVIDER>_MODELS, for exampleOPENROUTER_MODELS=openai/gpt-oss-120b,anthropic/claude-sonnet-4orORACLE_MODELS=openai.gpt-oss-120b,xai.grok-3. DeepSeek defaults tohttps://api.deepseek.com; setDEEPSEEK_BASE_URLonly when using a compatible proxy or alternate DeepSeek endpoint. By default,CONFIGURED_PROVIDER_MODELS_MODE=fallbackuses those lists only when upstream/modelsis unavailable or empty. SetCONFIGURED_PROVIDER_MODELS_MODE=allowlistto expose only configured models for providers that define a list, skipping their upstream/modelscalls. - Model filters — narrow a large catalog by glob pattern or price instead of
listing models one by one:
OPENROUTER_MODEL_FILTER_INCLUDE=*:freekeeps only OpenRouter’s free tier, and<PROVIDER>_MODEL_FILTER_MAX_PRICE_PER_MTOKcaps what a provider may route to. See Filtering a provider’s models. - Model categories (chat vs embeddings vs audio) — a model’s category comes
from its
modes, resolved from four sources in precedence order: the remote model registry, operator metadata declared underproviders.<name>.modelsinconfig.yaml(e.g.modes: [embedding]), capability signals in the provider’s own model listing (GeminisupportedGenerationMethods, Cohereendpoints, OpenRouter architecture modalities, Ollama/api/showcapabilities), and finally a conservative name check for models still unclassified: IDs containingembedor matching well-known embedding families (bge,e5,gte,minilm) are categorized as embedding models, and IDs containingrerankas reranking models — namespaced IDs likeorg/modelare checked by their final path segment. Declare operator metadata only when a model stays unclassified after all of this. Categories affect dashboard grouping only;/v1/embeddingsroutes to any model the provider serves regardless of category. - vLLM — set
VLLM_API_KEYonly if the upstream server was started with--api-key. - llama.cpp / LM Studio —
LLAMACPP_BASE_URLis required (llama-server’s default port collides with GoModel’s own 8080, so there is no default);LLAMACPP_API_KEYis optional. Do not register these servers asollama, which speaks Ollama’s native API. See llama.cpp. - llm-d —
LLMD_BASE_URLis required.LLMD_API_KEYis optional and is sent only when the Gateway in front of the Router requires bearer auth. - SGLang — set
SGLANG_API_KEYonly if the upstream server was started with--api-key; otherwiseSGLANG_BASE_URLis enough. - Multiple API keys for one provider — set
OPENAI_API_KEY_2,OPENAI_API_KEY_3, and so on to spread sessions across keys while keeping each conversation on one key for prompt-cache affinity. See API key rotation. - Multiple instances of one provider type — without
config.yaml, use suffixed env vars such asOPENAI_EAST_API_KEYandOPENAI_EAST_BASE_URL; addOPENAI_EAST_MODELSto configure that instance’s model list. This registers provideropenai-eastwith typeopenai. Vertex AI follows the same suffix pattern —VERTEX_US_PROJECTregisters providervertex-us. Vertex project and location env vars must match the instance prefix: for a suffixed instance such asVERTEX_US_PROJECT, also setVERTEX_US_LOCATIONand any other suffixed settings for that instance, rather than the genericVERTEX_PROJECT/VERTEX_LOCATION.VERTEX_AUTH_TYPEdefaults to Application Default Credentials (gcp_adc).
Why some providers have dedicated pages
These are the providers most users hit friction on:- Google Vertex AI — needs a GCP project, region, and either Application Default Credentials or a service-account JSON key.
- Amazon Bedrock — no API key of its own; uses the AWS credential chain and requires explicit model access in the Bedrock console.
- Azure OpenAI — deployment-scoped base URLs, the
api-versionquery parameter, and theapi-keyheader instead ofAuthorization: Bearer. - Oracle GenAI — requires an OCI IAM policy for
generativeaiapikeyand a region-specific OpenAI-compatible endpoint URL. - Google Gemini (AI Studio) — two routing modes (native
generateContentvs OpenAI-compatible) with different image-input behavior. - Anthropic — reasoning effort maps to Claude’s adaptive thinking and effort control, which differ across model generations.
- DeepSeek — reasoning effort mapping quirks for DeepSeek V4.
- Ollama / SGLang / vLLM — local-model hosting with optional multi-instance setup through suffixed env vars and provider-qualified model IDs.
- Xiaomi MiMo — thinking mode on by default, a
[1m]context suffix, and TTS/ASR that run through chat completions rather than native audio endpoints. - OpenCode Go — OpenCode Zen splits models across OpenAI-style
/chat/completionsand Anthropic-native/messages; GoModel routes per model (the/messages-only set is maintained manually, defaultqwen3.7-max). - ChatGPT subscription — a Responses-only upstream with a strict parameter allowlist, used to put GoModel between Codex and a ChatGPT plan.
Provider status
The admin dashboard (/admin/dashboard) shows live status for every
configured provider in the Providers Overview section of the
Overview page.
Each card’s status pill combines two signals — model discovery (can the
provider’s model inventory be fetched?) and request health (are real
requests through the gateway succeeding?). Real-traffic signals only ever
worsen a status, never mask a discovery failure. Hover over the pill for the
classification reason and the most recent error.
Expand a card (the arrow strip at the bottom, or the section-wide
Show Details switch) to see request health details:
- Recent Requests — requests and errors through the gateway in the last 10 minutes.
- Breaker State — the provider’s live circuit-breaker state (see Resilience).
- Models (Recent Traffic) — per-model request/error counts. A model with at least 3 errors making up half or more of its windowed requests is flagged in red — this catches a single broken model on an otherwise healthy provider, which model discovery alone cannot see. Hover a row for the model’s latest error message.
GET /admin/providers/status for
scripting and external monitoring.