fix(proxy): use max_completion_tokens for o1/o3 series models (#1451)

* fix(proxy): use max_completion_tokens for o1/o3 series models

When converting Anthropic requests to OpenAI format for o1/o3 series
models (like o1-mini, o3-mini), use max_completion_tokens instead of
max_tokens to avoid unsupported_parameter errors.

Fixes #1448

* fix: revert incorrect o-series max_completion_tokens in Responses API path

Responses API uses max_output_tokens for all models including o-series.
The o-series max_completion_tokens fix should only apply to Chat Completions API.

---------

Co-authored-by: Hajen Teowideo <hajen.teowideo@example.com>
Co-authored-by: Jason Young <44939412+farion1231@users.noreply.github.com>
Co-authored-by: Jason <farion1231@gmail.com>
This commit is contained in:
Hemilt0n
2026-03-15 20:39:17 +08:00
committed by GitHub
parent 5c03de53f7
commit f38facd430
2 changed files with 77 additions and 3 deletions
@@ -45,7 +45,7 @@ pub fn anthropic_to_responses(body: Value, cache_key: Option<&str>) -> Result<Va
result["input"] = json!(input);
}
// max_tokens → max_output_tokens
// max_tokens → max_output_tokens (Responses API uses max_output_tokens for all models)
if let Some(v) = body.get("max_tokens") {
result["max_output_tokens"] = v.clone();
}
@@ -897,4 +897,17 @@ mod tests {
assert_eq!(result["usage"]["cache_read_input_tokens"], 60);
assert_eq!(result["usage"]["cache_creation_input_tokens"], 20);
}
#[test]
fn test_anthropic_to_responses_o_series_uses_max_output_tokens() {
// Responses API always uses max_output_tokens, even for o-series models
let input = json!({
"model": "o3-mini",
"max_tokens": 4096,
"messages": [{"role": "user", "content": "Hello"}]
});
let result = anthropic_to_responses(input, None).unwrap();
assert_eq!(result["max_output_tokens"], 4096);
assert!(result.get("max_completion_tokens").is_none());
}
}