Каталог моделей
Hermes получает подобранные списки моделей для OpenRouter и Nous Portal из JSON-манифеста, размещённого вместе с сайтом документации. Это позволяет мейнтейнерам обновлять списки выбора без выпуска нового релиза hermes-agent.
Когда манифест недоступен (офлайн, блокировка сети, сбой хостинга), Hermes бесшумно переключается на встроенный в репозиторий снимок, который поставляется с CLI. Манифест никогда не ломает средство выбора — в худшем случае вы увидите список, встроенный в вашу установленную версию.
URL активного манифеста
https://hermes-agent.nousresearch.com/docs/api/model-catalog.json
Публикуется при каждом слиянии в main через существующий пайплайн GitHub Pages deploy-site.yml. Источник истины находится в репозитории по пути website/static/api/model-catalog.json.
Схема
{
"version": 1,
"updated_at": "2026-04-25T22:00:00Z",
"metadata": {},
"providers": {
"openrouter": {
"metadata": {},
"models": [
{"id": "moonshotai/kimi-k2.6", "description": "recommended", "metadata": {}},
{"id": "openai/gpt-5.4", "description": ""}
]
},
"nous": {
"metadata": {},
"models": [
{"id": "anthropic/claude-opus-4.7"},
{"id": "moonshotai/kimi-k2.6"}
]
}
}
}
Описание полей:
-
version— целочисленная версия схемы. Будущие схемы увеличивают это значение; Hermes отклоняет манифесты с неизвестными версиями и переключается на встроенный снимок. -
metadata— свободный словарь на уровне манифеста, провайдера и модели. Любые ключи. Hermes игнорирует неизвестные поля, поэтому вы можете аннотировать записи ("tier": "paid","tags": [...]и т.д.) без согласования изменения схемы. -
description— только для OpenRouter. Определяет текст бейджа в списке выбора ("recommended","free"или пусто). Nous Portal не использует это поле — определение бесплатного уровня происходит динамически через pricing-эндпоинт портала. -
Цены и длина контекста отсутствуют в манифесте. Они поступают из живых API провайдеров (эндпоинты
/v1/models, models.dev) во время загрузки.
Поведение при загрузке
| Ситуация | Что происходит |
|---|---|
/model или hermes model |
Загружает, если дисковый кэш устарел, иначе использует кэш |
| Дисковый кэш свежий (< TTL) | Без сетевого запроса |
| Сетевая ошибка при наличии кэша | Бесшумное падение на кэш, одна строка в логе |
| Сетевая ошибка, кэша нет | Бесшумное падение на встроенный снимок |
| Манифест не прошёл валидацию схемы | Считается недоступным |
Расположение кэша: ~/.hermes/cache/model_catalog.json.
Конфигурация
model_catalog:
enabled: true
url: https://hermes-agent.nousresearch.com/docs/api/model-catalog.json
ttl_hours: 24
providers: {}
Установите enabled: false, чтобы полностью отключить удалённую загрузку и всегда использовать встроенный снимок.
Переопределение URL для провайдеров
Сторонние разработчики могут размещать собственные списки моделей, используя ту же схему. Укажите провайдеру пользовательский URL:
model_catalog:
providers:
openrouter:
url: https://example.com/my-openrouter-curation.json
Переопределяющий манифест должен заполнять только те блоки провайдеров, которые его интересуют. Остальные провайдеры продолжают разрешаться через основной URL.
Обновление манифеста
Для мейнтейнеров:
# 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.py
Затем отправьте PR с изменениями в website/static/api/model-catalog.json в ветку main. Сайт документации развернётся автоматически после слияния, и новый манифест станет доступен в течение нескольких минут.
Вы также можете редактировать JSON вручную для точечных изменений метаданных, которые не должны попадать во встроенный снимок — скрипт генерации является удобством, а не единственным источником истины.