diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs index f789241a..e1daf273 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs @@ -612,10 +612,7 @@ public class AiGateWayManager : DomainService CancellationToken cancellationToken = default) { var response = httpContext.Response; - // 设置响应头,声明是 SSE 流 - response.ContentType = "text/event-stream;charset=utf-8;"; - response.Headers.TryAdd("Cache-Control", "no-cache"); - response.Headers.TryAdd("Connection", "keep-alive"); + // 注意:SSE响应头推迟到第一条消息成功获取后再设置 _specialCompatible.AnthropicCompatible(request); var modelDescribe = await GetModelAsync(ModelApiTypeEnum.Messages, request.Model); @@ -631,10 +628,25 @@ public class AiGateWayManager : DomainService var completeChatResponse = chatService.StreamChatCompletionsAsync(modelDescribe, request, cancellationToken); ThorUsageResponse? tokenUsage = new ThorUsageResponse(); + bool isFirst = true; try { await foreach (var responseResult in completeChatResponse) { + // 第一条消息成功获取,才设置 SSE 响应头 + if (isFirst) + { + response.ContentType = "text/event-stream;charset=utf-8;"; + response.Headers.TryAdd("Cache-Control", "no-cache"); + response.Headers.TryAdd("Connection", "keep-alive"); + isFirst = false; + } + + if (responseResult.Item1=="exception") + { + //兼容部分ai工具问题 + continue; + } //部分供应商message_start放一部分 if (responseResult.Item1.Contains("message_start")) {