diff --git a/relay/channel/claude/adaptor.go b/relay/channel/claude/adaptor.go index a713c17d..6daf5b6f 100644 --- a/relay/channel/claude/adaptor.go +++ b/relay/channel/claude/adaptor.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "net/http" + "net/url" "github.com/QuantumNous/new-api/dto" "github.com/QuantumNous/new-api/relay/channel" @@ -41,11 +42,32 @@ func (a *Adaptor) Init(info *relaycommon.RelayInfo) { } func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) { - baseURL := fmt.Sprintf("%s/v1/messages", info.ChannelBaseUrl) - if info.IsClaudeBetaQuery { - baseURL = baseURL + "?beta=true" + requestURL := fmt.Sprintf("%s/v1/messages", info.ChannelBaseUrl) + if !shouldAppendClaudeBetaQuery(info) { + return requestURL, nil } - return baseURL, nil + + parsedURL, err := url.Parse(requestURL) + if err != nil { + return "", err + } + query := parsedURL.Query() + query.Set("beta", "true") + parsedURL.RawQuery = query.Encode() + return parsedURL.String(), nil +} + +func shouldAppendClaudeBetaQuery(info *relaycommon.RelayInfo) bool { + if info == nil { + return false + } + if info.IsClaudeBetaQuery { + return true + } + if info.ChannelOtherSettings.ClaudeBetaQuery { + return true + } + return false } func CommonClaudeHeadersOperation(c *gin.Context, req *http.Header, info *relaycommon.RelayInfo) { diff --git a/relay/common/relay_info.go b/relay/common/relay_info.go index c90ecb44..ef1411af 100644 --- a/relay/common/relay_info.go +++ b/relay/common/relay_info.go @@ -338,15 +338,10 @@ func GenRelayInfoClaude(c *gin.Context, request dto.Request) *RelayInfo { info.ClaudeConvertInfo = &ClaudeConvertInfo{ LastMessagesType: LastMessageTypeNone, } - info.IsClaudeBetaQuery = c.Query("beta") == "true" || isClaudeBetaForced(c) + info.IsClaudeBetaQuery = c.Query("beta") == "true" return info } -func isClaudeBetaForced(c *gin.Context) bool { - channelOtherSettings, ok := common.GetContextKeyType[dto.ChannelOtherSettings](c, constant.ContextKeyChannelOtherSetting) - return ok && channelOtherSettings.ClaudeBetaQuery -} - func GenRelayInfoRerank(c *gin.Context, request *dto.RerankRequest) *RelayInfo { info := genBaseRelayInfo(c, request) info.RelayMode = relayconstant.RelayModeRerank