diff --git a/python/sglang/srt/entrypoints/openai/protocol.py b/python/sglang/srt/entrypoints/openai/protocol.py index ed52f535c..3a53dff3e 100644 --- a/python/sglang/srt/entrypoints/openai/protocol.py +++ b/python/sglang/srt/entrypoints/openai/protocol.py @@ -460,6 +460,34 @@ class ChatCompletionRequest(BaseModel): values["tool_choice"] = "auto" return values + @model_validator(mode="before") + @classmethod + def normalize_reasoning_inputs(cls, values: Dict): + r = values.get("reasoning") + if r is None: + return values + + if isinstance(r, dict): + effort = r.get("effort") or r.get("reasoning_effort") + if effort in {"low", "medium", "high"}: + values["reasoning_effort"] = effort + + enabled = ( + r.get("enabled") + if r.get("enabled") is not None + else r.get("enable", False) + ) + if isinstance(enabled, str): + enabled = enabled.strip().lower() in {"1", "true", "yes", "y", "on"} + if enabled: + ctk = values.get("chat_template_kwargs") + if not isinstance(ctk, dict): + ctk = {} + ctk.setdefault("thinking", True) + values["chat_template_kwargs"] = ctk + + return values + @model_validator(mode="before") @classmethod def set_json_schema(cls, values): diff --git a/test/srt/openai_server/basic/test_protocol.py b/test/srt/openai_server/basic/test_protocol.py index 9066e5339..fcaa9770b 100644 --- a/test/srt/openai_server/basic/test_protocol.py +++ b/test/srt/openai_server/basic/test_protocol.py @@ -192,6 +192,20 @@ class TestChatCompletionRequest(unittest.TestCase): self.assertFalse(request.stream_reasoning) self.assertEqual(request.chat_template_kwargs, {"custom_param": "value"}) + def test_chat_completion_reasoning_effort(self): + """Test chat completion with reasoning effort""" + messages = [{"role": "user", "content": "Hello"}] + request = ChatCompletionRequest( + model="test-model", + messages=messages, + reasoning={ + "enabled": True, + "reasoning_effort": "high", + }, + ) + self.assertEqual(request.reasoning_effort, "high") + self.assertEqual(request.chat_template_kwargs, {"thinking": True}) + def test_chat_completion_json_format(self): """Test chat completion json format""" transcript = "Good morning! It's 7:00 AM, and I'm just waking up. Today is going to be a busy day, "