From 65061bafc7ddccce4d9e2446091c57d47a869a44 Mon Sep 17 00:00:00 2001 From: Cesar Garcia <128240629+Chesars@users.noreply.github.com> Date: Fri, 14 Nov 2025 18:41:49 -0300 Subject: [PATCH] feat(openai): Add support for reasoning_effort='none' in GPT-5.1 (#16658) * feat(openai): Add support for reasoning_effort='none' in GPT-5.1 OpenAI's GPT-5.1 introduced a new reasoning effort parameter 'none' which replaces the previous 'minimal' setting for faster, lower-latency responses. This is now the default setting for GPT-5.1. Changes: - Updated REASONING_EFFORT type to include 'none' value - Added GPT-5.1, GPT-5-mini, and GPT-5-nano to documentation - Updated docs to reflect 'none' as GPT-5.1's default reasoning effort - Added test to verify reasoning_effort='none' passes through correctly Fixes #16633 * feat(responses): Add support for reasoning_effort='none' in Responses API transformation --- docs/my-website/docs/providers/openai.md | 11 +++++-- .../transformation.py | 4 ++- litellm/types/llms/openai.py | 2 +- .../llms/openai/test_gpt5_transformation.py | 30 +++++++++++++++++++ 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/docs/my-website/docs/providers/openai.md b/docs/my-website/docs/providers/openai.md index 51ebc881d2..e288f51155 100644 --- a/docs/my-website/docs/providers/openai.md +++ b/docs/my-website/docs/providers/openai.md @@ -412,7 +412,7 @@ Expected Response: ### Advanced: Using `reasoning_effort` with `summary` field -By default, `reasoning_effort` accepts a string value (`"low"`, `"medium"`, `"high"`, `"minimal"`) and only sets the effort level without including a reasoning summary. +By default, `reasoning_effort` accepts a string value (`"none"`, `"minimal"`, `"low"`, `"medium"`, `"high"`) and only sets the effort level without including a reasoning summary. To opt-in to the `summary` feature, you can pass `reasoning_effort` as a dictionary. **Note:** The `summary` field requires your OpenAI organization to have verification status. Using `summary` without verification will result in a 400 error from OpenAI. @@ -472,12 +472,17 @@ curl -X POST 'http://0.0.0.0:4000/chat/completions' \ | Model | Default (when not set) | Supported Values | |-------|----------------------|------------------| +| `gpt-5.1` | `none` | `none`, `low`, `medium`, `high` | | `gpt-5` | `medium` | `minimal`, `low`, `medium`, `high` | -| `gpt-5-mini` | `medium` | `minimal`, `low`, `medium`, `high` | +| `gpt-5-mini` | `medium` | `none`, `minimal`, `low`, `medium`, `high` | +| `gpt-5-nano` | `none` | `none`, `low`, `medium`, `high` | | `gpt-5-codex` | `adaptive` | `low`, `medium`, `high` (no `minimal`) | | `gpt-5-pro` | `high` | `high` only | -**Note:** `gpt-5-pro` only accepts `reasoning_effort="high"`. Other values will return an error. When `reasoning_effort` is not set (None), OpenAI defaults to the value shown in the "Default" column. +**Note:** +- GPT-5.1 introduced a new `reasoning_effort="none"` setting for faster, lower-latency responses. This replaces the `"minimal"` setting from GPT-5. +- `gpt-5-pro` only accepts `reasoning_effort="high"`. Other values will return an error. +- When `reasoning_effort` is not set (None), OpenAI defaults to the value shown in the "Default" column. See [OpenAI Reasoning documentation](https://platform.openai.com/docs/guides/reasoning) for more details on organization verification requirements. diff --git a/litellm/completion_extras/litellm_responses_transformation/transformation.py b/litellm/completion_extras/litellm_responses_transformation/transformation.py index 3ba75666b8..a64661da33 100644 --- a/litellm/completion_extras/litellm_responses_transformation/transformation.py +++ b/litellm/completion_extras/litellm_responses_transformation/transformation.py @@ -544,7 +544,9 @@ class LiteLLMResponsesTransformationHandler(CompletionTransformationBridge): return Reasoning(**reasoning_effort) # type: ignore[typeddict-item] # If string is passed, map without summary (default) - if reasoning_effort == "high": + if reasoning_effort == "none": + return Reasoning(effort="none") + elif reasoning_effort == "high": return Reasoning(effort="high") elif reasoning_effort == "medium": return Reasoning(effort="medium") diff --git a/litellm/types/llms/openai.py b/litellm/types/llms/openai.py index 7dab61b151..fd2f9b9d9c 100644 --- a/litellm/types/llms/openai.py +++ b/litellm/types/llms/openai.py @@ -1475,7 +1475,7 @@ ResponsesAPIStreamingResponse = Annotated[ ] -REASONING_EFFORT = Literal["minimal", "low", "medium", "high"] +REASONING_EFFORT = Literal["none", "minimal", "low", "medium", "high"] class OpenAIRealtimeStreamSession(TypedDict, total=False): diff --git a/tests/test_litellm/llms/openai/test_gpt5_transformation.py b/tests/test_litellm/llms/openai/test_gpt5_transformation.py index 876eb8b29f..42db678d1d 100644 --- a/tests/test_litellm/llms/openai/test_gpt5_transformation.py +++ b/tests/test_litellm/llms/openai/test_gpt5_transformation.py @@ -153,3 +153,33 @@ def test_gpt5_codex_supports_function_calling(config: OpenAIConfig): assert "functions" in supported_params assert "function_call" in supported_params assert "tools" in supported_params + + +def test_gpt5_1_reasoning_effort_none(config: OpenAIConfig): + """Test that GPT-5.1 supports reasoning_effort='none' parameter. + + Related issue: https://github.com/BerriAI/litellm/issues/16633 + GPT-5.1 introduced 'none' as the new default reasoning effort setting + for faster, lower-latency responses. + """ + # Test that reasoning_effort is a supported parameter + assert "reasoning_effort" in config.get_supported_openai_params(model="gpt-5.1") + + # Test that reasoning_effort="none" passes through correctly + params = config.map_openai_params( + non_default_params={"reasoning_effort": "none"}, + optional_params={}, + model="gpt-5.1", + drop_params=False, + ) + assert params["reasoning_effort"] == "none" + + # Test with other valid values for GPT-5.1 + for effort in ["low", "medium", "high"]: + params = config.map_openai_params( + non_default_params={"reasoning_effort": effort}, + optional_params={}, + model="gpt-5.1", + drop_params=False, + ) + assert params["reasoning_effort"] == effort