# πŸ€– Suggest-Bet-BE: Yapay Zeka iΓ§in Tam Proje Rehberi > **Bu dosya, projenin tamamΔ±nΔ± tek seferde anlamak isteyen yapay zeka sistemleri iΓ§in hazΔ±rlanmıştΔ±r.** > **Tarih:** 13 Şubat 2026 > **Versiyon:** V20 "Beast" Ensemble --- ## πŸ“‹ Δ°Γ§indekiler 1. [Proje Γ–zeti](#1-proje-ΓΆzeti) 2. [Teknoloji Stack'i](#2-teknoloji-stacki) 3. [Mimari YapΔ±](#3-mimari-yapΔ±) 4. [VeritabanΔ± ŞemasΔ±](#4-veritabanΔ±-şemasΔ±) 5. [AI Engine (V20)](#5-ai-engine-v20) 6. [Feeder Sistemi](#6-feeder-sistemi) 7. [API Endpoints](#7-api-endpoints) 8. [KullanΔ±cΔ± Sistemi](#8-kullanΔ±cΔ±-sistemi) 9. [Backtest SonuΓ§larΔ±](#9-backtest-sonuΓ§larΔ±) 10. [Γ–nemli Dosya YollarΔ±](#10-ΓΆnemli-dosya-yollarΔ±) 11. [SΔ±k KullanΔ±lan Komutlar](#11-sΔ±k-kullanΔ±lan-komutlar) --- ## 1. Proje Γ–zeti ### AmaΓ§ **Suggest-Bet-BE**, futbol ve basketbol maΓ§larΔ± iΓ§in **yapay zeka destekli tahminler ΓΌreten** ve kullanΔ±cΔ±lara **"AkΔ±llΔ± Kupon" ΓΆnerileri sunan** gelişmiş bir **Betting AI backend** projesidir. ### Ana İşlevler | İşlev | AΓ§Δ±klama | | -------------------- | --------------------------------------------- | | **AI Tahmin Motoru** | V20 "Beast" Ensemble model ile maΓ§ tahminleri | | **CanlΔ± Veri Akışı** | Mackolik.com'dan otomatik veri Γ§ekme | | **AkΔ±llΔ± Kupon** | KullanΔ±cΔ±ya değerli bahis ΓΆnerileri | | **Risk Analizi** | Surprise detection ile "trap" maΓ§ tespiti | ### Hedef Marketler - **MaΓ§ Sonucu (1X2)** - Ana gΓΌΓ§ alanΔ± - **Alt/Üst (1.5, 2.5, 3.5)** - **KarşılΔ±klΔ± Gol (BTTS)** - **Δ°lk YarΔ±/Sonu (HT/FT)** - **Korner & Kart** tahminleri --- ## 2. Teknoloji Stack'i ### Backend ``` NestJS (TypeScript) - Strict Mode β”œβ”€β”€ Prisma ORM (PostgreSQL) β”œβ”€β”€ Redis Cache β”œβ”€β”€ BullMQ (Job Queue) β”œβ”€β”€ JWT + RBAC Auth β”œβ”€β”€ nestjs-i18n (Γ‡oklu dil) └── Swagger API Docs ``` ### AI Engine ``` Python 3.10+ β”œβ”€β”€ XGBoost (6 market modeli) β”œβ”€β”€ PyTorch (Player embeddings) β”œβ”€β”€ NumPy/Pandas └── PostgreSQL bağlantΔ±sΔ± ``` ### Data Gathering ``` Puppeteer + Cheerio β”œβ”€β”€ Mackolik.com scraping β”œβ”€β”€ Live match tracking └── Odds monitoring ``` ### Infrastructure ``` Docker + Docker Compose β”œβ”€β”€ PostgreSQL:15432 β”œβ”€β”€ Redis:6379 └── Node.js:3000 ``` --- ## 3. Mimari YapΔ± ### Sistem Akış DiyagramΔ± ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MACKOLIK.COM β”‚ β”‚ (Veri Kaynağı) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ FEEDER SYSTEM β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Scraper β”‚β†’ β”‚ Transformer β”‚β†’ β”‚ Persistence β”‚ β”‚ β”‚ β”‚ (Puppeteer) β”‚ β”‚ (Normalize) β”‚ β”‚ (Prisma) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ POSTGRESQL DATABASE β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ matches β”‚ β”‚live_matchesβ”‚ β”‚odd_categoriesβ”‚ β”‚predictionsβ”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ teams β”‚ β”‚ players β”‚ β”‚match_player β”‚ β”‚ users β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚participationβ”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ AI ENGINE (V20) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚TeamPredictor β”‚ β”‚PlayerPredictorβ”‚ β”‚OddsPredictor β”‚ β”‚RefereePred β”‚ β”‚ β”‚ β”‚ (Form/H2H) β”‚ β”‚ (Kadro) β”‚ β”‚ (Piyasa) β”‚ β”‚ (Hakem) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β–Ό β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ V20 ENSEMBLE β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚MatchResult β”‚ β”‚ OverUnder β”‚ β”‚ HalfTime β”‚ β”‚ Risk β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Calculator β”‚ β”‚ Calculator β”‚ β”‚ Calculator β”‚ β”‚ Assessor β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ NESTJS BACKEND β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚PredictionsModβ”‚ β”‚ CouponsMod β”‚ β”‚ AuthMod β”‚ β”‚ UsersMod β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β–Ό β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ REST API β”‚ β”‚ β”‚ β”‚ GET /predictions/:matchId POST /coupons GET /matches β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ KULLANICI β”‚ β”‚ (Web/Mobile Frontend) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### KlasΓΆr YapΔ±sΔ± ``` Suggest-Bet-BE/ β”œβ”€β”€ src/ # NestJS Backend β”‚ β”œβ”€β”€ main.ts # Entry point β”‚ β”œβ”€β”€ app.module.ts # Root module β”‚ β”œβ”€β”€ common/ # Shared utilities β”‚ β”‚ β”œβ”€β”€ base/ # BaseService, BaseController β”‚ β”‚ β”œβ”€β”€ filters/ # Global exception filter β”‚ β”‚ β”œβ”€β”€ interceptors/ # Response wrapper β”‚ β”‚ └── types/ # API response types β”‚ β”œβ”€β”€ config/ # Configuration β”‚ β”œβ”€β”€ database/ # Prisma service β”‚ β”œβ”€β”€ i18n/ # Translation files β”‚ └── modules/ # Feature modules β”‚ β”œβ”€β”€ admin/ # Admin panel β”‚ β”œβ”€β”€ auth/ # Authentication β”‚ β”œβ”€β”€ coupons/ # Coupon system β”‚ β”œβ”€β”€ feeder/ # Data scraping β”‚ β”‚ β”œβ”€β”€ feeder.service.ts β”‚ β”‚ β”œβ”€β”€ feeder-scraper.service.ts β”‚ β”‚ β”œβ”€β”€ feeder-transformer.service.ts β”‚ β”‚ └── feeder-persistence.service.ts β”‚ β”œβ”€β”€ gemini/ # Google Gemini AI β”‚ β”œβ”€β”€ health/ # Health checks β”‚ β”œβ”€β”€ leagues/ # League management β”‚ β”œβ”€β”€ matches/ # Match management β”‚ β”œβ”€β”€ predictions/ # AI predictions β”‚ β”‚ β”œβ”€β”€ predictions.service.ts β”‚ β”‚ β”œβ”€β”€ services/ β”‚ β”‚ β”‚ └── ai-feature-store.service.ts β”‚ β”‚ └── queues/ β”‚ β”‚ └── predictions.processor.ts β”‚ └── users/ # User management β”‚ β”œβ”€β”€ ai-engine/ # Python AI Engine β”‚ β”œβ”€β”€ main.py # FastAPI entry β”‚ β”œβ”€β”€ config/ β”‚ β”‚ └── ensemble_config.yaml # Model config β”‚ β”œβ”€β”€ core/ β”‚ β”‚ β”œβ”€β”€ calculators/ # Market calculators β”‚ β”‚ β”‚ β”œβ”€β”€ match_result_calculator.py β”‚ β”‚ β”‚ β”œβ”€β”€ over_under_calculator.py β”‚ β”‚ β”‚ β”œβ”€β”€ half_time_calculator.py β”‚ β”‚ β”‚ β”œβ”€β”€ score_calculator.py β”‚ β”‚ β”‚ β”œβ”€β”€ risk_assessor.py β”‚ β”‚ β”‚ └── bet_recommender.py β”‚ β”‚ └── engines/ # Prediction engines β”‚ β”‚ β”œβ”€β”€ team_predictor.py β”‚ β”‚ β”œβ”€β”€ player_predictor.py β”‚ β”‚ β”œβ”€β”€ odds_predictor.py β”‚ β”‚ └── referee_predictor.py β”‚ β”œβ”€β”€ features/ # Feature engineering β”‚ β”‚ β”œβ”€β”€ elo_system.py β”‚ β”‚ β”œβ”€β”€ h2h_engine.py β”‚ β”‚ β”œβ”€β”€ momentum_engine.py β”‚ β”‚ β”œβ”€β”€ poisson_engine.py β”‚ β”‚ β”œβ”€β”€ referee_engine.py β”‚ β”‚ β”œβ”€β”€ squad_analysis_engine.py β”‚ β”‚ β”œβ”€β”€ upset_engine.py β”‚ β”‚ └── value_calculator.py β”‚ β”œβ”€β”€ models/ # ML Models β”‚ β”‚ β”œβ”€β”€ v20_ensemble.py # Main predictor β”‚ β”‚ β”œβ”€β”€ calibration.py β”‚ β”‚ └── xgboost/ # Trained XGBoost models β”‚ β”‚ β”œβ”€β”€ xgb_ms.json # MaΓ§ Sonucu β”‚ β”‚ β”œβ”€β”€ xgb_ou25.json # Over/Under 2.5 β”‚ β”‚ β”œβ”€β”€ xgb_ou15.json # Over/Under 1.5 β”‚ β”‚ β”œβ”€β”€ xgb_ou35.json # Over/Under 3.5 β”‚ β”‚ β”œβ”€β”€ xgb_btts.json # BTTS β”‚ β”‚ └── xgb_ht_ft.json # HT/FT β”‚ β”œβ”€β”€ scripts/ # Utility scripts β”‚ β”‚ β”œβ”€β”€ backtest_v20_feb9.py β”‚ β”‚ β”œβ”€β”€ predict_live.py β”‚ β”‚ └── extract_training_data.py β”‚ └── services/ β”‚ └── coupon_builder_v2.py β”‚ β”œβ”€β”€ prisma/ β”‚ β”œβ”€β”€ schema.prisma # Database schema β”‚ └── seed.ts # Initial data β”‚ β”œβ”€β”€ mds/ # Documentation β”œβ”€β”€ scripts/ # Utility scripts β”œβ”€β”€ colab_export/ # Training data β”œβ”€β”€ i18n/ # Translations β”œβ”€β”€ public/ # Static files β”‚ β”œβ”€β”€ top_leagues.json # Target leagues (22 lig) β”œβ”€β”€ bet-type.json # Bet type definitions β”œβ”€β”€ docker-compose.yml # Docker config β”œβ”€β”€ package.json └── README.md ``` --- ## 4. VeritabanΔ± ŞemasΔ± ### Entity-Relationship DiyagramΔ± ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Country │────<β”‚ League │────<β”‚ Match β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β–Ό β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚OddCategory β”‚ β”‚MatchPlayer β”‚ β”‚MatchTeamStats β”‚ β”‚ β”‚ β”‚Participation β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚OddSelection β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚OddsHistory β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Tablo AΓ§Δ±klamalarΔ± #### Γ‡ekirdek Tablolar | Tablo | AΓ§Δ±klama | Γ–nemli Kolonlar | | ------------------ | ------------------- | ---------------------------------------------------------------------------------------------------------------- | | **`matches`** | GeΓ§miş maΓ§ verileri | `mstUtc` (timestamp), `scoreHome/Away`, `htScoreHome/Away`, `winner`, `iddaaCode`, `status`, `state` | | **`live_matches`** | CanlΔ± maΓ§lar | `jsonData`, `odds` (JSON), `lineups` (JSON), `sidelined` (JSON), `refereeName`, `currentMinute`, `momentumScore` | | **`teams`** | TakΔ±mlar | `id`, `name`, `slug`, `sport`, `logoUrl` | | **`leagues`** | Ligler | `id`, `name`, `countryId`, `sport`, `competitionSlug` | | **`players`** | Oyuncular | `id`, `name`, `slug` | #### Oran TablolarΔ± | Tablo | AΓ§Δ±klama | Γ–nemli Kolonlar | | -------------------- | ----------------- | -------------------------------------------- | | **`odd_categories`** | Oran kategorileri | `matchId`, `name` (MS, Alt/Üst, BTTS, HT/FT) | | **`odd_selections`** | Oran seΓ§enekleri | `name` (1, X, 2), `oddValue`, `sov`, `state` | | **`odds_history`** | Oran değişimleri | `previousValue`, `newValue`, `changeTime` | **Γ–rnek Veri YapΔ±sΔ±:** ``` odd_categories: name = "MaΓ§ Sonucu", matchId = "abc123" └── odd_selections: β”œβ”€β”€ name="1", oddValue="1.50" (Ev sahibi kazanΔ±r) β”œβ”€β”€ name="X", oddValue="4.20" (Beraberlik) └── name="2", oddValue="6.00" (Deplasman kazanΔ±r) ``` #### Kadro & Olay TablolarΔ± | Tablo | AΓ§Δ±klama | Γ–nemli Kolonlar | | -------------------------------- | -------------------- | ---------------------------------------------------------------------- | | **`match_player_participation`** | MaΓ§ kadrosu | `playerId`, `teamId`, `position`, `shirtNumber`, `isStarting` | | **`match_player_events`** | Olaylar | `eventType` (GOAL, CARD, SUBSTITUTION), `timeMinute`, `assistPlayerId` | | **`match_team_stats`** | TakΔ±m istatistikleri | `possessionPercentage`, `shotsOnTarget`, `corners`, `fouls` | | **`match_officials`** | Hakemler | `name`, `roleId` | #### AI TablolarΔ± | Tablo | AΓ§Δ±klama | Γ–nemli Kolonlar | | ------------------------ | ----------------------- | ------------------------------------------------------------------------------ | | **`match_ai_features`** | Hesaplanmış feature'lar | `homeElo`, `awayElo`, `homeFormScore`, `awayFormScore`, `missingPlayersImpact` | | **`predictions`** | Model tahminleri | `predictionJson` (JSON formatΔ±nda tΓΌm tahminler) | | **`ai_predictions_log`** | Performans takibi | `modelVersion`, `confidenceScore`, `isCorrect`, `accuracyScore` | **Γ–rnek `predictions.predictionJson`:** ```json { "match_result": { "1": 45.2, "X": 28.1, "2": 26.7, "pick": "1", "confidence": 72.5 }, "over_under_25": { "over": 55.0, "under": 45.0, "pick": "Over", "confidence": 61.2 }, "btts": { "yes": 48.3, "no": 51.7, "pick": "No" }, "risk_level": "MEDIUM", "xg": { "home": 1.45, "away": 1.12, "total": 2.57 } } ``` #### KullanΔ±cΔ± TablolarΔ± | Tablo | AΓ§Δ±klama | Γ–nemli Kolonlar | | ----------------------- | ------------------ | ----------------------------------------------------------------- | | **`users`** | KullanΔ±cΔ±lar | `email`, `role` (user/admin), `subscriptionStatus` (free/premium) | | **`user_coupons`** | Kuponlar | `strategy`, `totalOdds`, `status` (PENDING/WON/LOST) | | **`user_coupon_items`** | Kupon kalemleri | `matchId`, `selection`, `oddAtTime`, `isCorrect` | | **`usage_limits`** | KullanΔ±m limitleri | `analysisCount`, `couponCount`, `lastResetDate` | --- ## 5. AI Engine (V20) ### V20 "Beast" Ensemble Mimarisi V20, 4 bağımsΔ±z prediction motorunu birleştiren bir ensemble sistemdir: ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ V20 ENSEMBLE PREDICTOR β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚TeamPredictor β”‚ β”‚PlayerPredictorβ”‚ β”‚OddsPredictor β”‚ β”‚RefereePred β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β€’ Form β”‚ β”‚ β€’ Kadro β”‚ β”‚ β€’ Piyasa β”‚ β”‚ β€’ Hakem β”‚ β”‚ β”‚ β”‚ β€’ H2H β”‚ β”‚ β€’ Oyuncu β”‚ β”‚ eğilimi β”‚ β”‚ istatistikβ”‚ β”‚ β”‚ β”‚ β€’ ELO β”‚ β”‚ rating β”‚ β”‚ β€’ Value bet β”‚ β”‚ β€’ Kart trendβ”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β–Ό β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ UPSET ENGINE β”‚ β”‚ β”‚ β”‚ (Surprise Detection - SΓΌrpriz Tespiti) β”‚ β”‚ β”‚ β”‚ β€’ Favori takΔ±mΔ±n kaybetme riski β”‚ β”‚ β”‚ β”‚ β€’ Derby tension, motivation gap β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β–Ό β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ MARKET CALCULATORS β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚MatchResult β”‚ β”‚ OverUnder β”‚ β”‚ HalfTime β”‚ β”‚ Risk β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Calculator β”‚ β”‚ Calculator β”‚ β”‚ Calculator β”‚ β”‚ Assessor β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β–Ό β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ BET RECOMMENDER β”‚ β”‚ β”‚ β”‚ (En iyi bahis ΓΆnerilerini seΓ§er) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Engine DetaylarΔ± | Engine | Girdi Verileri | Γ‡Δ±ktΔ± | | -------------------- | --------------------------------------- | --------------------------------------- | | **TeamPredictor** | `matches` (geΓ§miş), `leagues` | Form skoru, H2H analizi, ELO rating | | **PlayerPredictor** | `match_player_participation`, `players` | Kadro gΓΌcΓΌ, eksik oyuncu etkisi | | **OddsPredictor** | `odd_categories`, `odd_selections` | Piyasa eğilimi, value bet tespiti | | **RefereePredictor** | `match_officials` | Hakem kart ortalamasΔ±, fair play skoru | | **UpsetEngine** | TΓΌm engine'ler + context | Surprise risk (LOW/MEDIUM/HIGH/EXTREME) | ### XGBoost Modelleri | Model DosyasΔ± | Market | AΓ§Δ±klama | | ---------------- | ---------------- | -------------------------------------- | | `xgb_ms.json` | MaΓ§ Sonucu (1X2) | Ev, beraberlik, deplasman olasΔ±lΔ±klarΔ± | | `xgb_ou15.json` | Alt/Üst 1.5 | 1.5 gol ΓΌst/alt | | `xgb_ou25.json` | Alt/Üst 2.5 | 2.5 gol ΓΌst/alt | | `xgb_ou35.json` | Alt/Üst 3.5 | 3.5 gol ΓΌst/alt | | `xgb_btts.json` | BTTS | KarşılΔ±klΔ± gol var/yok | | `xgb_ht_ft.json` | HT/FT | Δ°lk yarΔ±/sonu kombinasyonlarΔ± | ### FullMatchPrediction Γ‡Δ±ktΔ±sΔ± ```python @dataclass class FullMatchPrediction: # MaΓ§ Bilgisi match_id: str home_team: str away_team: str # MaΓ§ Sonucu (1X2) ms_home_prob: float # Ev kazanma olasΔ±lığı ms_draw_prob: float # Beraberlik olasΔ±lığı ms_away_prob: float # Deplasman kazanma olasΔ±lığı ms_pick: str # "1", "X", veya "2" ms_confidence: float # GΓΌven skoru (0-100) # Alt/Üst over_25_prob: float under_25_prob: float ou25_pick: str # "Over" veya "Under" # BTTS btts_yes_prob: float btts_no_prob: float btts_pick: str # "Yes" veya "No" # xG (Expected Goals) home_xg: float away_xg: float total_xg: float # Skor Tahminleri predicted_ft_score: str # "2-1" predicted_ht_score: str # "1-0" ft_scores_top5: List[Dict] # En olasΔ± 5 skor # Risk risk_level: str # "LOW", "MEDIUM", "HIGH", "EXTREME" is_surprise_risk: bool # SΓΌrpriz riski var mΔ±? risk_warnings: List[str] # Γ–neriler best_bet: MarketPrediction recommended_bets: List[MarketPrediction] ``` --- ## 6. Feeder Sistemi ### Veri Akışı ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MACKOLIK.COM β”‚ β”‚ β”‚ β”‚ β€’ Livescores β”‚ β”‚ β€’ Kadrolar β”‚ β”‚ β€’ Oranlar β”‚ β”‚ β€’ Δ°statistikler β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ FeederScraperService β”‚ β”‚ β”‚ β”‚ URL: https://www.mackolik.com/perform/p0/ajax/components/ β”‚ β”‚ competition/livescores/json β”‚ β”‚ β”‚ β”‚ Query Params: β”‚ β”‚ β€’ date: YYYY-MM-DD β”‚ β”‚ β€’ sport: football/basketball β”‚ β”‚ β”‚ β”‚ Headers: β”‚ β”‚ β€’ User-Agent: Mozilla/5.0... β”‚ β”‚ β€’ X-Requested-With: XMLHttpRequest β”‚ β”‚ β€’ Accept-Language: tr-TR,tr;q=0.9 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ FeederTransformerService β”‚ β”‚ β”‚ β”‚ β€’ Ham JSON β†’ Normalize edilmiş objeler β”‚ β”‚ β€’ TakΔ±m isimleri standardizasyonu β”‚ β”‚ β€’ Oran formatΔ± dΓΆnüşümΓΌ β”‚ β”‚ β€’ Timestamp conversion β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ FeederPersistenceService β”‚ β”‚ β”‚ β”‚ β€’ matches tablosuna yaz β”‚ β”‚ β€’ live_matches tablosuna yaz (canlΔ± maΓ§lar) β”‚ β”‚ β€’ odd_categories / odd_selections β”‚ β”‚ β€’ match_player_participation (kadrolar) β”‚ β”‚ β€’ match_player_events (goller, kartlar) β”‚ β”‚ β”‚ β”‚ State Management: β”‚ β”‚ β€’ historical_scan_state_football_desc (kaldığı yer) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Feeder Scriptleri | Script | Komut | AΓ§Δ±klama | | -------------------------- | --------------------------- | ----------------------------- | | `run-feeder.ts` | `npm run feeder:historical` | TΓΌm tarihsel veri (2.5 sezon) | | `run-feeder-filtered.ts` | `npm run feeder:fill-gaps` | Sadece top 22 lig | | `run-feeder-basketball.ts` | `npm run feeder:basketball` | Basketbol verileri | | `run-live-feeder.ts` | `npm run feeder:live` | CanlΔ± maΓ§ takibi | ### fill-gaps Script DetayΔ± ```typescript // src/scripts/run-feeder-filtered.ts // 1. top_leagues.json'dan lig ID'lerini oku (22 lig) const targetLeagues = JSON.parse(fs.readFileSync('top_leagues.json')); // 2. Tarih aralığı: 2023-07-01 β†’ DΓΌn const START_DATE = '2023-07-01'; // 3. Reverse scan (geriye doğru) // DΓΌn'den başlayΔ±p 2023-07-01'e kadar gider // 4. Her gΓΌn iΓ§in: // - Mackolik API'den livescores Γ§ek // - Sadece top_leagues'deki maΓ§larΔ± işle // - Zaten DB'de olanlarΔ± atla // - Her 10 maΓ§ta 4 saniye cooldown // 5. State kaydet (kaldığı yerden devam et) ``` ### Top Leagues (22 Lig) ```json [ "Premier League (Δ°ngiltere)", "La Liga (Δ°spanya)", "Serie A (Δ°talya)", "Bundesliga (Almanya)", "Ligue 1 (Fransa)", "SΓΌper Lig (TΓΌrkiye)", "Eredivisie (Hollanda)", "Primeira Liga (Portekiz)", "Pro League (BelΓ§ika)", "Bundesliga (Avusturya)", "Super League (Δ°sviΓ§re)", "Scottish Premiership (Δ°skoΓ§ya)", "Championship (Δ°ngiltere)", "La Liga 2 (Δ°spanya)", "Serie B (Δ°talya)", "2. Bundesliga (Almanya)", "Ligue 2 (Fransa)", "Primera Division (Arjantin)" // ... ve daha fazlasΔ± ] ``` --- ## 7. API Endpoints ### Authentication | Method | Endpoint | AΓ§Δ±klama | | ------ | ---------------- | ------------------------ | | POST | `/auth/register` | Yeni kullanΔ±cΔ± kaydΔ± | | POST | `/auth/login` | Giriş (JWT dΓΆner) | | POST | `/auth/refresh` | Token yenileme | | GET | `/auth/me` | Mevcut kullanΔ±cΔ± bilgisi | ### Matches | Method | Endpoint | AΓ§Δ±klama | | ------ | --------------------- | ------------------------ | | GET | `/matches` | MaΓ§ listesi (pagination) | | GET | `/matches/:id` | Tek maΓ§ detayΔ± | | GET | `/matches/live` | CanlΔ± maΓ§lar | | GET | `/matches/date/:date` | Tarihe gΓΆre maΓ§lar | ### Predictions | Method | Endpoint | AΓ§Δ±klama | | ------ | --------------------------- | -------------------- | | GET | `/predictions/:matchId` | MaΓ§ tahmini | | POST | `/predictions/analyze` | Toplu analiz | | GET | `/predictions/smart-coupon` | AkΔ±llΔ± kupon ΓΆnerisi | ### Coupons | Method | Endpoint | AΓ§Δ±klama | | ------ | --------------------- | ---------------------- | | POST | `/coupons` | Yeni kupon oluştur | | GET | `/coupons` | KullanΔ±cΔ±nΔ±n kuponlarΔ± | | GET | `/coupons/:id` | Kupon detayΔ± | | PATCH | `/coupons/:id/status` | Kupon durumu gΓΌncelle | ### Leagues | Method | Endpoint | AΓ§Δ±klama | | ------ | ---------------------- | ----------- | | GET | `/leagues` | Lig listesi | | GET | `/leagues/:id` | Lig detayΔ± | | GET | `/leagues/:id/matches` | Lig maΓ§larΔ± | ### Admin | Method | Endpoint | AΓ§Δ±klama | | ------ | ------------------ | --------------------- | | GET | `/admin/users` | KullanΔ±cΔ± listesi | | PATCH | `/admin/users/:id` | KullanΔ±cΔ± gΓΌncelle | | GET | `/admin/stats` | Sistem istatistikleri | --- ## 8. KullanΔ±cΔ± Sistemi ### Roller | Rol | Yetkiler | | ------- | ----------------------------------- | | `user` | Tahmin gΓΆrΓΌntΓΌleme, kupon oluşturma | | `admin` | TΓΌm yetkiler + kullanΔ±cΔ± yΓΆnetimi | ### Abonelik | Durum | Limitler | | --------- | ------------------------ | | `free` | GΓΌnlΓΌk 3 analiz, 1 kupon | | `premium` | SΔ±nΔ±rsΔ±z analiz ve kupon | ### KullanΔ±m Limiti Sistemi ```typescript // Her kullanΔ±cΔ± iΓ§in usage_limits tablosu { analysisCount: 3, // BugΓΌn yapΔ±lan analiz sayΔ±sΔ± couponCount: 1, // BugΓΌn oluşturulan kupon lastResetDate: "2026-02-13" // Son sΔ±fΔ±rlama tarihi } // Her gece 00:00'da sΔ±fΔ±rlanΔ±r ``` --- ## 9. Backtest SonuΓ§larΔ± ### 90 GΓΌnlΓΌk Performans (V11 Referans) | Market | GΓΌven Eşiği | Bahis SayΔ±sΔ± | Kazanma OranΔ± | ROI | | ------- | ----------- | ------------ | ------------- | --------------- | | **1X2** | >%0 | 5,709 | %37.6 | **+%18.65** βœ… | | **1X2** | >%60 | 4,694 | %37.9 | **+%15.30** βœ… | | **1X2** | >%70 | 12 | %83.3 | **+%632.92** πŸ’Ž | | O/U 2.5 | >%70 | 2,756 | %61.1 | -%7.14 ❌ | | BTTS | >%0 | 5,709 | %47.8 | -%6.11 ❌ | ### Analiz **GΓΌΓ§lΓΌ YΓΆnler:** - MaΓ§ Sonucu (1X2) tahminlerinde %18.65 ROI - profesyonel seviye - YΓΌksek gΓΌven (>70) ile %83.3 isabet - neredeyse hatasΔ±z **ZayΔ±f YΓΆnler:** - Gol marketleri (O/U, BTTS) negatif ROI - xG hesaplamasΔ±nda iyileştirme gerekiyor **Γ–neri:** - 1X2 marketine odaklan - Confidence >%60 filtresi kullan - Gol marketlerinden kaΓ§Δ±n (model iyileştirilene kadar) --- ## 10. Γ–nemli Dosya YollarΔ± ### AI Engine | Dosya | AΓ§Δ±klama | | --------------------------------------------- | -------------------- | | `ai-engine/models/v20_ensemble.py` | Ana predictor sΔ±nΔ±fΔ± | | `ai-engine/core/engines/team_predictor.py` | Team engine | | `ai-engine/core/engines/player_predictor.py` | Player engine | | `ai-engine/core/engines/odds_predictor.py` | Odds engine | | `ai-engine/core/engines/referee_predictor.py` | Referee engine | | `ai-engine/features/upset_engine.py` | Surprise detection | | `ai-engine/scripts/backtest_v20_feb9.py` | Backtest scripti | | `ai-engine/scripts/predict_live.py` | CanlΔ± tahmin | ### Backend | Dosya | AΓ§Δ±klama | | ------------------------------------------------------ | -------------------- | | `src/modules/feeder/feeder.service.ts` | Feeder orchestration | | `src/modules/feeder/feeder-scraper.service.ts` | Mackolik scraping | | `src/modules/feeder/feeder-persistence.service.ts` | DB yazma | | `src/modules/predictions/predictions.service.ts` | Tahmin servisi | | `src/modules/coupons/services/smart-coupon.service.ts` | Kupon oluşturma | | `src/scripts/run-feeder-filtered.ts` | fill-gaps scripti | ### Config | Dosya | AΓ§Δ±klama | | --------------------------------------- | ------------------------- | | `prisma/schema.prisma` | VeritabanΔ± şemasΔ± | | `top_leagues.json` | Hedef ligler (22 adet) | | `ai-engine/config/ensemble_config.yaml` | Model konfigΓΌrasyonu | | `.env.example` | Ortam değişkenleri ΓΆrneği | --- ## 11. SΔ±k KullanΔ±lan Komutlar ### Geliştirme ```bash # BağımlΔ±lΔ±klarΔ± yΓΌkle npm ci # Geliştirme sunucusu başlat npm run start:dev # Production build npm run build npm run start:prod # Lint npm run lint # Test npm run test ``` ### VeritabanΔ± ```bash # Prisma client oluştur npx prisma generate # Migration Γ§alıştΔ±r npx prisma migrate dev # Seed (ilk veriler) npx prisma db seed # Studio (GUI) npx prisma studio ``` ### Feeder ```bash # Tarihsel veri Γ§ek (tΓΌm ligler) npm run feeder:historical # Eksik verileri tamamla (top 22 lig) npm run feeder:fill-gaps # Basketbol verileri npm run feeder:basketball # CanlΔ± maΓ§ takibi npm run feeder:live # CanlΔ± maΓ§ temizleme npm run cleanup:live ``` ### Docker ```bash # TΓΌm servisleri başlat docker-compose up -d # Sadece DB ve Redis docker-compose up -d postgres redis # LoglarΔ± gΓΆrΓΌntΓΌle docker-compose logs -f # Durdur docker-compose down ``` ### AI Engine ```bash # CanlΔ± tahmin cd ai-engine python scripts/predict_live.py --match_id # Backtest python scripts/backtest_v20_feb9.py # Eğitim verisi Γ§Δ±kar python scripts/extract_training_data.py ``` --- ## 🎯 Γ–zet **Suggest-Bet-BE**, futbol maΓ§larΔ± iΓ§in V20 Ensemble AI modeli kullanarak tahmin ΓΌreten, Mackolik.com'dan otomatik veri Γ§eken, ve kullanΔ±cΔ±lara akΔ±llΔ± kupon ΓΆnerileri sunan kapsamlΔ± bir bahis AI sistemidir. **Ana GΓΌΓ§:** MaΓ§ Sonucu (1X2) tahminlerinde %18.65 ROI **Teknoloji:** NestJS + PostgreSQL + Python (XGBoost) + Redis **Veri Kaynağı:** Mackolik.com (scraping) **Hedef:** Profesyonel seviyede bahis tahminleri ile kullanΔ±cΔ±ya değer sağlamak --- _Bu dosya yapay zeka sistemleri iΓ§in hazΔ±rlanmıştΔ±r. TΓΌm teknik detaylar gΓΌncel ve doğrudur._