Köfteci Yusuf — AI Sipariş Asistanı Akış Şeması

Telefonla arayan bir müşterinin karşılama anından itibaren izlediği her yol. hang_up() SADECE görüşmenin gerçekten bittiği noktalarda gösteriliyor — her biri hangi daldan geldiğini ve neden kapandığını açıkça belirtiyor, ara adımda rastgele bir kesinti yok.

Sistem aracı (API) çağrısı Müşteriye söylenen Karar noktası Görüşme sonu (hang_up)
Müşteri arıyor
AÇILIŞ

Karşılama

customer_lookup(telefon) görüşme başlamadan arka planda otomatik çalışır — arayan numara sistemde kayıtlıysa müşteri bilgisi ve varsa kayıtlı adres(ler) asistana yüklenir.

Tanınan Müşteri

"İyi günler [Ad] bey/hanım, nasıl yardımcı olabilirim?"

Yeni / Misafir

"İyi günler, Köfteci Yusuf Sipariş Asistanınız, nasıl yardımcı olabilirim?"

İstek türünü belirlemüşterinin ilk cümlesinden
Bilgi Talebi

Saat, ürün içeriği, en yakın şube, genel soru

Sipariş

Doğrudan sipariş vermek istiyor

Şikayet / İptal / İtiraz

Geçmiş sipariş sorunu, vazgeçme, gecikme, iptal

Aynı görüşmede birden fazla talep olabilir — biri bitince müşteriye başka bir isteği olup olmadığı sorulur, o dala geçilir.

A

Bilgi Talebi

Sipariş niyeti olmadan sorulan sorular

Şube Saati Sorusu

check_branch_status çağrılır, dönen calisma_saatleri okunur: "Çalışma saatlerimiz 10:00 - 23:00 arasıdır."

Ürün İçeriği / Alerjen

get_menu çağrılır, ozet içindeki alerjen bilgisi okunur. Bilgi yoksa uydurulmaz — "netleştirip döneriz" denir.

En Yakın Şube

Adres sorulur, resolve_branch çağrılır — sipariş niyeti olmadan, sadece bilgi amaçlı da kullanılabilir.

Genel Soru

Marka/kampanya sorusu kısaca yanıtlanır, ardından nazikçe siparişe yönlendirilir: "Dilerseniz hemen alayım."

Sipariş İstiyor

↓ B) SİPARİŞ bölümüne geç

İstemiyor
Görüşme biter — hang_up()
Bilgi verildi, müşterinin başka isteği yok.
B

Sipariş Alma

Adım 1'den 7'ye — ana sipariş akışı

ADIM 1

Adres ve Şube Tespiti — zorunlu, ilk adım

Menüye veya siparişe geçilmez; önce hangi şubenin hizmet vereceği netleşir.

Müşterinin kayıtlı adresi var mı?customer_lookup sonucuna göre
Evet — Kayıtlı Adres Var

Birden fazla adres varsa (ev/iş) varsaymadan "Hangi adresinize göndereyim?" diye sorar. Tek adres varsa kısaca teyit eder.

check_branch_status(branch_id) ile şube doğrulanır — resolve_branch tekrar çağrılmaz.

Şube kullanılamazsa alternatif için resolve_branch'e geçilir. "Başka adres" derse sağdaki akışa geçilir.

Hayır — Yeni / Farklı Adres

"Adresinizi alabilir miyim?" → resolve_branch(adres_metni)

Adres çok belirsizse (sadece ilçe) aynı sorguyu tekrarlamaz — "Cadde/mahalle adını da alabilir miyim?" diye ek bilgi ister.

serviceable = true mu?ve şube şu an açık mı
Hayır

Bölge dışı: "Maalesef bu bölgeye teslimat yapamıyoruz" — dilerse gel-al önerilir.

Bölgede ama kapalı (kapali_ama_bolgede): en yakın şubenin adı ve en_yakin_sube_saatleri iletilir, tekrar aramaları önerilir.

Görüşme biter — hang_up()
Bu adrese/saatte hizmet verilemiyor, sipariş alınmadı.
Evet — Şube Atandı

branch_id ve branch_name hafızada tutulur: "Sizi [Şube] şubemizden bağlıyoruz."

ADIM 2

Menü

Müşteri ürün/fiyat sorduğunda: get_menu(branch_id, kategori) — kategori boş bırakılabilir, tüm menü döner. O şubede olmayan ürün asla önerilmez.

ADIM 3

Sipariş Alma — Ürünleri Söyletme

Müşteri ne istediğini söyler → yeni müşteriden sadece adı alınır (tanınandan telefon tekrar sorulmaz) → teslimat mı gel-al mı sorulur.

ADIM 4

Öneri Kuralları — her biri sadece bir kez

Kasap ürünü aldıysa Hesaplı Kasap, köfte/çıtır aldıysa yan ürün, sonrasında şarküteri ürünü önerilebilir — sadece get_menu'de gerçekten olan ürünler, ısrar edilmez.

ADIM 5

Minimum Sepet Tutarı

