Преглед изворни кода

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 пре 2 недеља
родитељ
комит
f0f0215b20
3 измењених фајлова са 42 додато и 9 уклоњено
  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 Прегледај датотеку

@@ -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 var quotaType int


+ 4
- 4
relay/channel/claude/relay-claude.go Прегледај датотеку

@@ -635,7 +635,7 @@ func FormatClaudeResponseInfo(claudeResponse *dto.ClaudeResponse, oaiResponse *d
if claudeResponse.Message != nil && claudeResponse.Message.Usage != nil { if claudeResponse.Message != nil && claudeResponse.Message.Usage != nil {
claudeInfo.Usage.PromptTokens = claudeResponse.Message.Usage.InputTokens claudeInfo.Usage.PromptTokens = claudeResponse.Message.Usage.InputTokens
claudeInfo.Usage.PromptTokensDetails.CachedTokens = claudeResponse.Message.Usage.CacheReadInputTokens 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.ClaudeCacheCreation5mTokens = claudeResponse.Message.Usage.GetCacheCreation5mTokens()
claudeInfo.Usage.ClaudeCacheCreation1hTokens = claudeResponse.Message.Usage.GetCacheCreation1hTokens() claudeInfo.Usage.ClaudeCacheCreation1hTokens = claudeResponse.Message.Usage.GetCacheCreation1hTokens()
claudeInfo.Usage.CompletionTokens = claudeResponse.Message.Usage.OutputTokens claudeInfo.Usage.CompletionTokens = claudeResponse.Message.Usage.OutputTokens
@@ -659,8 +659,8 @@ func FormatClaudeResponseInfo(claudeResponse *dto.ClaudeResponse, oaiResponse *d
if claudeResponse.Usage.CacheReadInputTokens > 0 { if claudeResponse.Usage.CacheReadInputTokens > 0 {
claudeInfo.Usage.PromptTokensDetails.CachedTokens = claudeResponse.Usage.CacheReadInputTokens 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 { if cacheCreation5m := claudeResponse.Usage.GetCacheCreation5mTokens(); cacheCreation5m > 0 {
claudeInfo.Usage.ClaudeCacheCreation5mTokens = cacheCreation5m 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.CompletionTokens = claudeResponse.Usage.OutputTokens
claudeInfo.Usage.TotalTokens = claudeResponse.Usage.InputTokens + claudeResponse.Usage.OutputTokens claudeInfo.Usage.TotalTokens = claudeResponse.Usage.InputTokens + claudeResponse.Usage.OutputTokens
claudeInfo.Usage.PromptTokensDetails.CachedTokens = claudeResponse.Usage.CacheReadInputTokens 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.ClaudeCacheCreation5mTokens = claudeResponse.Usage.GetCacheCreation5mTokens()
claudeInfo.Usage.ClaudeCacheCreation1hTokens = claudeResponse.Usage.GetCacheCreation1hTokens() claudeInfo.Usage.ClaudeCacheCreation1hTokens = claudeResponse.Usage.GetCacheCreation1hTokens()
} }


+ 18
- 0
setting/ratio_setting/model_ratio.go Прегледај датотеку

@@ -604,6 +604,15 @@ func GetAudioRatio(name string) float64 {
return 1 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 { func GetAudioCompletionRatio(name string) float64 {
name = FormatMatchingModelName(name) name = FormatMatchingModelName(name)
if ratio, ok := audioCompletionRatioMap.Get(name); ok { if ratio, ok := audioCompletionRatioMap.Get(name); ok {
@@ -612,6 +621,15 @@ func GetAudioCompletionRatio(name string) float64 {
return 1 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 { func ContainsAudioRatio(name string) bool {
name = FormatMatchingModelName(name) name = FormatMatchingModelName(name)
_, ok := audioRatioMap.Get(name) _, ok := audioRatioMap.Get(name)


Loading…
Откажи
Сачувај