diff --git a/src/lib/ai/cagri.ts b/src/lib/ai/cagri.ts index ad09814..59f9e8b 100644 --- a/src/lib/ai/cagri.ts +++ b/src/lib/ai/cagri.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { getOpenRouter, raporModeli, saglayiciAdi } from "./client"; +import { getOpenRouter, kaliciDislananSaglayicilar, raporModeli, saglayiciAdi } from "./client"; /** * AI çağrı katmanı: tüm istekler OpenRouter'ın OpenAI-uyumlu API'sine gider @@ -75,10 +75,10 @@ const URETIM_ZAMAN_ASIMI_MS = 60_000; * maliyet; önbellek yüzünden yeniden deneme de aynı sağlayıcıya gidiyordu → * "iki denemede başarısız" ve 60 sn zaman aşımlarının kaynağı). * - * Savunma tepkiseldir, sağlayıcı SEÇİLMEZ: isteğe uymadığı bu süreçte - * gözlenen üst sağlayıcı bir süre `provider.ignore` ile atlanır; kalanlar - * arasında yönlendirme OpenRouter'da kalır. Kalıcı çözüm hesap ayarıdır - * (OpenRouter paneli → ignored providers) ve Bilal'in kararıdır. + * İki katman: AtlasCloud kalıcı olarak atlanır (client.ts + * `kaliciDislananSaglayicilar`, Bilal 5 Eki 2026); ayrıca isteğe uymadığı bu + * süreçte gözlenen başka bir üst sağlayıcı bir süre tepkisel olarak atlanır. + * Kalanlar arasında yönlendirme OpenRouter'da kalır. */ const DISLAMA_SURESI_MS = 6 * 60 * 60_000; const globalForCagri = globalThis as unknown as { @@ -136,7 +136,9 @@ export async function yapilandirilmisUret(opts: { const sinyal = AbortSignal.timeout(URETIM_ZAMAN_ASIMI_MS); // provider alanı OpenRouter'a özgüdür; başka bir kapıda (AI_BASE_URL) gönderilmez const dislanan = - saglayiciAdi() === "openrouter.ai" ? dislananSaglayicilar() : []; + saglayiciAdi() === "openrouter.ai" + ? [...new Set([...kaliciDislananSaglayicilar(), ...dislananSaglayicilar()])] + : []; const t0 = Date.now(); const yanit = await geciciHatadaTekrarla(() => getOpenRouter().chat.completions.create( diff --git a/src/lib/ai/client.ts b/src/lib/ai/client.ts index edc57f8..ff4739a 100644 --- a/src/lib/ai/client.ts +++ b/src/lib/ai/client.ts @@ -26,6 +26,20 @@ export function saglayiciAdi(): string { } } +/** + * OpenRouter'ın hiç yönlendirmemesi gereken üst sağlayıcılar (istek gövdesinde + * `provider.ignore`). AtlasCloud `reasoning_effort: "none"` isteğine uymuyor: + * 4.000 token'ın 3.999'unu düşünmeye harcıyor, cevap ~50 sn sürüp yarım kalıyor + * (ölçüm 5 Eki 2026, docs/gece-vardiyasi/2026-10-05/07-liste-duzeltmeleri.md). + * Liste üretimi (cagri.ts) ve danışman sohbeti (sohbet-akisi.ts) ortak kullanır. + * Başka bir kapıda (AI_BASE_URL) boş döner: `provider` alanı OpenRouter'a özgü. + */ +const KALICI_DISLANAN_SAGLAYICILAR = ["AtlasCloud"]; + +export function kaliciDislananSaglayicilar(): string[] { + return saglayiciAdi() === "openrouter.ai" ? KALICI_DISLANAN_SAGLAYICILAR : []; +} + export function raporModeli(): string { return ( process.env.OPENROUTER_RAPOR_MODEL?.trim() || diff --git a/src/lib/ai/sohbet-akisi.ts b/src/lib/ai/sohbet-akisi.ts index 272e588..7a972d2 100644 --- a/src/lib/ai/sohbet-akisi.ts +++ b/src/lib/ai/sohbet-akisi.ts @@ -23,7 +23,7 @@ import { type UIMessageChunk, } from "ai"; import { ARACLAR, aracSeti, type AracBaglami } from "./araclar"; -import { sohbetDilModeli } from "./client"; +import { kaliciDislananSaglayicilar, sohbetDilModeli } from "./client"; import { KAYIT_DUZELTME_NOTU, kayitBeyaniVar, semaSizintisiVar, vaatDiliBul } from "./cikti-denetimi"; import { cevapIhlalOlasiligi, JEV_DUZELTME_NOTU, JEV_IHLAL_ESIGI } from "./jev"; @@ -113,7 +113,13 @@ export function danismanAkisi(opts: { }, maxOutputTokens: 1024, abortSignal: zamanAsimi, - providerOptions: { openaiCompatible: { reasoningEffort: "none" } }, + providerOptions: { + openaiCompatible: { reasoningEffort: "none" }, + // Sağlayıcı adı altındaki bilinmeyen alanlar istek gövdesine aynen geçer + ...(kaliciDislananSaglayicilar().length > 0 + ? { openrouter: { provider: { ignore: kaliciDislananSaglayicilar() } } } + : {}), + }, onError: ({ error }) => { // Hata nesnesinin tamamı istek gövdesini ve cevap başlıklarını // taşır; loga yalnız durum kodu ve mesaj gider.