From 9268dfc08a380bc56c739c80e54144bc497eec85 Mon Sep 17 00:00:00 2001 From: Daniel Naves de Carvalho Date: Mon, 11 May 2026 11:04:17 -0300 Subject: [PATCH] fix: add gpt-5.1-mini and gpt-5.1-nano registry entries with supports_none_reasoning_effort MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per OpenAI's parameter compatibility guide, the gpt-5.1 family (including gpt-5.1-mini and gpt-5.1-nano) supports `temperature` when reasoning_effort is omitted or set to 'none'. LiteLLM's pre-flight check correctly applies this for the bare `gpt-5.1` slug (which has `supports_none_reasoning_effort: true` in the registry), but `gpt-5.1-mini` and `gpt-5.1-nano` are absent from `model_prices_and_context_window.json` entirely, so they fall back to strict rejection — `litellm.UnsupportedParamsError` even when reasoning_effort is null. Adds the two missing entries with the same flag matrix as the existing `gpt-5.1` entry — most importantly `supports_none_reasoning_effort: true`. Pricing is anchored to the gpt-5-mini and gpt-5-nano siblings (same scale tier, same provider) until OpenAI publishes explicit 5.1 mini/nano pricing; this matches the conservative "match the 5.0 generation siblings" rule rather than inventing numbers. Context window (272000 input / 128000 output) matches the rest of the gpt-5.1 family. Also extends two existing tests in tests/test_litellm/llms/openai/ test_gpt5_transformation.py: - test_gpt5_1_model_detection: asserts gpt-5.1-mini and gpt-5.1-nano now resolve through `_supports_reasoning_effort_level(model, "none")` as True. - test_gpt5_1_mini_nano_temperature_with_reasoning_effort_none: new test mirroring the existing test_gpt5_1_temperature_with_reasoning_effort_none, asserting temperature pass-through for these two new slugs. Repro and full curl evidence in #27351. --- ...odel_prices_and_context_window_backup.json | 83 +++++++++++++++++++ model_prices_and_context_window.json | 83 +++++++++++++++++++ .../llms/openai/test_gpt5_transformation.py | 21 +++++ 3 files changed, 187 insertions(+) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 13a45fd1650..898629b64bf 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -20746,6 +20746,89 @@ "supports_xhigh_reasoning_effort": false, "supports_minimal_reasoning_effort": true }, + "gpt-5.1-mini": { + "cache_read_input_token_cost": 2.5e-08, + "cache_read_input_token_cost_flex": 1.25e-08, + "cache_read_input_token_cost_priority": 4.5e-08, + "input_cost_per_token": 2.5e-07, + "input_cost_per_token_flex": 1.25e-07, + "input_cost_per_token_priority": 4.5e-07, + "litellm_provider": "openai", + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2e-06, + "output_cost_per_token_flex": 1e-06, + "output_cost_per_token_priority": 3.6e-06, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_service_tier": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": false, + "supports_minimal_reasoning_effort": true + }, + "gpt-5.1-nano": { + "cache_read_input_token_cost": 5e-09, + "cache_read_input_token_cost_flex": 2.5e-09, + "input_cost_per_token": 5e-08, + "input_cost_per_token_flex": 2.5e-08, + "input_cost_per_token_priority": 2.5e-06, + "litellm_provider": "openai", + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 4e-07, + "output_cost_per_token_flex": 2e-07, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": false, + "supports_minimal_reasoning_effort": true + }, "gpt-5.2-codex": { "cache_read_input_token_cost": 1.75e-07, "cache_read_input_token_cost_priority": 3.5e-07, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index bbe13442d63..3109a2a32b8 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -20760,6 +20760,89 @@ "supports_xhigh_reasoning_effort": false, "supports_minimal_reasoning_effort": true }, + "gpt-5.1-mini": { + "cache_read_input_token_cost": 2.5e-08, + "cache_read_input_token_cost_flex": 1.25e-08, + "cache_read_input_token_cost_priority": 4.5e-08, + "input_cost_per_token": 2.5e-07, + "input_cost_per_token_flex": 1.25e-07, + "input_cost_per_token_priority": 4.5e-07, + "litellm_provider": "openai", + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 2e-06, + "output_cost_per_token_flex": 1e-06, + "output_cost_per_token_priority": 3.6e-06, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_service_tier": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": false, + "supports_minimal_reasoning_effort": true + }, + "gpt-5.1-nano": { + "cache_read_input_token_cost": 5e-09, + "cache_read_input_token_cost_flex": 2.5e-09, + "input_cost_per_token": 5e-08, + "input_cost_per_token_flex": 2.5e-08, + "input_cost_per_token_priority": 2.5e-06, + "litellm_provider": "openai", + "max_input_tokens": 272000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "output_cost_per_token": 4e-07, + "output_cost_per_token_flex": 2e-07, + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/batch", + "/v1/responses" + ], + "supported_modalities": [ + "text", + "image" + ], + "supported_output_modalities": [ + "text" + ], + "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_system_messages": true, + "supports_tool_choice": true, + "supports_vision": true, + "supports_web_search": true, + "supports_none_reasoning_effort": true, + "supports_xhigh_reasoning_effort": false, + "supports_minimal_reasoning_effort": true + }, "gpt-5.2-codex": { "cache_read_input_token_cost": 1.75e-07, "cache_read_input_token_cost_priority": 3.5e-07, diff --git a/tests/test_litellm/llms/openai/test_gpt5_transformation.py b/tests/test_litellm/llms/openai/test_gpt5_transformation.py index 6383bfc9e18..f69400dfbd1 100644 --- a/tests/test_litellm/llms/openai/test_gpt5_transformation.py +++ b/tests/test_litellm/llms/openai/test_gpt5_transformation.py @@ -276,6 +276,8 @@ def test_gpt5_1_model_detection(gpt5_config: OpenAIGPT5Config): assert gpt5_config._supports_reasoning_effort_level("gpt-5.1", "none") assert gpt5_config._supports_reasoning_effort_level("gpt-5.1-2025-11-13", "none") assert gpt5_config._supports_reasoning_effort_level("gpt-5.1-chat-latest", "none") + assert gpt5_config._supports_reasoning_effort_level("gpt-5.1-mini", "none") + assert gpt5_config._supports_reasoning_effort_level("gpt-5.1-nano", "none") assert gpt5_config._supports_reasoning_effort_level("gpt-5.2", "none") assert gpt5_config._supports_reasoning_effort_level("gpt-5.2-2025-12-11", "none") # codex/pro/chat variants do not support none @@ -304,6 +306,25 @@ def test_gpt5_1_temperature_with_reasoning_effort_none(config: OpenAIConfig): assert params["reasoning_effort"] == "none" +def test_gpt5_1_mini_nano_temperature_with_reasoning_effort_none( + config: OpenAIConfig, +): + """Test that gpt-5.1-mini and gpt-5.1-nano support temperature when + reasoning_effort='none' (registry parity with bare gpt-5.1).""" + for model in ["gpt-5.1-mini", "gpt-5.1-nano"]: + for temp in [0.0, 0.7, 1.0, 1.5]: + params = config.map_openai_params( + non_default_params={"temperature": temp, "reasoning_effort": "none"}, + optional_params={}, + model=model, + drop_params=False, + ) + assert params["temperature"] == temp, ( + f"{model} should preserve temperature={temp} with effort='none'" + ) + assert params["reasoning_effort"] == "none" + + def test_gpt5_2_temperature_with_reasoning_effort_none(config: OpenAIConfig): """Test that GPT-5.2 aligns with GPT-5.1 temperature rules when effort='none'.""" for temp in [0.0, 0.3, 0.7, 1.0, 1.5]: