From ea5f326e26c12c3f5cce7269fd11969a5a21a713 Mon Sep 17 00:00:00 2001 From: dhruvindave007 <160149487+dhruvindave007@users.noreply.github.com> Date: Thu, 29 Oct 2026 20:40:07 +0530 Subject: [PATCH] fix(openai): keep the system role for o3, o3-mini and o4-mini The o-series transform rewrites a system message as a user message when the cost map does not flag the model with supports_system_messages. Only the o1 rows carried the flag, so every o3, o3-mini and o4-mini request (OpenAI and Azure) silently demoted its system prompt to user-level authority Flag those rows in the cost map and its bundled backup, and add a regression test that the system role survives for them on both the OpenAI and Azure configs --- ...odel_prices_and_context_window_backup.json | 33 ++++++++++++++++--- model_prices_and_context_window.json | 33 ++++++++++++++++--- .../openai/test_o_series_transformation.py | 22 +++++++++++++ 3 files changed, 80 insertions(+), 8 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index d68eb3ce775..fd7c289527c 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -5359,6 +5359,7 @@ "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", "supports_prompt_caching": true, "supports_reasoning": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -5376,6 +5377,7 @@ "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", "supports_prompt_caching": true, "supports_reasoning": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -11347,6 +11349,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -11384,6 +11387,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -11439,6 +11443,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -11456,6 +11461,7 @@ "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", "supports_prompt_caching": true, "supports_reasoning": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -11563,6 +11569,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -11588,6 +11595,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -12290,6 +12298,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -12327,6 +12336,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -12344,6 +12354,7 @@ "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", "supports_prompt_caching": true, "supports_reasoning": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -12361,6 +12372,7 @@ "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", "supports_prompt_caching": true, "supports_reasoning": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -12386,6 +12398,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -12411,6 +12424,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -44857,6 +44871,7 @@ "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 @@ -44972,6 +44987,7 @@ "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 @@ -44993,6 +45009,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -45013,6 +45030,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -45133,6 +45151,7 @@ "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 @@ -45228,6 +45247,7 @@ "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 @@ -69203,6 +69223,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -70783,7 +70804,8 @@ "search_context_size_low": 0.014, "search_context_size_medium": 0.014 }, - "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'" + "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", + "supports_system_messages": true }, "azure/eu/o3-2025-04-16": { "deprecation_date": "2026-11-19", @@ -70801,7 +70823,8 @@ "search_context_size_low": 0.014, "search_context_size_medium": 0.014 }, - "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'" + "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", + "supports_system_messages": true }, "azure/eu/o3-deep-research": { "deprecation_date": "2026-11-19", @@ -70828,7 +70851,8 @@ "search_context_size_low": 0.014, "search_context_size_medium": 0.014 }, - "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'" + "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", + "supports_system_messages": true }, "azure/eu/o4-mini-2025-04-16": { "deprecation_date": "2026-11-19", @@ -70846,7 +70870,8 @@ "search_context_size_low": 0.014, "search_context_size_medium": 0.014 }, - "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'" + "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", + "supports_system_messages": true }, "azure/eu/text-embedding-3-large": { "deprecation_date": "2028-02-09", diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index d68eb3ce775..fd7c289527c 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -5359,6 +5359,7 @@ "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", "supports_prompt_caching": true, "supports_reasoning": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -5376,6 +5377,7 @@ "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", "supports_prompt_caching": true, "supports_reasoning": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -11347,6 +11349,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -11384,6 +11387,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -11439,6 +11443,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -11456,6 +11461,7 @@ "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", "supports_prompt_caching": true, "supports_reasoning": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -11563,6 +11569,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -11588,6 +11595,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -12290,6 +12298,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -12327,6 +12336,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -12344,6 +12354,7 @@ "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", "supports_prompt_caching": true, "supports_reasoning": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -12361,6 +12372,7 @@ "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", "supports_prompt_caching": true, "supports_reasoning": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -12386,6 +12398,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -12411,6 +12424,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": true }, @@ -44857,6 +44871,7 @@ "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 @@ -44972,6 +44987,7 @@ "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 @@ -44993,6 +45009,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -45013,6 +45030,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -45133,6 +45151,7 @@ "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 @@ -45228,6 +45247,7 @@ "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 @@ -69203,6 +69223,7 @@ "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -70783,7 +70804,8 @@ "search_context_size_low": 0.014, "search_context_size_medium": 0.014 }, - "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'" + "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", + "supports_system_messages": true }, "azure/eu/o3-2025-04-16": { "deprecation_date": "2026-11-19", @@ -70801,7 +70823,8 @@ "search_context_size_low": 0.014, "search_context_size_medium": 0.014 }, - "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'" + "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", + "supports_system_messages": true }, "azure/eu/o3-deep-research": { "deprecation_date": "2026-11-19", @@ -70828,7 +70851,8 @@ "search_context_size_low": 0.014, "search_context_size_medium": 0.014 }, - "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'" + "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", + "supports_system_messages": true }, "azure/eu/o4-mini-2025-04-16": { "deprecation_date": "2026-11-19", @@ -70846,7 +70870,8 @@ "search_context_size_low": 0.014, "search_context_size_medium": 0.014 }, - "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'" + "source": "https://prices.azure.com/api/retail/prices?$filter=serviceName%20eq%20'Foundry%20Models'%20and%20armRegionName%20eq%20'eastus'%20and%20priceType%20eq%20'Consumption'", + "supports_system_messages": true }, "azure/eu/text-embedding-3-large": { "deprecation_date": "2028-02-09", diff --git a/tests/unit/llms/openai/test_o_series_transformation.py b/tests/unit/llms/openai/test_o_series_transformation.py index 9d39dfda60a..a59928d83f2 100644 --- a/tests/unit/llms/openai/test_o_series_transformation.py +++ b/tests/unit/llms/openai/test_o_series_transformation.py @@ -6,6 +6,7 @@ import pytest import litellm from litellm import ModelResponse +from litellm.llms.azure.chat.o_series_transformation import AzureOpenAIO1Config from litellm.llms.openai.chat.o_series_transformation import OpenAIOSeriesConfig import os @@ -219,3 +220,24 @@ def test_o_series_request_turns_system_into_user_without_touching_the_callers_me assert [message["role"] for message in body["messages"]] == ["user", "user"] assert messages == messages_before + + +@pytest.mark.parametrize( + "config", + [OpenAIOSeriesConfig(), AzureOpenAIO1Config()], + ids=["openai", "azure"], +) +@pytest.mark.parametrize("model", ["o3", "o3-2025-04-16", "o4-mini", "o4-mini-2025-04-16", "o3-mini"]) +def test_o_series_keeps_system_role_for_models_that_support_it(config: OpenAIOSeriesConfig, model: str): + """o1-2024-12-17 and later reasoning models accept system messages, which the API treats as developer messages + (https://platform.openai.com/docs/guides/reasoning, checked 2026-10-28). Rewriting them as user messages drops + them to user-level authority""" + system_message: Final = {"role": "system", "content": "Be a good bot!"} + request: Final = config.transform_request( + model=model, + messages=[dict(system_message), {"role": "user", "content": "hi"}], + optional_params={}, + litellm_params={}, + headers={}, + ) + assert request["messages"][0] == system_message