Every model in the catalog carries metadata — pricing, context window, max output
tokens, capabilities, and modes (which decide whether it shows up as a chat,
embeddings, image, or audio model). GoModel assembles it from five sources,
strongest first:
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.yaml metadata — providers.<name>.models entries can attach
metadata (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: declaring modes: [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/show capabilities, family and context length; vLLM, SGLang and
llm-d’s max_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-list registry,
fetched from MODEL_LIST_URL (default: the registry’s models.min.json on
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
embed or
matching well-known embedding families (bge, e5, gte, minilm) become
embedding models, IDs containing rerank become 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 by
GET /admin/models/metadata.
- Pricing drives cost tracking, budgets, and
cost load-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/embeddings reaches any model
the provider serves.
- Context window and capabilities are advertised on
GET /v1/models (and
on GET /v1/models/{model} for a single model) for clients that pick models
dynamically.
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:
A file is read on startup and on every cache refresh, and re-parsed only when
its content changes, so you can update pricing by replacing the file. Because
a file involves no network request, it keeps working under
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. Last modified on September 22, 2026