# Suggest-Bet-BE - Tek Gerçek Kaynak (OZET.md) Son güncelleme: 17 Şubat 2026 Kapsam: Bu dosya, projeyi devralmak/geliştirmek için gereken ana teknik bilgileri tek yerde toplar. Kaynak: Doğrudan repo kodu (`prisma/schema.prisma`, `src/*`, `ai-engine/*`) üzerinden derlenmiştir. --- ## 1. Ürün Hedefi Suggest-Bet-BE, canlı ve geçmiş maç verileri üzerinden AI tahminleri üretir. Ana ürün akışı: 1. Kullanıcı frontend’de `live_matches` tablosundan maçı seçer. 2. Backend seçilen maçı AI engine’e gönderir (V20+ tek maç paketi). 3. AI engine çoklu market olasılık paketi üretir. 4. Kullanıcı bu önerilerden kuponunu manuel kurar. 5. Aynı altyapı yaklaşan maç otomasyonları/sosyal medya çıktısı için tekrar kullanılır. --- ## 2. Teknoloji Stack - Backend API: NestJS + TypeScript - ORM/DB: Prisma + PostgreSQL - Queue: BullMQ - Cache: Redis (`cache-manager-redis-yet`) - AI Engine: Python + FastAPI + XGBoost (+ ensemble logic) - Scheduler: `@nestjs/schedule` Cron - Auth: JWT + refresh token - i18n: `nestjs-i18n` --- ## 3. Kod Yapısı (Özet) ### 3.1 NestJS Temel yol: `/Users/piton/Documents/Suggest-Bet-BE/src` Önemli modüller: - `auth` - `users` - `admin` - `matches` - `predictions` - `coupons` - `analysis` - `feeder` - `health` - `leagues` Sistem seviyesinde: - `database` (Prisma servisleri) - `tasks` (cron işleri) - `common/queues` (BullMQ global queue config) ### 3.2 AI Engine Temel yol: `/Users/piton/Documents/Suggest-Bet-BE/ai-engine` Önemli bileşenler: - `main.py` (FastAPI endpointleri) - `services/single_match_orchestrator.py` (ana orchestration) - `models/v20_ensemble.py` (ana tahmin motoru) - `core/calculators/*` - `core/engines/*` - `features/*` - `models/xgboost/*` (model artefact) --- ## 4. Veritabanı Şeması - Ne Nerede? Kaynak: `/Users/piton/Documents/Suggest-Bet-BE/prisma/schema.prisma` ### 4.1 Temel Sport Veri Tabloları - `countries`: ülke bilgileri - `leagues`: lig bilgileri (`country_id`, `sport`) - `teams`: takım bilgileri (`sport`, `logo_url`) - `players`: oyuncu kayıtları - `matches`: kalıcı maç kaydı (FT/historical dahil) - `live_matches`: canlı/akış bazlı maç kaydı (JSON odds/lineups/sidelined dahil) ### 4.2 Odds Tabloları - `odd_categories`: market başlıkları (MS, OU, BTTS vb.) - `odd_selections`: kategori alt seçimleri ve oran değerleri - `odds_history`: oran değişim geçmişi ### 4.3 Maç İçi Detay Tabloları - `match_team_stats`: takım istatistikleri (futbol+basketbol alanları) - `match_player_participation`: kadro/ilk 11 katılımı - `match_player_events`: gol/kart/değişiklik olayları - `match_player_stats`: oyuncu istatistikleri - `match_officials`: hakem/yardımcı hakem vb. - `official_roles`: hakem rol sözlüğü ### 4.4 AI Tabloları - `match_ai_features`: hesaplanmış feature cache/tabanı - `predictions`: match bazlı cache edilmiş prediction JSON - `ai_predictions_log`: tahmin/sonuç performans logu ### 4.5 Kullanıcı/Kupon Tabloları - `users` - `refresh_tokens` - `usage_limits` - `user_coupons` - `user_coupon_items` - `analyses` ### 4.6 Sistem Tabloları - `app_settings`: state/checkpoint gibi key-value ayarlar - `translations`: runtime çeviri girdileri ### 4.7 İlişki Mantığı (kısa) - `matches` merkezi entity’dir. - Odds: `matches -> odd_categories -> odd_selections -> odds_history` - Kadro/event/stats: `matches` + `teams` + `players` - Kupon item: `user_coupon_items.match_id -> matches.id` --- ## 5. API Envanteri (Backend) Base prefix: `/api` ### 5.1 Auth (`/auth`) - `POST /register` - `POST /login` - `POST /refresh` - `POST /logout` ### 5.2 Predictions (`/predictions`) - `GET /health` - `GET /upcoming` - `GET /value-bets` - `GET /history` - `GET /:matchId` - `POST /generate` - `POST /smart-coupon` Not (çalışma modu): - `REDIS_ENABLED=false` iken `QueueModule` ve `PredictionsModule` AppModule importundan çıkarılır; bu modda `/api/predictions/*` route'ları yüklenmez. - `REDIS_ENABLED=true` iken queue + predictions endpointleri aktif olur. ### 5.3 Coupons (`/coupon`) - `POST /analyze-match` - `POST /daily-banko` - `POST /suggest` - `POST /create` - `GET /my-stats` - `GET /history` ### 5.4 Matches (`/matches`) - `POST /query` - `GET /` - `GET /leagues/active` - `GET /:id` ### 5.5 Leagues (`/leagues`) - `GET /countries` - `GET /countries/:id` - `GET /` - `GET /:id` - `GET /teams/search` - `GET /teams/:id` - `GET /teams/:id/matches` - `GET /teams/h2h` ### 5.6 Health (`/health`) - `GET /` - `GET /ready` - `GET /live` ### 5.7 Analysis (`/analysis`) - `POST /analyze-matches` - `GET /history` ### 5.8 Users (`/users`) - `GET /me` ### 5.9 Admin (`/admin`) - `GET /users` - `GET /users/:id` - `DELETE /users/:id` - `GET /settings` - `GET /usage-limits` - `POST /usage-limits/reset-all` - `GET /analytics/overview` --- ## 6. AI Engine API Envanteri Ana dosya: `/Users/piton/Documents/Suggest-Bet-BE/ai-engine/main.py` Ana route’lar: - `GET /` - `GET /health` - `POST /v20plus/analyze/{match_id}` - `POST /v20plus/coupon` - `GET /v20plus/daily-banker` Geriye uyumluluk alias’ları: - `POST /predict/v20/{match_id}` - `POST /v20/analyze/{match_id}` - `POST /smart-coupon` - `POST /v20/coupon` Not: Backend uygulaması artık yalnızca `v20plus` route'larını çağırır. --- ## 7. V20+ Ana Tahmin Mimarisi (Şu anki temel) Ana servis: `ai-engine/services/single_match_orchestrator.py` Akış: 1. Maç verisini getir (`live_matches` öncelik, `matches` fallback) 2. Odds çıkar (`live_matches.odds` JSON, yoksa relational odds fallback) 3. Lineup çıkar: - `live_matches.lineups` JSON parse (`id` / `playerId` / `personId` destekli) - yoksa `match_player_participation` (aynı match, `is_starting=true`) fallback - yine yoksa tarih bazlı muhtemel XI fallback: ilgili takımın maç tarihinden önceki FT maçlarında en sık başlayan 11 oyuncu (home/away tarafları ayrı hesaplanır, karıştırılmaz) 4. V20 ensemble çalıştır (`models/v20_ensemble.py`) 5. Tek sözleşmede prediction package döndür Package ana alanları: - `match_info` - `data_quality` - `risk` - `engine_breakdown` - `main_pick` - `bet_advice` - `bet_summary` - `supporting_picks` - `aggressive_pick` - `scenario_top5` - `score_prediction` - `market_board` - `reasoning_factors` Pick karar alanları (özellikle `main_pick` ve `supporting_picks`): - `raw_confidence` - `calibrated_confidence` - `min_required_confidence` - `edge` - `play_score` - `playable` - `bet_grade` (`A`/`B`/`C`/`PASS`) - `stake_units` - `decision_reasons` Bu sözleşme frontend + kupon + otomasyon için ortak temel kabul edilir. --- ## 8. Queue ve Asenkron İşler Queue tanımı: - Queue adı: `predictions-queue` - Job tipleri: - `predict-match` - `smart-coupon` Kod: - `src/modules/predictions/queues/predictions.types.ts` - `src/modules/predictions/queues/predictions.queue.ts` - `src/modules/predictions/queues/predictions.processor.ts` - `src/common/queues/queue.module.ts` --- ## 9. Cron/Task Envanteri Dosyalar: - `src/tasks/data-fetcher.task.ts` - `src/tasks/live-updater.task.ts` - `src/tasks/limit-resetter.task.ts` Başlıca işler: - 15 dk: canlı maç fetch (`fetchLiveMatches`) - 15 dk: live score update (`updateLiveScores`) - 30 dk: finished match finalize (`finalizeFinishedMatches`) - Günlük 03:00: usage limit reset - Günlük 04:00: eski data cleanup - Günlük 00:00: subscription expiry check --- ## 10. Çalıştırma Komutları (Repo Gerçeği) Kaynak: `package.json` - Dev server: `npm run start:dev` - Build: `npm run build` - Test: `npm run test` - E2E: `npm run test:e2e` - Lint: `npm run lint` Feeder scriptleri: - `npm run feeder:historical` - `npm run feeder:fill-gaps` - `npm run feeder:basketball` - `npm run feeder:live` - `npm run cleanup:live` AI/backtest scriptleri (sık kullanılan): - `python3 ai-engine/scripts/backtest_v20plus_today.py` - `python3 ai-engine/scripts/backtest_v20plus_today.py --date YYYY-MM-DD` - `python3 ai-engine/scripts/backtest_v20plus_today.py --date YYYY-MM-DD --end-date YYYY-MM-DD` --- ## 11. Env Değişkenleri (Zorunlu/Önemli) Kaynak: `src/config/env.validation.ts` Kritikler: - `NODE_ENV`, `PORT` - `DATABASE_URL` - `JWT_SECRET` - `JWT_ACCESS_EXPIRATION`, `JWT_REFRESH_EXPIRATION` - `REDIS_ENABLED` - `REDIS_HOST`, `REDIS_PORT`, `REDIS_PASSWORD` - `DEFAULT_LANGUAGE`, `FALLBACK_LANGUAGE` - `THROTTLE_TTL`, `THROTTLE_LIMIT` Opsiyoneller: - `ENABLE_MAIL`, `ENABLE_S3`, `ENABLE_WEBSOCKET`, `ENABLE_MULTI_TENANCY` - Mail/S3 alanları AI endpoint host’u: - Backend tarafında `AI_ENGINE_URL` env’i zorunlu olarak set edilmelidir (önerilen: `http://ai-engine:8000`). --- ## 12. Model Artefact Durumu (Özet) XGBoost artefact klasörü: - `/Users/piton/Documents/Suggest-Bet-BE/ai-engine/models/xgboost` Aktif yüklenen pkl’ler: - `xgb_ms.pkl` - `xgb_ou25.pkl` - `xgb_btts.pkl` - `xgb_ht_ft.pkl` Not: - Bazı marketlerde `.json` dosyaları bulunabilir; inferans tarafı pkl odaklıdır. --- ## 13. Temizlenen/Legacy Kod Notu V20+ geçişinde kaldırılan örnek dead code: - `ai-engine/services/coupon_builder_v2.py` - `src/modules/predictions/dto/python-prediction.dto.ts` - birkaç eski debug/test Python scripti Not: - Repo’da kullanıcı kaynaklı başka değişiklikler olabilir; silme/temizlik öncesi `git status` ile doğrulama şart. --- ## 14. Bilinen Riskler / Teknik Borç 1. Repo genelinde `src/scripts/*` altında mevcut TypeScript/lint hataları var (bu dosyalar ana runtime dışında). 2. Bazı ortamlarda `dist/` klasörü permission/root ownership problemi build sürecini bozabiliyor. 3. Tahmin kalitesi için lineup/odds kapsamı kritik; eksik veri durumunda confidence düşürme stratejisi uygulanmalı. 4. Contract testleri ve backtest raporlarının CI içine alınması henüz yeterli değil. 5. ~~V20+ bet calibration şu an hafif katsayı tabanlı; pazar bazlı (MS/OU/BTTS) düzenli kalibrasyon pipeline'ı (ör. weekly recalibration) ile desteklenmeli.~~ **ÇÖZÜLDÜ**: Isotonic Regression calibration sistemi eklendi (Şubat 2026). 6. `xgb_ou15.pkl` ve `xgb_ou35.pkl` bazı ortamlarda eksik olabilir; bu durumda ilgili marketler fallback mantıkla çalışır, kalite düşebilir. --- ## 15. Isotonic Regression Calibration Sistemi (Şubat 2026) ### 15.1 Genel Bakış V20+ tahmin modelinin olasılık çıktılarını kalibre etmek için **Isotonic Regression** tabanlı bir calibration sistemi eklendi. **Neden Calibration?** - XGBoost modelleri genellikle aşırı güvenli (overconfident) tahminler üretir - Örnek: Model %70 derken gerçek kazanma oranı %60 olabilir - Isotonic Regression, tahmin edilen olasılıkları gerçek sonuç oranlarına map eder ### 15.2 Dosya Yapısı ``` ai-engine/models/ ├── calibration.py # Ana calibration modülü └── calibration/ # Eğitilmiş modeller (otomatik oluşturulur) ├── ms_home_calibrator.pkl ├── ms_home_metrics.json ├── ou25_calibrator.pkl ├── ou25_metrics.json └── ... ``` ### 15.3 Kullanım ```python from models.calibration import get_calibrator calibrator = get_calibrator() # Tek bir olasılığı kalibre et raw_prob = 0.75 calibrated_prob = calibrator.calibrate("ou25", raw_prob) # Örnek: 0.75 → 0.68 (daha gerçekçi) ``` ### 15.4 Eğitim Scriptleri ```bash # Tüm marketler için calibration eğitimi python3 ai-engine/scripts/train_calibration.py # Belirli marketler python3 ai-engine/scripts/train_calibration.py --markets ou25 btts ms_home # Tarih aralığı ile python3 ai-engine/scripts/train_calibration.py --start 2026-01-01 --end 2026-02-15 # Sadece top ligler python3 ai-engine/scripts/train_calibration.py --top-leagues-only ``` ### 15.5 Backtest ve Doğrulama ```bash # Calibration karşılaştırması python3 ai-engine/scripts/backtest_calibration.py --start 2026-01-01 --end 2026-02-15 ``` **Çıktı Örneği:** ``` Market N Raw Calibrated Improvement Status ou25 1245 0.2134 0.1987 +0.0147 ✓ Better btts 1189 0.2245 0.2101 +0.0144 ✓ Better ms_home 1230 0.2456 0.2398 +0.0058 ✓ Better ``` ### 15.6 Metrikler | Metrik | Açıklama | İdeal Değer | | ---------------- | -------------------------- | -------------- | | **Brier Score** | Olasılık tahmin doğruluğu | 0 (mükemmel) | | **ECE** | Expected Calibration Error | 0 (mükemmel) | | **Sample Count** | Eğitim örnek sayısı | >1000 önerilir | ### 15.7 Desteklenen Marketler - `ms_home`, `ms_draw`, `ms_away` - Maç Sonucu - `ou15`, `ou25`, `ou35` - Alt/Üst - `btts` - Karşılıklı Gol - `ht_home`, `ht_draw`, `ht_away` - İlk Yarı Sonucu - `dc` - Çifte Şans - `ht_ft` - İlk Yarı/Maç Sonucu ### 15.8 Weekly Recalibration Önerisi En iyi sonuçlar için haftalık olarak calibration modellerini yeniden eğitin: ```bash # Cron job (her Pazartesi 05:00) 0 5 * * 1 cd /path/to/ai-engine && python3 scripts/train_calibration.py --top-leagues-only ``` ### 15.9 Backtest Sonuçları ve Optimizasyonlar (Şubat 2026) **V20 Ensemble Backtest Özeti (107 maç, 17-18 Şubat 2026):** | Market | Doğruluk | Değerlendirme | | ---------------- | --------- | ------------- | | Alt/Üst 1.5 | **82.2%** | 🔥 En yüksek | | Çifte Şans | **76.6%** | 🔥 Yüksek | | İY Alt/Üst 0.5 | **75.7%** | 🔥 Yüksek | | Alt/Üst 2.5 | **65.4%** | 👍 İyi | | Maç Sonucu (1X2) | 57.0% | 👍 Orta | | Alt/Üst 3.5 | 56.1% | 👍 Orta | | KG Var/Yok | 47.7% | ⚠️ Düşük | | İlk Yarı Sonucu | 41.1% | 💀 Çok düşük | **Confidence Bucket Analizi:** | Confidence Aralığı | Doğruluk | Öneri | | ------------------ | ---------- | ---------------------- | | 80%+ | **100.0%** | Kesin banko | | 60-80% | 70.0% | Güvenilir | | **40-60%** | **83.3%** | 🔥 **Sürpriz yüksek!** | | 0-40% | 49.4% | Riskli | **Önemli Bulgular:** - 40-60% confidence aralığı beklenenden çok daha yüksek doğruluk gösteriyor (83.3%) - Bu nedenle MIN_CONFIDENCE threshold 60%'tan **40%'a düşürüldü** - Yüksek doğruluklu marketler (DC, OU15, HT_OU05, OU25) önceliklendirildi **Guaranteed Pick Optimizasyonu:** ```python # Önceki (eski) değerler MIN_CONFIDENCE = 60.0 # Yeni (optimize edilmiş) değerler MIN_CONFIDENCE = 40.0 # Backtest sonucuna göre HIGH_ACCURACY_MARKETS = {"DC", "OU15", "HT_OU05", "OU25"} # Öncelikli marketler ``` **Market Calibration Değerleri (Backtest'e göre güncellendi):** ```python market_calibration = { "OU15": 0.82, # 82.2% accuracy - EN YÜKSEK "DC": 0.77, # 76.6% accuracy "HT_OU05": 0.76, # 75.7% accuracy "OU25": 0.65, # 65.4% accuracy "MS": 0.57, # 57.0% accuracy "BTTS": 0.48, # 47.7% accuracy - düşük } ``` --- ## 16. İlgili Yeni Dokümanlar - API response sözleşmesi: `mds/API_RESPONSE_SCHEMA.md` --- ## 15. Karar: Bundan Sonra Tek Referans Bu dosya (`mds/OZET.md`) tek ana referanstır. Her büyük değişiklikten sonra şu alanlar güncellenecek: - 5. API envanteri - 7. V20+ mimari - 9. Task/Cron envanteri - 12. Model artefact durumu - 14. Riskler Böylece context reset olsa bile proje devamlılığı bu dosyadan sağlanır. --- ## 17. Son Konuşma Güncellemesi (16 Şubat 2026) Bu bölüm, son diyalogda netleşen teknik durumları özetler: 1. HT/FT `.pkl` boyutu neden çok yüksek? - `xgb_ht_ft.pkl` yaklaşık `313.55 MB` ölçüldü. - Model tipi `CalibratedClassifierCV (cv=5)` ve her fold içinde `XGBClassifier` var. - HT/FT marketi `9 sınıf` olduğu için ağaç sayısı katlanıyor (`n_estimators=720`, `num_class=9`, `cv=5`). - Sonuç: boyut büyük ama mevcut eğitim konfigürasyonuyla beklenen bir durum; zorunlu değil, yeniden eğitimle küçültülebilir. 2. Neden farklı `match_id` ile aynı HT/FT sonucu çıktı? - DB'siz hızlı testte `match_id` feature olarak kullanılmıyor. - Modele aynı feature vektörü verildiği için farklı ID’lerde aynı olasılık çıktısı üretiyor. - Gerçek maça özel farklı sonuç için feature’ların match bazında DB’den üretilmesi gerekir. 3. HT/FT testini kolaylaştırmak için yapılan API güncellemesi - `ai-engine/main.py` içine yeni endpoint eklendi: - `GET /v20plus/analyze-htft/{match_id}?timeout_sec=30` - Bu endpoint sadece HT/FT odaklı özet döndürür: - `ht_ft_probs`, `surprise_hunter`, `ht_ft_reversal_radar`, `main_pick`, `bet_summary` - Timeout koruması var (uzun süre asılı kalmayı engeller, timeoutta `504` döner). 4. DB bağlantı davranışı (localhost/127) güncellemesi - `ai-engine/data/db.py` içinde host zorlaması kaldırıldı. - Artık `DATABASE_URL` içindeki host ne ise (`localhost`, `postgres`, vb.) aynen kullanılır. - `connect_timeout` ekleme mantığı korundu (`PGCONNECT_TIMEOUT`, default `5`). 5. Docker içi DB port düzeltmesi - `docker-compose.yml` içinde container-to-container DB bağlantılarında yanlış port vardı (`15432`). - Düzeltilenler: - `app` servisi DB URL: `postgres:15432` - `ai-engine` servisi DB URL: `postgres:15432` - Not: Hosttan erişim için `127.0.0.1:15432` map’i ayrı ve doğru. 6. Deploy ve büyük model artefact notu - GitHub dosya limiti nedeniyle büyük `.pkl` dosyaları normal push ile yönetilemeyebilir. - Daha doğru yaklaşım: model artefact’ı harici depodan indirmek (S3/release artifact) ve deploy sırasında bootstrap etmek. --- ## 18. Son Çalışma Güncellemesi (17 Şubat 2026) - HT/FT Analiz ve Düzeltmeler Bu bölüm, kullanıcı talebiyle yapılan HT/FT odaklı tüm analiz ve kod değişikliklerini toplu özetler. ### 18.1 Hedef ve Kapsam Hedef: - `top_leagues.json` içindeki lig ID’lerine göre filtrelenmiş maçlarda HT/FT patternini çıkarmak. - `1/1`, `2/1`, `1/2`, `X/2` gibi sonuçların hangi koşullarda arttığını bulmak. - Sonucu model davranışına (kalibrasyon/öncelik dağılımı) yansıtmak. Kapsam: - Veri kaynağı: `matches`, `live_matches`, `odd_categories`, `odd_selections`, `leagues`, `teams`. - Lig filtresi: doğrudan `/Users/piton/Documents/Suggest-Bet-BE/top_leagues.json`. ### 18.2 Top-Leagues HT/FT Bulguları (Özet İstatistik) Top leagues football örneklemi: - `n = 21,069` HT/FT dağılımı: - `1/1: 26.43%` - `2/2: 16.94%` - `X/X: 15.85%` - `X/1: 14.92%` - `X/2: 10.57%` - `2/1: 2.73%` - `1/2: 2.30%` HT -> FT geçiş: - HT `1` ise FT `1`: `78.02%` - HT `2` ise FT `2`: `68.35%` - HT `X` ise FT `X`: `38.35%`, FT `1`: `36.09%`, FT `2`: `25.56%` Reversal (1/2 + 2/1) devre farkına göre: - Devre farkı `1`: `10.83%` - Devre farkı `2`: `3.18%` - Devre farkı `3`: `0.64%` Oran (MS 1X2) ilişkisi: - Home fav maçlarda `1/1` belirgin yüksek. - Away fav maçlarda `2/2` belirgin yüksek. - Favori devre geriye düşerse `2/1` veya `1/2` olasılığı belirgin artıyor. Sonuç: - `1/1` biası tamamen bug kaynaklı değil; veri dağılımı gerçekten `1/1` ağırlıklı. - Ancak odds sinyali doğru parse edilmezse model tarafsız/fallback davranıp `1/1`i gereğinden fazla öne çekebiliyor. ### 18.3 Kök Nedenler (Bug ve Davranış) 1. Odds parser market eşleşmesi fazla genişti: - `Maç Sonucu` için substring kontrolü, `İlk Yarı/Maç Sonucu` gibi marketlerle çakışıyordu. - `2,5 Alt/Üst` kontrolü, `2,5 Kart Puanı Alt/Üst` ile çakışıyordu. - `Karşılıklı Gol` kontrolü, `1. Yarı Karşılıklı Gol` ile çakışıyordu. - Sonuç: Ana market odds’ları overwrite oluyordu. 2. Bazı maçlarda odds fallback defaultlarına düşülüyordu: - Bu durum favori taraf sinyalini bozuyordu. 3. `Decimal` tipleri bazı yerlerde float bölme hatası üretiyordu: - Prediction akışı kırılıyor veya testler fail oluyordu. ### 18.4 Yapılan Kod Değişiklikleri 1. HT/FT prior odds-koşullu hale getirildi (`home_fav/away_fav/balanced`): - Dosya: `ai-engine/models/v20_ensemble.py` - Eklenenler: - `FOOTBALL_TOP_PRIOR_HOME_FAV` - `FOOTBALL_TOP_PRIOR_AWAY_FAV` - `FOOTBALL_TOP_PRIOR_BALANCED` - `_favorite_side_from_ms_odds` - `_get_top_odds_conditioned_prior` - prior blending içinde odds-koşullu prior entegrasyonu 2. Odds defaultları nötrleştirildi (home bias azaltımı): - Dosya: `ai-engine/models/v20_ensemble.py` - Dosya: `ai-engine/services/single_match_orchestrator.py` - Dosya: `ai-engine/core/engines/odds_predictor.py` - Yeni default: `ms_h=2.65`, `ms_d=3.20`, `ms_a=2.65` 3. Odds parser tam eşleşme mantığına geçirildi: - Dosya: `ai-engine/services/single_match_orchestrator.py` - Değişiklik: - substring yerine normalize + exact category match - `MS`, `OU15`, `OU25`, `OU35`, `BTTS`, `DC` alanları güvenli eşleşme 4. Decimal tip güvenliği eklendi: - Dosya: `ai-engine/core/engines/odds_predictor.py` - `_odds_to_prob` içinde `float()` cast - Dosya: `ai-engine/features/sidelined_analyzer.py` - DB stats alanlarına (`goals/assists/starts/matches`) güvenli float cast 5. HT/FT config ayarları eklendi/güncellendi: - Dosya: `ai-engine/config/ensemble_config.yaml` - Eklenen kritikler: - `risk.htft_prior_odds_blend_top` - `risk.htft_prior_odds_blend_top_with_league` - `risk.htft_favorite_balance_gap` ### 18.5 Test Komutları ve Sonuçlar Kullanılan script: - `python3 ai-engine/scripts/test_ht_ft_match.py --match-id ` Örnek sonuçlar: 1. `Coventry vs Middlesbrough` (`8z03io3g443y73gwxbxk66590`) - Top1: `1/1` (`21.12%`) 2. `Girona vs Barcelona` (`2elfffvt87h2apmhh2c0et3pw`) - Odds doğru parse sonrası: - `ms_h=6.38`, `ms_d=5.24`, `ms_a=1.19` (away favori) - Top1 HT/FT: - `2/2` (`23.08%`) Bu test, parser ve odds-koşullu prior düzeltmesinin çalıştığını doğrular. ### 18.6 Operasyonel Not - HT/FT yüzdeleri `confidence` değil, sınıf olasılığıdır (`probability`). - Tek maçta yüzde düşükken farklı sonuç gerçekleşebilir; kalite ölçümü tek maç değil toplu backtest ile yapılmalıdır. --- ## 19. Son Çalışma Güncellemesi (17 Şubat 2026) - Veri Bütünlüğü, Type Uyumu, Uçtan Uca Test Bu bölümde, `live_matches` üzerinden gelen verinin eksiksiz parse edilmesi, Python tarafındaki alanların type sözleşmesine uyumu ve tahmin paketine doğru aktarım için yapılan kritik düzeltmeler yer alır. ### 19.1 Hedef - Oran kategori parse hatalarını engellemek. - Eksik takım/lineup verisinde yanlış tahmin üretimini kesmek. - `lineups`, `sidelined`, `referee`, `odds`, takım formu ve lig pozisyonu gibi sinyalleri tek maç analizine güvenli taşımak. - Python tarafındaki sözleşmeyi TypeScript/uygulama beklentisiyle uyumlu hale getirmek. ### 19.2 Yapılan Kod Düzeltmeleri 1. Team feature key eşleşmeleri düzeltildi: - Dosya: `ai-engine/core/engines/team_predictor.py` - `possession -> avg_possession`, `shots_on_target -> avg_shots_on_target`, `corners -> avg_corners` 2. Sahte lineup defaultları kaldırıldı: - Dosya: `ai-engine/features/squad_analysis_engine.py` - `or 11 / or 18` fallbackleri temizlendi; gerçek sayılar kullanılıyor. 3. Player predictor lineup gate ve confidence iyileştirildi: - Dosya: `ai-engine/core/engines/player_predictor.py` - `lineup_available` artık her iki takımda da en az 11 oyuncu şartına bağlı. - Lineup yokken confidence daha agresif düşürülüyor; alt sınır clamp ile korunuyor. 4. Referee feature fallback güçlendirildi: - Dosya: `ai-engine/core/engines/referee_predictor.py` - `match_id` ile gelen veri zayıfsa ve `referee_name` varsa isim bazlı daha güçlü örneklem seçiliyor. 5. Tek maç orchestrator veri sözleşmesi genişletildi: - Dosya: `ai-engine/services/single_match_orchestrator.py` - `MatchData` eklendi: - `home_goals_avg`, `home_conceded_avg`, `away_goals_avg`, `away_conceded_avg` - `lineup_source` - Zorunlu gate: - `home_team_id` veya `away_team_id` yoksa analiz iptal (`None`). - Yeni yardımcılar: - `_calculate_team_form` - `_estimate_league_position` - `_extract_lineups` artık `(home, away, source)` döner: - `confirmed_live`, `confirmed_participation`, `probable_xi`, `none` - `market` kararlarında: - `probable_xi` lineup-sensitive marketlerde ceza alır. - Zorunlu odds eksikse market `market_odds_missing` ile playable olmaz. - Data quality: - Gerçek odds ile default odds ayrıştırılır. - `lineup_source` kalite ve reasoning alanına taşınır. 6. Testler yeni sözleşmeye göre güncellendi: - Dosya: `ai-engine/tests/test_single_match_orchestrator.py` - Yeni testler: - takım id eksikse match load reject - required odds yoksa market block ### 19.3 Çalıştırılan Testler - Python unit test: - `python3 -m unittest discover -s ai-engine/tests -v` - Sonuç: `19/19 PASS` - Jest: - `npx jest --runInBand` - Sonuç: `2 suite / 4 test PASS` - DB smoke doğrulama: - Team ID eksik future match artık analiz edilmiyor. - Complete veri içeren match normal analiz üretiyor. ### 19.4 Veri Kalitesi Bulgusu (Neden Bazı Maçlar Zayıf Kalıyor?) - `future30` içinde `live_matches` satırlarında `league_id/home_team_id/away_team_id` çok yüksek oranda boş olabiliyor. - Aynı pencerede `odds/lineups/referee/sidelined` da çoğu zaman boş kalabiliyor. - Sonuç: model kapasitesi yüksek olsa da giriş verisi boşsa “sürpriz yakalama” veya “garanti market” üretimi sınırlanır. Bu yüzden yeni yaklaşım: - Eksik kritik alan varsa tahmini zorla üretme. - Veri kaynağını `lineup_source` gibi kalite etiketleriyle açıkça işaretle. - Eksik market odds varsa o marketi otomatik ele. ### 19.5 Basketbol Fazı (Bir Sonraki Adım Planı) Futbol için kritik parse/type/quality sorunları stabilize edildi. Sıradaki odak basketbol: 1. Basketbol market sözlüğü ve parser matrisi: - 1X2 yerine basketbola özgü marketleri (`ML`, `spread`, `total`) ayrı haritala. 2. Basketbol feature contract: - `match_team_stats` içindeki basketbol alanlarını (pace, rebound, turnover, 3P vb.) zorunlu/opsiyonel diye netleştir. 3. Lineup/injury impact modeli (basketbol): - İlk 5 ve rotasyon oyuncusu etkisini pozisyon ve usage ile ağırlıkla. 4. Basketbol için ayrı confidence calibration: - Futbol kalibrasyon katsayılarını basketbola taşımadan lig bazlı yeniden ayarla. 5. Basketbol E2E test paketi: - `live_matches -> orchestrator -> package -> market gating` zincirini basketbol maçları için ayrı fixture setiyle doğrula. ## 20) Swagger Endpoint Envanteri (2026-02-17) ### 20.1 Yapılanlar 1. Swagger tag kapsamı genişletildi: - Dosya: `src/main.ts` - Eklenen tagler: `Matches`, `Leagues`, `Analysis`, `Coupon`, `Predictions` 2. `users/me` endpointi Swagger’da eksiksiz tanımlandı: - Dosya: `src/modules/users/users.controller.ts` - Eklendi: - `@ApiOperation({ summary: 'Get current authenticated user profile' })` - `@ApiOkResponse({ type: UserResponseDto })` 3. Tüm backend endpointlerinin otomatik JSON özeti üretildi: - Yeni script: `src/scripts/export-swagger-endpoints-summary.ts` - NPM komutu: `npm run swagger:summary` - Üretilen çıktı: `mds/backend_endpoints_swagger_summary.json` ### 20.2 JSON Özeti İçeriği Üretilen JSON dosyasında her endpoint için: - HTTP method + path - controller/method kaynak bilgisi - endpoint summary/description - auth gereksinimi (`bearer`, `@Public`) - path/query/header/cookie parametre tipleri - body şeması (Swagger’da varsa) + TypeScript body type hint - response status listesi + şema referansları (Swagger’da varsa) + TypeScript return type - tag bazlı endpoint sayıları ### 20.3 Not - `PredictionsModule`, `AppModule` içinde `REDIS_ENABLED` koşuluna bağlı olduğu için export scripti kapsamlı envanter için `REDIS_ENABLED=true` ile Swagger dokümanı üretir.