From 0ef2b715c46c7ee0e2a49d66d0ef1ec2089e5a34 Mon Sep 17 00:00:00 2001 From: asepharyana Date: Sat, 1 Aug 2026 15:00:59 +0700 Subject: [PATCH] =?UTF-8?q?fix(gateway):=20enable=20stream=20for=20all=20L?= =?UTF-8?q?LM=20calls=20=E2=80=94=20router=20always=20streams=20SSE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Audit lanjutan: 6x 'LLM API request failed: Request was aborted' per jam. Root cause: 9router/omniroute SELALU balas SSE (data: chunks) walau request tanpa stream:true — SDK OpenAI non-stream menunggu FULL body sebelum parse, jadi batch moderasi besar yang upstream-nya lambat kena timeout 30-60s dan di-abort. llmClient sudah punya agregasi streaming (chunks → ChatCompletion). Fix: stream:true di llmCaller (moderasi batch/individual), llmVision, cultureLearner, userProfileLearner. Verified: SDK stream test 806ms vs sebelumnya abort. Caller lain (recovery worker dll) lewat llmCaller sama. --- .../src/modules/ai-moderation/cultureLearner.ts | 1 + .../discord-gateway/src/modules/ai-moderation/llmCaller.ts | 7 +++++++ .../discord-gateway/src/modules/ai-moderation/llmClient.ts | 1 + .../src/modules/ai-moderation/userProfileLearner.ts | 1 + 4 files changed, 10 insertions(+) diff --git a/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts b/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts index e71d537..49b2c2a 100644 --- a/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts +++ b/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts @@ -87,6 +87,7 @@ hal dasar ke newbie tanpa judge."`; max_tokens: 500, temperature: 0.7, // Higher temp for summarization retries: 2, + stream: true, // router always streams SSE; non-stream waits for full body and times out }); if (!completion) throw new Error("Empty response from LLM"); diff --git a/services/discord-gateway/src/modules/ai-moderation/llmCaller.ts b/services/discord-gateway/src/modules/ai-moderation/llmCaller.ts index 4ed3eb2..f2f471a 100644 --- a/services/discord-gateway/src/modules/ai-moderation/llmCaller.ts +++ b/services/discord-gateway/src/modules/ai-moderation/llmCaller.ts @@ -79,6 +79,13 @@ export async function callModerationLLM( jsonResponse: { type: "json_object" }, retries: 0, signal, + // Router (9router/omniroute) always streams SSE even when the + // request omits `stream`. In non-stream mode the OpenAI SDK waits + // for the FULL body before parsing, so slow/long upstream streams + // hit the 30s/60s timeout and abort mid-generation. Streaming mode + // consumes chunks incrementally — timeout only fires on a real + // stall. llmClient aggregates the stream into a ChatCompletion. + stream: true, }); if (!completion) diff --git a/services/discord-gateway/src/modules/ai-moderation/llmClient.ts b/services/discord-gateway/src/modules/ai-moderation/llmClient.ts index 3969423..230b4a5 100644 --- a/services/discord-gateway/src/modules/ai-moderation/llmClient.ts +++ b/services/discord-gateway/src/modules/ai-moderation/llmClient.ts @@ -272,6 +272,7 @@ export async function llmVision( temperature: 0.1, top_p: 0.9, retries: 0, + stream: true, // router always streams SSE; non-stream waits for full body and times out }); if (!completion) return null; diff --git a/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts b/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts index 18e4400..ac8d8aa 100644 --- a/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts +++ b/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts @@ -116,6 +116,7 @@ atau konten SARA, itu akan SANGAT tidak sesuai dengan karakternya dan patut dicu max_tokens: 2000, temperature: 0.7, // Higher temp for summarization retries: 2, + stream: true, // router always streams SSE; non-stream waits for full body and times out }); if (!completion) throw new Error("Empty response from LLM");