From fff83dd8a5a6ff4003a8db4c74e7b0fe951d1381 Mon Sep 17 00:00:00 2001 From: Chesars Date: Sun, 22 Mar 2026 17:51:07 -0300 Subject: [PATCH 1/3] fix(responses-api): apply GPT-5 temperature validation in Responses API The Responses API map_openai_params passed all params through without applying model-specific validation. GPT-5 models (except gpt-5-chat) only accept temperature=1 unless reasoning.effort="none" on models that support it (5.1, 5.2, 5.4). Reuse the existing OpenAIGPT5Config logic from chat completions to validate temperature in the Responses API path. With drop_params=True, unsupported temperature values are silently dropped; without it, UnsupportedParamsError is raised. Fixes #16090 --- .../llms/openai/responses/transformation.py | 35 +++++++- .../llms/openai/test_gpt5_transformation.py | 83 +++++++++++++++++++ 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/litellm/llms/openai/responses/transformation.py b/litellm/llms/openai/responses/transformation.py index cafb745862..bfcf0959f9 100644 --- a/litellm/llms/openai/responses/transformation.py +++ b/litellm/llms/openai/responses/transformation.py @@ -60,8 +60,39 @@ class OpenAIResponsesAPIConfig(BaseResponsesAPIConfig): model: str, drop_params: bool, ) -> Dict: - """No mapping applied since inputs are in OpenAI spec already""" - return dict(response_api_optional_params) + """No mapping applied since inputs are in OpenAI spec already. + + GPT-5 models have restrictions on temperature (only temperature=1 + is accepted unless reasoning_effort='none' on models that support it). + Apply the same validation used by the chat completions path. + """ + from litellm.llms.openai.chat.gpt_5_transformation import OpenAIGPT5Config + + params = dict(response_api_optional_params) + + if OpenAIGPT5Config.is_model_gpt_5_model(model=model): + temperature = params.get("temperature") + if temperature is not None and temperature != 1: + reasoning = params.get("reasoning") or {} + effort = reasoning.get("effort") if isinstance(reasoning, dict) else None + supports_none = OpenAIGPT5Config._supports_reasoning_effort_level( + model=model, level="none" + ) + if supports_none and (effort == "none" or effort is None): + pass # flexible temperature allowed + elif drop_params or litellm.drop_params: + params.pop("temperature", None) + else: + raise litellm.UnsupportedParamsError( + message=( + "gpt-5 models don't support temperature={}. " + "Only temperature=1 is supported. " + "To drop unsupported params set `litellm.drop_params = True`" + ).format(temperature), + status_code=400, + ) + + return params def transform_responses_api_request( self, diff --git a/tests/test_litellm/llms/openai/test_gpt5_transformation.py b/tests/test_litellm/llms/openai/test_gpt5_transformation.py index aebab33e80..f95dbbe9bf 100644 --- a/tests/test_litellm/llms/openai/test_gpt5_transformation.py +++ b/tests/test_litellm/llms/openai/test_gpt5_transformation.py @@ -1031,3 +1031,86 @@ def test_gpt5_1_logprobs_dropped_with_reasoning_effort(config: OpenAIConfig): assert "logprobs" not in params assert "top_p" not in params assert params["reasoning_effort"] == "high" + + +# --------------------------------------------------------------------------- +# Responses API: GPT-5 temperature validation (#16090) +# --------------------------------------------------------------------------- + +from litellm.llms.openai.responses.transformation import OpenAIResponsesAPIConfig +from litellm.types.llms.openai import ResponsesAPIOptionalRequestParams + + +@pytest.fixture() +def responses_config() -> OpenAIResponsesAPIConfig: + return OpenAIResponsesAPIConfig() + + +def test_responses_gpt5_drop_temperature( + responses_config: OpenAIResponsesAPIConfig, +): + """drop_params=True should silently drop temperature!=1 for gpt-5.""" + params = responses_config.map_openai_params( + response_api_optional_params=ResponsesAPIOptionalRequestParams( + temperature=0.5, + ), + model="gpt-5", + drop_params=True, + ) + assert "temperature" not in params + + +def test_responses_gpt5_reject_temperature( + responses_config: OpenAIResponsesAPIConfig, +): + """Without drop_params, temperature!=1 should raise UnsupportedParamsError.""" + with pytest.raises(litellm.UnsupportedParamsError): + responses_config.map_openai_params( + response_api_optional_params=ResponsesAPIOptionalRequestParams( + temperature=0.5, + ), + model="gpt-5", + drop_params=False, + ) + + +def test_responses_gpt5_allow_temperature_1( + responses_config: OpenAIResponsesAPIConfig, +): + """temperature=1 should always be allowed for gpt-5.""" + params = responses_config.map_openai_params( + response_api_optional_params=ResponsesAPIOptionalRequestParams( + temperature=1, + ), + model="gpt-5", + drop_params=False, + ) + assert params["temperature"] == 1 + + +def test_responses_gpt5_mini_drop_temperature( + responses_config: OpenAIResponsesAPIConfig, +): + """gpt-5-mini should also drop temperature!=1.""" + params = responses_config.map_openai_params( + response_api_optional_params=ResponsesAPIOptionalRequestParams( + temperature=0.7, + ), + model="gpt-5-mini", + drop_params=True, + ) + assert "temperature" not in params + + +def test_responses_gpt5_chat_allow_temperature( + responses_config: OpenAIResponsesAPIConfig, +): + """gpt-5-chat models should allow any temperature (not GPT-5 restricted).""" + params = responses_config.map_openai_params( + response_api_optional_params=ResponsesAPIOptionalRequestParams( + temperature=0.3, + ), + model="gpt-5-chat-latest", + drop_params=False, + ) + assert params["temperature"] == 0.3 From f8a9bbd53788cab72f1e26eb97217a20fc1d7111 Mon Sep 17 00:00:00 2001 From: Chesars Date: Sun, 22 Mar 2026 18:22:11 -0300 Subject: [PATCH 2/3] test: add supports_none branch coverage for Responses API GPT-5 temperature Add tests for the gpt-5.1/5.2/5.4 reasoning.effort interaction: - gpt-5.1 with no reasoning allows flexible temperature - gpt-5.1 with effort='high' drops temperature - gpt-5.4 with effort='none' allows flexible temperature --- .../llms/openai/test_gpt5_transformation.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/tests/test_litellm/llms/openai/test_gpt5_transformation.py b/tests/test_litellm/llms/openai/test_gpt5_transformation.py index f95dbbe9bf..6383bfc9e1 100644 --- a/tests/test_litellm/llms/openai/test_gpt5_transformation.py +++ b/tests/test_litellm/llms/openai/test_gpt5_transformation.py @@ -1114,3 +1114,48 @@ def test_responses_gpt5_chat_allow_temperature( drop_params=False, ) assert params["temperature"] == 0.3 + + +def test_responses_gpt51_allow_temperature_no_reasoning( + responses_config: OpenAIResponsesAPIConfig, +): + """gpt-5.1 supports reasoning_effort='none'; no reasoning defaults to 'none', + so temperature should be allowed.""" + params = responses_config.map_openai_params( + response_api_optional_params=ResponsesAPIOptionalRequestParams( + temperature=0.5, + ), + model="gpt-5.1", + drop_params=False, + ) + assert params["temperature"] == 0.5 + + +def test_responses_gpt51_drop_temperature_with_high_effort( + responses_config: OpenAIResponsesAPIConfig, +): + """gpt-5.1 with reasoning.effort='high' should drop temperature!=1.""" + params = responses_config.map_openai_params( + response_api_optional_params=ResponsesAPIOptionalRequestParams( + temperature=0.5, + reasoning={"effort": "high"}, + ), + model="gpt-5.1", + drop_params=True, + ) + assert "temperature" not in params + + +def test_responses_gpt54_allow_temperature_effort_none( + responses_config: OpenAIResponsesAPIConfig, +): + """gpt-5.4 with explicit reasoning.effort='none' should allow temperature.""" + params = responses_config.map_openai_params( + response_api_optional_params=ResponsesAPIOptionalRequestParams( + temperature=0.7, + reasoning={"effort": "none"}, + ), + model="gpt-5.4", + drop_params=False, + ) + assert params["temperature"] == 0.7 From bfee7f0b58f960b7effe86b784cd33b9502a560c Mon Sep 17 00:00:00 2001 From: Chesars Date: Sun, 22 Mar 2026 18:37:34 -0300 Subject: [PATCH 3/3] fix: improve error message for supports-none models with temperature --- litellm/llms/openai/responses/transformation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/litellm/llms/openai/responses/transformation.py b/litellm/llms/openai/responses/transformation.py index bfcf0959f9..03e09b039d 100644 --- a/litellm/llms/openai/responses/transformation.py +++ b/litellm/llms/openai/responses/transformation.py @@ -87,6 +87,8 @@ class OpenAIResponsesAPIConfig(BaseResponsesAPIConfig): message=( "gpt-5 models don't support temperature={}. " "Only temperature=1 is supported. " + "For models like gpt-5.1/5.4, temperature is supported " + "when reasoning.effort='none' (or not specified). " "To drop unsupported params set `litellm.drop_params = True`" ).format(temperature), status_code=400,