From bdf80b081c0cc2fb4711c0f7cdf71a3ff99838b4 Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Fri, 5 Jun 2026 19:08:57 +0700 Subject: [PATCH] chore(ai-moderation): increase llm client timeout and add test script - Increase OpenAI client timeout from 15s to 60s to handle high-latency models - Add `test-llm.js` for manual verification of LLM connectivity and response times --- .../src/modules/ai-moderation/llmClient.ts | 2 +- test-llm.js | 60 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 test-llm.js diff --git a/services/discord-gateway/src/modules/ai-moderation/llmClient.ts b/services/discord-gateway/src/modules/ai-moderation/llmClient.ts index f238691..88cdd25 100644 --- a/services/discord-gateway/src/modules/ai-moderation/llmClient.ts +++ b/services/discord-gateway/src/modules/ai-moderation/llmClient.ts @@ -27,7 +27,7 @@ function getClient(): OpenAI | null { apiKey: config.AI_LLM_API_KEY, baseURL: config.AI_LLM_BASE_URL, maxRetries: 0, - timeout: 15_000, + timeout: 60_000, // Diperbesar dari 15s ke 60s untuk mengakomodasi model delay tinggi }); } return openaiClient; diff --git a/test-llm.js b/test-llm.js new file mode 100644 index 0000000..17b213e --- /dev/null +++ b/test-llm.js @@ -0,0 +1,60 @@ +const baseURL = process.env.AI_LLM_BASE_URL; +const apiKey = process.env.AI_LLM_API_KEY; + +async function main() { + console.log("šŸš€ Initializing test script..."); + console.log("baseURL:", baseURL); + console.log("apiKey:", apiKey ? "Set (Hidden)" : "Not Set"); + + const model = "cf/@cf/google/gemma-4-26b-a4b-it"; + const startMs = Date.now(); + + try { + console.log(`\nšŸ“” Mengirim request ke model: ${model} ...`); + + // Kita gunakan timeout manual menggunakan AbortController untuk mensimulasikan + // timeout LLM klien di batas waktu tinggi + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 120_000); // 120 detik + + const response = await fetch(`${baseURL}/chat/completions`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}) + }, + body: JSON.stringify({ + model: model, + messages: [ + { role: "system", content: "You are a helpful assistant." }, + { role: "user", content: "Jelaskan secara singkat cara kerja timeout API." } + ] + }), + signal: controller.signal + }); + + clearTimeout(timeoutId); + + const endMs = Date.now(); + console.log(`\nāœ… Respons diterima dalam ${endMs - startMs}ms`); + console.log("Status HTTP:", response.status); + + const text = await response.text(); + try { + const data = JSON.parse(text); + console.dir(data, { depth: null }); + console.log("\nšŸ“ Content:"); + console.log(data.choices?.[0]?.message?.content); + } catch { + console.log("\nšŸ“ Raw Text Response:"); + console.log(text); + } + + } catch (error) { + const endMs = Date.now(); + console.log(`\nāŒ Request gagal setelah ${endMs - startMs}ms`); + console.error("Pesan Error:", error.message); + } +} + +main().catch(console.error);