From 867d8acfc3cb001cc560869bd52b9c1c21cff99a Mon Sep 17 00:00:00 2001 From: Benson Yan Date: Wed, 10 Jun 2026 17:19:57 +0800 Subject: [PATCH] fix: normalize kimi k2.6 temperature (#5390) --- relay/channel/moonshot/adaptor.go | 16 ++++++ relay/channel/moonshot/adaptor_test.go | 68 ++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 relay/channel/moonshot/adaptor_test.go diff --git a/relay/channel/moonshot/adaptor.go b/relay/channel/moonshot/adaptor.go index c2f6ee4a..c90ae073 100644 --- a/relay/channel/moonshot/adaptor.go +++ b/relay/channel/moonshot/adaptor.go @@ -5,7 +5,9 @@ import ( "fmt" "io" "net/http" + "strings" + "github.com/QuantumNous/new-api/common" channelconstant "github.com/QuantumNous/new-api/constant" "github.com/QuantumNous/new-api/dto" "github.com/QuantumNous/new-api/relay/channel" @@ -79,9 +81,23 @@ func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Header, info *rel } func (a *Adaptor) ConvertOpenAIRequest(c *gin.Context, info *relaycommon.RelayInfo, request *dto.GeneralOpenAIRequest) (any, error) { + if request.Temperature != nil && isTemperatureOneOnlyModel(getUpstreamModelName(info, request.Model)) && *request.Temperature != 1.0 { + request.Temperature = common.GetPointer[float64](1.0) + } return request, nil } +func getUpstreamModelName(info *relaycommon.RelayInfo, fallback string) string { + if info != nil && info.ChannelMeta != nil && info.UpstreamModelName != "" { + return info.UpstreamModelName + } + return fallback +} + +func isTemperatureOneOnlyModel(model string) bool { + return strings.EqualFold(model, "kimi-k2.6") +} + func (a *Adaptor) ConvertOpenAIResponsesRequest(c *gin.Context, info *relaycommon.RelayInfo, request dto.OpenAIResponsesRequest) (any, error) { // TODO implement me return nil, errors.New("not implemented") diff --git a/relay/channel/moonshot/adaptor_test.go b/relay/channel/moonshot/adaptor_test.go new file mode 100644 index 00000000..cfa1cb49 --- /dev/null +++ b/relay/channel/moonshot/adaptor_test.go @@ -0,0 +1,68 @@ +package moonshot + +import ( + "testing" + + "github.com/QuantumNous/new-api/common" + "github.com/QuantumNous/new-api/dto" + relaycommon "github.com/QuantumNous/new-api/relay/common" + "github.com/stretchr/testify/require" +) + +func TestConvertOpenAIRequestKimiK26UsesOnlyAllowedTemperature(t *testing.T) { + request := &dto.GeneralOpenAIRequest{ + Model: "kimi-k2.6", + Temperature: common.GetPointer[float64](0.7), + } + info := &relaycommon.RelayInfo{ + ChannelMeta: &relaycommon.ChannelMeta{ + UpstreamModelName: "kimi-k2.6", + }, + } + + converted, err := (&Adaptor{}).ConvertOpenAIRequest(nil, info, request) + + require.NoError(t, err) + convertedRequest, ok := converted.(*dto.GeneralOpenAIRequest) + require.True(t, ok) + require.NotNil(t, convertedRequest.Temperature) + require.Equal(t, 1.0, *convertedRequest.Temperature) +} + +func TestConvertOpenAIRequestKimiK26KeepsOmittedTemperatureOmitted(t *testing.T) { + request := &dto.GeneralOpenAIRequest{ + Model: "kimi-k2.6", + } + info := &relaycommon.RelayInfo{ + ChannelMeta: &relaycommon.ChannelMeta{ + UpstreamModelName: "kimi-k2.6", + }, + } + + converted, err := (&Adaptor{}).ConvertOpenAIRequest(nil, info, request) + + require.NoError(t, err) + convertedRequest, ok := converted.(*dto.GeneralOpenAIRequest) + require.True(t, ok) + require.Nil(t, convertedRequest.Temperature) +} + +func TestConvertOpenAIRequestOtherMoonshotModelKeepsTemperature(t *testing.T) { + request := &dto.GeneralOpenAIRequest{ + Model: "kimi-k2.5", + Temperature: common.GetPointer[float64](0.7), + } + info := &relaycommon.RelayInfo{ + ChannelMeta: &relaycommon.ChannelMeta{ + UpstreamModelName: "kimi-k2.5", + }, + } + + converted, err := (&Adaptor{}).ConvertOpenAIRequest(nil, info, request) + + require.NoError(t, err) + convertedRequest, ok := converted.(*dto.GeneralOpenAIRequest) + require.True(t, ok) + require.NotNil(t, convertedRequest.Temperature) + require.Equal(t, 0.7, *convertedRequest.Temperature) +}