diff --git a/litellm/llms/azure/chat/gpt_5_transformation.py b/litellm/llms/azure/chat/gpt_5_transformation.py index f1bfd96de94..ac74ee0a942 100644 --- a/litellm/llms/azure/chat/gpt_5_transformation.py +++ b/litellm/llms/azure/chat/gpt_5_transformation.py @@ -18,6 +18,11 @@ class AzureOpenAIGPT5Config(AzureOpenAIConfig, OpenAIGPT5Config): GPT5_SERIES_ROUTE = "gpt5_series/" + @classmethod + def _rejects_non_default_temperature(cls, model: str) -> bool: + model_name = model.split("/")[-1] + return model_name.startswith(("gpt-5.5", "gpt-5.6")) + @classmethod def _supports_reasoning_effort_level(cls, model: str, level: str) -> bool: """Override to handle gpt5_series/ prefix used for Azure routing. @@ -93,6 +98,20 @@ class AzureOpenAIGPT5Config(AzureOpenAIConfig, OpenAIGPT5Config): drop_params: bool, api_version: str = "", ) -> dict: + temperature_value = non_default_params.get("temperature") + if self._rejects_non_default_temperature(model) and temperature_value not in (None, 1): + if litellm.drop_params is True or drop_params is True: + non_default_params = {key: value for key, value in non_default_params.items() if key != "temperature"} + else: + raise UnsupportedParamsError( + status_code=400, + message=( + f"Azure OpenAI {model} does not support temperature={temperature_value}. " + "Only temperature=1 is supported. " + "To drop unsupported params set `litellm.drop_params = True`" + ), + ) + reasoning_effort_value = non_default_params.get("reasoning_effort") or optional_params.get("reasoning_effort") effective_effort = _get_effort_level(reasoning_effort_value) diff --git a/tests/test_litellm/llms/azure/chat/test_azure_gpt5_transformation.py b/tests/test_litellm/llms/azure/chat/test_azure_gpt5_transformation.py index 83562331b9a..3c4dee4c196 100644 --- a/tests/test_litellm/llms/azure/chat/test_azure_gpt5_transformation.py +++ b/tests/test_litellm/llms/azure/chat/test_azure_gpt5_transformation.py @@ -50,6 +50,75 @@ def test_azure_gpt5_temperature_error(config: AzureOpenAIGPT5Config): ) +@pytest.mark.parametrize( + "model", + [ + "azure/gpt-5.5", + "azure/gpt-5.5-2026-04-23", + "azure/gpt-5.6", + "azure/gpt-5.6-luna", + "azure/gpt-5.6-sol", + "azure/gpt-5.6-terra", + "gpt5_series/gpt-5.6-luna", + ], +) +def test_azure_gpt5_5_and_5_6_non_default_temperature( + config: AzureOpenAIGPT5Config, + model: str, + monkeypatch: pytest.MonkeyPatch, +): + assert ( + config.map_openai_params( + non_default_params={"temperature": 0.3}, + optional_params={}, + model=model, + drop_params=True, + ) + == {} + ) + + monkeypatch.setattr(litellm, "drop_params", True) + assert ( + config.map_openai_params( + non_default_params={"temperature": 0.3}, + optional_params={}, + model=model, + drop_params=False, + ) + == {} + ) + + monkeypatch.setattr(litellm, "drop_params", False) + with pytest.raises(litellm.utils.UnsupportedParamsError): + config.map_openai_params( + non_default_params={"temperature": 0.3}, + optional_params={}, + model=model, + drop_params=False, + ) + + +@pytest.mark.parametrize( + ("model", "temperature"), + [ + ("azure/gpt-5.4", 0.3), + ("azure/gpt-5.5", 1), + ("azure/gpt-5.6-sol", 1.0), + ], +) +def test_azure_gpt5_temperature_supported_values_unchanged( + config: AzureOpenAIGPT5Config, + model: str, + temperature: float, +): + assert config.map_openai_params( + non_default_params={"temperature": temperature}, + optional_params={}, + model=model, + drop_params=False, + )["temperature"] == temperature + + def test_azure_gpt5_series_transform_request(config: AzureOpenAIGPT5Config): request = config.transform_request( model="gpt5_series/gpt-5",