From 6c24f24e9eadf1602858e96878c82887cd97fad3 Mon Sep 17 00:00:00 2001 From: Xubin Ren Date: Mon, 20 Apr 2026 18:18:06 +0000 Subject: [PATCH] feat(models): add support for kimi-k2.6 with temperature override and update documentation --- docs/configuration.md | 2 +- nanobot/providers/openai_compat_provider.py | 3 ++- nanobot/providers/registry.py | 7 +++++-- tests/providers/test_litellm_kwargs.py | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 96b5fa5b..a7b3ec0f 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -420,7 +420,7 @@ That's it! Environment variables, model routing, config matching, and `nanobot s |-------|-------------|---------| | `default_api_base` | OpenAI-compatible base URL | `"https://api.deepseek.com"` | | `env_extras` | Additional env vars to set | `(("ZHIPUAI_API_KEY", "{api_key}"),)` | -| `model_overrides` | Per-model parameter overrides | `(("kimi-k2.5", {"temperature": 1.0}),)` | +| `model_overrides` | Per-model parameter overrides | `(("kimi-k2.5", {"temperature": 1.0}), ("kimi-k2.6", {"temperature": 1.0}),)` | | `is_gateway` | Can route any model (like OpenRouter) | `True` | | `detect_by_key_prefix` | Detect gateway by API key prefix | `"sk-or-"` | | `detect_by_base_keyword` | Detect gateway by API base URL | `"openrouter"` | diff --git a/nanobot/providers/openai_compat_provider.py b/nanobot/providers/openai_compat_provider.py index 83db7e8f..2ffc7c58 100644 --- a/nanobot/providers/openai_compat_provider.py +++ b/nanobot/providers/openai_compat_provider.py @@ -54,6 +54,7 @@ _DEFAULT_OPENROUTER_HEADERS = { } _KIMI_THINKING_MODELS: frozenset[str] = frozenset({ "kimi-k2.5", + "kimi-k2.6", "k2.6-code-preview", }) @@ -62,7 +63,7 @@ def _is_kimi_thinking_model(model_name: str) -> bool: """Return True if model_name refers to a Kimi thinking-capable model. Supports two forms: - - Exact match: kimi-k2.5 in _KIMI_THINKING_MODELS + - Exact match: e.g. kimi-k2.5 / kimi-k2.6 in _KIMI_THINKING_MODELS - Slug match: moonshotai/kimi-k2.5 -> the part after the last "/" is checked against _KIMI_THINKING_MODELS diff --git a/nanobot/providers/registry.py b/nanobot/providers/registry.py index be098731..05237338 100644 --- a/nanobot/providers/registry.py +++ b/nanobot/providers/registry.py @@ -261,7 +261,7 @@ PROVIDERS: tuple[ProviderSpec, ...] = ( backend="openai_compat", default_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1", ), - # Moonshot (月之暗面): Kimi models. K2.5 enforces temperature >= 1.0. + # Moonshot (月之暗面): Kimi K2.5 / K2.6 enforce temperature >= 1.0. ProviderSpec( name="moonshot", keywords=("moonshot", "kimi"), @@ -269,7 +269,10 @@ PROVIDERS: tuple[ProviderSpec, ...] = ( display_name="Moonshot", backend="openai_compat", default_api_base="https://api.moonshot.ai/v1", - model_overrides=(("kimi-k2.5", {"temperature": 1.0}),), + model_overrides=( + ("kimi-k2.5", {"temperature": 1.0}), + ("kimi-k2.6", {"temperature": 1.0}), + ), ), # MiniMax: OpenAI-compatible API ProviderSpec( diff --git a/tests/providers/test_litellm_kwargs.py b/tests/providers/test_litellm_kwargs.py index 47db2039..0d6280b7 100644 --- a/tests/providers/test_litellm_kwargs.py +++ b/tests/providers/test_litellm_kwargs.py @@ -784,6 +784,25 @@ def test_kimi_k25_thinking_enabled_with_openrouter_prefix() -> None: kw = _build_kwargs_for("openrouter", "moonshotai/kimi-k2.5", reasoning_effort="medium") assert kw.get("extra_body") == {"thinking": {"type": "enabled"}} + +def test_kimi_k26_thinking_enabled() -> None: + """kimi-k2.6 with reasoning_effort set should opt in to thinking.""" + kw = _build_kwargs_for("moonshot", "kimi-k2.6", reasoning_effort="medium") + assert kw.get("extra_body") == {"thinking": {"type": "enabled"}} + + +def test_kimi_k26_thinking_enabled_with_openrouter_prefix() -> None: + """OpenRouter-style names like moonshotai/kimi-k2.6 must trigger thinking.""" + kw = _build_kwargs_for("openrouter", "moonshotai/kimi-k2.6", reasoning_effort="medium") + assert kw.get("extra_body") == {"thinking": {"type": "enabled"}} + + +def test_moonshot_kimi_k26_temperature_override() -> None: + """Moonshot registry forces temperature 1.0 for kimi-k2.6 (API requirement).""" + kw = _build_kwargs_for("moonshot", "kimi-k2.6", reasoning_effort=None) + assert kw["temperature"] == 1.0 + + def test_kimi_k25_thinking_disabled_with_openrouter_prefix() -> None: """OpenRouter names must NOT trigger thinking without reasoning_effort.""" kw = _build_kwargs_for("openrouter", "moonshotai/kimi-k2.5", reasoning_effort=None)