@@ -352,6 +352,7 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo,
352352 promptTokens := usage .PromptTokens
353353 cacheTokens := usage .PromptTokensDetails .CachedTokens
354354 imageTokens := usage .PromptTokensDetails .ImageTokens
355+ audioTokens := usage .PromptTokensDetails .AudioTokens
355356 completionTokens := usage .CompletionTokens
356357 modelName := relayInfo .OriginModelName
357358
@@ -367,6 +368,7 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo,
367368 dPromptTokens := decimal .NewFromInt (int64 (promptTokens ))
368369 dCacheTokens := decimal .NewFromInt (int64 (cacheTokens ))
369370 dImageTokens := decimal .NewFromInt (int64 (imageTokens ))
371+ dAudioTokens := decimal .NewFromInt (int64 (audioTokens ))
370372 dCompletionTokens := decimal .NewFromInt (int64 (completionTokens ))
371373 dCompletionRatio := decimal .NewFromFloat (completionRatio )
372374 dCacheRatio := decimal .NewFromFloat (cacheRatio )
@@ -412,23 +414,43 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo,
412414 dFileSearchQuota = decimal .NewFromFloat (fileSearchPrice ).
413415 Mul (decimal .NewFromInt (int64 (fileSearchTool .CallCount ))).
414416 Div (decimal .NewFromInt (1000 )).Mul (dGroupRatio ).Mul (dQuotaPerUnit )
415- extraContent += fmt .Sprintf ("File Search 调用 %d 次,调用花费 $ %s" ,
417+ extraContent += fmt .Sprintf ("File Search 调用 %d 次,调用花费 %s" ,
416418 fileSearchTool .CallCount , dFileSearchQuota .String ())
417419 }
418420 }
419421
420422 var quotaCalculateDecimal decimal.Decimal
423+
424+ var audioInputQuota decimal.Decimal
425+ var audioInputPrice float64
421426 if ! priceData .UsePrice {
422- nonCachedTokens := dPromptTokens .Sub (dCacheTokens )
423- cachedTokensWithRatio := dCacheTokens .Mul (dCacheRatio )
424-
425- promptQuota := nonCachedTokens .Add (cachedTokensWithRatio )
426- if imageTokens > 0 {
427- nonImageTokens := dPromptTokens .Sub (dImageTokens )
428- imageTokensWithRatio := dImageTokens .Mul (dImageRatio )
429- promptQuota = nonImageTokens .Add (imageTokensWithRatio )
427+ baseTokens := dPromptTokens
428+ // 减去 cached tokens
429+ var cachedTokensWithRatio decimal.Decimal
430+ if ! dCacheTokens .IsZero () {
431+ baseTokens = baseTokens .Sub (dCacheTokens )
432+ cachedTokensWithRatio = dCacheTokens .Mul (dCacheRatio )
433+ }
434+
435+ // 减去 image tokens
436+ var imageTokensWithRatio decimal.Decimal
437+ if ! dImageTokens .IsZero () {
438+ baseTokens = baseTokens .Sub (dImageTokens )
439+ imageTokensWithRatio = dImageTokens .Mul (dImageRatio )
430440 }
431441
442+ // 减去 Gemini audio tokens
443+ if ! dAudioTokens .IsZero () {
444+ audioInputPrice = operation_setting .GetGeminiInputAudioPricePerMillionTokens (modelName )
445+ if audioInputPrice > 0 {
446+ // 重新计算 base tokens
447+ baseTokens = baseTokens .Sub (dAudioTokens )
448+ audioInputQuota = decimal .NewFromFloat (audioInputPrice ).Div (decimal .NewFromInt (1000000 )).Mul (dAudioTokens ).Mul (dGroupRatio ).Mul (dQuotaPerUnit )
449+ extraContent += fmt .Sprintf ("Audio Input 花费 %s" , audioInputQuota .String ())
450+ }
451+ }
452+ promptQuota := baseTokens .Add (cachedTokensWithRatio ).Add (imageTokensWithRatio )
453+
432454 completionQuota := dCompletionTokens .Mul (dCompletionRatio )
433455
434456 quotaCalculateDecimal = promptQuota .Add (completionQuota ).Mul (ratio )
@@ -442,6 +464,8 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo,
442464 // 添加 responses tools call 调用的配额
443465 quotaCalculateDecimal = quotaCalculateDecimal .Add (dWebSearchQuota )
444466 quotaCalculateDecimal = quotaCalculateDecimal .Add (dFileSearchQuota )
467+ // 添加 audio input 独立计费
468+ quotaCalculateDecimal = quotaCalculateDecimal .Add (audioInputQuota )
445469
446470 quota := int (quotaCalculateDecimal .Round (0 ).IntPart ())
447471 totalTokens := promptTokens + completionTokens
@@ -512,6 +536,11 @@ func postConsumeQuota(ctx *gin.Context, relayInfo *relaycommon.RelayInfo,
512536 other ["file_search_price" ] = fileSearchPrice
513537 }
514538 }
539+ if ! audioInputQuota .IsZero () {
540+ other ["audio_input_seperate_price" ] = true
541+ other ["audio_input_token_count" ] = audioTokens
542+ other ["audio_input_price" ] = audioInputPrice
543+ }
515544 model .RecordConsumeLog (ctx , relayInfo .UserId , relayInfo .ChannelId , promptTokens , completionTokens , logModel ,
516545 tokenName , quota , logContent , relayInfo .TokenId , userQuota , int (useTimeSeconds ), relayInfo .IsStream , relayInfo .Group , other )
517546}
0 commit comments