Files
iddaai-be/mds/OZET.md
fahricansecer 2f0b85a0c7
Deploy Iddaai Backend / build-and-deploy (push) Failing after 18s
first (part 2: other directories)
2026-04-16 15:11:25 +03:00

28 KiB
Executable File
Raw Permalink Blame History

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ı frontendde live_matches tablosundan maçı seçer.
  2. Backend seçilen maçı AI enginee 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 entitydir.
  • 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 routelar:

  • GET /
  • GET /health
  • POST /v20plus/analyze/{match_id}
  • POST /v20plus/coupon
  • GET /v20plus/daily-banker

Geriye uyumluluk aliasları:

  • 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 hostu:

  • Backend tarafında AI_ENGINE_URL envi 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 pkller:

  • 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:

  • Repoda 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

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

# 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

# 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:

# 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:

# Ö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):

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:

    1. API envanteri
    1. V20+ mimari
    1. Task/Cron envanteri
    1. Model artefact durumu
    1. 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.
  1. 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ı IDlerde aynı olasılık çıktısı üretiyor.
  • Gerçek maça özel farklı sonuç için featureların match bazında DBden üretilmesi gerekir.
  1. 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).
  1. 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).
  1. 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 mapi ayrı ve doğru.
  1. 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 IDlerine 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/1i 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 oddsları overwrite oluyordu.
  1. Bazı maçlarda odds fallback defaultlarına düşülüyordu:
  • Bu durum favori taraf sinyalini bozuyordu.
  1. 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
  1. 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
  1. 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
  1. 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
  1. 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 <id>

Örnek sonuçlar:

  1. Coventry vs Middlesbrough (8z03io3g443y73gwxbxk66590)
  • Top1: 1/1 (21.12%)
  1. 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
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. Basketbol feature contract:
  • match_team_stats içindeki basketbol alanlarını (pace, rebound, turnover, 3P vb.) zorunlu/opsiyonel diye netleştir.
  1. Lineup/injury impact modeli (basketbol):
  • İlk 5 ve rotasyon oyuncusu etkisini pozisyon ve usage ile ağırlıkla.
  1. Basketbol için ayrı confidence calibration:
  • Futbol kalibrasyon katsayılarını basketbola taşımadan lig bazlı yeniden ayarla.
  1. 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
  1. users/me endpointi Swaggerda eksiksiz tanımlandı:
  • Dosya: src/modules/users/users.controller.ts
  • Eklendi:
    • @ApiOperation({ summary: 'Get current authenticated user profile' })
    • @ApiOkResponse({ type: UserResponseDto })
  1. 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ı (Swaggerda varsa) + TypeScript body type hint
  • response status listesi + şema referansları (Swaggerda 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.