From 6863b773b402af98d31b73f80f1aac817532652e Mon Sep 17 00:00:00 2001 From: ccnetcore Date: Wed, 4 Feb 2026 23:34:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BB=B6=E8=BF=9F=E8=AE=BE=E7=BD=AESSE?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E5=A4=B4=E5=B9=B6=E5=85=BC=E5=AE=B9=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E6=B5=81=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在成功获取第一条流式消息后再设置SSE响应头,避免无数据时提前建立连接;同时忽略异常类型的流消息,提升对部分AI工具的兼容性。 --- .../Managers/AiGateWayManager.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) 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")) {