From 50db2d9c12f2734b4ba8bbeb3c92a6e14e786a02 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Sat, 30 May 2026 20:57:01 -0700 Subject: [PATCH] feat(models): add deepseek-v4-flash, trim variants, group curated lists by maker (#35659) * feat(models): add deepseek-v4-flash to OpenRouter + Nous curated lists deepseek/deepseek-v4-flash was already in the native deepseek provider catalog but missing from the curated OpenRouter and Nous Portal picker lists. Added it to both and regenerated the model-catalog.json manifest (drift guard requires same-PR regeneration). * refactor(models): trim redundant variants, group curated lists by maker Remove claude-opus-4.7/4.6, gpt-5.4-nano, gpt-5.3-codex, gemini-3-pro-image-preview, gemini-3.1-flash-lite-preview, grok-4.20, and the older gemini-3-pro-preview (Nous). Reorder both OPENROUTER_MODELS and _PROVIDER_MODELS[nous] into contiguous per-maker blocks with comment headers. Regenerated model-catalog.json (openrouter 27, nous 20). * feat(models): add gemini-3-pro-preview to OpenRouter + Nous curated lists Adds google/gemini-3-pro-preview to both curated pickers (new on OpenRouter, restored on Nous). Regenerated model-catalog.json (openrouter 28, nous 21). * test(models): use claude-opus-4.8 in OpenRouter fetch fixtures The two TestFetchOpenRouterModels tests mocked a live OpenRouter response with claude-opus-4.6 and relied on it surviving the curated-list filter. Since 4.6 was removed from OPENROUTER_MODELS, those models got filtered out and the recommended tag shifted. Swap the fixture to claude-opus-4.8 (still curated, still first in the Anthropic block). --- hermes_cli/models.py | 84 ++++++++------ tests/hermes_cli/test_models.py | 8 +- website/static/api/model-catalog.json | 156 ++++++++++---------------- 3 files changed, 117 insertions(+), 131 deletions(-) diff --git a/hermes_cli/models.py b/hermes_cli/models.py index fba6ec94c..bacfafdba 100644 --- a/hermes_cli/models.py +++ b/hermes_cli/models.py @@ -32,34 +32,43 @@ COPILOT_REASONING_EFFORTS_O_SERIES = ["low", "medium", "high"] # Fallback OpenRouter snapshot used when the live catalog is unavailable. # (model_id, display description shown in menus) OPENROUTER_MODELS: list[tuple[str, str]] = [ + # Anthropic ("anthropic/claude-opus-4.8", ""), ("anthropic/claude-opus-4.8-fast", "2x price, higher output speed"), - ("anthropic/claude-opus-4.7", ""), - ("anthropic/claude-opus-4.6", ""), ("anthropic/claude-sonnet-4.6", ""), - ("moonshotai/kimi-k2.6", "recommended"), - ("openrouter/pareto-code", "auto-routes to cheapest coder meeting openrouter.min_coding_score"), - ("qwen/qwen3.7-max", ""), ("anthropic/claude-haiku-4.5", ""), + # OpenAI ("openai/gpt-5.5", ""), ("openai/gpt-5.5-pro", ""), ("openai/gpt-5.4-mini", ""), - ("openai/gpt-5.4-nano", ""), - ("openai/gpt-5.3-codex", ""), - ("xiaomi/mimo-v2.5-pro", ""), - ("tencent/hy3-preview", ""), - ("google/gemini-3-pro-image-preview", ""), - ("google/gemini-3.5-flash", ""), + # Google + ("google/gemini-3-pro-preview", ""), ("google/gemini-3.1-pro-preview", ""), - ("google/gemini-3.1-flash-lite-preview", ""), - ("qwen/qwen3.6-35b-a3b", ""), - ("stepfun/step-3.7-flash", ""), - ("minimax/minimax-m2.7", ""), - ("z-ai/glm-5.1", ""), - ("x-ai/grok-4.20", ""), + ("google/gemini-3.5-flash", ""), + # xAI ("x-ai/grok-4.3", ""), - ("nvidia/nemotron-3-super-120b-a12b", ""), + # DeepSeek ("deepseek/deepseek-v4-pro", ""), + ("deepseek/deepseek-v4-flash", ""), + # Qwen + ("qwen/qwen3.7-max", ""), + ("qwen/qwen3.6-35b-a3b", ""), + # MoonshotAI + ("moonshotai/kimi-k2.6", "recommended"), + # MiniMax + ("minimax/minimax-m2.7", ""), + # Z-AI + ("z-ai/glm-5.1", ""), + # Xiaomi + ("xiaomi/mimo-v2.5-pro", ""), + # Tencent + ("tencent/hy3-preview", ""), + # StepFun + ("stepfun/step-3.7-flash", ""), + # NVIDIA + ("nvidia/nemotron-3-super-120b-a12b", ""), + # OpenRouter routers + ("openrouter/pareto-code", "auto-routes to cheapest coder meeting openrouter.min_coding_score"), # Free tier ("openrouter/elephant-alpha", "free"), ("openrouter/owl-alpha", "free"), @@ -141,31 +150,40 @@ def _xai_curated_models() -> list[str]: _PROVIDER_MODELS: dict[str, list[str]] = { "nous": [ + # Anthropic "anthropic/claude-opus-4.8", - "anthropic/claude-opus-4.7", - "anthropic/claude-opus-4.6", "anthropic/claude-sonnet-4.6", - "moonshotai/kimi-k2.6", - "qwen/qwen3.7-max", "anthropic/claude-haiku-4.5", + # OpenAI "openai/gpt-5.5", "openai/gpt-5.5-pro", "openai/gpt-5.4-mini", - "openai/gpt-5.4-nano", - "openai/gpt-5.3-codex", - "xiaomi/mimo-v2.5-pro", - "tencent/hy3-preview", + # Google "google/gemini-3-pro-preview", - "google/gemini-3.5-flash", "google/gemini-3.1-pro-preview", - "google/gemini-3.1-flash-lite-preview", - "qwen/qwen3.6-35b-a3b", - "stepfun/step-3.7-flash", - "minimax/minimax-m2.7", - "z-ai/glm-5.1", + "google/gemini-3.5-flash", + # xAI "x-ai/grok-4.3", - "nvidia/nemotron-3-super-120b-a12b", + # DeepSeek "deepseek/deepseek-v4-pro", + "deepseek/deepseek-v4-flash", + # Qwen + "qwen/qwen3.7-max", + "qwen/qwen3.6-35b-a3b", + # MoonshotAI + "moonshotai/kimi-k2.6", + # MiniMax + "minimax/minimax-m2.7", + # Z-AI + "z-ai/glm-5.1", + # Xiaomi + "xiaomi/mimo-v2.5-pro", + # Tencent + "tencent/hy3-preview", + # StepFun + "stepfun/step-3.7-flash", + # NVIDIA + "nvidia/nemotron-3-super-120b-a12b", ], # Native OpenAI Chat Completions (api.openai.com). Used by /model counts and # provider_model_ids fallback when /v1/models is unavailable. diff --git a/tests/hermes_cli/test_models.py b/tests/hermes_cli/test_models.py index f965f361d..d6ae4b1dd 100644 --- a/tests/hermes_cli/test_models.py +++ b/tests/hermes_cli/test_models.py @@ -67,14 +67,14 @@ class TestFetchOpenRouterModels: return False def read(self): - return b'{"data":[{"id":"anthropic/claude-opus-4.6","pricing":{"prompt":"0.000015","completion":"0.000075"}},{"id":"qwen/qwen3.7-max","pricing":{"prompt":"0.000000325","completion":"0.00000195"}},{"id":"nvidia/nemotron-3-super-120b-a12b:free","pricing":{"prompt":"0","completion":"0"}}]}' + return b'{"data":[{"id":"anthropic/claude-opus-4.8","pricing":{"prompt":"0.000015","completion":"0.000075"}},{"id":"qwen/qwen3.7-max","pricing":{"prompt":"0.000000325","completion":"0.00000195"}},{"id":"nvidia/nemotron-3-super-120b-a12b:free","pricing":{"prompt":"0","completion":"0"}}]}' monkeypatch.setattr(_models_mod, "_openrouter_catalog_cache", None) with patch("hermes_cli.models.urllib.request.urlopen", return_value=_Resp()): models = fetch_openrouter_models(force_refresh=True) assert models == [ - ("anthropic/claude-opus-4.6", "recommended"), + ("anthropic/claude-opus-4.8", "recommended"), ("qwen/qwen3.7-max", ""), ("nvidia/nemotron-3-super-120b-a12b:free", "free"), ] @@ -154,7 +154,7 @@ class TestFetchOpenRouterModels: # No supported_parameters field at all on either entry. return ( b'{"data":[' - b'{"id":"anthropic/claude-opus-4.6","pricing":{"prompt":"0.000015","completion":"0.000075"}},' + b'{"id":"anthropic/claude-opus-4.8","pricing":{"prompt":"0.000015","completion":"0.000075"}},' b'{"id":"qwen/qwen3.7-max","pricing":{"prompt":"0.000000325","completion":"0.00000195"}}' b']}' ) @@ -164,7 +164,7 @@ class TestFetchOpenRouterModels: models = fetch_openrouter_models(force_refresh=True) ids = [mid for mid, _ in models] - assert "anthropic/claude-opus-4.6" in ids + assert "anthropic/claude-opus-4.8" in ids assert "qwen/qwen3.7-max" in ids diff --git a/website/static/api/model-catalog.json b/website/static/api/model-catalog.json index 13a147dfa..c2b7c241a 100644 --- a/website/static/api/model-catalog.json +++ b/website/static/api/model-catalog.json @@ -1,6 +1,6 @@ { "version": 1, - "updated_at": "2026-05-29T11:20:16Z", + "updated_at": "2026-05-31T03:27:32Z", "metadata": { "source": "hermes-agent repo", "docs": "https://hermes-agent.nousresearch.com/docs/reference/model-catalog" @@ -20,30 +20,10 @@ "id": "anthropic/claude-opus-4.8-fast", "description": "2x price, higher output speed" }, - { - "id": "anthropic/claude-opus-4.7", - "description": "" - }, - { - "id": "anthropic/claude-opus-4.6", - "description": "" - }, { "id": "anthropic/claude-sonnet-4.6", "description": "" }, - { - "id": "moonshotai/kimi-k2.6", - "description": "recommended" - }, - { - "id": "openrouter/pareto-code", - "description": "auto-routes to cheapest coder meeting openrouter.min_coding_score" - }, - { - "id": "qwen/qwen3.7-max", - "description": "" - }, { "id": "anthropic/claude-haiku-4.5", "description": "" @@ -61,11 +41,47 @@ "description": "" }, { - "id": "openai/gpt-5.4-nano", + "id": "google/gemini-3-pro-preview", "description": "" }, { - "id": "openai/gpt-5.3-codex", + "id": "google/gemini-3.1-pro-preview", + "description": "" + }, + { + "id": "google/gemini-3.5-flash", + "description": "" + }, + { + "id": "x-ai/grok-4.3", + "description": "" + }, + { + "id": "deepseek/deepseek-v4-pro", + "description": "" + }, + { + "id": "deepseek/deepseek-v4-flash", + "description": "" + }, + { + "id": "qwen/qwen3.7-max", + "description": "" + }, + { + "id": "qwen/qwen3.6-35b-a3b", + "description": "" + }, + { + "id": "moonshotai/kimi-k2.6", + "description": "recommended" + }, + { + "id": "minimax/minimax-m2.7", + "description": "" + }, + { + "id": "z-ai/glm-5.1", "description": "" }, { @@ -76,53 +92,17 @@ "id": "tencent/hy3-preview", "description": "" }, - { - "id": "google/gemini-3-pro-image-preview", - "description": "" - }, - { - "id": "google/gemini-3.5-flash", - "description": "" - }, - { - "id": "google/gemini-3.1-pro-preview", - "description": "" - }, - { - "id": "google/gemini-3.1-flash-lite-preview", - "description": "" - }, - { - "id": "qwen/qwen3.6-35b-a3b", - "description": "" - }, { "id": "stepfun/step-3.7-flash", "description": "" }, - { - "id": "minimax/minimax-m2.7", - "description": "" - }, - { - "id": "z-ai/glm-5.1", - "description": "" - }, - { - "id": "x-ai/grok-4.20", - "description": "" - }, - { - "id": "x-ai/grok-4.3", - "description": "" - }, { "id": "nvidia/nemotron-3-super-120b-a12b", "description": "" }, { - "id": "deepseek/deepseek-v4-pro", - "description": "" + "id": "openrouter/pareto-code", + "description": "auto-routes to cheapest coder meeting openrouter.min_coding_score" }, { "id": "openrouter/elephant-alpha", @@ -155,21 +135,9 @@ { "id": "anthropic/claude-opus-4.8" }, - { - "id": "anthropic/claude-opus-4.7" - }, - { - "id": "anthropic/claude-opus-4.6" - }, { "id": "anthropic/claude-sonnet-4.6" }, - { - "id": "moonshotai/kimi-k2.6" - }, - { - "id": "qwen/qwen3.7-max" - }, { "id": "anthropic/claude-haiku-4.5" }, @@ -182,35 +150,32 @@ { "id": "openai/gpt-5.4-mini" }, - { - "id": "openai/gpt-5.4-nano" - }, - { - "id": "openai/gpt-5.3-codex" - }, - { - "id": "xiaomi/mimo-v2.5-pro" - }, - { - "id": "tencent/hy3-preview" - }, { "id": "google/gemini-3-pro-preview" }, - { - "id": "google/gemini-3.5-flash" - }, { "id": "google/gemini-3.1-pro-preview" }, { - "id": "google/gemini-3.1-flash-lite-preview" + "id": "google/gemini-3.5-flash" + }, + { + "id": "x-ai/grok-4.3" + }, + { + "id": "deepseek/deepseek-v4-pro" + }, + { + "id": "deepseek/deepseek-v4-flash" + }, + { + "id": "qwen/qwen3.7-max" }, { "id": "qwen/qwen3.6-35b-a3b" }, { - "id": "stepfun/step-3.7-flash" + "id": "moonshotai/kimi-k2.6" }, { "id": "minimax/minimax-m2.7" @@ -219,13 +184,16 @@ "id": "z-ai/glm-5.1" }, { - "id": "x-ai/grok-4.3" + "id": "xiaomi/mimo-v2.5-pro" + }, + { + "id": "tencent/hy3-preview" + }, + { + "id": "stepfun/step-3.7-flash" }, { "id": "nvidia/nemotron-3-super-120b-a12b" - }, - { - "id": "deepseek/deepseek-v4-pro" } ] }