From 586fc03d19e575f9fe56dac16f5ad3959b1c3345 Mon Sep 17 00:00:00 2001 From: Ntty Date: Fri, 31 Jul 2026 23:57:27 +0100 Subject: [PATCH] feat(providers): refresh built-in model catalogs for v1.0.33 Add GPT-5.6 Sol/Terra/Luna, Claude Fable/Opus/Sonnet 5, Gemini 3.6 Flash and 3.5 Flash-Lite, Grok 4.5, Kimi K3/K2.7 Code, GLM-5.2, and a Baseten catalog cleanup. Keep Aliyun Coding Plan allowlist IDs and add Qwen3.7/3.6 Plus. --- CHANGELOG.md | 14 ++++ src/adclaw/__version__.py | 2 +- src/adclaw/providers/registry.py | 80 +++++++++++++++++------ tests/test_provider_registry.py | 108 +++++++++++++++++++++++++++++++ 4 files changed, 184 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5c18a0..d557e2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,20 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). --- +## [1.0.33] - 2026-07-31 + +### Changed +- **Provider model catalog refresh**: built-in presets now include current frontier models across major providers. + - OpenAI / Azure OpenAI: GPT-5.6 Sol, Terra, Luna + - OpenRouter: GPT-5.6 family, Claude Fable/Opus/Sonnet 5, Gemini 3.6 Flash + 3.5 Flash-Lite, Grok 4.5, Kimi K3 / K2.7 Code, GLM 5.2 + - Anthropic: Claude Fable 5, Opus 5, Sonnet 5 + - xAI: Grok 4.5 + - Gemini: 3.6 Flash, 3.5 Flash-Lite + - Moonshot: Kimi K3, K2.7 Code (+ highspeed) + - Z.AI: GLM-5.2 + - Baseten: Kimi K3 / K2.7 Code, GLM-5.2 (+ Fast), DeepSeek V4 Pro, Nemotron 3 Ultra; removed deprecated DeepSeek V3.1 and MiniMax M2.5 + - Alibaba Coding Plan / DashScope: Qwen3.7 Plus and Qwen3.6 Plus (Coding Plan still uses exact allowlist including kimi-k2.5 and MiniMax-M2.5) + ## [1.0.9] - 2026-05-21 ### Fixed diff --git a/src/adclaw/__version__.py b/src/adclaw/__version__.py index 5733b60..0d1e55c 100644 --- a/src/adclaw/__version__.py +++ b/src/adclaw/__version__.py @@ -1,2 +1,2 @@ # -*- coding: utf-8 -*- -__version__ = "1.0.32" +__version__ = "1.0.33" diff --git a/src/adclaw/providers/registry.py b/src/adclaw/providers/registry.py index f61381a..9c9fb0a 100644 --- a/src/adclaw/providers/registry.py +++ b/src/adclaw/providers/registry.py @@ -90,6 +90,7 @@ ] DASHSCOPE_MODELS: List[ModelInfo] = [ + ModelInfo(id="qwen3.7-plus", name="Qwen3.7 Plus"), ModelInfo(id="qwen3.6-plus", name="Qwen3.6 Plus"), ModelInfo(id="qwen3-coder-next", name="Qwen3 Coder Next"), ModelInfo(id="qwen3.5-plus", name="Qwen3.5 Plus"), @@ -99,7 +100,11 @@ ModelInfo(id="qwen3-coder-plus", name="Qwen3 Coder Plus"), ] +# Coding Plan allowlist is exact-string (Alibaba docs, Jul 2026). +# Recommended: qwen3.7-plus, qwen3.6-plus, kimi-k2.5, glm-5, MiniMax-M2.5. ALIYUN_CODINGPLAN_MODELS: List[ModelInfo] = [ + ModelInfo(id="qwen3.7-plus", name="Qwen3.7 Plus"), + ModelInfo(id="qwen3.6-plus", name="Qwen3.6 Plus"), ModelInfo(id="qwen3.5-plus", name="Qwen3.5 Plus"), ModelInfo(id="glm-5", name="GLM-5"), ModelInfo(id="glm-4.7", name="GLM-4.7"), @@ -111,6 +116,9 @@ ] OPENAI_MODELS: List[ModelInfo] = [ + ModelInfo(id="gpt-5.6-sol", name="GPT-5.6 Sol"), + ModelInfo(id="gpt-5.6-terra", name="GPT-5.6 Terra"), + ModelInfo(id="gpt-5.6-luna", name="GPT-5.6 Luna"), ModelInfo(id="gpt-5.5", name="GPT-5.5"), ModelInfo(id="gpt-5.4", name="GPT-5.4"), ModelInfo(id="gpt-5.4-mini", name="GPT-5.4 Mini"), @@ -122,7 +130,13 @@ ModelInfo(id="gpt-4o-mini", name="GPT-4o Mini"), ] +# Azure deployment names are user-defined; presets match Foundry model catalog IDs. AZURE_OPENAI_MODELS: List[ModelInfo] = [ + ModelInfo(id="gpt-5.6-sol", name="GPT-5.6 Sol"), + ModelInfo(id="gpt-5.6-terra", name="GPT-5.6 Terra"), + ModelInfo(id="gpt-5.6-luna", name="GPT-5.6 Luna"), + ModelInfo(id="gpt-5.5", name="GPT-5.5"), + ModelInfo(id="gpt-5.4", name="GPT-5.4"), ModelInfo(id="gpt-5-chat", name="GPT-5 Chat"), ModelInfo(id="gpt-5-mini", name="GPT-5 Mini"), ModelInfo(id="gpt-5-nano", name="GPT-5 Nano"), @@ -133,7 +147,9 @@ ModelInfo(id="gpt-4o-mini", name="GPT-4o Mini"), ] +# International Coding endpoint — same plan allowlist as China Coding Plan. ALIYUN_INTL_MODELS: List[ModelInfo] = [ + ModelInfo(id="qwen3.7-plus", name="Qwen3.7 Plus"), ModelInfo(id="qwen3.6-plus", name="Qwen3.6 Plus"), ModelInfo(id="qwen3-coder-next", name="Qwen3 Coder Next"), ModelInfo(id="qwen3.5-plus", name="Qwen3.5 Plus"), @@ -148,17 +164,9 @@ OPENROUTER_MODELS: List[ModelInfo] = [ ModelInfo(id="openrouter/auto", name="Auto (OpenRouter picks)"), - ModelInfo(id="google/gemini-3.5-flash", name="Gemini 3.5 Flash"), - ModelInfo(id="google/gemini-3.1-pro-preview", name="Gemini 3.1 Pro Preview"), - ModelInfo(id="minimax/minimax-m2.5", name="MiniMax M2.5"), - ModelInfo(id="moonshotai/kimi-k2.6", name="Kimi K2.6"), - ModelInfo(id="anthropic/claude-opus-4.8", name="Claude Opus 4.8"), - ModelInfo(id="anthropic/claude-opus-4.7", name="Claude Opus 4.7"), - ModelInfo(id="anthropic/claude-sonnet-4.6", name="Claude Sonnet 4.6"), - ModelInfo(id="anthropic/claude-haiku-4.5", name="Claude Haiku 4.5"), - ModelInfo(id="deepseek/deepseek-v4-pro", name="DeepSeek V4 Pro"), - ModelInfo(id="deepseek/deepseek-v4-flash", name="DeepSeek V4 Flash"), - ModelInfo(id="qwen/qwen3-32b", name="Qwen3 32B"), + ModelInfo(id="openai/gpt-5.6-sol", name="GPT-5.6 Sol"), + ModelInfo(id="openai/gpt-5.6-terra", name="GPT-5.6 Terra"), + ModelInfo(id="openai/gpt-5.6-luna", name="GPT-5.6 Luna"), ModelInfo(id="openai/gpt-5.5", name="GPT-5.5"), ModelInfo(id="openai/gpt-5.5-pro", name="GPT-5.5 Pro"), ModelInfo(id="openai/gpt-5.4", name="GPT-5.4"), @@ -167,9 +175,32 @@ ModelInfo(id="openai/gpt-5.3-codex", name="GPT-5.3 Codex"), ModelInfo(id="openai/gpt-4o-mini", name="GPT-4o Mini"), ModelInfo(id="openai/gpt-oss-120b", name="GPT-OSS 120B"), + ModelInfo(id="anthropic/claude-fable-5", name="Claude Fable 5"), + ModelInfo(id="anthropic/claude-opus-5", name="Claude Opus 5"), + ModelInfo(id="anthropic/claude-sonnet-5", name="Claude Sonnet 5"), + ModelInfo(id="anthropic/claude-opus-4.8", name="Claude Opus 4.8"), + ModelInfo(id="anthropic/claude-opus-4.7", name="Claude Opus 4.7"), + ModelInfo(id="anthropic/claude-sonnet-4.6", name="Claude Sonnet 4.6"), + ModelInfo(id="anthropic/claude-haiku-4.5", name="Claude Haiku 4.5"), + ModelInfo(id="google/gemini-3.6-flash", name="Gemini 3.6 Flash"), + ModelInfo(id="google/gemini-3.5-flash", name="Gemini 3.5 Flash"), + ModelInfo(id="google/gemini-3.5-flash-lite", name="Gemini 3.5 Flash-Lite"), + ModelInfo(id="google/gemini-3.1-pro-preview", name="Gemini 3.1 Pro Preview"), + ModelInfo(id="x-ai/grok-4.5", name="Grok 4.5"), + ModelInfo(id="moonshotai/kimi-k3", name="Kimi K3"), + ModelInfo(id="moonshotai/kimi-k2.7-code", name="Kimi K2.7 Code"), + ModelInfo(id="moonshotai/kimi-k2.6", name="Kimi K2.6"), + ModelInfo(id="z-ai/glm-5.2", name="GLM 5.2"), + ModelInfo(id="minimax/minimax-m2.5", name="MiniMax M2.5"), + ModelInfo(id="deepseek/deepseek-v4-pro", name="DeepSeek V4 Pro"), + ModelInfo(id="deepseek/deepseek-v4-flash", name="DeepSeek V4 Flash"), + ModelInfo(id="qwen/qwen3-32b", name="Qwen3 32B"), ] ANTHROPIC_MODELS: List[ModelInfo] = [ + ModelInfo(id="claude-fable-5", name="Claude Fable 5"), + ModelInfo(id="claude-opus-5", name="Claude Opus 5"), + ModelInfo(id="claude-sonnet-5", name="Claude Sonnet 5"), ModelInfo(id="claude-opus-4-8", name="Claude Opus 4.8"), ModelInfo(id="claude-opus-4-7", name="Claude Opus 4.7"), ModelInfo(id="claude-sonnet-4-6", name="Claude Sonnet 4.6"), @@ -180,13 +211,16 @@ ] XAI_MODELS: List[ModelInfo] = [ + ModelInfo(id="grok-4.5", name="Grok 4.5"), ModelInfo(id="grok-4.3", name="Grok 4.3"), ModelInfo(id="grok-4.20-reasoning", name="Grok 4.20 Reasoning"), ModelInfo(id="grok-4.20-non-reasoning", name="Grok 4.20 Non-Reasoning"), ] GEMINI_MODELS: List[ModelInfo] = [ + ModelInfo(id="gemini-3.6-flash", name="Gemini 3.6 Flash"), ModelInfo(id="gemini-3.5-flash", name="Gemini 3.5 Flash"), + ModelInfo(id="gemini-3.5-flash-lite", name="Gemini 3.5 Flash-Lite"), ModelInfo(id="gemini-3.1-pro-preview", name="Gemini 3.1 Pro Preview"), ModelInfo( id="gemini-3.1-pro-preview-customtools", @@ -231,16 +265,20 @@ ModelInfo(id="mistral-small-latest", name="Mistral Small"), ] +# Model API IDs from https://www.baseten.co/products/model-apis/ (Jul 2026). +# DeepSeek v3.1 and MiniMax M2.5 were deprecated 2026-06-24. BASETEN_MODELS: List[ModelInfo] = [ + ModelInfo(id="moonshotai/Kimi-K3", name="Kimi K3"), + ModelInfo(id="moonshotai/Kimi-K2.7-Code", name="Kimi K2.7 Code"), + ModelInfo(id="zai-org/GLM-5.2", name="GLM 5.2"), + ModelInfo(id="zai-org/GLM-5.2-Fast", name="GLM 5.2 Fast"), ModelInfo(id="zai-org/GLM-5", name="GLM 5"), - ModelInfo(id="zai-org/GLM-4.7", name="GLM 4.7"), - ModelInfo(id="zai-org/GLM-4.6", name="GLM 4.6"), - ModelInfo(id="deepseek-ai/DeepSeek-V3.1", name="DeepSeek V3.1"), - ModelInfo(id="deepseek-ai/DeepSeek-V3-0324", name="DeepSeek V3 0324"), - ModelInfo(id="openai/gpt-oss-120b", name="OpenAI GPT 120B"), - ModelInfo(id="nvidia/Nemotron-120B-A12B", name="Nemotron Super"), - ModelInfo(id="moonshotai/Kimi-K2.5", name="Kimi K2.5"), - ModelInfo(id="MiniMaxAI/MiniMax-M2.5", name="MiniMax M2.5"), + ModelInfo(id="deepseek-v4-pro", name="DeepSeek V4 Pro"), + ModelInfo(id="openai/gpt-oss-120b", name="OpenAI GPT OSS 120B"), + ModelInfo( + id="nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", + name="Nemotron 3 Ultra", + ), ] MINIMAX_MODELS: List[ModelInfo] = [ @@ -255,6 +293,9 @@ ] MOONSHOT_MODELS: List[ModelInfo] = [ + ModelInfo(id="kimi-k3", name="Kimi K3"), + ModelInfo(id="kimi-k2.7-code", name="Kimi K2.7 Code"), + ModelInfo(id="kimi-k2.7-code-highspeed", name="Kimi K2.7 Code Highspeed"), ModelInfo(id="kimi-k2.6", name="Kimi K2.6"), ] @@ -440,6 +481,7 @@ ) ZAI_MODELS: List[ModelInfo] = [ + ModelInfo(id="glm-5.2", name="GLM-5.2"), ModelInfo(id="glm-5.1", name="GLM-5.1"), ModelInfo(id="glm-5v-turbo", name="GLM-5V Turbo"), ModelInfo(id="glm-5", name="GLM-5"), diff --git a/tests/test_provider_registry.py b/tests/test_provider_registry.py index d79475e..dafeb08 100644 --- a/tests/test_provider_registry.py +++ b/tests/test_provider_registry.py @@ -25,7 +25,115 @@ def test_xai_provider_uses_current_text_chat_models(): assert provider is not None assert [model.id for model in provider.models] == [ + "grok-4.5", "grok-4.3", "grok-4.20-reasoning", "grok-4.20-non-reasoning", ] + + +def test_openai_provider_includes_gpt_5_6_family(): + provider = get_provider("openai") + + assert provider is not None + model_ids = [model.id for model in provider.models] + assert model_ids[:3] == [ + "gpt-5.6-sol", + "gpt-5.6-terra", + "gpt-5.6-luna", + ] + + +def test_openrouter_provider_includes_gpt_5_6_family(): + provider = get_provider("openrouter") + + assert provider is not None + model_ids = [model.id for model in provider.models] + assert "openai/gpt-5.6-sol" in model_ids + assert "openai/gpt-5.6-terra" in model_ids + assert "openai/gpt-5.6-luna" in model_ids + assert "anthropic/claude-fable-5" in model_ids + assert "google/gemini-3.6-flash" in model_ids + assert "moonshotai/kimi-k3" in model_ids + assert "z-ai/glm-5.2" in model_ids + assert "x-ai/grok-4.5" in model_ids + + +def test_anthropic_provider_includes_claude_5_family(): + provider = get_provider("anthropic") + + assert provider is not None + model_ids = [model.id for model in provider.models] + assert model_ids[:3] == [ + "claude-fable-5", + "claude-opus-5", + "claude-sonnet-5", + ] + + +def test_gemini_provider_includes_3_6_flash_and_3_5_flash_lite(): + provider = get_provider("gemini") + + assert provider is not None + model_ids = [model.id for model in provider.models] + assert model_ids[:3] == [ + "gemini-3.6-flash", + "gemini-3.5-flash", + "gemini-3.5-flash-lite", + ] + + +def test_moonshot_provider_includes_kimi_k3_and_k2_7_code(): + provider = get_provider("moonshot") + + assert provider is not None + assert [model.id for model in provider.models] == [ + "kimi-k3", + "kimi-k2.7-code", + "kimi-k2.7-code-highspeed", + "kimi-k2.6", + ] + + +def test_zai_provider_includes_glm_5_2(): + provider = get_provider("zai") + + assert provider is not None + assert provider.models[0].id == "glm-5.2" + + +def test_baseten_provider_drops_deprecated_and_adds_current(): + provider = get_provider("baseten") + + assert provider is not None + model_ids = [model.id for model in provider.models] + assert "moonshotai/Kimi-K3" in model_ids + assert "zai-org/GLM-5.2" in model_ids + assert "deepseek-v4-pro" in model_ids + assert "deepseek-ai/DeepSeek-V3.1" not in model_ids + assert "MiniMaxAI/MiniMax-M2.5" not in model_ids + + +def test_azure_openai_includes_gpt_5_6_family(): + provider = get_provider("azure-openai") + + assert provider is not None + model_ids = [model.id for model in provider.models] + assert model_ids[:3] == [ + "gpt-5.6-sol", + "gpt-5.6-terra", + "gpt-5.6-luna", + ] + + +def test_aliyun_coding_plan_keeps_allowlist_and_adds_qwen37(): + """Coding Plan is an exact-string allowlist; k2.5/M2.5 still official.""" + provider = get_provider("aliyun-codingplan") + + assert provider is not None + model_ids = [model.id for model in provider.models] + assert "qwen3.7-plus" in model_ids + assert "qwen3.6-plus" in model_ids + assert "kimi-k2.5" in model_ids + assert "MiniMax-M2.5" in model_ids + assert "glm-5" in model_ids