Model Catalog
كتالوج النماذج
What this page is, and what it holds.
This page covers Model Catalog. You will use hermes model here; about 4 minutes to read. The priciest model is not always best for your task. Compare on one task and set a spend cap.
Remotely-hosted manifest driving curated model picker lists for OpenRouter and Nous Portal.
Outcomes taken from this page, not a template.
- Understand what المزوّد والنموذج is and when you need it.
- Run
hermes modeland understand what happens next. - Read the table and take only the row that applies to you.
- Set
PREFERRED_SILENT_DEFAULT_MODELin the right place.
Exactly as they appear in Hermes.
hermes model
PREFERRED_SILENT_DEFAULT_MODELOPENROUTER_MODELS
Jump to the part you need.
Nothing summarised away.
The documentation body below is reproduced from the official source so commands and identifiers stay exact. Each section carries a short note describing what it contains.
Hermes fetches curated model lists for OpenRouter and Nous Portal from a JSON manifest hosted alongside the docs site. This lets maintainers update picker lists without shipping a new hermes-agent release.
When the manifest is unreachable (offline, network blocked, hosting failure), Hermes silently falls back to the in-repo snapshot that ships with the CLI. The manifest never breaks the picker — worst case you see whatever list was bundled with your installed version.
Live manifest URL
Explains the idea itself. Read it slowly; the later sections build on it.
https://hermes-agent.nousresearch.com/docs/api/model-catalog.jsonPublished on every merge to main via the existing deploy-site.yml GitHub Pages pipeline. The source of truth lives in the repo at website/static/api/model-catalog.json.
Schema
Settings you configure once. Change one at a time so you can see what each does. Set PREFERRED_SILENT_DEFAULT_MODEL in your environment, not in the chat.
{
"version": 1,
"updated_at": "2026-04-25T22:00:00Z",
"metadata": {},
"providers": {
"openrouter": {
"metadata": {},
"models": [
{"id": "z-ai/glm-5.2", "description": "default", "default": true},
{"id": "moonshotai/kimi-k3", "description": "recommended", "metadata": {}},
{"id": "openai/gpt-5.4", "description": ""}
]
},
"nous": {
"metadata": {},
"models": [
{"id": "z-ai/glm-5.2", "default": true},
{"id": "anthropic/claude-opus-4.7"},
{"id": "moonshotai/kimi-k3"}
]
}
}
}Field notes:
version— integer schema version. Future schemas bump this; Hermes refuses manifests with versions it doesn't understand and falls back to the hardcoded snapshot.metadata— free-form dict at the manifest, provider, and model level. Any keys. Hermes ignores unknown fields, so you can annotate entries ("tier": "paid","tags": [...], etc.) without coordinating a schema change.description— OpenRouter-only. Drives picker badge text ("recommended","free","default", or empty). Nous Portal doesn't use this — free-tier gating is determined live from the Portal's pricing endpoint.default— exactly one entry per provider may carry"default": true. That model is the silent default: what Hermes lands on when the user never selected a model (GUI onboarding confirm card,providerconfigured with nomodel, emptymodel.default). Read cache-only at runtime (get_default_model_from_cache) so hot resolution paths never hit the network; when no cached manifest exists, Hermes falls back to the in-repoPREFERRED_SILENT_DEFAULT_MODELconstant, which must match the labeled entry. This lets maintainers rotate the silent default without shipping a release. It is deliberately a capable low-cost model, never the priciest flagship.- Pricing and context length are NOT in the manifest. Those come from live provider APIs (
/v1/modelsendpoints, models.dev) at fetch time.
Fetch behavior
A lookup table. Do not read it all; find the row that applies to you.
| When | What happens |
|---|---|
/model or hermes model | Fetches if disk cache is stale, else uses cache |
| Disk cache fresh (< TTL) | No network hit |
| Network failure with cache | Silent fallback to cache, one log line |
| Network failure, no cache | Silent fallback to in-repo snapshot |
| Manifest fails schema validation | Treated as unreachable |
Cache location: ~/.hermes/cache/model_catalog.json.
Config
Settings you configure once. Change one at a time so you can see what each does. Commands here: hermes model.
model_catalog:
enabled: true
url: https://hermes-agent.nousresearch.com/docs/api/model-catalog.json
ttl_hours: 1
providers: {}Set enabled: false to disable remote fetch entirely and always use the in-repo snapshot.
Per-provider override URLs
Third parties can self-host their own curation list using the same schema. Point a provider at a custom URL:
model_catalog:
providers:
openrouter:
url: https://example.com/my-openrouter-curation.jsonThe overriding manifest only needs to populate the provider block(s) it cares about. Other providers continue to resolve against the master URL.
Hiding providers from the picker
excluded_providers lets you hide specific providers from the /model picker even when valid credentials exist. Useful when credentials are present for legacy or testing providers that shouldn't appear in normal use (e.g. an old Copilot or OpenRouter token still cached in auth.json or discovered via the gh CLI).
model_catalog:
excluded_providers:
- copilot
- openrouter
- openaiThe exclusion is matched case-insensitively against every key a provider can surface under — the Hermes id and models.dev id (built-in mapped providers), the overlay pid and resolved Hermes slug (overlay providers), and the canonical slug (canonical providers) — so a single entry like copilot hides the provider regardless of which section emits it. It is honored by every /model picker surface: the gateway interactive/text pickers, the TUI picker, and the interactive hermes model CLI picker. An empty list (or omitting the key) has no effect.
Updating the manifest
Settings you configure once. Change one at a time so you can see what each does. Set OPENROUTER_MODELS in your environment, not in the chat.
Maintainers:
# Re-generate from the in-repo hardcoded lists (keeps manifest in sync after
# editing OPENROUTER_MODELS or _PROVIDER_MODELS["nous"] in hermes_cli/models.py).
python scripts/build_model_catalog.pyThen PR the resulting change to website/static/api/model-catalog.json to main. The docs site auto-deploys on merge and the new manifest is live within a few minutes.
You can also hand-edit the JSON directly for fine-grained metadata changes that don't belong in the in-repo snapshot — the generator script is a convenience, not the single source of truth.
4 questions answered by this page alone.
Every option is a real identifier from the Hermes documentation. The wrong ones are real too, just from other pages.