From be4c27532f33daa6afe74bff5d87116b56327bc6 Mon Sep 17 00:00:00 2001 From: Marcus <1922576605@qq.com> Date: Sun, 26 Apr 2026 01:40:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20TODO=20=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E4=BB=A5=E4=BC=98=E5=8C=96=E5=86=85=E5=AD=98=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=92=8C=E5=BC=82=E6=AD=A5=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/images/generate.post.ts | 2 ++ server/utils/lsky.ts | 2 ++ server/utils/openai.ts | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/server/api/images/generate.post.ts b/server/api/images/generate.post.ts index 6354375..b96cf42 100644 --- a/server/api/images/generate.post.ts +++ b/server/api/images/generate.post.ts @@ -103,6 +103,8 @@ export default defineEventHandler(async (event) => { }); const finishedRecord = record; + // TODO: 归档任务现在仍跑在当前 Node 进程里;如果并发继续升高,应该迁移到独立队列/worker, + // 避免大量响应后任务在同一进程内叠加,拖慢其他请求的调度与内存回收。 setImmediate(() => { void archiveGeneratedImageInBackground({ imageUrl: result.imageUrl, diff --git a/server/utils/lsky.ts b/server/utils/lsky.ts index 4cdef38..beda153 100644 --- a/server/utils/lsky.ts +++ b/server/utils/lsky.ts @@ -126,6 +126,8 @@ const downloadImage = async (imageUrl: string) => { throw new Error(`图片下载失败:${response.status}`); } + // TODO: 当前会把整张图片一次性读入当前 Node 进程内存,再转 Blob 上传到图床; + // 如果图片尺寸或并发继续增大,建议改成流式转发或落临时文件,降低内存峰值和主线程抖动。 return { bytes: await response.arrayBuffer(), mimeType: response.headers.get("content-type") || "image/png" diff --git a/server/utils/openai.ts b/server/utils/openai.ts index 46b5243..c0f47ed 100644 --- a/server/utils/openai.ts +++ b/server/utils/openai.ts @@ -221,6 +221,8 @@ const readChatCompletionStream = async ( ): Promise => { const reader = stream.getReader(); const decoder = new TextDecoder(); + // TODO: 这里会把完整 SSE 文本和 chunk 元数据都累计到当前 Node 进程内存里, + // 高并发或超长响应下可能带来明显的事件循环抖动;后续可改为限制缓存窗口或只保留摘要。 const chunks: IImageStreamUpstreamResponse["chunks"] = []; let buffer = ""; let content = ""; @@ -301,6 +303,8 @@ const parseSseDataLine = (line: string): IChatCompletionStreamChunk | null => { const data = trimmed.slice("data:".length).trim(); if (!data || data === "[DONE]") return null; + // TODO: JSON.parse 仍运行在主线程;如果后续接入更大的 SSE chunk,需要增加单行大小保护, + // 避免异常大包在单个 tick 内长时间占用事件循环。 return JSON.parse(data) as IChatCompletionStreamChunk; };