From 484a8595e4558e4e5f2879367f2598e47e1e18a7 Mon Sep 17 00:00:00 2001 From: OswinWu Date: Fri, 23 Aug 2024 17:16:09 +0800 Subject: [PATCH 1/6] =?UTF-8?q?fix:=20=E5=A4=9A=E5=9C=B0=E5=8C=BAoutlook?= =?UTF-8?q?=E9=82=AE=E7=AE=B1=E5=92=8Cofb=E9=82=AE=E7=AE=B1Auth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/email-outlook-auth.go | 8 ++++++++ common/email.go | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/common/email-outlook-auth.go b/common/email-outlook-auth.go index 723a10b..f6a71b8 100644 --- a/common/email-outlook-auth.go +++ b/common/email-outlook-auth.go @@ -3,6 +3,7 @@ package common import ( "errors" "net/smtp" + "strings" ) type outlookAuth struct { @@ -30,3 +31,10 @@ func (a *outlookAuth) Next(fromServer []byte, more bool) ([]byte, error) { } return nil, nil } + +func isOutlookServer(server string) bool { + // 兼容多地区的outlook邮箱和ofb邮箱 + // 其实应该加一个Option来区分是否用LOGIN的方式登录 + // 先临时兼容一下 + return strings.Contains(server, "outlook") || strings.Contains(server, "onmicrosoft") +} diff --git a/common/email.go b/common/email.go index b23bb23..905f385 100644 --- a/common/email.go +++ b/common/email.go @@ -68,7 +68,7 @@ func SendEmail(subject string, receiver string, content string) error { if err != nil { return err } - } else if strings.HasSuffix(SMTPAccount, "outlook.com") { + } else if isOutlookServer(SMTPAccount) { auth = LoginAuth(SMTPAccount, SMTPToken) err = smtp.SendMail(addr, auth, SMTPAccount, to, mail) } else { From 144513f1d841fd178403b1ec6b117f06b053b442 Mon Sep 17 00:00:00 2001 From: CalciumIon <1808837298@qq.com> Date: Fri, 23 Aug 2024 23:21:37 +0800 Subject: [PATCH 2/6] feat: rerank model mapping (close #444) --- relay/relay_rerank.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/relay/relay_rerank.go b/relay/relay_rerank.go index 9885fd3..4242155 100644 --- a/relay/relay_rerank.go +++ b/relay/relay_rerank.go @@ -38,6 +38,23 @@ func RerankHelper(c *gin.Context, relayMode int) *dto.OpenAIErrorWithStatusCode if len(rerankRequest.Documents) == 0 { return service.OpenAIErrorWrapperLocal(fmt.Errorf("documents is empty"), "invalid_documents", http.StatusBadRequest) } + + // map model name + modelMapping := c.GetString("model_mapping") + //isModelMapped := false + if modelMapping != "" && modelMapping != "{}" { + modelMap := make(map[string]string) + err := json.Unmarshal([]byte(modelMapping), &modelMap) + if err != nil { + return service.OpenAIErrorWrapperLocal(err, "unmarshal_model_mapping_failed", http.StatusInternalServerError) + } + if modelMap[rerankRequest.Model] != "" { + rerankRequest.Model = modelMap[rerankRequest.Model] + // set upstream model name + //isModelMapped = true + } + } + relayInfo.UpstreamModelName = rerankRequest.Model modelPrice, success := common.GetModelPrice(rerankRequest.Model, false) groupRatio := common.GetGroupRatio(relayInfo.Group) From 967ccabb56b3fb896fd1e71af5b54e81152a2fe1 Mon Sep 17 00:00:00 2001 From: Xyfacai Date: Sat, 24 Aug 2024 13:36:41 +0800 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20dall-e-2=20?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- relay/relay-image.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/relay/relay-image.go b/relay/relay-image.go index 74d6c30..411a2c3 100644 --- a/relay/relay-image.go +++ b/relay/relay-image.go @@ -38,9 +38,7 @@ func getAndValidImageRequest(c *gin.Context, info *relaycommon.RelayInfo) (*dto. if imageRequest.Model == "" { imageRequest.Model = "dall-e-2" } - if imageRequest.Quality == "" { - imageRequest.Quality = "standard" - } + // Not "256x256", "512x512", or "1024x1024" if imageRequest.Model == "dall-e-2" || imageRequest.Model == "dall-e" { if imageRequest.Size != "" && imageRequest.Size != "256x256" && imageRequest.Size != "512x512" && imageRequest.Size != "1024x1024" { @@ -50,6 +48,9 @@ func getAndValidImageRequest(c *gin.Context, info *relaycommon.RelayInfo) (*dto. if imageRequest.Size != "" && imageRequest.Size != "1024x1024" && imageRequest.Size != "1024x1792" && imageRequest.Size != "1792x1024" { return nil, errors.New("size must be one of 256x256, 512x512, or 1024x1024, dall-e-3 1024x1792 or 1792x1024") } + if imageRequest.Quality == "" { + imageRequest.Quality = "standard" + } //if imageRequest.N != 1 { // return nil, errors.New("n must be 1") //} From a8ac8a25d522dceda91112b3ca92f2559a808316 Mon Sep 17 00:00:00 2001 From: CalciumIon <1808837298@qq.com> Date: Sat, 24 Aug 2024 17:15:55 +0800 Subject: [PATCH 4/6] feat: format claude messages when first role is not user --- relay/channel/claude/relay-claude.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index 47abe31..1c9d4e6 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -139,6 +139,7 @@ func RequestOpenAI2ClaudeMessage(textRequest dto.GeneralOpenAIRequest) (*ClaudeR } claudeMessages := make([]ClaudeMessage, 0) + isFirstMessage := true for _, message := range formatMessages { if message.Role == "system" { if message.IsStringContent() { @@ -154,6 +155,22 @@ func RequestOpenAI2ClaudeMessage(textRequest dto.GeneralOpenAIRequest) (*ClaudeR claudeRequest.System = content } } else { + if isFirstMessage { + isFirstMessage = false + if message.Role != "user" { + // fix: first message is assistant, add user message + claudeMessage := ClaudeMessage{ + Role: "user", + Content: []ClaudeMediaMessage{ + { + Type: "text", + Text: "...", + }, + }, + } + claudeMessages = append(claudeMessages, claudeMessage) + } + } claudeMessage := ClaudeMessage{ Role: message.Role, } From ff0985f06e7df6e49dd0ea4c24c4a3dcf4f59035 Mon Sep 17 00:00:00 2001 From: CalciumIon <1808837298@qq.com> Date: Sat, 24 Aug 2024 17:23:24 +0800 Subject: [PATCH 5/6] fix: channel auto ban #443 --- service/channel.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/service/channel.go b/service/channel.go index 5716a6d..b370a43 100644 --- a/service/channel.go +++ b/service/channel.go @@ -54,6 +54,8 @@ func ShouldDisableChannel(channelType int, err *relaymodel.OpenAIErrorWithStatus switch err.Error.Type { case "insufficient_quota": return true + case "insufficient_user_quota": + return true // https://docs.anthropic.com/claude/reference/errors case "authentication_error": return true From 46e03683ce668082f10ad914a0cf0e67bf8d43e1 Mon Sep 17 00:00:00 2001 From: CalciumIon <1808837298@qq.com> Date: Sat, 24 Aug 2024 17:27:14 +0800 Subject: [PATCH 6/6] fix: channel auto ban --- controller/relay.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/controller/relay.go b/controller/relay.go index 13fbde0..875222d 100644 --- a/controller/relay.go +++ b/controller/relay.go @@ -121,6 +121,9 @@ func shouldRetry(c *gin.Context, openaiErr *dto.OpenAIErrorWithStatusCode, retry if openaiErr == nil { return false } + if openaiErr.LocalError { + return false + } if retryTimes <= 0 { return false } @@ -151,9 +154,6 @@ func shouldRetry(c *gin.Context, openaiErr *dto.OpenAIErrorWithStatusCode, retry // azure处理超时不重试 return false } - if openaiErr.LocalError { - return false - } if openaiErr.StatusCode/100 == 2 { return false }