14 KiB
14 KiB
AI Recommendation Type Flow Diagram
Complete Flow: From Trip Analysis to UI Display
┌─────────────────────────────────────────────────────────────────────┐
│ USER CREATES TRIP │
│ - Destination: Cappadocia │
│ - Days: 3 days │
│ - Places: 12 places (museums, valleys, underground cities) │
│ - Travelers: 4 people │
└────────────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ ANALYZE-TRIP EDGE FUNCTION │
│ │
│ 1. Calculate Metrics: │
│ - Total distance: 85 km │
│ - Total time: 24 hours │
│ - Density score: 42 (HIGH) │
│ - Places per day: 4 │
│ │
│ 2. Extract Place Types: │
│ - museum, valley, underground_city, panorama │
│ │
│ 3. Query Database: │
│ SELECT * FROM daily_tours │
│ WHERE region_slug = 'cappadocia' │
│ AND is_active = true │
│ │
│ 4. Score Each Service: │
│ ┌──────────────┬───────────┬────────────┐ │
│ │ Service │ Overlap │ Score │ │
│ ├──────────────┼───────────┼────────────┤ │
│ │ red_tour │ 3/4 types │ 0.75 │ ← BEST MATCH │
│ │ green_tour │ 2/4 types │ 0.50 │ │
│ │ private_guide│ 0/4 types │ 0.00 │ │
│ └──────────────┴───────────┴────────────┘ │
│ │
│ 5. Derive Type from Slug: │
│ matched_slug = "red_tour" │
│ ↓ │
│ if (slug === 'private_guide') → type = 'private_guide' │
│ else if (slug === 'driver_car') → type = 'driver_car' │
│ else if (slug === 'activity_bundle') → type = 'activity_bundle'│
│ else → type = 'daily_tour' ✓ │
│ │
└────────────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ API RESPONSE │
│ { │
│ "recommend": true, │
│ "recommended_type": "daily_tour", ← DERIVED FROM SLUG │
│ "daily_tour_slug": "red_tour", │
│ "confidence": 0.85, │
│ "reason": "Planınız Red Tour rotasıyla %75 uyumlu", │
│ "why_better_than_self": [ │
│ "Profesyonel rehber eşliğinde tarihi detayları öğrenin", │
│ "Müze giriş biletleri ve transferler dahil", │
│ ... │
│ ] │
│ } │
└────────────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ UI: AITourRecommendation.tsx │
│ │
│ const typeLabels = { │
│ daily_tour: 'Günlük Tur', │
│ private_guide: 'Özel Rehber', │
│ driver_car: 'Şoförlü Araç', │
│ activity_bundle: 'Aktivite Paketi' │
│ }; │
│ │
│ Display: │
│ ┌────────────────────────────────────────────────────┐ │
│ │ 🎯 AI Önerisi │ │
│ │ │ │
│ │ Planınız Red Tour rotasıyla %75 uyumlu │ │
│ │ │ │
│ │ 🏷️ Günlük Tur 🔴 Red Tour ⏰ 09:00-17:00 │ │
│ │ │ │
│ │ ✓ Profesyonel rehber eşliğinde tarihi detayları │ │
│ │ ✓ Müze giriş biletleri ve transferler dahil │ │
│ │ │ │
│ │ [Turları Görüntüle] │ │
│ └────────────────────────────────────────────────────┘ │
└────────────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ USER CLICKS "Turları Görüntüle" │
└────────────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ SEARCH-TOURS EDGE FUNCTION │
│ │
│ Query: │
│ SELECT * FROM provider_services │
│ WHERE 'red_tour' = ANY(daily_tour_services) │
│ AND is_active = true │
│ ORDER BY rating DESC, lead_price ASC │
│ │
│ Returns providers who offer Red Tour service │
└────────────────────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ UI: TourModal.tsx │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Önerilen Turlar │ │
│ │ Cappadocia için Günlük Tur türünde turlar │ │
│ │ │ │
│ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │
│ │ │ Provider A │ │ Provider B │ │ │
│ │ │ Red Tour │ │ Red Tour │ │ │
│ │ │ ⭐ 4.8 (120) │ │ ⭐ 4.6 (85) │ │ │
│ │ │ 8 saat │ │ 8 saat │ │ │
│ │ │ €45/kişi │ │ €50/kişi │ │ │
│ │ │ [Seç] │ │ [Seç] │ │ │
│ │ └─────────────────────┘ └─────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Type Derivation Examples
Example 1: Private Guide Recommendation
Trip: 4+ travelers, flexible schedule
↓
Match: private_guide (confidence: 0.75)
↓
Derive: slug = "private_guide" → type = "private_guide"
↓
Display: "Özel Rehber" badge
↓
Search: Providers with private_guide in services array
Example 2: Driver Car Recommendation
Trip: Long distances (>100km), few places
↓
Match: driver_car (confidence: 0.80)
↓
Derive: slug = "driver_car" → type = "driver_car"
↓
Display: "Şoförlü Araç" badge
↓
Search: Providers with driver_car in services array
Example 3: Activity Bundle Recommendation
Trip: Multiple activities (ATV + Balloon + Horse)
↓
Match: activity_bundle (confidence: 0.75)
↓
Derive: slug = "activity_bundle" → type = "activity_bundle"
↓
Display: "Aktivite Paketi" badge
↓
Search: Providers with activity_bundle in services array
Example 4: Daily Tour Recommendation
Trip: High density, many museums, valleys
↓
Match: red_tour (confidence: 0.85)
↓
Derive: slug = "red_tour" → type = "daily_tour"
↓
Display: "Günlük Tur" + "🔴 Red Tour" badges
↓
Search: Providers with red_tour in services array
Key Principles
- Single Source of Truth: The service slug determines the type
- No Hardcoding: Type is always derived, never hardcoded
- Validation: AI responses are validated and corrected if needed
- Consistency: Slug and type are always aligned
- Transparency: Debug info shows derivation reasoning
Service Type Mapping Table
| Slug | Type | Turkish Label | Use Case |
|---|---|---|---|
| red_tour | daily_tour | Günlük Tur | High density, museums, valleys |
| green_tour | daily_tour | Günlük Tur | Long distance, underground cities |
| blue_tour | daily_tour | Günlük Tur | Off-beaten path, quiet places |
| balloon_day | daily_tour | Günlük Tur | Balloon + light tour |
| private_guide | private_guide | Özel Rehber | 4+ travelers, flexible schedule |
| driver_car | driver_car | Şoförlü Araç | Long distances, comfort |
| activity_bundle | activity_bundle | Aktivite Paketi | Multiple activities |