From f7cdc727df2669068a53eb51d0415647b3af2ab5 Mon Sep 17 00:00:00 2001 From: zuiho <2324465096@qq.com> Date: Tue, 7 Apr 2026 17:41:08 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20Claude=20=E6=B5=81=E5=BC=8F=E6=96=AD?= =?UTF-8?q?=E6=B5=81=E6=97=B6=E4=B8=8D=E5=86=8D=E6=95=B4=E4=BB=BD=E8=A6=86?= =?UTF-8?q?=E7=9B=96=20usage=EF=BC=8C=E4=BF=9D=E7=95=99=20cache=20?= =?UTF-8?q?=E8=AE=A1=E8=B4=B9=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HandleStreamFinalResponse 在 !Done 时调用 ResponseText2Usage 整份覆盖 claudeInfo.Usage,导致 message_start 已获取的 CacheReadInputTokens、 CacheCreationInputTokens 等字段丢失,prompt 退化为占位值 1。 修复: - 只补缺失的 CompletionTokens/PromptTokens,保留已有 cache 数据 - PromptTokens 兜底改用 info.GetEstimatePromptTokens()(与其他渠道对齐) Fixes #4127 --- relay/channel/claude/relay-claude.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index dceff5e7..21427b1f 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -809,7 +809,15 @@ func HandleStreamFinalResponse(c *gin.Context, info *relaycommon.RelayInfo, clau if common.DebugEnabled { common.SysLog("claude response usage is not complete, maybe upstream error") } - claudeInfo.Usage = service.ResponseText2Usage(c, claudeInfo.ResponseText.String(), info.UpstreamModelName, claudeInfo.Usage.PromptTokens) + // 只补缺失字段,不整份覆盖——保留 message_start 已拿到的 cache 字段 + fallback := service.ResponseText2Usage(c, claudeInfo.ResponseText.String(), info.UpstreamModelName, info.GetEstimatePromptTokens()) + if claudeInfo.Usage.CompletionTokens == 0 { + claudeInfo.Usage.CompletionTokens = fallback.CompletionTokens + } + if claudeInfo.Usage.PromptTokens == 0 { + claudeInfo.Usage.PromptTokens = fallback.PromptTokens + } + claudeInfo.Usage.TotalTokens = claudeInfo.Usage.PromptTokens + claudeInfo.Usage.CompletionTokens } if claudeInfo.Usage != nil { claudeInfo.Usage.UsageSemantic = "anthropic" From c66636a0c737d093a7e813bd4ad8b3f9bc0add60 Mon Sep 17 00:00:00 2001 From: zuiho <2324465096@qq.com> Date: Tue, 7 Apr 2026 17:52:11 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E9=87=87=E7=BA=B3=20CodeRabbit=20?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=EF=BC=8C!Done=20=E6=97=B6=E4=B9=9F=E7=94=A8?= =?UTF-8?q?=20fallback=20=E8=A6=86=E7=9B=96=E5=8D=A0=E4=BD=8D=20Completion?= =?UTF-8?q?Tokens?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit message_start 阶段可能给 CompletionTokens 非零占位值, 只检查 == 0 不够,加上 !Done && fallback > current 条件。 --- relay/channel/claude/relay-claude.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index 21427b1f..2982945c 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -811,7 +811,8 @@ func HandleStreamFinalResponse(c *gin.Context, info *relaycommon.RelayInfo, clau } // 只补缺失字段,不整份覆盖——保留 message_start 已拿到的 cache 字段 fallback := service.ResponseText2Usage(c, claudeInfo.ResponseText.String(), info.UpstreamModelName, info.GetEstimatePromptTokens()) - if claudeInfo.Usage.CompletionTokens == 0 { + if claudeInfo.Usage.CompletionTokens == 0 || + (!claudeInfo.Done && fallback.CompletionTokens > claudeInfo.Usage.CompletionTokens) { claudeInfo.Usage.CompletionTokens = fallback.CompletionTokens } if claudeInfo.Usage.PromptTokens == 0 {