Procházet zdrojové kódy

fix(pricing): 修复缓存倍率写入默认值1和缓存创建token丢失

1. CopyGlobalPricing 检查 ratio 查找的 bool 返回值,未找到时写 0
   而非写入 fallback 值 1,避免覆盖全局正确的 0.1
2. Claude 响应使用 GetCacheCreationTotalTokens() 替代直接读
   CacheCreationInputTokens,兼容新版本子对象格式
3. 新增 GetAudioRatioV2/GetAudioCompletionRatioV2 带 bool 返回

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
master
fengsilin před 2 týdny
rodič
revize
f0f0215b20
3 změnil soubory, kde provedl 42 přidání a 9 odebrání
  1. +20
    -5
      controller/channel_pricing.go
  2. +4
    -4
      relay/channel/claude/relay-claude.go
  3. +18
    -0
      setting/ratio_setting/model_ratio.go

+ 20
- 5
controller/channel_pricing.go Zobrazit soubor

@@ -212,11 +212,26 @@ func CopyGlobalPricing(c *gin.Context) {
}

// 获取全局扩展比率
globalCacheRatio, _ := ratio_setting.GetCacheRatio(ability.Model)
globalCacheCreationRatio, _ := ratio_setting.GetCreateCacheRatio(ability.Model)
globalImageRatio, _ := ratio_setting.GetImageRatio(ability.Model)
globalAudioRatio := ratio_setting.GetAudioRatio(ability.Model)
globalAudioCompletionRatio := ratio_setting.GetAudioCompletionRatio(ability.Model)
globalCacheRatio, hasCacheRatio := ratio_setting.GetCacheRatio(ability.Model)
if !hasCacheRatio {
globalCacheRatio = 0
}
globalCacheCreationRatio, hasCacheCreationRatio := ratio_setting.GetCreateCacheRatio(ability.Model)
if !hasCacheCreationRatio {
globalCacheCreationRatio = 0
}
globalImageRatio, hasImageRatio := ratio_setting.GetImageRatio(ability.Model)
if !hasImageRatio {
globalImageRatio = 0
}
globalAudioRatio, hasAudioRatio := ratio_setting.GetAudioRatioV2(ability.Model)
if !hasAudioRatio {
globalAudioRatio = 0
}
globalAudioCompletionRatio, hasAudioCompRatio := ratio_setting.GetAudioCompletionRatioV2(ability.Model)
if !hasAudioCompRatio {
globalAudioCompletionRatio = 0
}

// 确定定价类型
var quotaType int


+ 4
- 4
relay/channel/claude/relay-claude.go Zobrazit soubor

@@ -635,7 +635,7 @@ func FormatClaudeResponseInfo(claudeResponse *dto.ClaudeResponse, oaiResponse *d
if claudeResponse.Message != nil && claudeResponse.Message.Usage != nil {
claudeInfo.Usage.PromptTokens = claudeResponse.Message.Usage.InputTokens
claudeInfo.Usage.PromptTokensDetails.CachedTokens = claudeResponse.Message.Usage.CacheReadInputTokens
claudeInfo.Usage.PromptTokensDetails.CachedCreationTokens = claudeResponse.Message.Usage.CacheCreationInputTokens
claudeInfo.Usage.PromptTokensDetails.CachedCreationTokens = claudeResponse.Message.Usage.GetCacheCreationTotalTokens()
claudeInfo.Usage.ClaudeCacheCreation5mTokens = claudeResponse.Message.Usage.GetCacheCreation5mTokens()
claudeInfo.Usage.ClaudeCacheCreation1hTokens = claudeResponse.Message.Usage.GetCacheCreation1hTokens()
claudeInfo.Usage.CompletionTokens = claudeResponse.Message.Usage.OutputTokens
@@ -659,8 +659,8 @@ func FormatClaudeResponseInfo(claudeResponse *dto.ClaudeResponse, oaiResponse *d
if claudeResponse.Usage.CacheReadInputTokens > 0 {
claudeInfo.Usage.PromptTokensDetails.CachedTokens = claudeResponse.Usage.CacheReadInputTokens
}
if claudeResponse.Usage.CacheCreationInputTokens > 0 {
claudeInfo.Usage.PromptTokensDetails.CachedCreationTokens = claudeResponse.Usage.CacheCreationInputTokens
if total := claudeResponse.Usage.GetCacheCreationTotalTokens(); total > 0 {
claudeInfo.Usage.PromptTokensDetails.CachedCreationTokens = total
}
if cacheCreation5m := claudeResponse.Usage.GetCacheCreation5mTokens(); cacheCreation5m > 0 {
claudeInfo.Usage.ClaudeCacheCreation5mTokens = cacheCreation5m
@@ -811,7 +811,7 @@ func HandleClaudeResponseData(c *gin.Context, info *relaycommon.RelayInfo, claud
claudeInfo.Usage.CompletionTokens = claudeResponse.Usage.OutputTokens
claudeInfo.Usage.TotalTokens = claudeResponse.Usage.InputTokens + claudeResponse.Usage.OutputTokens
claudeInfo.Usage.PromptTokensDetails.CachedTokens = claudeResponse.Usage.CacheReadInputTokens
claudeInfo.Usage.PromptTokensDetails.CachedCreationTokens = claudeResponse.Usage.CacheCreationInputTokens
claudeInfo.Usage.PromptTokensDetails.CachedCreationTokens = claudeResponse.Usage.GetCacheCreationTotalTokens()
claudeInfo.Usage.ClaudeCacheCreation5mTokens = claudeResponse.Usage.GetCacheCreation5mTokens()
claudeInfo.Usage.ClaudeCacheCreation1hTokens = claudeResponse.Usage.GetCacheCreation1hTokens()
}


+ 18
- 0
setting/ratio_setting/model_ratio.go Zobrazit soubor

@@ -604,6 +604,15 @@ func GetAudioRatio(name string) float64 {
return 1
}

func GetAudioRatioV2(name string) (float64, bool) {
name = FormatMatchingModelName(name)
ratio, ok := audioRatioMap.Get(name)
if !ok {
return 0, false
}
return ratio, true
}

func GetAudioCompletionRatio(name string) float64 {
name = FormatMatchingModelName(name)
if ratio, ok := audioCompletionRatioMap.Get(name); ok {
@@ -612,6 +621,15 @@ func GetAudioCompletionRatio(name string) float64 {
return 1
}

func GetAudioCompletionRatioV2(name string) (float64, bool) {
name = FormatMatchingModelName(name)
ratio, ok := audioCompletionRatioMap.Get(name)
if !ok {
return 0, false
}
return ratio, true
}

func ContainsAudioRatio(name string) bool {
name = FormatMatchingModelName(name)
_, ok := audioRatioMap.Get(name)


Načítá se…
Zrušit
Uložit