From 66a3960d904d915d639d653d71046683ded9416c Mon Sep 17 00:00:00 2001 From: Mustafa Yildiz Date: Mon, 17 Aug 2026 00:46:10 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20Ollama=20KEEP=5FALIVE=3D-1=20ve=20AbortE?= =?UTF-8?q?rror=20mesaj=20netli=C4=9Fi,=20callAiModelRaw'a=20opsiyonel=20t?= =?UTF-8?q?imeoutMs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KEEP_ALIVE '30m' -> -1: GPU'da bolca boş VRAM var, modeli sürekli bellekte tutmanın maliyeti yok, 30dk sınırı gereksiz soğuk-başlangıç gecikmelerine sebep oluyordu (bkz. 2026-08-14 log: 44GB boş / 17.5GB kullanılan). --- src/controllers/document.controller.ts | 4 ++-- src/lib/aiClient.ts | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/controllers/document.controller.ts b/src/controllers/document.controller.ts index 960935e..2b89266 100644 --- a/src/controllers/document.controller.ts +++ b/src/controllers/document.controller.ts @@ -150,12 +150,12 @@ async function callAiModel(systemPrompt: string, userText: string): Promise<{ re return { resultJson, aiModel }; } -export async function callAiModelRaw(systemPrompt: string, userText: string, numPredict = 1500): Promise<{ aiContent: string; aiModel: string }> { +export async function callAiModelRaw(systemPrompt: string, userText: string, numPredict = 1500, timeoutMs?: number): Promise<{ aiContent: string; aiModel: string }> { const { aiModel } = getAiConfig(); const aiContent = await callOllama([ { role: 'system', content: systemPrompt }, { role: 'user', content: userText.substring(0, 15000) }, - ], { numPredict }); + ], { numPredict, timeoutMs }); return { aiContent, aiModel }; } diff --git a/src/lib/aiClient.ts b/src/lib/aiClient.ts index 7b58f8f..c27d213 100644 --- a/src/lib/aiClient.ts +++ b/src/lib/aiClient.ts @@ -6,7 +6,12 @@ export interface ChatMsg { role: string; content: string; } // Model her istekte bellekten atılıp yeniden yüklenmesin diye (varsayılan Ollama // davranışı: 5 dakika kullanılmazsa boşalır, sıradaki istek soğuk başlangıç // gecikmesi yaşar) worker'ı bu süre boyunca bellekte tutmasını istiyoruz. -const KEEP_ALIVE = '30m'; +// -1: Ollama'ya özel değer, "asla otomatik atma" anlamına gelir — sadece Ollama +// sunucusu yeniden başlarsa model tekrar yüklenir. GPU'da bolca boş VRAM var +// (bkz. 2026-08-14 log: 44GB boş / 17.5GB kullanılan), bu yüzden modeli sürekli +// bellekte tutmanın maliyeti yok; 30dk'lık sınır sadece gereksiz soğuk başlangıç +// gecikmelerine (~90sn, bazen backend timeout'undan uzun) sebep oluyordu. +const KEEP_ALIVE = -1; // 800 pratikte çok düşük çıktı — çok bölümlü hukuki cevaplar (kira feshi, tazminat // hesabı gibi) bu sınıra çarpıp cümlenin ortasında kesiliyordu. 2048 hem çoğu cevabı // tam bitirmeye yetiyor hem de modelin sonsuz uzayıp gitmesine karşı hâlâ bir üst sınır. @@ -55,6 +60,11 @@ export async function callOllama( } const data = await response.json(); return (data.message?.content || '').toString().trim(); + } catch (err: any) { + if (err?.name === 'AbortError' || (err?.message && String(err.message).toLowerCase().includes('aborted'))) { + throw new Error('Yapay zeka yanıt verme süresi aşıldı (Zaman Aşımı). Lütfen tekrar deneyin.'); + } + throw err; } finally { clearTimeout(timeoutId); }