All checks were successful
Deploy / deploy (push) Successful in 9m30s
- Tüm AI akışı OpenRouter üzerinden (openai SDK, varsayılan model deepseek/deepseek-v4-flash, OPENROUTER_MODEL ile değiştirilebilir); Anthropic/Gemini/lokal sağlayıcı seçimi ve SDK'ları kaldırıldı. - Rapor: aday havuzu dilim başına 20 (60 program, ~8k token prompt); AI şeması sabit uzunluklu üç liste (hayal 5 / dengeli 13 / garanti 6 — dağılım şema düzeyinde zorlanır), sıra + dilim + riskNotu + trendOzeti gerçek sıra geçmişinden deterministik üretilir; 184 sn → ~12 sn. - Sohbet: akış ortası zaman aşımı artık sessizce yutulmaz (kesik cevap tam cevap gibi kaydedilmiyordu, kredi iadesi çalışmıyordu); istemci hata anında durumu sunucudan senkronlar, boş balon bırakmaz. - aiHataMesaji, openai SDK'nın .name'i "Error" kalan abort/timeout hatalarını da yakalar; meraklisina şeması yeni akışla senkronlandı. - CI: OPENROUTER_API_KEY / OPENROUTER_MODEL secret'ları; eski AI secret'ları kaldırıldı. next.config serverExternalPackages sadeleşti. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
import OpenAI from "openai";
|
||
|
||
// Tüm AI akışı OpenRouter üzerinden tek kapıdan gider (kullanıcı kararı,
|
||
// 7 Ağu 2026 — önceki Anthropic/Gemini/lokal sağlayıcı seçimi kaldırıldı).
|
||
// Model .env'den değiştirilebilir; rapor ve sohbet istenirse ayrışabilir.
|
||
const VARSAYILAN_MODEL = "deepseek/deepseek-v4-flash";
|
||
|
||
export function raporModeli(): string {
|
||
return (
|
||
process.env.OPENROUTER_RAPOR_MODEL?.trim() ||
|
||
process.env.OPENROUTER_MODEL?.trim() ||
|
||
VARSAYILAN_MODEL
|
||
);
|
||
}
|
||
|
||
export function sohbetModeli(): string {
|
||
return (
|
||
process.env.OPENROUTER_SOHBET_MODEL?.trim() ||
|
||
process.env.OPENROUTER_MODEL?.trim() ||
|
||
VARSAYILAN_MODEL
|
||
);
|
||
}
|
||
|
||
/** API anahtarı tanımlı mı (mock moduna düşülecek mi)? */
|
||
export function anahtarVar(): boolean {
|
||
return Boolean(process.env.OPENROUTER_API_KEY);
|
||
}
|
||
|
||
const globalForAi = globalThis as unknown as { __openrouter?: OpenAI };
|
||
|
||
export function getOpenRouter(): OpenAI {
|
||
const apiKey = process.env.OPENROUTER_API_KEY;
|
||
if (!apiKey) {
|
||
throw new Error("AI_KEY_MISSING");
|
||
}
|
||
if (!globalForAi.__openrouter) {
|
||
globalForAi.__openrouter = new OpenAI({
|
||
baseURL: "https://openrouter.ai/api/v1",
|
||
apiKey,
|
||
// Tek retry otoritesi cagri.ts'teki geciciHatadaTekrarla
|
||
maxRetries: 0,
|
||
// OpenRouter panelindeki kullanım dökümünde uygulama atfı (opsiyonel)
|
||
defaultHeaders: {
|
||
"HTTP-Referer": "https://kolaytercih.com",
|
||
"X-Title": "KolayTercih",
|
||
},
|
||
});
|
||
}
|
||
return globalForAi.__openrouter;
|
||
}
|
||
|
||
export const SORUMLULUK_REDDI =
|
||
"KolayTercih bir karar destek aracıdır; öneriler resmî YÖK Atlas verisine dayanır ancak yerleşme garantisi verilmez. Nihai tercih sorumluluğu adaya aittir.";
|