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
This commit is contained in:
Jonathan Wrede 2026-05-09 09:17:32 +00:00
parent fa81017e12
commit ca8b2471c7
3 changed files with 42 additions and 1 deletions

View file

@ -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",

View file

@ -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

View file

@ -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