From 3c34d2c3ebfe0d4dfc02353980ed50a350fa0324 Mon Sep 17 00:00:00 2001 From: Xinyuan Tong <115166877+JustinTong0323@users.noreply.github.com> Date: Wed, 28 Jan 2026 22:47:09 -0500 Subject: [PATCH] [FIX] kimi_k2 reasoning parser (#17901) Signed-off-by: Xinyuan Tong --- .../srt/entrypoints/openai/serving_chat.py | 15 +++++++++---- python/sglang/srt/parser/reasoning_parser.py | 22 +------------------ 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/python/sglang/srt/entrypoints/openai/serving_chat.py b/python/sglang/srt/entrypoints/openai/serving_chat.py index f833120db..ab4d6c7fb 100644 --- a/python/sglang/srt/entrypoints/openai/serving_chat.py +++ b/python/sglang/srt/entrypoints/openai/serving_chat.py @@ -1196,16 +1196,23 @@ class OpenAIServingChat(OpenAIServingBase): """Judge whether the request needs reasoning""" if not self.reasoning_parser: return False - if self.reasoning_parser in ["deepseek-v3", "kimi_k2"]: + if self.reasoning_parser in ["deepseek-v3"]: + # Models that require explicit enable thinking (thinking=True) return ( request.chat_template_kwargs is not None and request.chat_template_kwargs.get("thinking") is True ) - if self.reasoning_parser in ["qwen3", "glm45", "nano_v3", "interns1"]: - # qwen3, glm45, nano_v3, and interns1 are reasoning by default + if self.reasoning_parser in ["kimi_k2"]: + # Models that thinking by default, and can be disabled by setting thinking=False return ( not request.chat_template_kwargs - or request.chat_template_kwargs.get("enable_thinking", True) is True + or request.chat_template_kwargs.get("thinking") is not False + ) + if self.reasoning_parser in ["qwen3", "glm45", "nano_v3", "interns1"]: + # Models that thinking by default, and can be disabled by setting enable_thinking=False + return ( + not request.chat_template_kwargs + or request.chat_template_kwargs.get("enable_thinking") is not False ) return True # default diff --git a/python/sglang/srt/parser/reasoning_parser.py b/python/sglang/srt/parser/reasoning_parser.py index 87535d95e..455101b5c 100644 --- a/python/sglang/srt/parser/reasoning_parser.py +++ b/python/sglang/srt/parser/reasoning_parser.py @@ -179,26 +179,6 @@ class DeepSeekR1Detector(BaseReasoningFormatDetector): # https://github.com/sgl-project/sglang/pull/3202#discussion_r1950153599 -class KimiK2Detector(BaseReasoningFormatDetector): - """ - Detector for Kimi K2 model. - - It uses the DeepSeek-R1 reasoning format: ()*(.*). - Defaults to thinking mode (force_reasoning=True), but allows disabling it - if the model is configured to not think. - """ - - def __init__(self, stream_reasoning: bool = True, force_reasoning: bool = True): - super().__init__( - "", - "", - # Allow force_reasoning to be controlled by arguments, defaulting to True - # to match vLLM's default `thinking=True` behavior. - force_reasoning=force_reasoning, - stream_reasoning=stream_reasoning, - ) - - class Qwen3Detector(BaseReasoningFormatDetector): """ Detector for Qwen3 models (e.g., Qwen/Qwen3-235B-A22B). @@ -398,7 +378,7 @@ class ReasoningParser: "glm45": Qwen3Detector, "gpt-oss": GptOssDetector, "kimi": KimiDetector, - "kimi_k2": KimiK2Detector, + "kimi_k2": Qwen3Detector, "qwen3": Qwen3Detector, "qwen3-thinking": Qwen3Detector, "minimax": Qwen3Detector,