fix: 延迟设置SSE响应头并兼容异常流数据

在成功获取第一条流式消息后再设置SSE响应头,避免无数据时提前建立连接;同时忽略异常类型的流消息,提升对部分AI工具的兼容性。
This commit is contained in:
ccnetcore
2026-02-04 23:34:57 +08:00
parent 82d97ab0b4
commit 6863b773b4

View File

@@ -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"))
{