From 2399de97daf6ac76e5378a7c7c244ff0628a8186 Mon Sep 17 00:00:00 2001 From: ENCHIGO <38551565+ENCHIGO@users.noreply.github.com> Date: Sat, 8 Aug 2026 13:54:00 +0800 Subject: [PATCH] fix(ali): stop injecting top_p into requests that omit it (#6674) --- relay/channel/ali/text.go | 18 ++++++++--- relay/channel/ali/text_test.go | 59 ++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 relay/channel/ali/text_test.go diff --git a/relay/channel/ali/text.go b/relay/channel/ali/text.go index eea13129..8e8f4c7c 100644 --- a/relay/channel/ali/text.go +++ b/relay/channel/ali/text.go @@ -18,11 +18,19 @@ func requestOpenAI2Ali(request dto.GeneralOpenAIRequest, upstreamModelName strin request.ThinkingBudget = nil } - topP := lo.FromPtrOr(request.TopP, 0) - if topP >= 1 { - request.TopP = lo.ToPtr(0.999) - } else if topP <= 0 { - request.TopP = lo.ToPtr(0.001) + // DashScope rejects top_p at the 0 and 1 boundaries, so an explicit value is + // clamped into the open interval. The clamp stays at two decimals because + // some models on the platform reject a third decimal with + // "top_p参数非法:限制小数点[2]位". + // + // A request that omits top_p is left untouched: injecting a value would + // silently replace the model's own default with near-greedy decoding. + if request.TopP != nil { + if *request.TopP >= 1 { + request.TopP = lo.ToPtr(0.99) + } else if *request.TopP <= 0 { + request.TopP = lo.ToPtr(0.01) + } } return &request } diff --git a/relay/channel/ali/text_test.go b/relay/channel/ali/text_test.go new file mode 100644 index 00000000..dc37e4ed --- /dev/null +++ b/relay/channel/ali/text_test.go @@ -0,0 +1,59 @@ +package ali + +import ( + "testing" + + "github.com/QuantumNous/new-api/relaykit/dto" + "github.com/samber/lo" + "github.com/stretchr/testify/assert" +) + +func TestRequestOpenAI2AliTopP(t *testing.T) { + tests := []struct { + name string + topP *float64 + want *float64 + }{ + { + name: "omitted top_p is not injected", + topP: nil, + want: nil, + }, + { + name: "in-range top_p is preserved", + topP: lo.ToPtr(0.8), + want: lo.ToPtr(0.8), + }, + { + name: "top_p of 1 is clamped to two decimals", + topP: lo.ToPtr(1.0), + want: lo.ToPtr(0.99), + }, + { + name: "top_p above 1 is clamped to two decimals", + topP: lo.ToPtr(1.5), + want: lo.ToPtr(0.99), + }, + { + name: "top_p of 0 is clamped to two decimals", + topP: lo.ToPtr(0.0), + want: lo.ToPtr(0.01), + }, + { + name: "negative top_p is clamped to two decimals", + topP: lo.ToPtr(-0.3), + want: lo.ToPtr(0.01), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := requestOpenAI2Ali(dto.GeneralOpenAIRequest{ + Model: "qwen-plus", + TopP: tt.topP, + }, "qwen-plus") + + assert.Equal(t, tt.want, got.TopP) + }) + } +}