From 4e715fd18fff9649bfe7ee070c125b71df19f109 Mon Sep 17 00:00:00 2001 From: kocor Date: Tue, 21 Jul 2026 01:08:53 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(service):=20=E4=BC=98=E5=8C=96Claude?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=88=9B=E5=BB=BAtoken=E5=A4=84=E7=90=86?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在billing_usage.go中添加对CacheCreationInputTokens的fallback处理, 当原有缓存token为0时使用新的输入token字段 - 在tiered_settle.go中添加对Claude缓存创建token的非零值检查, 避免无效的零值参与计算 --- service/billing_usage.go | 6 ++++++ service/tiered_settle.go | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/service/billing_usage.go b/service/billing_usage.go index a8d47917b39d..cf1a8457feb4 100644 --- a/service/billing_usage.go +++ b/service/billing_usage.go @@ -129,10 +129,16 @@ func usageFromClaudeBillingUsage(billingUsage *dto.BillingUsage) *dto.Usage { if cacheCreation5m == 0 { cacheCreation5m = claudeUsage.ClaudeCacheCreation5mTokens } + if cacheCreation5m == 0 && claudeUsage.CacheCreationInputTokens > 0 { + cacheCreation5m = claudeUsage.CacheCreationInputTokens + } cacheCreation1h := claudeUsage.GetCacheCreation1hTokens() if cacheCreation1h == 0 { cacheCreation1h = claudeUsage.ClaudeCacheCreation1hTokens } + if cacheCreation1h == 0 && claudeUsage.CacheCreationInputTokens > 0 && cacheCreation5m == 0 { + cacheCreation1h = claudeUsage.CacheCreationInputTokens + } usage := &dto.Usage{ PromptTokens: claudeUsage.InputTokens, diff --git a/service/tiered_settle.go b/service/tiered_settle.go index 05337bd774e9..81dd2a716a38 100644 --- a/service/tiered_settle.go +++ b/service/tiered_settle.go @@ -26,8 +26,12 @@ func BuildTieredTokenParams(usage *dto.Usage, isClaudeUsageSemantic bool, usedVa cc1h := float64(0) if usage.UsageSemantic == "anthropic" { - cc1h = float64(usage.ClaudeCacheCreation1hTokens) - cc5m = float64(usage.ClaudeCacheCreation5mTokens) + if usage.ClaudeCacheCreation1hTokens > 0 { + cc1h = float64(usage.ClaudeCacheCreation1hTokens) + } + if usage.ClaudeCacheCreation5mTokens > 0 { + cc5m = float64(usage.ClaudeCacheCreation5mTokens) + } } img := float64(usage.PromptTokensDetails.ImageTokens) From 6cd0d77b11150ad12a363a782bd16678d012cfef Mon Sep 17 00:00:00 2001 From: kocor Date: Tue, 21 Jul 2026 02:50:56 +0800 Subject: [PATCH 2/2] =?UTF-8?q?refactor(service):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=88=9B=E5=BB=BA=E4=BB=A4=E7=89=8C=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除重复的条件判断逻辑,将CacheCreationInputTokens的回退赋值集中在5分钟缓存处理中, 并添加注释说明Claude标准缓存TL为5分钟。简化了代码结构,避免了不必要的条件检查。 --- service/billing_usage.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/service/billing_usage.go b/service/billing_usage.go index cf1a8457feb4..48615adc4140 100644 --- a/service/billing_usage.go +++ b/service/billing_usage.go @@ -129,15 +129,14 @@ func usageFromClaudeBillingUsage(billingUsage *dto.BillingUsage) *dto.Usage { if cacheCreation5m == 0 { cacheCreation5m = claudeUsage.ClaudeCacheCreation5mTokens } - if cacheCreation5m == 0 && claudeUsage.CacheCreationInputTokens > 0 { - cacheCreation5m = claudeUsage.CacheCreationInputTokens - } cacheCreation1h := claudeUsage.GetCacheCreation1hTokens() if cacheCreation1h == 0 { cacheCreation1h = claudeUsage.ClaudeCacheCreation1hTokens } - if cacheCreation1h == 0 && claudeUsage.CacheCreationInputTokens > 0 && cacheCreation5m == 0 { - cacheCreation1h = claudeUsage.CacheCreationInputTokens + // If both split values are still 0 but there's a total, default to 5m + // (Claude standard cache TTL is 5 minutes). + if cacheCreation5m == 0 && cacheCreation1h == 0 && claudeUsage.CacheCreationInputTokens > 0 { + cacheCreation5m = claudeUsage.CacheCreationInputTokens } usage := &dto.Usage{