|
|
@@ -90,9 +90,8 @@ func TextHelper(c *gin.Context) (newAPIError *types.NewAPIError) {
|
|
|
|
|
|
// get & validate textRequest 获取并验证文本请求
|
|
|
textRequest, err := getAndValidateTextRequest(c, relayInfo)
|
|
|
-
|
|
|
if err != nil {
|
|
|
- return types.NewError(err, types.ErrorCodeInvalidRequest)
|
|
|
+ return types.NewError(err, types.ErrorCodeInvalidRequest, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
|
|
|
if textRequest.WebSearchOptions != nil {
|
|
|
@@ -103,13 +102,13 @@ func TextHelper(c *gin.Context) (newAPIError *types.NewAPIError) {
|
|
|
words, err := checkRequestSensitive(textRequest, relayInfo)
|
|
|
if err != nil {
|
|
|
common.LogWarn(c, fmt.Sprintf("user sensitive words detected: %s", strings.Join(words, ", ")))
|
|
|
- return types.NewError(err, types.ErrorCodeSensitiveWordsDetected)
|
|
|
+ return types.NewError(err, types.ErrorCodeSensitiveWordsDetected, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
}
|
|
|
|
|
|
err = helper.ModelMappedHelper(c, relayInfo, textRequest)
|
|
|
if err != nil {
|
|
|
- return types.NewError(err, types.ErrorCodeChannelModelMappedError)
|
|
|
+ return types.NewError(err, types.ErrorCodeChannelModelMappedError, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
|
|
|
// 获取 promptTokens,如果上下文中已经存在,则直接使用
|
|
|
@@ -121,14 +120,14 @@ func TextHelper(c *gin.Context) (newAPIError *types.NewAPIError) {
|
|
|
promptTokens, err = getPromptTokens(textRequest, relayInfo)
|
|
|
// count messages token error 计算promptTokens错误
|
|
|
if err != nil {
|
|
|
- return types.NewError(err, types.ErrorCodeCountTokenFailed)
|
|
|
+ return types.NewError(err, types.ErrorCodeCountTokenFailed, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
c.Set("prompt_tokens", promptTokens)
|
|
|
}
|
|
|
|
|
|
priceData, err := helper.ModelPriceHelper(c, relayInfo, promptTokens, int(math.Max(float64(textRequest.MaxTokens), float64(textRequest.MaxCompletionTokens))))
|
|
|
if err != nil {
|
|
|
- return types.NewError(err, types.ErrorCodeModelPriceError)
|
|
|
+ return types.NewError(err, types.ErrorCodeModelPriceError, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
|
|
|
// pre-consume quota 预消耗配额
|
|
|
@@ -165,7 +164,7 @@ func TextHelper(c *gin.Context) (newAPIError *types.NewAPIError) {
|
|
|
|
|
|
adaptor := GetAdaptor(relayInfo.ApiType)
|
|
|
if adaptor == nil {
|
|
|
- return types.NewError(fmt.Errorf("invalid api type: %d", relayInfo.ApiType), types.ErrorCodeInvalidApiType)
|
|
|
+ return types.NewError(fmt.Errorf("invalid api type: %d", relayInfo.ApiType), types.ErrorCodeInvalidApiType, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
adaptor.Init(relayInfo)
|
|
|
var requestBody io.Reader
|
|
|
@@ -173,7 +172,7 @@ func TextHelper(c *gin.Context) (newAPIError *types.NewAPIError) {
|
|
|
if model_setting.GetGlobalSettings().PassThroughRequestEnabled || relayInfo.ChannelSetting.PassThroughBodyEnabled {
|
|
|
body, err := common.GetRequestBody(c)
|
|
|
if err != nil {
|
|
|
- return types.NewErrorWithStatusCode(err, types.ErrorCodeReadRequestBodyFailed, http.StatusBadRequest)
|
|
|
+ return types.NewErrorWithStatusCode(err, types.ErrorCodeReadRequestBodyFailed, http.StatusBadRequest, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
if common.DebugEnabled {
|
|
|
println("requestBody: ", string(body))
|
|
|
@@ -182,7 +181,7 @@ func TextHelper(c *gin.Context) (newAPIError *types.NewAPIError) {
|
|
|
} else {
|
|
|
convertedRequest, err := adaptor.ConvertOpenAIRequest(c, relayInfo, textRequest)
|
|
|
if err != nil {
|
|
|
- return types.NewError(err, types.ErrorCodeConvertRequestFailed)
|
|
|
+ return types.NewError(err, types.ErrorCodeConvertRequestFailed, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
|
|
|
if relayInfo.ChannelSetting.SystemPrompt != "" {
|
|
|
@@ -207,7 +206,7 @@ func TextHelper(c *gin.Context) (newAPIError *types.NewAPIError) {
|
|
|
|
|
|
jsonData, err := common.Marshal(convertedRequest)
|
|
|
if err != nil {
|
|
|
- return types.NewError(err, types.ErrorCodeConvertRequestFailed)
|
|
|
+ return types.NewError(err, types.ErrorCodeConvertRequestFailed, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
|
|
|
// apply param override
|
|
|
@@ -219,7 +218,7 @@ func TextHelper(c *gin.Context) (newAPIError *types.NewAPIError) {
|
|
|
}
|
|
|
jsonData, err = common.Marshal(reqMap)
|
|
|
if err != nil {
|
|
|
- return types.NewError(err, types.ErrorCodeChannelParamOverrideInvalid)
|
|
|
+ return types.NewError(err, types.ErrorCodeChannelParamOverrideInvalid, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -231,7 +230,6 @@ func TextHelper(c *gin.Context) (newAPIError *types.NewAPIError) {
|
|
|
|
|
|
var httpResp *http.Response
|
|
|
resp, err := adaptor.DoRequest(c, relayInfo, requestBody)
|
|
|
-
|
|
|
if err != nil {
|
|
|
return types.NewOpenAIError(err, types.ErrorCodeDoRequestFailed, http.StatusInternalServerError)
|
|
|
}
|
|
|
@@ -304,13 +302,13 @@ func checkRequestSensitive(textRequest *dto.GeneralOpenAIRequest, info *relaycom
|
|
|
func preConsumeQuota(c *gin.Context, preConsumedQuota int, relayInfo *relaycommon.RelayInfo) (int, int, *types.NewAPIError) {
|
|
|
userQuota, err := model.GetUserQuota(relayInfo.UserId, false)
|
|
|
if err != nil {
|
|
|
- return 0, 0, types.NewError(err, types.ErrorCodeQueryDataError)
|
|
|
+ return 0, 0, types.NewError(err, types.ErrorCodeQueryDataError, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
if userQuota <= 0 {
|
|
|
- return 0, 0, types.NewErrorWithStatusCode(errors.New("user quota is not enough"), types.ErrorCodeInsufficientUserQuota, http.StatusForbidden)
|
|
|
+ return 0, 0, types.NewErrorWithStatusCode(errors.New("user quota is not enough"), types.ErrorCodeInsufficientUserQuota, http.StatusForbidden, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
if userQuota-preConsumedQuota < 0 {
|
|
|
- return 0, 0, types.NewErrorWithStatusCode(fmt.Errorf("pre-consume quota failed, user quota: %s, need quota: %s", common.FormatQuota(userQuota), common.FormatQuota(preConsumedQuota)), types.ErrorCodeInsufficientUserQuota, http.StatusForbidden)
|
|
|
+ return 0, 0, types.NewErrorWithStatusCode(fmt.Errorf("pre-consume quota failed, user quota: %s, need quota: %s", common.FormatQuota(userQuota), common.FormatQuota(preConsumedQuota)), types.ErrorCodeInsufficientUserQuota, http.StatusForbidden, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
relayInfo.UserQuota = userQuota
|
|
|
if userQuota > 100*preConsumedQuota {
|
|
|
@@ -334,11 +332,11 @@ func preConsumeQuota(c *gin.Context, preConsumedQuota int, relayInfo *relaycommo
|
|
|
if preConsumedQuota > 0 {
|
|
|
err := service.PreConsumeTokenQuota(relayInfo, preConsumedQuota)
|
|
|
if err != nil {
|
|
|
- return 0, 0, types.NewErrorWithStatusCode(err, types.ErrorCodePreConsumeTokenQuotaFailed, http.StatusForbidden)
|
|
|
+ return 0, 0, types.NewErrorWithStatusCode(err, types.ErrorCodePreConsumeTokenQuotaFailed, http.StatusForbidden, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
err = model.DecreaseUserQuota(relayInfo.UserId, preConsumedQuota)
|
|
|
if err != nil {
|
|
|
- return 0, 0, types.NewError(err, types.ErrorCodeUpdateDataError)
|
|
|
+ return 0, 0, types.NewError(err, types.ErrorCodeUpdateDataError, types.ErrOptionWithSkipRetry())
|
|
|
}
|
|
|
}
|
|
|
return preConsumedQuota, userQuota, nil
|