From 3f1e770013423ed4118315cfbf323ae6e8eab02c Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Mon, 5 Oct 2026 01:06:01 +0300 Subject: [PATCH] =?UTF-8?q?fix(danisman):=20H3=20(3)=20=E2=80=94=20bedelsi?= =?UTF-8?q?z=20onay=20yolu=20yaln=C4=B1z=20ger=C3=A7ek=20onayda=20a=C3=A7?= =?UTF-8?q?=C4=B1ls=C4=B1n=20[KARAR]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Onay mesajı artık baştan sona evet/hayır sözlerinden oluşmalı; "evet. " normal (kredili) soru sayılır, 0 kredide 402 döner. "Profil onayı kredi harcamaz" kararı (26 Eyl) gerçek onay için aynen duruyor. Co-Authored-By: Claude Fable 5.1 --- src/app/api/soru/route.ts | 18 +---------------- src/lib/ai/sohbet-gecmisi.ts | 39 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/app/api/soru/route.ts b/src/app/api/soru/route.ts index 1aeba7a..97e9784 100644 --- a/src/app/api/soru/route.ts +++ b/src/app/api/soru/route.ts @@ -14,7 +14,7 @@ import { kullanicininRaporu, sohbetGecmisiGetir } from "@/features/rapor/rapor-q import type { AracBaglami } from "@/lib/ai/araclar"; import { danismanAkisi } from "@/lib/ai/sohbet-akisi"; import { sistemPromptu } from "@/lib/ai/danisman-prompt"; -import { modelPenceresi } from "@/lib/ai/sohbet-gecmisi"; +import { modelPenceresi, onayMesajiMi } from "@/lib/ai/sohbet-gecmisi"; import { profilGetir } from "@/lib/danisman-profil-db"; import { listeOzetiCikar } from "@/lib/ai/rapor"; import type { RaporSonuc } from "@/features/rapor/types/rapor"; @@ -28,22 +28,6 @@ const akisBasliklari = (bedelsiz: boolean) => ({ "Cache-Control": "no-store", "X-Kredi-Dusuldu": bedelsiz ? "0" : "1", }); - -/** Danışmanın onay sorusunda geçen sabit ibare; istemci de bunu görmez, yalnız sunucu arar. */ -const ONAY_SORUSU = "profiline kaydedeyim mi"; - -/** - * Onay mesajı mı: son danışman mesajı "kaydedeyim mi?" diye sormuş VE aday - * kısa bir evet/hayır yazmış. Bu mesaj kredi harcamaz (Bilal, 26 Eyl 2026). - * Kısa tutulur ki "evet ama İzmir'de hukuk kaç sırayla alıyor" gibi gerçek - * sorular bedava geçmesin. - */ -function onayMesajiMi(mesaj: string, sonAsistan: string | undefined): boolean { - if (!sonAsistan || !sonAsistan.toLocaleLowerCase("tr-TR").includes(ONAY_SORUSU)) return false; - const m = mesaj.trim().toLocaleLowerCase("tr-TR"); - if (m.length > 40) return false; - return /^(evet|olur|tamam|kaydet|kaydedebilirsin|kaydedelim|hayır|hayir|kaydetme|gerek yok|istemiyorum|şimdilik hayır)\b/.test(m); -} const MAX_MESAJ_UZUNLUK = 2000; // Widget açıldığında geçmişi ve kredi bakiyesini döner diff --git a/src/lib/ai/sohbet-gecmisi.ts b/src/lib/ai/sohbet-gecmisi.ts index 5f45e1f..6b9a3ed 100644 --- a/src/lib/ai/sohbet-gecmisi.ts +++ b/src/lib/ai/sohbet-gecmisi.ts @@ -27,3 +27,42 @@ export function modelPenceresi(gecmis: SohbetMesaji[], yeniSoru: string): Sohbet } return gruplar.map((g) => ({ role: g.role, content: g.parcalar.join("\n\n") })); } + +/** Danışmanın onay sorusunda geçen sabit ibare; istemci de bunu görmez, yalnız sunucu arar. */ +const ONAY_SORUSU = "profiline kaydedeyim mi"; + +const ONAY_SOZLERI = [ + "evet", + "olur", + "tamam", + "kaydet", + "kaydedebilirsin", + "kaydedelim", + "hayır", + "hayir", + "yok", + "kaydetme", + "gerek yok", + "istemiyorum", + "şimdilik hayır", +]; +/** Onay sözünün ardından gelebilecek dolgu; bunların dışındaki her kelime mesajı soru yapar. */ +const ONAY_DOLGU = [...ONAY_SOZLERI, "bunu", "lütfen", "lutfen", "teşekkürler", "tesekkurler", "teşekkür ederim", "sağ ol"]; +const ONAY_KALIBI = new RegExp(`^(?:${ONAY_SOZLERI.join("|")})(?: (?:${ONAY_DOLGU.join("|")}))*$`); + +/** + * Onay mesajı mı: son danışman mesajı "kaydedeyim mi?" diye sormuş VE adayın + * mesajı BAŞTAN SONA evet/hayır sözlerinden oluşuyor. Bu mesaj kredi harcamaz + * (Bilal, 26 Eyl 2026). Yalnız başına bakmak yetmiyordu: "evet. Ege hukuk + * taban sırası kaç?" kredisiz tam cevap alıyordu. Kalıba uymayan mesaj + * normal (kredili) soru sayılır. + */ +export function onayMesajiMi(mesaj: string, sonAsistan: string | undefined): boolean { + if (!sonAsistan || !sonAsistan.toLocaleLowerCase("tr-TR").includes(ONAY_SORUSU)) return false; + const m = mesaj + .toLocaleLowerCase("tr-TR") + .replace(/[.,!?;:…'"()]+/g, " ") + .replace(/\s+/g, " ") + .trim(); + return ONAY_KALIBI.test(m); +}