Просмотр исходного кода

fix: minimax error try handler (#292)

zijiren 6 месяцев назад
Родитель
Сommit
8e79bdb6d9

+ 3 - 0
core/relay/adaptor/minimax/adaptor.go

@@ -97,6 +97,9 @@ func (a *Adaptor) DoResponse(
 	case mode.AudioSpeech:
 		return TTSHandler(meta, c, resp)
 	default:
+		if err := TryErrorHanlder(resp); err != nil {
+			return model.Usage{}, err
+		}
 		return a.Adaptor.DoResponse(meta, store, c, resp)
 	}
 }

+ 72 - 0
core/relay/adaptor/minimax/error.go

@@ -0,0 +1,72 @@
+package minimax
+
+import (
+	"bytes"
+	"io"
+	"net/http"
+	"strconv"
+	"strings"
+
+	"github.com/bytedance/sonic"
+	"github.com/labring/aiproxy/core/relay/adaptor"
+	relaymodel "github.com/labring/aiproxy/core/relay/model"
+)
+
+type BaseResp struct {
+	StatusMsg  string `json:"status_msg"`
+	StatusCode int    `json:"status_code"`
+}
+
+type ErrorResponse struct {
+	BaseResp *BaseResp `json:"base_resp"`
+}
+
+func TryErrorHanlder(resp *http.Response) adaptor.Error {
+	defer resp.Body.Close()
+
+	respBody, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return relaymodel.NewOpenAIError(resp.StatusCode, relaymodel.OpenAIError{
+			Message: err.Error(),
+			Type:    relaymodel.ErrorTypeUpstream,
+			Code:    relaymodel.ErrorCodeBadResponse,
+		})
+	}
+
+	var result ErrorResponse
+	if err := sonic.Unmarshal(respBody, &result); err != nil {
+		return relaymodel.WrapperOpenAIError(
+			err,
+			"TTS_ERROR",
+			http.StatusInternalServerError,
+		)
+	}
+	if result.BaseResp != nil && result.BaseResp.StatusCode != 0 {
+		statusCode := http.StatusInternalServerError
+		switch {
+		case result.BaseResp.StatusCode == 1008,
+			strings.Contains(result.BaseResp.StatusMsg, "insufficient balance"):
+			statusCode = http.StatusPaymentRequired
+		case result.BaseResp.StatusCode == 1001:
+			statusCode = http.StatusRequestTimeout
+		case result.BaseResp.StatusCode == 1004:
+			statusCode = http.StatusForbidden
+		case result.BaseResp.StatusCode == 1026,
+			result.BaseResp.StatusCode == 1027,
+			result.BaseResp.StatusCode == 2013:
+			statusCode = http.StatusBadRequest
+		case result.BaseResp.StatusCode == 1039:
+			statusCode = http.StatusTooManyRequests
+		}
+		return relaymodel.WrapperOpenAIErrorWithMessage(
+			result.BaseResp.StatusMsg,
+			strconv.Itoa(result.BaseResp.StatusCode),
+			statusCode,
+			relaymodel.ErrorTypeUpstream,
+		)
+	}
+
+	resp.Body = io.NopCloser(bytes.NewReader(respBody))
+
+	return nil
+}

+ 2 - 17
core/relay/adaptor/minimax/tts.go

@@ -97,18 +97,12 @@ type TTSExtraInfo struct {
 	UsageCharacters int64  `json:"usage_characters"`
 }
 
-type TTSBaseResp struct {
-	StatusMsg  string `json:"status_msg"`
-	StatusCode int    `json:"status_code"`
-}
-
 type TTSData struct {
 	Audio  string `json:"audio"`
 	Status int    `json:"status"`
 }
 
 type TTSResponse struct {
-	BaseResp  *TTSBaseResp `json:"base_resp"`
 	ExtraInfo TTSExtraInfo `json:"extra_info"`
 	Data      TTSData      `json:"data"`
 }
@@ -118,8 +112,8 @@ func TTSHandler(
 	c *gin.Context,
 	resp *http.Response,
 ) (model.Usage, adaptor.Error) {
-	if resp.StatusCode != http.StatusOK {
-		return model.Usage{}, openai.ErrorHanlder(resp)
+	if err := TryErrorHanlder(resp); err != nil {
+		return model.Usage{}, err
 	}
 
 	if !strings.Contains(resp.Header.Get("Content-Type"), "application/json") &&
@@ -148,13 +142,6 @@ func TTSHandler(
 			http.StatusInternalServerError,
 		)
 	}
-	if result.BaseResp != nil && result.BaseResp.StatusCode != 0 {
-		return model.Usage{}, relaymodel.WrapperOpenAIErrorWithMessage(
-			result.BaseResp.StatusMsg,
-			"TTS_ERROR_"+strconv.Itoa(result.BaseResp.StatusCode),
-			http.StatusInternalServerError,
-		)
-	}
 
 	usageCharacters := meta.RequestUsage.InputTokens
 	if result.ExtraInfo.UsageCharacters > 0 {
@@ -166,8 +153,6 @@ func TTSHandler(
 		TotalTokens: usageCharacters,
 	}
 
-	resp.Header.Set("Content-Type", "audio/"+result.ExtraInfo.AudioFormat)
-
 	audioBytes, err := hex.DecodeString(result.Data.Audio)
 	if err != nil {
 		return usage, relaymodel.WrapperOpenAIError(

+ 13 - 4
core/relay/model/chat.go

@@ -87,14 +87,23 @@ func NewOpenAIError(statusCode int, err OpenAIError) adaptor.Error {
 	})
 }
 
-func WrapperOpenAIError(err error, code any, statusCode int) adaptor.Error {
-	return WrapperOpenAIErrorWithMessage(err.Error(), code, statusCode)
+func WrapperOpenAIError(err error, code any, statusCode int, _type ...string) adaptor.Error {
+	return WrapperOpenAIErrorWithMessage(err.Error(), code, statusCode, _type...)
 }
 
-func WrapperOpenAIErrorWithMessage(message string, code any, statusCode int) adaptor.Error {
+func WrapperOpenAIErrorWithMessage(
+	message string,
+	code any,
+	statusCode int,
+	_type ...string,
+) adaptor.Error {
+	errType := ErrorTypeAIPROXY
+	if len(_type) > 0 {
+		errType = _type[0]
+	}
 	return NewOpenAIError(statusCode, OpenAIError{
 		Message: message,
-		Type:    ErrorTypeAIPROXY,
+		Type:    errType,
 		Code:    code,
 	})
 }