修复SSE流式响应中usage数据被覆盖的问题

This commit is contained in:
shaw
2026-01-28 18:35:20 +08:00
parent edf215e6fd
commit cadca752c4

View File

@@ -3372,12 +3372,21 @@ func (s *GatewayService) parseSSEUsage(data string, usage *ClaudeUsage) {
} `json:"usage"` } `json:"usage"`
} }
if json.Unmarshal([]byte(data), &msgDelta) == nil && msgDelta.Type == "message_delta" { if json.Unmarshal([]byte(data), &msgDelta) == nil && msgDelta.Type == "message_delta" {
// message_delta 是推理结束后的最终统计,应完全覆盖 message_start 的数据 // message_delta 仅覆盖存在且非0的字段
// 这对于 Claude API 和 GLM 等兼容 API 都是正确的行为 // 避免覆盖 message_start 中已有的值(如 input_tokens
usage.InputTokens = msgDelta.Usage.InputTokens // Claude API 的 message_delta 通常只包含 output_tokens
usage.OutputTokens = msgDelta.Usage.OutputTokens if msgDelta.Usage.InputTokens > 0 {
usage.CacheCreationInputTokens = msgDelta.Usage.CacheCreationInputTokens usage.InputTokens = msgDelta.Usage.InputTokens
usage.CacheReadInputTokens = msgDelta.Usage.CacheReadInputTokens }
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
}
} }
} }