fix(ai): AtlasCloud üst sağlayıcısı kalıcı olarak atlanır (liste + danışman)
All checks were successful
Deploy / deploy (push) Successful in 9m34s

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 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-10-05 09:40:18 +03:00
parent 3e599a5411
commit b04003fa09
3 changed files with 30 additions and 8 deletions

View File

@@ -1,5 +1,5 @@
import { z } from "zod"; 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 * 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 → * 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ğı). * "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 * İki katman: AtlasCloud kalıcı olarak atlanır (client.ts
* gözlenen üst sağlayıcı bir süre `provider.ignore` ile atlanır; kalanlar * `kaliciDislananSaglayicilar`, Bilal 5 Eki 2026); ayrıca isteğe uymadığı bu
* arasında yönlendirme OpenRouter'da kalır. Kalıcı çözüm hesap ayarıdır * süreçte gözlenen başka bir üst sağlayıcı bir süre tepkisel olarak atlanır.
* (OpenRouter paneli → ignored providers) ve Bilal'in kararıdır. * Kalanlar arasında yönlendirme OpenRouter'da kalır.
*/ */
const DISLAMA_SURESI_MS = 6 * 60 * 60_000; const DISLAMA_SURESI_MS = 6 * 60 * 60_000;
const globalForCagri = globalThis as unknown as { const globalForCagri = globalThis as unknown as {
@@ -136,7 +136,9 @@ export async function yapilandirilmisUret<T extends z.ZodType>(opts: {
const sinyal = AbortSignal.timeout(URETIM_ZAMAN_ASIMI_MS); 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 // provider alanı OpenRouter'a özgüdür; başka bir kapıda (AI_BASE_URL) gönderilmez
const dislanan = const dislanan =
saglayiciAdi() === "openrouter.ai" ? dislananSaglayicilar() : []; saglayiciAdi() === "openrouter.ai"
? [...new Set([...kaliciDislananSaglayicilar(), ...dislananSaglayicilar()])]
: [];
const t0 = Date.now(); const t0 = Date.now();
const yanit = await geciciHatadaTekrarla(() => const yanit = await geciciHatadaTekrarla(() =>
getOpenRouter().chat.completions.create( getOpenRouter().chat.completions.create(

View File

@@ -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 { export function raporModeli(): string {
return ( return (
process.env.OPENROUTER_RAPOR_MODEL?.trim() || process.env.OPENROUTER_RAPOR_MODEL?.trim() ||

View File

@@ -23,7 +23,7 @@ import {
type UIMessageChunk, type UIMessageChunk,
} from "ai"; } from "ai";
import { ARACLAR, aracSeti, type AracBaglami } from "./araclar"; 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 { KAYIT_DUZELTME_NOTU, kayitBeyaniVar, semaSizintisiVar, vaatDiliBul } from "./cikti-denetimi";
import { cevapIhlalOlasiligi, JEV_DUZELTME_NOTU, JEV_IHLAL_ESIGI } from "./jev"; import { cevapIhlalOlasiligi, JEV_DUZELTME_NOTU, JEV_IHLAL_ESIGI } from "./jev";
@@ -113,7 +113,13 @@ export function danismanAkisi(opts: {
}, },
maxOutputTokens: 1024, maxOutputTokens: 1024,
abortSignal: zamanAsimi, 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 }) => { onError: ({ error }) => {
// Hata nesnesinin tamamı istek gövdesini ve cevap başlıklarını // Hata nesnesinin tamamı istek gövdesini ve cevap başlıklarını
// taşır; loga yalnız durum kodu ve mesaj gider. // taşır; loga yalnız durum kodu ve mesaj gider.