From cadca752c492ef923c66b7c7b4c50a97c16cc1b5 Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 28 Jan 2026 18:35:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSSE=E6=B5=81=E5=BC=8F?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E4=B8=ADusage=E6=95=B0=E6=8D=AE=E8=A2=AB?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/service/gateway_service.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/backend/internal/service/gateway_service.go b/backend/internal/service/gateway_service.go index 5819f15a..2e3ba93e 100644 --- a/backend/internal/service/gateway_service.go +++ b/backend/internal/service/gateway_service.go @@ -3372,12 +3372,21 @@ func (s *GatewayService) parseSSEUsage(data string, usage *ClaudeUsage) { } `json:"usage"` } if json.Unmarshal([]byte(data), &msgDelta) == nil && msgDelta.Type == "message_delta" { - // message_delta 是推理结束后的最终统计,应完全覆盖 message_start 的数据 - // 这对于 Claude API 和 GLM 等兼容 API 都是正确的行为 - usage.InputTokens = msgDelta.Usage.InputTokens - usage.OutputTokens = msgDelta.Usage.OutputTokens - usage.CacheCreationInputTokens = msgDelta.Usage.CacheCreationInputTokens - usage.CacheReadInputTokens = msgDelta.Usage.CacheReadInputTokens + // message_delta 仅覆盖存在且非0的字段 + // 避免覆盖 message_start 中已有的值(如 input_tokens) + // Claude API 的 message_delta 通常只包含 output_tokens + if msgDelta.Usage.InputTokens > 0 { + usage.InputTokens = msgDelta.Usage.InputTokens + } + if msgDelta.Usage.OutputTokens > 0 { + usage.OutputTokens = msgDelta.Usage.OutputTokens + } + if msgDelta.Usage.CacheCreationInputTokens > 0 { + usage.CacheCreationInputTokens = msgDelta.Usage.CacheCreationInputTokens + } + if msgDelta.Usage.CacheReadInputTokens > 0 { + usage.CacheReadInputTokens = msgDelta.Usage.CacheReadInputTokens + } } }