From b4013e90bc8aee14f1cad9bd1d032abf7fc4acb4 Mon Sep 17 00:00:00 2001 From: sidsri14 Date: Wed, 4 Nov 2026 17:48:24 +0530 Subject: [PATCH 1/2] fix(openai/responses): drop unsupported temperature for o-series models when drop_params=True (#49927) --- litellm/llms/openai/responses/transformation.py | 17 +++++++++++++++-- .../test_openai_responses_transformation.py | 10 ++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/litellm/llms/openai/responses/transformation.py b/litellm/llms/openai/responses/transformation.py index 6bbf3598bd8..91ab42f083b 100644 --- a/litellm/llms/openai/responses/transformation.py +++ b/litellm/llms/openai/responses/transformation.py @@ -369,6 +369,20 @@ class OpenAIResponsesAPIConfig(BaseResponsesAPIConfig): def _model_map_lookup_name(model: str) -> str: return model + @staticmethod + def _without_unsupported_o_series_temperature( + params: Mapping[str, object], model: str, drop_params: bool + ) -> Mapping[str, object]: + temperature: Final = params.get("temperature") + if ( + litellm.openaiOSeriesConfig.is_model_o_series_model(model=model) + and temperature is not None + and temperature != 1 + and (drop_params or litellm.drop_params) + ): + return {key: value for key, value in params.items() if key != "temperature"} + return params + @staticmethod def _supports_reasoning_effort_none(model: str) -> bool: """Return True if the model supports reasoning.effort='none'.""" @@ -585,8 +599,7 @@ class OpenAIResponsesAPIConfig(BaseResponsesAPIConfig): ), status_code=400, ) - - return params + return self._without_unsupported_o_series_temperature(params, lookup_name, drop_params) def transform_responses_api_request( self, diff --git a/tests/unit/llms/openai/responses/test_openai_responses_transformation.py b/tests/unit/llms/openai/responses/test_openai_responses_transformation.py index 6b36a683df7..394648e1345 100644 --- a/tests/unit/llms/openai/responses/test_openai_responses_transformation.py +++ b/tests/unit/llms/openai/responses/test_openai_responses_transformation.py @@ -2383,6 +2383,16 @@ class TestPromptCacheOptionsOnResponsesPath: } +@pytest.mark.parametrize(("temperature", "survives"), ((0.5, False), (1, True))) +def test_o_series_responses_temperature_follows_the_chat_rule(temperature: float, survives: bool) -> None: + mapped: Final = OpenAIResponsesAPIConfig().map_openai_params( + response_api_optional_params={"temperature": temperature}, + model="o3-mini", + drop_params=True, + ) + assert ("temperature" in mapped) is survives + + class TestResponsesSurfaceSharesTheEffortRule: """The Responses API reaches the same gpt-5 models over a different wire, and the default /v1/messages bridge for openai models routes through it. It carried its own copy of the From 8a7b51ca4e1723d7ced2226926ec2a68d7f7fe18 Mon Sep 17 00:00:00 2001 From: sidsri14 Date: Wed, 4 Nov 2026 23:51:23 +0530 Subject: [PATCH 2/2] test(openai/responses): cover temperature filtering boundaries --- .../test_openai_responses_transformation.py | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/tests/unit/llms/openai/responses/test_openai_responses_transformation.py b/tests/unit/llms/openai/responses/test_openai_responses_transformation.py index 394648e1345..d6207461dba 100644 --- a/tests/unit/llms/openai/responses/test_openai_responses_transformation.py +++ b/tests/unit/llms/openai/responses/test_openai_responses_transformation.py @@ -2383,14 +2383,31 @@ class TestPromptCacheOptionsOnResponsesPath: } -@pytest.mark.parametrize(("temperature", "survives"), ((0.5, False), (1, True))) -def test_o_series_responses_temperature_follows_the_chat_rule(temperature: float, survives: bool) -> None: +@pytest.mark.parametrize( + ("model", "temperature", "drop_params", "global_drop_params", "expected"), + ( + ("o3-mini", 0.5, True, False, {"max_output_tokens": 128}), + ("o3-mini", 1, True, False, {"temperature": 1, "max_output_tokens": 128}), + ("o3-mini", 0.5, False, True, {"max_output_tokens": 128}), + ("o3-mini", 0.5, False, False, {"temperature": 0.5, "max_output_tokens": 128}), + ("gpt-4o", 0.5, True, False, {"temperature": 0.5, "max_output_tokens": 128}), + ), +) +def test_o_series_responses_drops_only_unsupported_temperature_when_enabled( + model: str, + temperature: float, + drop_params: bool, + global_drop_params: bool, + expected: Mapping[str, object], + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr(litellm, "drop_params", global_drop_params) mapped: Final = OpenAIResponsesAPIConfig().map_openai_params( - response_api_optional_params={"temperature": temperature}, - model="o3-mini", - drop_params=True, + response_api_optional_params={"temperature": temperature, "max_output_tokens": 128}, + model=model, + drop_params=drop_params, ) - assert ("temperature" in mapped) is survives + assert mapped == expected class TestResponsesSurfaceSharesTheEffortRule: