chore: update OpenRouter and provider model lists — PR #551
OpenRouter dropdown updated to 14 current models across 7 providers.
All slugs verified against live OpenRouter catalog.
Removed: o4-mini, claude-sonnet-4-5 (temporarily, re-added), gemini-2.5-pro,
gemini-2.0-flash, llama-4-scout, llama-4-maverick.
Added: gpt-5.4, claude-opus-4.6, claude-sonnet-4-5, gemini-3.1-pro-preview,
gemini-3-flash-preview, deepseek-r1, qwen3-coder, qwen3.6-plus,
grok-4.20, mistral-large-latest.
Fixed: gemini slug -preview suffix, grok-4-20 -> grok-4.20 (dot not dash),
stale Nous label, mistralai/qwen/x-ai added to PROVIDER_MODELS/DISPLAY.
This commit is contained in:
@@ -404,31 +404,29 @@ CLI_TOOLSETS = get_config().get("platform_toolsets", {}).get("cli", _DEFAULT_TOO
|
|||||||
# ── Model / provider discovery ───────────────────────────────────────────────
|
# ── Model / provider discovery ───────────────────────────────────────────────
|
||||||
|
|
||||||
# Hardcoded fallback models (used when no config.yaml or agent is available)
|
# Hardcoded fallback models (used when no config.yaml or agent is available)
|
||||||
|
# Also used as the OpenRouter model list — keep this curated to current, widely-used models.
|
||||||
_FALLBACK_MODELS = [
|
_FALLBACK_MODELS = [
|
||||||
|
# OpenAI
|
||||||
{"provider": "OpenAI", "id": "openai/gpt-5.4-mini", "label": "GPT-5.4 Mini"},
|
{"provider": "OpenAI", "id": "openai/gpt-5.4-mini", "label": "GPT-5.4 Mini"},
|
||||||
{"provider": "OpenAI", "id": "openai/o4-mini", "label": "o4-mini"},
|
{"provider": "OpenAI", "id": "openai/gpt-5.4", "label": "GPT-5.4"},
|
||||||
{
|
# Anthropic — 4.6 flagship + 4.5 generation
|
||||||
"provider": "Anthropic",
|
{"provider": "Anthropic", "id": "anthropic/claude-opus-4.6", "label": "Claude Opus 4.6"},
|
||||||
"id": "anthropic/claude-sonnet-4.6",
|
{"provider": "Anthropic", "id": "anthropic/claude-sonnet-4.6", "label": "Claude Sonnet 4.6"},
|
||||||
"label": "Claude Sonnet 4.6",
|
{"provider": "Anthropic", "id": "anthropic/claude-sonnet-4-5", "label": "Claude Sonnet 4.5"},
|
||||||
},
|
{"provider": "Anthropic", "id": "anthropic/claude-haiku-4-5", "label": "Claude Haiku 4.5"},
|
||||||
{
|
# Google
|
||||||
"provider": "Anthropic",
|
{"provider": "Google", "id": "google/gemini-3.1-pro-preview", "label": "Gemini 3.1 Pro Preview"},
|
||||||
"id": "anthropic/claude-sonnet-4-5",
|
{"provider": "Google", "id": "google/gemini-3-flash-preview", "label": "Gemini 3 Flash Preview"},
|
||||||
"label": "Claude Sonnet 4.5",
|
# DeepSeek
|
||||||
},
|
{"provider": "DeepSeek", "id": "deepseek/deepseek-chat-v3-0324", "label": "DeepSeek V3"},
|
||||||
{
|
{"provider": "DeepSeek", "id": "deepseek/deepseek-r1", "label": "DeepSeek R1"},
|
||||||
"provider": "Anthropic",
|
# Qwen (Alibaba) — strong coding and general models
|
||||||
"id": "anthropic/claude-haiku-4-5",
|
{"provider": "Qwen", "id": "qwen/qwen3-coder", "label": "Qwen3 Coder"},
|
||||||
"label": "Claude Haiku 4.5",
|
{"provider": "Qwen", "id": "qwen/qwen3.6-plus", "label": "Qwen3.6 Plus"},
|
||||||
},
|
# xAI
|
||||||
{"provider": "Other", "id": "google/gemini-2.5-pro", "label": "Gemini 2.5 Pro"},
|
{"provider": "xAI", "id": "x-ai/grok-4.20", "label": "Grok 4.20"},
|
||||||
{
|
# Mistral
|
||||||
"provider": "Other",
|
{"provider": "Mistral", "id": "mistralai/mistral-large-latest", "label": "Mistral Large"},
|
||||||
"id": "deepseek/deepseek-chat-v3-0324",
|
|
||||||
"label": "DeepSeek V3",
|
|
||||||
},
|
|
||||||
{"provider": "Other", "id": "meta-llama/llama-4-scout", "label": "Llama 4 Scout"},
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# Provider display names for known Hermes provider IDs
|
# Provider display names for known Hermes provider IDs
|
||||||
@@ -451,6 +449,9 @@ _PROVIDER_DISPLAY = {
|
|||||||
"opencode-zen": "OpenCode Zen",
|
"opencode-zen": "OpenCode Zen",
|
||||||
"opencode-go": "OpenCode Go",
|
"opencode-go": "OpenCode Go",
|
||||||
"lmstudio": "LM Studio",
|
"lmstudio": "LM Studio",
|
||||||
|
"mistralai": "Mistral",
|
||||||
|
"qwen": "Qwen",
|
||||||
|
"x-ai": "xAI",
|
||||||
}
|
}
|
||||||
|
|
||||||
# Well-known models per provider (used to populate dropdown for direct API providers)
|
# Well-known models per provider (used to populate dropdown for direct API providers)
|
||||||
@@ -463,7 +464,7 @@ _PROVIDER_MODELS = {
|
|||||||
],
|
],
|
||||||
"openai": [
|
"openai": [
|
||||||
{"id": "gpt-5.4-mini", "label": "GPT-5.4 Mini"},
|
{"id": "gpt-5.4-mini", "label": "GPT-5.4 Mini"},
|
||||||
{"id": "o4-mini", "label": "o4-mini"},
|
{"id": "gpt-5.4", "label": "GPT-5.4"},
|
||||||
],
|
],
|
||||||
"openai-codex": [
|
"openai-codex": [
|
||||||
{"id": "gpt-5.4", "label": "GPT-5.4"},
|
{"id": "gpt-5.4", "label": "GPT-5.4"},
|
||||||
@@ -475,7 +476,8 @@ _PROVIDER_MODELS = {
|
|||||||
{"id": "codex-mini-latest", "label": "Codex Mini (latest)"},
|
{"id": "codex-mini-latest", "label": "Codex Mini (latest)"},
|
||||||
],
|
],
|
||||||
"google": [
|
"google": [
|
||||||
{"id": "gemini-2.5-pro", "label": "Gemini 2.5 Pro"},
|
{"id": "gemini-3.1-pro-preview", "label": "Gemini 3.1 Pro Preview"},
|
||||||
|
{"id": "gemini-3-flash-preview", "label": "Gemini 3 Flash Preview"},
|
||||||
],
|
],
|
||||||
"deepseek": [
|
"deepseek": [
|
||||||
{"id": "deepseek-chat-v3-0324", "label": "DeepSeek V3"},
|
{"id": "deepseek-chat-v3-0324", "label": "DeepSeek V3"},
|
||||||
@@ -485,7 +487,7 @@ _PROVIDER_MODELS = {
|
|||||||
{"id": "claude-opus-4.6", "label": "Claude Opus 4.6 (via Nous)"},
|
{"id": "claude-opus-4.6", "label": "Claude Opus 4.6 (via Nous)"},
|
||||||
{"id": "claude-sonnet-4.6", "label": "Claude Sonnet 4.6 (via Nous)"},
|
{"id": "claude-sonnet-4.6", "label": "Claude Sonnet 4.6 (via Nous)"},
|
||||||
{"id": "gpt-5.4-mini", "label": "GPT-5.4 Mini (via Nous)"},
|
{"id": "gpt-5.4-mini", "label": "GPT-5.4 Mini (via Nous)"},
|
||||||
{"id": "gemini-2.5-pro", "label": "Gemini 2.5 Pro (via Nous)"},
|
{"id": "gemini-3.1-pro-preview", "label": "Gemini 3.1 Pro Preview (via Nous)"},
|
||||||
],
|
],
|
||||||
"zai": [
|
"zai": [
|
||||||
{"id": "glm-5.1", "label": "GLM-5.1"},
|
{"id": "glm-5.1", "label": "GLM-5.1"},
|
||||||
@@ -515,7 +517,7 @@ _PROVIDER_MODELS = {
|
|||||||
{"id": "gpt-4o", "label": "GPT-4o"},
|
{"id": "gpt-4o", "label": "GPT-4o"},
|
||||||
{"id": "claude-opus-4.6", "label": "Claude Opus 4.6"},
|
{"id": "claude-opus-4.6", "label": "Claude Opus 4.6"},
|
||||||
{"id": "claude-sonnet-4.6", "label": "Claude Sonnet 4.6"},
|
{"id": "claude-sonnet-4.6", "label": "Claude Sonnet 4.6"},
|
||||||
{"id": "gemini-2.5-pro", "label": "Gemini 2.5 Pro"},
|
{"id": "gemini-3.1-pro-preview", "label": "Gemini 3.1 Pro Preview"},
|
||||||
],
|
],
|
||||||
# OpenCode Zen — curated models via opencode.ai/zen (pay-as-you-go credits)
|
# OpenCode Zen — curated models via opencode.ai/zen (pay-as-you-go credits)
|
||||||
"opencode-zen": [
|
"opencode-zen": [
|
||||||
@@ -542,8 +544,8 @@ _PROVIDER_MODELS = {
|
|||||||
{"id": "claude-sonnet-4", "label": "Claude Sonnet 4"},
|
{"id": "claude-sonnet-4", "label": "Claude Sonnet 4"},
|
||||||
{"id": "claude-haiku-4-5", "label": "Claude Haiku 4.5"},
|
{"id": "claude-haiku-4-5", "label": "Claude Haiku 4.5"},
|
||||||
{"id": "claude-3-5-haiku", "label": "Claude 3.5 Haiku"},
|
{"id": "claude-3-5-haiku", "label": "Claude 3.5 Haiku"},
|
||||||
{"id": "gemini-3.1-pro", "label": "Gemini 3.1 Pro"},
|
{"id": "gemini-3.1-pro-preview", "label": "Gemini 3.1 Pro Preview"},
|
||||||
{"id": "gemini-3-flash", "label": "Gemini 3 Flash"},
|
{"id": "gemini-3-flash-preview", "label": "Gemini 3 Flash Preview"},
|
||||||
{"id": "glm-5.1", "label": "GLM-5.1"},
|
{"id": "glm-5.1", "label": "GLM-5.1"},
|
||||||
{"id": "glm-5", "label": "GLM-5"},
|
{"id": "glm-5", "label": "GLM-5"},
|
||||||
{"id": "kimi-k2.5", "label": "Kimi K2.5"},
|
{"id": "kimi-k2.5", "label": "Kimi K2.5"},
|
||||||
@@ -564,8 +566,22 @@ _PROVIDER_MODELS = {
|
|||||||
],
|
],
|
||||||
# 'gemini' is the hermes_cli provider ID for Google AI Studio
|
# 'gemini' is the hermes_cli provider ID for Google AI Studio
|
||||||
"gemini": [
|
"gemini": [
|
||||||
{"id": "gemini-2.5-pro", "label": "Gemini 2.5 Pro"},
|
{"id": "gemini-3.1-pro-preview", "label": "Gemini 3.1 Pro Preview"},
|
||||||
{"id": "gemini-2.0-flash", "label": "Gemini 2.0 Flash"},
|
{"id": "gemini-3-flash-preview", "label": "Gemini 3 Flash Preview"},
|
||||||
|
],
|
||||||
|
# Mistral — prefix used in OpenRouter model IDs (mistralai/mistral-large-latest)
|
||||||
|
"mistralai": [
|
||||||
|
{"id": "mistral-large-latest", "label": "Mistral Large"},
|
||||||
|
{"id": "mistral-small-latest", "label": "Mistral Small"},
|
||||||
|
],
|
||||||
|
# Qwen (Alibaba) — prefix used in OpenRouter model IDs (qwen/qwen3-coder)
|
||||||
|
"qwen": [
|
||||||
|
{"id": "qwen3-coder", "label": "Qwen3 Coder"},
|
||||||
|
{"id": "qwen3.6-plus", "label": "Qwen3.6 Plus"},
|
||||||
|
],
|
||||||
|
# xAI — prefix used in OpenRouter model IDs (x-ai/grok-4-20)
|
||||||
|
"x-ai": [
|
||||||
|
{"id": "grok-4.20", "label": "Grok 4.20"},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -127,10 +127,12 @@ class TestStaleModelListCleanup:
|
|||||||
"_FALLBACK_MODELS must keep gpt-5.4-mini as primary OpenAI model (#374)"
|
"_FALLBACK_MODELS must keep gpt-5.4-mini as primary OpenAI model (#374)"
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_fallback_still_has_o4_mini(self):
|
def test_fallback_has_gpt54(self):
|
||||||
"""_FALLBACK_MODELS must still contain o4-mini (reasoning model)."""
|
"""_FALLBACK_MODELS must contain gpt-5.4-mini as the primary OpenAI option."""
|
||||||
assert "o4-mini" in CONFIG_PY, (
|
from api.config import _FALLBACK_MODELS
|
||||||
"_FALLBACK_MODELS must keep o4-mini as reasoning model (#374)"
|
ids = [m["id"] for m in _FALLBACK_MODELS]
|
||||||
|
assert any("gpt-5.4-mini" in mid for mid in ids), (
|
||||||
|
"_FALLBACK_MODELS must include gpt-5.4-mini as the primary OpenAI option"
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_copilot_list_unchanged(self):
|
def test_copilot_list_unchanged(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user