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

feat: 请求出现 0 token的时候,加入错误提示并打印日志

CaIon 2 лет назад
Родитель
Сommit
b3f46223a8
1 измененных файлов с 24 добавлено и 20 удалено
  1. 24 20
      controller/relay-text.go

+ 24 - 20
controller/relay-text.go

@@ -474,6 +474,7 @@ func relayTextHelper(c *gin.Context, relayMode int) *OpenAIErrorWithStatusCode {
 	defer func(ctx context.Context) {
 		// c.Writer.Flush()
 		go func() {
+			useTimeSeconds := time.Now().Unix() - startTime.Unix()
 			promptTokens = textResponse.Usage.PromptTokens
 			completionTokens = textResponse.Usage.CompletionTokens
 
@@ -489,38 +490,41 @@ func relayTextHelper(c *gin.Context, relayMode int) *OpenAIErrorWithStatusCode {
 				quota = int(modelPrice * common.QuotaPerUnit * groupRatio)
 			}
 			totalTokens := promptTokens + completionTokens
-			if totalTokens == 0 {
-				// in this case, must be some error happened
-				// we cannot just return, because we may have to return the pre-consumed quota
-				quota = 0
-			}
-			quotaDelta := quota - preConsumedQuota
-			err := model.PostConsumeTokenQuota(tokenId, userQuota, quotaDelta, preConsumedQuota, true)
-			if err != nil {
-				common.LogError(ctx, "error consuming token remain quota: "+err.Error())
-			}
-			err = model.CacheUpdateUserQuota(userId)
-			if err != nil {
-				common.LogError(ctx, "error update user quota cache: "+err.Error())
-			}
-
-			// record all the consume log even if quota is 0
-			useTimeSeconds := time.Now().Unix() - startTime.Unix()
 			var logContent string
 			if modelPrice == -1 {
 				logContent = fmt.Sprintf("模型倍率 %.2f,分组倍率 %.2f", modelRatio, groupRatio)
 			} else {
 				logContent = fmt.Sprintf("模型价格 %.2f,分组倍率 %.2f", modelPrice, groupRatio)
 			}
+
+			// record all the consume log even if quota is 0
+			if totalTokens == 0 {
+				// in this case, must be some error happened
+				// we cannot just return, because we may have to return the pre-consumed quota
+				quota = 0
+				logContent += fmt.Sprintf("(有疑问请联系管理员)")
+				common.LogError(ctx, fmt.Sprintf("total tokens is 0, cannot consume quota, userId %d, channelId %d, tokenId %d, model %s, pre-consumed quota %d", userId, channelId, tokenId, textRequest.Model, preConsumedQuota))
+			} else {
+				quotaDelta := quota - preConsumedQuota
+				err := model.PostConsumeTokenQuota(tokenId, userQuota, quotaDelta, preConsumedQuota, true)
+				if err != nil {
+					common.LogError(ctx, "error consuming token remain quota: "+err.Error())
+				}
+				err = model.CacheUpdateUserQuota(userId)
+				if err != nil {
+					common.LogError(ctx, "error update user quota cache: "+err.Error())
+				}
+				model.UpdateUserUsedQuotaAndRequestCount(userId, quota)
+				model.UpdateChannelUsedQuota(channelId, quota)
+			}
+
 			logModel := textRequest.Model
 			if strings.HasPrefix(logModel, "gpt-4-gizmo") {
 				logModel = "gpt-4-gizmo-*"
 				logContent += fmt.Sprintf(",模型 %s", textRequest.Model)
 			}
-
 			model.RecordConsumeLog(ctx, userId, channelId, promptTokens, completionTokens, logModel, tokenName, quota, logContent, tokenId, userQuota, int(useTimeSeconds), isStream)
-			model.UpdateUserUsedQuotaAndRequestCount(userId, quota)
-			model.UpdateChannelUsedQuota(channelId, quota)
+
 			//if quota != 0 {
 			//
 			//}