Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/adclaw/__version__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# -*- coding: utf-8 -*-
__version__ = "1.0.32"
__version__ = "1.0.33"
80 changes: 61 additions & 19 deletions src/adclaw/providers/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand All @@ -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"),
Expand All @@ -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"),
Expand All @@ -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"),
Expand All @@ -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"),
Expand All @@ -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"),
Expand All @@ -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"),
Expand All @@ -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",
Expand Down Expand Up @@ -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] = [
Expand All @@ -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"),
]

Expand Down Expand Up @@ -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"),
Expand Down
108 changes: 108 additions & 0 deletions tests/test_provider_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading