From cd9cadbb61e9ec8b0f63b64de65fa7270e6c1792 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 19 Feb 2026 01:04:19 +0800 Subject: [PATCH] fix(chat): disable buffering for sse stream responses --- app/(chat)/api/chat/route.ts | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/app/(chat)/api/chat/route.ts b/app/(chat)/api/chat/route.ts index 18eba745c..2014f206a 100644 --- a/app/(chat)/api/chat/route.ts +++ b/app/(chat)/api/chat/route.ts @@ -223,6 +223,17 @@ function writeAssistantTextChunk( return messageId; } +function createSseResponse(stream: ReadableStream) { + return new Response(stream.pipeThrough(new JsonToSseTransformStream()), { + headers: { + "Content-Type": "text/event-stream; charset=utf-8", + "Cache-Control": "no-cache, no-transform", + Connection: "keep-alive", + "X-Accel-Buffering": "no", + }, + }); +} + function startStreamKeepalive(writer: StreamWriter, label: string, intervalMs = 15000) { const timer = setInterval(() => { safeWriteStreamChunk( @@ -1417,7 +1428,7 @@ export async function POST(request: Request) { }); }, }); - return new Response(duplicateStream.pipeThrough(new JsonToSseTransformStream())); + return createSseResponse(duplicateStream); } inFlightChatRequests.set(requestDedupKey, now); acquiredInFlightLock = true; @@ -2104,7 +2115,7 @@ export async function POST(request: Request) { }); }, }); - return new Response(duplicateStream.pipeThrough(new JsonToSseTransformStream())); + return createSseResponse(duplicateStream); } const streamId = generateUUID(); @@ -2173,7 +2184,7 @@ export async function POST(request: Request) { }, }); - return new Response(clarificationStream.pipeThrough(new JsonToSseTransformStream())); + return createSseResponse(clarificationStream); } let finalMergedUsage: AppUsage | undefined; @@ -2672,7 +2683,7 @@ export async function POST(request: Request) { }, }); - return new Response(geminiStream.pipeThrough(new JsonToSseTransformStream())); + return createSseResponse(geminiStream); } // ========== Gemini 处理结束 ========== @@ -3010,7 +3021,7 @@ export async function POST(request: Request) { }, }); - return new Response(alibabaStream.pipeThrough(new JsonToSseTransformStream())); + return createSseResponse(alibabaStream); } // ========== 阿里云图片生成处理结束 ========== @@ -3342,7 +3353,7 @@ export async function POST(request: Request) { }, }); - return new Response(volcanoStream.pipeThrough(new JsonToSseTransformStream())); + return createSseResponse(volcanoStream); } // ========== 火山引擎视觉处理结束 ========== @@ -3488,7 +3499,7 @@ export async function POST(request: Request) { }, }); - return new Response(qianwenVideoStream.pipeThrough(new JsonToSseTransformStream())); + return createSseResponse(qianwenVideoStream); } // ========== 千问/FAL 视频处理结束 ========== @@ -4267,7 +4278,7 @@ export async function POST(request: Request) { // ); // } - return new Response(stream.pipeThrough(new JsonToSseTransformStream())); + return createSseResponse(stream); } catch (error) { const vercelId = request.headers.get("x-vercel-id");