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); }