fix: Ollama KEEP_ALIVE=-1 ve AbortError mesaj netliği, callAiModelRaw'a opsiyonel timeoutMs
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).
This commit is contained in:
@@ -150,12 +150,12 @@ async function callAiModel(systemPrompt: string, userText: string): Promise<{ re
|
|||||||
return { resultJson, aiModel };
|
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 { aiModel } = getAiConfig();
|
||||||
const aiContent = await callOllama([
|
const aiContent = await callOllama([
|
||||||
{ role: 'system', content: systemPrompt },
|
{ role: 'system', content: systemPrompt },
|
||||||
{ role: 'user', content: userText.substring(0, 15000) },
|
{ role: 'user', content: userText.substring(0, 15000) },
|
||||||
], { numPredict });
|
], { numPredict, timeoutMs });
|
||||||
return { aiContent, aiModel };
|
return { aiContent, aiModel };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-1
@@ -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
|
// 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ıç
|
// 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.
|
// 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
|
// 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ı
|
// 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.
|
// 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();
|
const data = await response.json();
|
||||||
return (data.message?.content || '').toString().trim();
|
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 {
|
} finally {
|
||||||
clearTimeout(timeoutId);
|
clearTimeout(timeoutId);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user