The sources
- Pricing overrides — set per model in the dashboard’s Models page. The top layer for pricing fields only; unset price types keep inheriting. See Cost tracking.
config.yamlmetadata —providers.<name>.modelsentries can attachmetadata(pricing,context_window,modes,capabilities, …). Declared fields win field-by-field over everything below; omitted fields inherit. This is the escape hatch for local models: declaringmodes: [embedding]also derives the model’s category.- Provider discovery — most providers describe their models in their own
listings, and what a provider says about its own deployment wins over the
catalog field by field: Anthropic’s display name, token limits and
capability flags; Gemini’s display name, description, token limits and
thinking support (also on Vertex); Groq’s context window, output limit,
modalities, features and prices; xAI’s context window, prices (with the
long-context tier) and reasoning support; Fireworks’ model kind, context
window and feature flags; OpenRouter’s name, description, modalities,
supported parameters and prices; Cohere’s endpoints, context length and
features; Bedrock’s display name, modalities and streaming support;
Chutes’ context length, max output, features and prices; Ollama’s
/api/showcapabilities, family and context length; vLLM, SGLang and llm-d’smax_model_len; and llama.cpp’s context window and modalities (see llama.cpp). Capability names are mapped onto the catalog’s vocabulary (function_calling,vision,reasoning, …) so both layers describe one feature under one key. This matters most for self-hosted servers, where the running process is the only source that can know the real context window. Models declared via configured model lists skip this step. - The model catalog — the
ai-model-listregistry, fetched fromMODEL_LIST_URL(default: the registry’smodels.min.jsonon GitHub) at startup and on every catalog refresh. It supplies the rich defaults — pricing, context windows, capabilities, modes — for most hosted models, matching IDs directly, through aliases, and with release-date suffixes stripped, and it fills in every field the provider above did not report. Wrong or missing data is best fixed by contributing to the registry; use an override for an immediate fix. - ID heuristic — a last-resort name check for models that end up with no
modes at all (typical for llama.cpp and LM Studio): IDs containing
embedor matching well-known embedding families (bge,e5,gte,minilm) become embedding models, IDs containingrerankbecome reranking models. Namespaced IDs are matched by their final path segment. When unsure, it claims nothing.
Checking where a value came from
Expand a row on the dashboard’s Models page to see the model’s effective metadata with the layer that supplied each field, and switch the panel to Provider, Catalog, or Config to see one layer on its own. The same data is served byGET /admin/models/metadata.
What metadata affects
- Pricing drives cost tracking, budgets, and
costload-balancing. Each priced field remembers its source, so the dashboard can show where a rate came from. - Modes and categories drive dashboard grouping only — routing never
blocks on them, so
/v1/embeddingsreaches any model the provider serves. - Context window and capabilities are advertised on
GET /v1/models(and onGET /v1/models/{model}for a single model) for clients that pick models dynamically. Thevisioncapability also drives vision routing; a catalog entry that listsimageamong its input modalities reports it.
Offline behavior
If the catalog fetch fails or the deployment is air-gapped, the gateway runs normally — only the catalog-supplied defaults (including catalog pricing) are missing. Pricing overrides,config.yaml metadata, provider discovery signals,
and the ID heuristic still apply.
MODEL_LIST_URL accepts a local file as well as an HTTP URL:
GOMODEL_OFFLINE=true, which drops HTTP catalog URLs. Set MODEL_LIST_URL=off
to turn the catalog off entirely and declare metadata in config.yaml; see the
production guide for
the full air-gap checklist.