From ca8b2471c7b4a4271c1a1f1b66784a9567487bef Mon Sep 17 00:00:00 2001 From: Jonathan Wrede Date: Sat, 9 May 2026 09:17:32 +0000 Subject: [PATCH] fix(oci): map max_completion_tokens to maxCompletionTokens The OCI parameter mapping incorrectly maps max_completion_tokens to maxTokens (the legacy OCI field). OCI OpenAI GPT-5 models reject maxTokens and require maxCompletionTokens instead. Fix the mapping so max_completion_tokens maps to maxCompletionTokens while max_tokens continues to map to maxTokens for backward compatibility with older models. Fixes #27429 --- litellm/llms/oci/chat/transformation.py | 2 +- litellm/types/llms/oci.py | 1 + .../oci/chat/test_oci_chat_transformation.py | 40 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/litellm/llms/oci/chat/transformation.py b/litellm/llms/oci/chat/transformation.py index 62104e921a4..4ee935c6782 100644 --- a/litellm/llms/oci/chat/transformation.py +++ b/litellm/llms/oci/chat/transformation.py @@ -213,7 +213,7 @@ class OCIChatConfig(BaseConfig): self.openai_to_oci_generic_param_map = { "stream": "isStream", "max_tokens": "maxTokens", - "max_completion_tokens": "maxTokens", + "max_completion_tokens": "maxCompletionTokens", "temperature": "temperature", "tools": "tools", "frequency_penalty": "frequencyPenalty", diff --git a/litellm/types/llms/oci.py b/litellm/types/llms/oci.py index e041810158a..81237eef67f 100644 --- a/litellm/types/llms/oci.py +++ b/litellm/types/llms/oci.py @@ -96,6 +96,7 @@ class OCIChatRequestPayload(BaseModel): isStream: bool = False numGenerations: Optional[int] = None maxTokens: Optional[int] = None + maxCompletionTokens: Optional[int] = None temperature: Optional[float] = None topP: Optional[float] = None stop: Optional[List[str]] = None diff --git a/tests/test_litellm/llms/oci/chat/test_oci_chat_transformation.py b/tests/test_litellm/llms/oci/chat/test_oci_chat_transformation.py index 2a5cc6b8e3d..7d7df989841 100644 --- a/tests/test_litellm/llms/oci/chat/test_oci_chat_transformation.py +++ b/tests/test_litellm/llms/oci/chat/test_oci_chat_transformation.py @@ -765,3 +765,43 @@ class TestOCISignerSupport: ) assert wrapper.path_url == "/api/v1/chat" + + def test_max_completion_tokens_maps_to_maxCompletionTokens(self): + """ + max_completion_tokens should map to maxCompletionTokens, not maxTokens. + + Regression test for https://github.com/BerriAI/litellm/issues/27429 + """ + config = OCIChatConfig() + optional_params = { + "oci_compartment_id": TEST_COMPARTMENT_ID, + "max_completion_tokens": 100, + } + transformed_request = config.transform_request( + model=TEST_MODEL_NAME, + messages=TEST_MESSAGES, # type: ignore + optional_params=optional_params, + litellm_params={}, + headers={}, + ) + chat_request = transformed_request["chatRequest"] + assert chat_request.get("maxCompletionTokens") == 100 + assert "maxTokens" not in chat_request + + def test_max_tokens_maps_to_maxTokens(self): + """max_tokens (legacy param) should still map to maxTokens.""" + config = OCIChatConfig() + optional_params = { + "oci_compartment_id": TEST_COMPARTMENT_ID, + "max_tokens": 200, + } + transformed_request = config.transform_request( + model=TEST_MODEL_NAME, + messages=TEST_MESSAGES, # type: ignore + optional_params=optional_params, + litellm_params={}, + headers={}, + ) + chat_request = transformed_request["chatRequest"] + assert chat_request.get("maxTokens") == 200 + assert "maxCompletionTokens" not in chat_request