From 306c9f76617e733d939c6ff823d6c6c848af6715 Mon Sep 17 00:00:00 2001 From: teknium1 <127238744+teknium1@users.noreply.github.com> Date: Fri, 24 Jul 2026 12:08:45 -0700 Subject: [PATCH] feat(models): add anthropic/claude-opus-5 to OpenRouter and Nous Portal catalogs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Anthropic released Claude Opus 5 (+ -fast variant) — both are live on OpenRouter and the Nous Portal /models endpoint (verified against both live APIs). Opus 4.8 entries are kept. - hermes_cli/models.py: opus-5 + opus-5-fast in OPENROUTER_MODELS; opus-5 in _PROVIDER_MODELS[nous] (Portal serves both, curated list carries the base model like the rest of the Nous Anthropic block). Ordering: below fable-5 flagship, above opus-4.8. - agent/model_metadata.py: claude-opus-5 -> 1M context (matches live OpenRouter metadata). - agent/reasoning_timeouts.py: claude-opus-5 -> 240s stale-timeout floor (same as the opus-4.x thinking family). - website/static/api/model-catalog.json: regenerated via scripts/build_model_catalog.py. Both providers bill via official_models_api (live pricing), so no _OFFICIAL_DOCS_PRICING snapshot entry is needed for these routes. --- agent/model_metadata.py | 1 + agent/reasoning_timeouts.py | 1 + hermes_cli/models.py | 3 +++ website/static/api/model-catalog.json | 13 ++++++++++++- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/agent/model_metadata.py b/agent/model_metadata.py index 288083628e..296fe0aedc 100644 --- a/agent/model_metadata.py +++ b/agent/model_metadata.py @@ -215,6 +215,7 @@ DEFAULT_CONTEXT_LENGTHS = { # OpenRouter-prefixed models resolve via OpenRouter live API or models.dev. "claude-fable-5": 1000000, "claude-fable": 1000000, + "claude-opus-5": 1000000, "claude-sonnet-5": 1000000, "claude-opus-4-8": 1000000, "claude-opus-4.8": 1000000, diff --git a/agent/reasoning_timeouts.py b/agent/reasoning_timeouts.py index 13df836b11..8af5ab799f 100644 --- a/agent/reasoning_timeouts.py +++ b/agent/reasoning_timeouts.py @@ -102,6 +102,7 @@ _REASONING_STALE_TIMEOUT_FLOORS: tuple[tuple[str, int], ...] = ( # ``claude-opus-4`` so non-thinking Claude 3.x or future # non-reasoning Claude variants don't match. ("claude-opus-4", 240), + ("claude-opus-5", 240), ("claude-sonnet-5", 180), ("claude-sonnet-4.5", 180), ("claude-sonnet-4.6", 180), diff --git a/hermes_cli/models.py b/hermes_cli/models.py index bea34c4448..3352058a51 100644 --- a/hermes_cli/models.py +++ b/hermes_cli/models.py @@ -41,6 +41,8 @@ def _urlopen_model_catalog_request(req: urllib.request.Request, *, timeout: floa OPENROUTER_MODELS: list[tuple[str, str]] = [ # Anthropic ("anthropic/claude-fable-5", ""), + ("anthropic/claude-opus-5", ""), + ("anthropic/claude-opus-5-fast", "2x price, higher output speed"), ("anthropic/claude-opus-4.8", ""), ("anthropic/claude-opus-4.8-fast", "2x price, higher output speed"), ("anthropic/claude-sonnet-5", ""), @@ -192,6 +194,7 @@ _PROVIDER_MODELS: dict[str, list[str]] = { "nous": [ # Anthropic "anthropic/claude-fable-5", + "anthropic/claude-opus-5", "anthropic/claude-opus-4.8", "anthropic/claude-sonnet-5", "anthropic/claude-haiku-4.5", diff --git a/website/static/api/model-catalog.json b/website/static/api/model-catalog.json index 4711abbd87..3fa346ca4b 100644 --- a/website/static/api/model-catalog.json +++ b/website/static/api/model-catalog.json @@ -1,6 +1,6 @@ { "version": 1, - "updated_at": "2026-07-20T08:23:45Z", + "updated_at": "2026-07-24T19:06:06Z", "metadata": { "source": "hermes-agent repo", "docs": "https://hermes-agent.nousresearch.com/docs/reference/model-catalog" @@ -16,6 +16,14 @@ "id": "anthropic/claude-fable-5", "description": "" }, + { + "id": "anthropic/claude-opus-5", + "description": "" + }, + { + "id": "anthropic/claude-opus-5-fast", + "description": "2x price, higher output speed" + }, { "id": "anthropic/claude-opus-4.8", "description": "" @@ -180,6 +188,9 @@ { "id": "anthropic/claude-fable-5" }, + { + "id": "anthropic/claude-opus-5" + }, { "id": "anthropic/claude-opus-4.8" },