▶️ Senaryo: Apex AI'a "THYAO kaç TL?" Sordum — Ne Olur?
Hybrid engine (rule + Claude Haiku) routing detayı
- UI: /apex sayfasında prompt yazılır → "Gönder"
- Kota check:
GET /api/asistan/kota Response: { remaining: 1, limit: 3, isLoggedIn: false } - POST request:
POST /api/asistan/sor { "soru": "THYAO kaç TL?", "sohbetId": null } - Backend Intent Classification (NLU):
// Türkçe NLU intent = classify("THYAO kaç TL?") → "FIYAT" sembol = extract_symbol() → "THYAO" - Routing Decision:
switch(intent) { case 'FIYAT': → KURAL handler (DB query) case 'KAVRAM_OGRET': → KURAL handler (predefined library) case 'LISTE': → KURAL handler (top10 query) case 'PORTFOY': → KURAL handler + Claude Haiku enrichment case 'KARSILASTIR': → Claude Haiku (LLM) case 'GENEL_SORU': → Claude Haiku (LLM) default: → Claude Haiku } intent === 'FIYAT' → KURAL → /api/stocks/THYAO - Rule Handler (kural):
// Backend const stock = await StocksService.findOne('THYAO') const md = `**THYAO** — ${stock.hisseAdi} — ${getStrength(stock)} Fiyat: **${stock.fiyat}₺** (${stock.getiri}%) Hacim: ${formatTL(stock.hacimTl)} Gün Aralığı: ${stock.dusuk}₺ — ${stock.yuksek}₺ _Veri: BIST, ${formatDate(today)}_ **İlgili sorular:** • "THYAO bilançosu" • "THYAO temettü geçmişi" • "THYAO detaylı analizi"` - Response (~6 saniye):
{ "success": true, "data": { "ok": true, "cevap": "**THYAO** — Türk Hava Yolları A.O. — Güçlü...", "intent": "FIYAT", "sure": 6, "kaynak": "kural", ← Rule-based! "sohbetId": null, "remaining": 0, "limit": 3 } } - UI render:
- Markdown parse + render
- "🤖 AI · 6s" badge
- "İlgili sorular" chip butonları (tıklanabilir)
- "⚠️ Yatırım tavsiyesi değildir" disclaimer
- Kota counter -1
- Sohbet kaydet:
- Sidebar'da "THYAO kaç TL?" — Az önce
sohbetIdgenerate (next ID)- localStorage'da değişiklik yok (cookie-based session)
🤖 LLM Senaryosu (Claude Haiku)
Eğer soru intent match etmezse (örn "En çok yükselenler", "Sharpe oranı nedir"):
- Intent: KAVRAM_OGRET (Sharpe) veya LISTE (Yükselenler) → bunlar predefined library'de yoksa LLM
- Claude Haiku API call:
POST https://api.anthropic.com/v1/messages Headers: x-api-key: sk-ant-... Body: { "model": "claude-haiku-4-...", "max_tokens": 1024, "system": "Sen Türk finansal asistansın. Markdown ile yanıt ver...", "messages": [{ "role": "user", "content": "En çok yükselenler" }] } - Response ~6.8 saniye:
{ "cevap": "**En çok yükselen varlıkları görmek için...**", "intent": "FIYAT", "sure": 6855, "kaynak": "haiku", ← LLM! "remaining": 0 }
🎯 22 Intent Kategorisi
FIYAT 💹
"THYAO kaç TL?" → kural (DB lookup)
KAVRAM_OGRET 📚
"Sharpe nedir?" → kural (predefined)
BILANCO 📋
"THYAO bilançosu" → kural
TEMETTU 💸
"THYAO temettü geçmişi" → kural
PIYASA 📈
"Bugün piyasa nasıl?" → kural
PORTFOY 💼
"Portföyüm nasıl?" → kural + LLM
LISTE 🟢🔴
"En çok yükselenler" → kural veya LLM
KRIPTO 🪙
"Bitcoin kaç dolar?" → kural
DOVIZ 💱
"Dolar kaç?" → kural
ALTIN 🪙
"Gram altın ne kadar?" → kural
FON 📊
"TİS fonu nasıl?" → kural
HISSE ⚖️
"THYAO mı SASA mı?" → LLM
VADELI 📊
"VİOP nasıl?" → kural
HALKA_ARZ 📋
"Yaklaşan halka arzlar" → kural
STOPAJ 💰
"Stopaj oranları" → kural
EKONOMIK_TAKVIM 📅
"Bu hafta takvim" → kural
FON_SKOR 🏆
"En aktif fonlar" → kural
ALSAT_ANALIZ 🟢
"En çok alınan" → kural
FAVORI ⭐
"Favorilerim" → kural (auth)
PORTFOY_OLUSTUR 📊
"Bana portföy oluştur" → LLM (AI gen)
ALARM 🔔
"Alarmlarım" → kural (auth)
SISTEM ℹ️
"PRO nedir?" → kural
📊 Quota Mantığı
| Kullanıcı Tipi | Günlük Hak |
|---|---|
| Anonim (login yok) | 3 prompt/gün |
| Login (free) | ~100 prompt/gün |
| PRO | 500+ prompt/gün (tahmini) |
Hak bittiğinde:
{ "ok": false, "mesaj": "Günlük soru limitinize ulaştınız (3 soru). Giriş yaparak daha fazla soru sorabilirsiniz!", "resetAt": "2026-05-25T21:00:00.000Z" }
💰 Maliyet Tahmini (FVT için)
| Kalem | Hesap |
|---|---|
| Claude Haiku input | ~$0.25 / 1M token |
| Claude Haiku output | ~$1.25 / 1M token |
| Avg prompt token | ~500 (system + question) |
| Avg response token | ~300 |
| Per LLM call | ~$0.0005 |
| 20K user × 50 prompt/ay × $0.0005 | ~$500/ay LLM cost |
🗄️ DB Tabloları
| Tablo | İşlem |
|---|---|
asistan_sohbetler | UPSERT (id, kullanici_id, baslik, son_mesaj_tarihi) |
asistan_mesajlar | INSERT (id, sohbet_id, rol, icerik, kaynak='haiku'|'kural', token_sayisi) |
asistan_kota | UPDATE (kullanici_id, kullanim_sayisi, tarih) |