From 4c69ee4fc19c61cf6ed463e4f9dd366175dbae27 Mon Sep 17 00:00:00 2001 From: Kshitij <160704796+kshitij-ka@users.noreply.github.com> Date: Sun, 3 May 2026 17:26:20 +0530 Subject: [PATCH] fix: add timeout to LLM API calls to prevent hung requests. --- web/server/services/llmService.js | 43 +++++++++++++++++++------------ 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/web/server/services/llmService.js b/web/server/services/llmService.js index 2b8d15e..bb6e7e0 100644 --- a/web/server/services/llmService.js +++ b/web/server/services/llmService.js @@ -21,26 +21,37 @@ const MODEL = "llama-3.1-8b-instant"; * @returns {Promise} Trimmed text content from the first choice. * @throws {Error} If the API key is missing or the response is non-2xx. */ +const GROQ_TIMEOUT_MS = 8_000; + async function _groqCall({ systemPrompt, userMessage, maxTokens = 256, temperature = 0.2 }) { const key = process.env.GROQ_API_KEY; if (!key) throw new Error("GROQ_API_KEY not set"); - const res = await fetch(GROQ_API_URL, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${key}`, - }, - body: JSON.stringify({ - model: MODEL, - messages: [ - { role: "system", content: systemPrompt }, - { role: "user", content: userMessage }, - ], - max_tokens: maxTokens, - temperature, - }), - }); + const ctrl = new AbortController(); + const tid = setTimeout(() => ctrl.abort(), GROQ_TIMEOUT_MS); + + let res; + try { + res = await fetch(GROQ_API_URL, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${key}`, + }, + body: JSON.stringify({ + model: MODEL, + messages: [ + { role: "system", content: systemPrompt }, + { role: "user", content: userMessage }, + ], + max_tokens: maxTokens, + temperature, + }), + signal: ctrl.signal, + }); + } finally { + clearTimeout(tid); + } if (!res.ok) { const body = await res.json().catch(() => ({}));