From f3ed82b3a8bd7f855f4e1796d1d2e79cf04915a8 Mon Sep 17 00:00:00 2001 From: Eric Zhang Date: Sat, 8 Aug 2026 09:59:32 -0400 Subject: [PATCH] [inkling] Let Anthropic thinking=disabled map to reasoning effort "none" (#33913) Co-authored-by: Claude Opus 5 (1M context) --- .../srt/entrypoints/openai/serving_chat.py | 6 ++++++ .../entrypoints/openai/test_serving_chat.py | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/python/sglang/srt/entrypoints/openai/serving_chat.py b/python/sglang/srt/entrypoints/openai/serving_chat.py index ddbb8f7e9..34dceaa2b 100644 --- a/python/sglang/srt/entrypoints/openai/serving_chat.py +++ b/python/sglang/srt/entrypoints/openai/serving_chat.py @@ -2220,6 +2220,12 @@ class OpenAIServingChat(OpenAIServingBase): request.reasoning_effort = "medium" if enabled else "no_think" return + if self.reasoning_parser == "inkling": + # Effort-conditioned, not toggled: "none" (0.0) is the off switch. + if not enabled: + request.reasoning_effort = "none" + return + config = self.template_manager.reasoning_config is_mistral = (config is not None and config.special_case == "mistral") or ( config is None and self._reasoning_default_mode() == "mistral" diff --git a/test/registered/unit/entrypoints/openai/test_serving_chat.py b/test/registered/unit/entrypoints/openai/test_serving_chat.py index b26216569..63330b441 100644 --- a/test/registered/unit/entrypoints/openai/test_serving_chat.py +++ b/test/registered/unit/entrypoints/openai/test_serving_chat.py @@ -3054,6 +3054,26 @@ class InklingReasoningEffortTest(unittest.TestCase): finally: env.clear() + def test_thinking_disabled_maps_to_no_thinking_effort(self): + """Bug regression: Inkling is an always-on parser, so Anthropic + thinking={"type": "disabled"} was rejected outright even though effort + "none" (0.0) expresses exactly that.""" + serving = object.__new__(OpenAIServingChat) + serving.reasoning_parser = "inkling" + serving.template_manager = Mock(reasoning_config=None) + serving._reasoning_detector = Mock(reasoning_default="always") + request = ChatCompletionRequest( + model="test-model", messages=[{"role": "user", "content": "hi"}] + ) + + serving.apply_reasoning_enabled(request, False) + self.assertEqual(request.reasoning_effort, "none") + + # Enabling leaves an effort set via output_config.effort alone. + request.reasoning_effort = "low" + serving.apply_reasoning_enabled(request, True) + self.assertEqual(request.reasoning_effort, "low") + def test_serving_does_not_prefill_model_message(self): from sglang.srt.parser.inkling_tokenizer import INKLING_SPECIAL_TOKEN_IDS