From 2a6dbb25b26231d2e60ce5ca5d983cda134f6f01 Mon Sep 17 00:00:00 2001 From: 0xbyt4 <35742124+0xbyt4@users.noreply.github.com> Date: Thu, 12 Mar 2026 16:25:13 +0300 Subject: [PATCH] fix: exclude Coding Plan-only models from Moonshot model selection Moonshot (legacy key) users were shown kimi-for-coding and kimi-k2-thinking-turbo which only work on the Coding Plan endpoint (api.kimi.com/coding/v1). Add a separate "moonshot" model list that excludes plan-specific models. --- hermes_cli/main.py | 10 ++++++++-- tests/test_api_key_providers.py | 27 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/hermes_cli/main.py b/hermes_cli/main.py index 37af245fc..429c8b593 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -1373,6 +1373,12 @@ _PROVIDER_MODELS = { "kimi-k2-turbo-preview", "kimi-k2-0905-preview", ], + "moonshot": [ + "kimi-k2.5", + "kimi-k2-thinking", + "kimi-k2-turbo-preview", + "kimi-k2-0905-preview", + ], "minimax": [ "MiniMax-M2.5", "MiniMax-M2.5-highspeed", @@ -1454,8 +1460,8 @@ def _model_flow_kimi(config, current_model=""): "kimi-k2-thinking-turbo", ] else: - # Legacy Moonshot models - model_list = _PROVIDER_MODELS.get(provider_id, []) + # Legacy Moonshot models (excludes Coding Plan-only models) + model_list = _PROVIDER_MODELS.get("moonshot", []) if model_list: selected = _prompt_model_selection(model_list, current_model=current_model) diff --git a/tests/test_api_key_providers.py b/tests/test_api_key_providers.py index 8df2d6327..01378569d 100644 --- a/tests/test_api_key_providers.py +++ b/tests/test_api_key_providers.py @@ -426,3 +426,30 @@ class TestKimiCodeCredentialAutoDetect: monkeypatch.setenv("GLM_API_KEY", "sk-kimi-looks-like-kimi-but-isnt") creds = resolve_api_key_provider_credentials("zai") assert creds["base_url"] == "https://api.z.ai/api/paas/v4" + + +# ============================================================================= +# Kimi / Moonshot model list isolation tests +# ============================================================================= + +class TestKimiMoonshotModelListIsolation: + """Moonshot (legacy) users must not see Coding Plan-only models.""" + + def test_moonshot_list_excludes_coding_plan_only_models(self): + from hermes_cli.main import _PROVIDER_MODELS + moonshot_models = _PROVIDER_MODELS["moonshot"] + coding_plan_only = {"kimi-for-coding", "kimi-k2-thinking-turbo"} + leaked = set(moonshot_models) & coding_plan_only + assert not leaked, f"Moonshot list contains Coding Plan-only models: {leaked}" + + def test_moonshot_list_contains_shared_models(self): + from hermes_cli.main import _PROVIDER_MODELS + moonshot_models = _PROVIDER_MODELS["moonshot"] + assert "kimi-k2.5" in moonshot_models + assert "kimi-k2-thinking" in moonshot_models + + def test_coding_plan_list_contains_plan_specific_models(self): + from hermes_cli.main import _PROVIDER_MODELS + coding_models = _PROVIDER_MODELS["kimi-coding"] + assert "kimi-for-coding" in coding_models + assert "kimi-k2-thinking-turbo" in coding_models