From 007572b58e2e6577f3c9a9a83d946e3b9c757437 Mon Sep 17 00:00:00 2001 From: hkfires <10558748+hkfires@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:52:14 +0800 Subject: [PATCH] fix(util): do not strip thinking suffix on registered models NormalizeThinkingModel now checks ModelSupportsThinking before removing "-thinking" or "-thinking-", avoiding accidental parsing of model names where the suffix is part of the official id (e.g., kimi-k2-thinking, qwen3-235b-a22b-thinking-2507). The registry adds ThinkingSupport metadata for several models and propagates it via ModelInfo (e.g., kimi-k2-thinking, deepseek-r1, qwen3-235b-a22b-thinking-2507, minimax-m2), enabling accurate detection of thinking-capable models and correcting base model inference. --- internal/registry/model_definitions.go | 10 ++++++---- internal/util/thinking_suffix.go | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/internal/registry/model_definitions.go b/internal/registry/model_definitions.go index 9956d964..adaff867 100644 --- a/internal/registry/model_definitions.go +++ b/internal/registry/model_definitions.go @@ -623,6 +623,7 @@ func GetIFlowModels() []*ModelInfo { DisplayName string Description string Created int64 + Thinking *ThinkingSupport }{ {ID: "tstars2.0", DisplayName: "TStars-2.0", Description: "iFlow TStars-2.0 multimodal assistant", Created: 1746489600}, {ID: "qwen3-coder-plus", DisplayName: "Qwen3-Coder-Plus", Description: "Qwen3 Coder Plus code generation", Created: 1753228800}, @@ -632,17 +633,17 @@ func GetIFlowModels() []*ModelInfo { {ID: "kimi-k2-0905", DisplayName: "Kimi-K2-Instruct-0905", Description: "Moonshot Kimi K2 instruct 0905", Created: 1757030400}, {ID: "glm-4.6", DisplayName: "GLM-4.6", Description: "Zhipu GLM 4.6 general model", Created: 1759190400}, {ID: "kimi-k2", DisplayName: "Kimi-K2", Description: "Moonshot Kimi K2 general model", Created: 1752192000}, - {ID: "kimi-k2-thinking", DisplayName: "Kimi-K2-Thinking", Description: "Moonshot Kimi K2 general model", Created: 1762387200}, + {ID: "kimi-k2-thinking", DisplayName: "Kimi-K2-Thinking", Description: "Moonshot Kimi K2 thinking model", Created: 1762387200, Thinking: &ThinkingSupport{Levels: []string{"low", "medium", "high"}}}, {ID: "deepseek-v3.2-chat", DisplayName: "DeepSeek-V3.2", Description: "DeepSeek V3.2", Created: 1764576000}, {ID: "deepseek-v3.2", DisplayName: "DeepSeek-V3.2-Exp", Description: "DeepSeek V3.2 experimental", Created: 1759104000}, {ID: "deepseek-v3.1", DisplayName: "DeepSeek-V3.1-Terminus", Description: "DeepSeek V3.1 Terminus", Created: 1756339200}, - {ID: "deepseek-r1", DisplayName: "DeepSeek-R1", Description: "DeepSeek reasoning model R1", Created: 1737331200}, + {ID: "deepseek-r1", DisplayName: "DeepSeek-R1", Description: "DeepSeek reasoning model R1", Created: 1737331200, Thinking: &ThinkingSupport{Levels: []string{"low", "medium", "high"}}}, {ID: "deepseek-v3", DisplayName: "DeepSeek-V3-671B", Description: "DeepSeek V3 671B", Created: 1734307200}, {ID: "qwen3-32b", DisplayName: "Qwen3-32B", Description: "Qwen3 32B", Created: 1747094400}, - {ID: "qwen3-235b-a22b-thinking-2507", DisplayName: "Qwen3-235B-A22B-Thinking", Description: "Qwen3 235B A22B Thinking (2507)", Created: 1753401600}, + {ID: "qwen3-235b-a22b-thinking-2507", DisplayName: "Qwen3-235B-A22B-Thinking", Description: "Qwen3 235B A22B Thinking (2507)", Created: 1753401600, Thinking: &ThinkingSupport{Levels: []string{"low", "medium", "high"}}}, {ID: "qwen3-235b-a22b-instruct", DisplayName: "Qwen3-235B-A22B-Instruct", Description: "Qwen3 235B A22B Instruct", Created: 1753401600}, {ID: "qwen3-235b", DisplayName: "Qwen3-235B-A22B", Description: "Qwen3 235B A22B", Created: 1753401600}, - {ID: "minimax-m2", DisplayName: "MiniMax-M2", Description: "MiniMax M2", Created: 1758672000}, + {ID: "minimax-m2", DisplayName: "MiniMax-M2", Description: "MiniMax M2", Created: 1758672000, Thinking: &ThinkingSupport{Levels: []string{"low", "medium", "high"}}}, } models := make([]*ModelInfo, 0, len(entries)) for _, entry := range entries { @@ -654,6 +655,7 @@ func GetIFlowModels() []*ModelInfo { Type: "iflow", DisplayName: entry.DisplayName, Description: entry.Description, + Thinking: entry.Thinking, }) } return models diff --git a/internal/util/thinking_suffix.go b/internal/util/thinking_suffix.go index 47ce42f7..ef8302b0 100644 --- a/internal/util/thinking_suffix.go +++ b/internal/util/thinking_suffix.go @@ -52,6 +52,11 @@ func NormalizeThinkingModel(modelName string) (string, map[string]any) { matched = true default: if idx := strings.LastIndex(lower, "-thinking-"); idx != -1 { + // Skip stripping if the original model is a registered thinking model. + // This prevents "-thinking-2507" in "qwen3-235b-a22b-thinking-2507" from being parsed. + if ModelSupportsThinking(modelName) { + break + } value := modelName[idx+len("-thinking-"):] if value != "" { if parsed, ok := parseIntPrefix(value); ok { @@ -95,10 +100,16 @@ func NormalizeThinkingModel(modelName string) (string, map[string]any) { } } } else if strings.HasSuffix(lower, "-thinking") { - baseModel = modelName[:len(modelName)-len("-thinking")] - effort := "medium" - reasoningEffort = &effort - matched = true + candidateBase := modelName[:len(modelName)-len("-thinking")] + // Only strip the suffix if the original model is NOT a registered thinking model. + // This prevents stripping "-thinking" from models like "kimi-k2-thinking" where + // the suffix is part of the model's actual name. + if !ModelSupportsThinking(modelName) { + baseModel = candidateBase + effort := "medium" + reasoningEffort = &effort + matched = true + } } }