Ara toplam tahmin edilmez, get_menu fiyatlarıyla yeniden toplanır. 350 TL altındaysa tamamlama önerilir, reddederse ısrar edilmez.

Devam Ediyor

↓ Adım 6'ya geç

Tamamen Vazgeçti

↓ C) ŞİKAYET bölümü, alt-fork B'ye geç

ADIM 6

Özet ve Onay

Sipariş tek cümlede özetlenir. Tutar uydurulmaz — save_order sonucundan öğrenilecek. Onay istenir.

ADIM 7

Kayıt

Onay gelince tek seferde: save_order(branch_id, urunler, teslimat_turu, adres, musteri_adi) — tutar gönderilmez, sunucu hesaplar.

"Siparişiniz alındı, numaranız [siparis_no], toplam [toplam_tutar] lira, tahmini teslimat [dk] dakika."

Yeni adres + tanınan müşteriyse: "Kayıtlarınıza ekleyelim mi? Ev mi iş mi?" → save_address(adres_metni, branch_id, etiket)

Müşteri Memnun
Görüşme biter — hang_up()
"Bereket versin, afiyet olsun" — sipariş başarıyla kaydedildi.
Hemen "İptal Edin" Derse

↓ C) ŞİKAYET bölümü, alt-fork C'ye geç (ADIM 6/7 tekrarlanmaz)

C

Şikayet / İptal / İtiraz

5 alt durum — hangisi olduğu ilk cümleden belirlenir

AGeçmiş Sipariş Sorunu / İade

Sebep sorulur, 5 kategoriden hangisi belirlenir: yabancı madde · bozuk/bayat ürün · SKT geçmiş · paket hasarlı · pişirme sorunu (uymuyorsa diğer).

Basit/değişimle çözülebilecekse (eksik/yanlış ürün) önce değişim önerilir. Değişim olmaz veya ciddi bir durumsa (özellikle yabancı madde):

save_complaint(siparis_no, sikayet_tipi="iade", sikayet_nedeni=[kategori], aciklama)

Görüşme biter — hang_up()
Takip no ve SLA süresi iletildi.
BSipariş Vermekten Vazgeçme (kayıt öncesi)

"Vazgeçme sebebinizi paylaşabilir misiniz?" diye SADECE BİR KEZ sorulur, kısa bir ikna cümlesi kurulur. Kayıt aracı hiç çağrılmaz.

Görüşme biter — hang_up()
Israrla vazgeçti, sipariş hiç kaydedilmedi.
CSipariş Tamamlandıktan Hemen Sonra İptal

save_order zaten çağrılmış, müşteri fikrini değiştirdi: "İptal talebinizi hemen ilettim" →

save_complaint(siparis_no, sikayet_tipi="iptal", aciklama)

Görüşme biter — hang_up()
Takip no iletildi, şubenin onayı beklenecek.
DKurye / Teslimat Gecikmesi

siparis_durumu_sorgula(siparis_no) çağrılır.

gecikme_var_mi=true → gecikme dürüstçe iletilir, özür dilenir. false → kalan_dakika iletilir. "Kurye X dakikaya gelir" gibi bir tahmin ASLA uydurulmaz — sadece API verisi kullanılır.

Görüşme biter — hang_up()
Gerçek durum bilgisi verildi.
EAdresten Hemen Ayrılacak Müşteri

"Kurye yetişir mi?" sorusu — siparis_durumu_sorgula(siparis_no) ile kalan_dakika öğrenilir ve dürüstçe iletilir. Kesin bir söz verilmez; dilerse gel-al'a yönlendirilebilir.

Görüşme biter — hang_up()
Elde olan bilgi paylaşıldı, kesin taahhüt verilmedi.

Görüşmenin her anında geçerli kurallar

Yukarıdaki üç bölümün (A/B/C) dışında, konuşmanın herhangi bir noktasında devreye girebilecek kurallar.

API Hatası / Zaman Aşımı

Herhangi bir araç başarısız olursa: 1. "Tekrar deniyorum" deyip aynı aracı bir kez daha çağırır. 2. Yine başarısız olursa özür diler, duruma göre insana aktarır ya da nazikçe kapanır (hang_up). Üçüncü kez çağırmaz.

İnsana Aktarım

  • Müşteri açıkça isterse
  • Aynı konuda 2 kez anlaşılamazsa
  • Kayıt art arda 2 kez başarısız olursa
  • Müşteri sinirli/şikayeti büyütüyorsa

Dallar Arası Geçiş

Bir görüşmede birden fazla talep olabilir (önce şikayet, sonra yeni sipariş gibi). Bir dal biterse hemen kapanmaz — "Başka bir isteğiniz var mı?" diye sorulur, varsa ilgili bölüme geçilir.

Görüşme Bitişi

hang_up() SADECE: bir dal gerçekten sonuçlandığında (kayıt yapıldı/reddedildi/bilgi verildi) VEYA müşteri veda/teşekkür sinyali verdiğinde çağrılır. Başka hiçbir yerde görüşme kesilmez.