From fbf279d2d0525110c2b5a51287e2293bb65d2df9 Mon Sep 17 00:00:00 2001 From: Fahri Can Date: Tue, 2 Jun 2026 23:47:17 +0300 Subject: [PATCH] g3 --- messages/en.json | 2 + messages/tr.json | 2 + src/components/matches/prediction-card.tsx | 63 ++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/messages/en.json b/messages/en.json index af15b17..9f949ad 100644 --- a/messages/en.json +++ b/messages/en.json @@ -296,6 +296,8 @@ "engine-label-low": "Low", "engine-label-very-low": "Very Low", "best-single-pick": "Value Bet (odds-based)", + "most-reliable-read": "Most Reliable Read", + "most-reliable-copy": "The market the model reads with the highest accuracy for this match. Even if the winner is unclear, this read can be stronger.", "match-result-prediction": "Match Result Prediction", "match-result-copy": "The model's most likely outcome (who wins).", "match-result-vs-value": "This is the most likely outcome. The \"Value Bet\" below is the most profitable pick by odds — the two can differ.", diff --git a/messages/tr.json b/messages/tr.json index 7ff25c7..c9febc3 100644 --- a/messages/tr.json +++ b/messages/tr.json @@ -296,6 +296,8 @@ "engine-label-low": "Düşük", "engine-label-very-low": "Çok Düşük", "best-single-pick": "Değerli Bahis (orana göre)", + "most-reliable-read": "En Güvenilir Okuma", + "most-reliable-copy": "Bu maçta modelin en yüksek isabetle okuduğu market. Maç sonucu belirsiz olsa bile bu okuma daha güçlü olabilir.", "match-result-prediction": "Maç Sonucu Tahmini", "match-result-copy": "Modelin en olası gördüğü sonuç (kim kazanır).", "match-result-vs-value": "Bu en olası sonuçtur. Aşağıdaki \"Değerli Bahis\" ise orana göre en kârlı görülen seçimdir — ikisi farklı olabilir.", diff --git a/src/components/matches/prediction-card.tsx b/src/components/matches/prediction-card.tsx index 29c98e9..27d3e74 100644 --- a/src/components/matches/prediction-card.tsx +++ b/src/components/matches/prediction-card.tsx @@ -1214,6 +1214,27 @@ export default function PredictionCard({ prediction }: PredictionCardProps) { }; })(); + // ── En Güvenilir Okuma (akıllı market seçimi) ────────────────────── + // Backtest: always-MS headline = %53 hit; picking the HIGHEST-confidence + // market per match = %74 hit (DC / Üst1.5 / Üst3.5 etc.). The model's + // probabilities are fine — the upgrade is *choosing which market to lead + // with*. We surface the most reliable read (highest calibrated_confidence + // across all bet_summary markets), so e.g. a match with an unclear winner + // but a clear "Üst 2.5" leads with the goals call instead of a coin-flip MS. + const mostReliableRead = (() => { + const items = prediction.bet_summary; + if (!Array.isArray(items) || items.length === 0) return null; + let best: (typeof items)[number] | null = null; + for (const it of items) { + const conf = it.calibrated_confidence ?? 0; + // require a genuinely confident read; skip near-coinflip + if (conf < 55) continue; + if (!best || conf > (best.calibrated_confidence ?? 0)) best = it; + } + if (!best) return null; + return best; + })(); + const sport = getPredictionSport(prediction); const isBasketball = sport === "basketball"; @@ -1494,6 +1515,48 @@ export default function PredictionCard({ prediction }: PredictionCardProps) { ) : null} + {mostReliableRead ? ( + + + + + {uiText("most-reliable-read", "En Güvenilir Okuma")} + + + + {getMarketLabel(mostReliableRead.market, marketLabels)}:{" "} + {mostReliableRead.pick} + + + + {uiText( + "most-reliable-copy", + "Bu maçta modelin en yüksek isabetle okuduğu market. Maç sonucu belirsiz olsa bile bu okuma daha güçlü olabilir.", + )} + + + + + {formatPercent( + mostReliableRead.unified_score ?? + mostReliableRead.calibrated_confidence, + 0, + )} + + + {uiText("confidence-label", "Güven")} + + + + + ) : null} + {recommendedPick ? (