From b04003fa09e108dc3269921756dc7cfc989222ce Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Mon, 5 Oct 2026 09:40:18 +0300 Subject: [PATCH] =?UTF-8?q?fix(ai):=20AtlasCloud=20=C3=BCst=20sa=C4=9Flay?= =?UTF-8?q?=C4=B1c=C4=B1s=C4=B1=20kal=C4=B1c=C4=B1=20olarak=20atlan=C4=B1r?= =?UTF-8?q?=20(liste=20+=20dan=C4=B1=C5=9Fman)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AtlasCloud reasoning_effort: "none" isteğine uymuyor; cevap ~50 sn sürüp yarım kalıyordu (07-liste-duzeltmeleri.md). Liste üretiminde tepkisel 6 saatlik atlamaya ek olarak kalıcı liste eklendi (client.ts); danışman sohbeti de aynı listeyi provider.ignore ile gönderir. Gerçek modelle doğrulandı: 3 soru + 2 listede istek gövdesinde alan var, yanıt 200. Co-Authored-By: Claude Opus 5.5 --- src/lib/ai/cagri.ts | 14 ++++++++------ src/lib/ai/client.ts | 14 ++++++++++++++ src/lib/ai/sohbet-akisi.ts | 10 ++++++++-- 3 files changed, 30 insertions(+), 8 deletions(-) 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.