▶️ Senaryo: Apex AI'a "THYAO kaç TL?" Sordum — Ne Olur?

Hybrid engine (rule + Claude Haiku) routing detayı

  1. UI: /apex sayfasında prompt yazılır → "Gönder"
  2. Kota check:
    GET /api/asistan/kota
    Response: { remaining: 1, limit: 3, isLoggedIn: false }
  3. POST request:
    POST /api/asistan/sor
    {
      "soru": "THYAO kaç TL?",
      "sohbetId": null
    }
  4. Backend Intent Classification (NLU):
    // Türkçe NLU
    intent = classify("THYAO kaç TL?") → "FIYAT"
    sembol = extract_symbol() → "THYAO"
  5. 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
  6. 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"`
  7. 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
      }
    }
  8. UI render:
    • Markdown parse + render
    • "🤖 AI · 6s" badge
    • "İlgili sorular" chip butonları (tıklanabilir)
    • "⚠️ Yatırım tavsiyesi değildir" disclaimer
    • Kota counter -1
  9. Sohbet kaydet:
    • Sidebar'da "THYAO kaç TL?" — Az önce
    • sohbetId generate (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"):

  1. Intent: KAVRAM_OGRET (Sharpe) veya LISTE (Yükselenler) → bunlar predefined library'de yoksa LLM
  2. 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" }]
    }
  3. 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ı TipiGünlük Hak
Anonim (login yok)3 prompt/gün
Login (free)~100 prompt/gün
PRO500+ 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)

KalemHesap
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
🎯 Hybrid Engine Faydası
Çoğu soru (FIYAT, BILANCO, TEMETTU) kural-based → 0 LLM cost. Sadece edge case'ler Claude Haiku'ya gider → maliyet minimum.

🗄️ DB Tabloları

Tabloİşlem
asistan_sohbetlerUPSERT (id, kullanici_id, baslik, son_mesaj_tarihi)
asistan_mesajlarINSERT (id, sohbet_id, rol, icerik, kaynak='haiku'|'kural', token_sayisi)
asistan_kotaUPDATE (kullanici_id, kullanim_sayisi, tarih)

📖 Asistan tablolar → · ⚠️ Routing %72 Haiku →