From e5f8a2a7dae76927cc904e4e8cd0e73e42a22287 Mon Sep 17 00:00:00 2001 From: Marcelo Emmerich Date: Sun, 15 Mar 2026 13:39:39 +0100 Subject: [PATCH] fix(openai): use max_completion_tokens and skip temperature for GPT-5/o-series models (#213) GPT-5 and o-series models reject the legacy max_tokens parameter and require max_completion_tokens instead. Additionally, gpt-5-mini, gpt-5-nano, and o-series models only support the default temperature (1). This patch adds model-aware branching in buildRequestBody() to: - Send max_completion_tokens instead of max_tokens for gpt-5*/o1/o3/o4 - Skip temperature parameter for gpt-5-mini/gpt-5-nano/o-series Co-authored-by: Marcelo Emmerich --- internal/providers/openai.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/internal/providers/openai.go b/internal/providers/openai.go index f9ad5f8f..9fe929a0 100644 --- a/internal/providers/openai.go +++ b/internal/providers/openai.go @@ -313,10 +313,18 @@ func (p *OpenAIProvider) buildRequestBody(model string, req ChatRequest, stream // Merge options if v, ok := req.Options[OptMaxTokens]; ok { - body["max_tokens"] = v + if strings.HasPrefix(model, "gpt-5") || strings.HasPrefix(model, "o1") || strings.HasPrefix(model, "o3") || strings.HasPrefix(model, "o4") { + body["max_completion_tokens"] = v + } else { + body["max_tokens"] = v + } } if v, ok := req.Options[OptTemperature]; ok { - body["temperature"] = v + // GPT-5 mini/nano and o-series models only support default temperature + skipTemp := strings.HasPrefix(model, "gpt-5-mini") || strings.HasPrefix(model, "gpt-5-nano") || strings.HasPrefix(model, "o1") || strings.HasPrefix(model, "o3") || strings.HasPrefix(model, "o4") + if !skipTemp { + body["temperature"] = v + } } // Inject reasoning_effort for o-series models (ignored by models that don't support it)