修复SSE流式响应中usage数据被覆盖的问题
This commit is contained in:
@@ -3372,13 +3372,22 @@ 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)
|
||||||
|
// Claude API 的 message_delta 通常只包含 output_tokens
|
||||||
|
if msgDelta.Usage.InputTokens > 0 {
|
||||||
usage.InputTokens = msgDelta.Usage.InputTokens
|
usage.InputTokens = msgDelta.Usage.InputTokens
|
||||||
|
}
|
||||||
|
if msgDelta.Usage.OutputTokens > 0 {
|
||||||
usage.OutputTokens = msgDelta.Usage.OutputTokens
|
usage.OutputTokens = msgDelta.Usage.OutputTokens
|
||||||
|
}
|
||||||
|
if msgDelta.Usage.CacheCreationInputTokens > 0 {
|
||||||
usage.CacheCreationInputTokens = msgDelta.Usage.CacheCreationInputTokens
|
usage.CacheCreationInputTokens = msgDelta.Usage.CacheCreationInputTokens
|
||||||
|
}
|
||||||
|
if msgDelta.Usage.CacheReadInputTokens > 0 {
|
||||||
usage.CacheReadInputTokens = msgDelta.Usage.CacheReadInputTokens
|
usage.CacheReadInputTokens = msgDelta.Usage.CacheReadInputTokens
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *GatewayService) handleNonStreamingResponse(ctx context.Context, resp *http.Response, c *gin.Context, account *Account, originalModel, mappedModel string) (*ClaudeUsage, error) {
|
func (s *GatewayService) handleNonStreamingResponse(ctx context.Context, resp *http.Response, c *gin.Context, account *Account, originalModel, mappedModel string) (*ClaudeUsage, error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user