|
|
@@ -158,7 +158,7 @@ func TextHelper(c *gin.Context, info *relaycommon.RelayInfo) (newAPIError *types
|
|
|
httpResp = resp.(*http.Response)
|
|
|
info.IsStream = info.IsStream || strings.HasPrefix(httpResp.Header.Get("Content-Type"), "text/event-stream")
|
|
|
if httpResp.StatusCode != http.StatusOK {
|
|
|
- newApiErr := service.RelayErrorHandler(httpResp, false)
|
|
|
+ newApiErr := service.RelayErrorHandler(c.Request.Context(), httpResp, false)
|
|
|
// reset status code 重置状态码
|
|
|
service.ResetStatusCode(newApiErr, statusCodeMappingStr)
|
|
|
return newApiErr
|
|
|
@@ -195,6 +195,8 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, usage
|
|
|
imageTokens := usage.PromptTokensDetails.ImageTokens
|
|
|
audioTokens := usage.PromptTokensDetails.AudioTokens
|
|
|
completionTokens := usage.CompletionTokens
|
|
|
+ cachedCreationTokens := usage.PromptTokensDetails.CachedCreationTokens
|
|
|
+
|
|
|
modelName := relayInfo.OriginModelName
|
|
|
|
|
|
tokenName := ctx.GetString("token_name")
|
|
|
@@ -204,6 +206,7 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, usage
|
|
|
modelRatio := relayInfo.PriceData.ModelRatio
|
|
|
groupRatio := relayInfo.PriceData.GroupRatioInfo.GroupRatio
|
|
|
modelPrice := relayInfo.PriceData.ModelPrice
|
|
|
+ cachedCreationRatio := relayInfo.PriceData.CacheCreationRatio
|
|
|
|
|
|
// Convert values to decimal for precise calculation
|
|
|
dPromptTokens := decimal.NewFromInt(int64(promptTokens))
|
|
|
@@ -211,12 +214,14 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, usage
|
|
|
dImageTokens := decimal.NewFromInt(int64(imageTokens))
|
|
|
dAudioTokens := decimal.NewFromInt(int64(audioTokens))
|
|
|
dCompletionTokens := decimal.NewFromInt(int64(completionTokens))
|
|
|
+ dCachedCreationTokens := decimal.NewFromInt(int64(cachedCreationTokens))
|
|
|
dCompletionRatio := decimal.NewFromFloat(completionRatio)
|
|
|
dCacheRatio := decimal.NewFromFloat(cacheRatio)
|
|
|
dImageRatio := decimal.NewFromFloat(imageRatio)
|
|
|
dModelRatio := decimal.NewFromFloat(modelRatio)
|
|
|
dGroupRatio := decimal.NewFromFloat(groupRatio)
|
|
|
dModelPrice := decimal.NewFromFloat(modelPrice)
|
|
|
+ dCachedCreationRatio := decimal.NewFromFloat(cachedCreationRatio)
|
|
|
dQuotaPerUnit := decimal.NewFromFloat(common.QuotaPerUnit)
|
|
|
|
|
|
ratio := dModelRatio.Mul(dGroupRatio)
|
|
|
@@ -284,6 +289,11 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, usage
|
|
|
baseTokens = baseTokens.Sub(dCacheTokens)
|
|
|
cachedTokensWithRatio = dCacheTokens.Mul(dCacheRatio)
|
|
|
}
|
|
|
+ var dCachedCreationTokensWithRatio decimal.Decimal
|
|
|
+ if !dCachedCreationTokens.IsZero() {
|
|
|
+ baseTokens = baseTokens.Sub(dCachedCreationTokens)
|
|
|
+ dCachedCreationTokensWithRatio = dCachedCreationTokens.Mul(dCachedCreationRatio)
|
|
|
+ }
|
|
|
|
|
|
// 减去 image tokens
|
|
|
var imageTokensWithRatio decimal.Decimal
|
|
|
@@ -302,7 +312,9 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, usage
|
|
|
extraContent += fmt.Sprintf("Audio Input 花费 %s", audioInputQuota.String())
|
|
|
}
|
|
|
}
|
|
|
- promptQuota := baseTokens.Add(cachedTokensWithRatio).Add(imageTokensWithRatio)
|
|
|
+ promptQuota := baseTokens.Add(cachedTokensWithRatio).
|
|
|
+ Add(imageTokensWithRatio).
|
|
|
+ Add(dCachedCreationTokensWithRatio)
|
|
|
|
|
|
completionQuota := dCompletionTokens.Mul(dCompletionRatio)
|
|
|
|
|
|
@@ -395,6 +407,10 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo, usage
|
|
|
other["image_ratio"] = imageRatio
|
|
|
other["image_output"] = imageTokens
|
|
|
}
|
|
|
+ if cachedCreationTokens != 0 {
|
|
|
+ other["cache_creation_tokens"] = cachedCreationTokens
|
|
|
+ other["cache_creation_ratio"] = cachedCreationRatio
|
|
|
+ }
|
|
|
if !dWebSearchQuota.IsZero() {
|
|
|
if relayInfo.ResponsesUsageInfo != nil {
|
|
|
if webSearchTool, exists := relayInfo.ResponsesUsageInfo.BuiltInTools[dto.BuildInToolWebSearchPreview]; exists {
|