@@ -18,84 +18,55 @@ function buildPrompt(p: PredictionData): string {
const risk = ( p . risk ? ? { } ) as Record < string , unknown > ;
const risk = ( p . risk ? ? { } ) as Record < string , unknown > ;
const ba = ( p . bet_advice ? ? { } ) as Record < string , unknown > ;
const ba = ( p . bet_advice ? ? { } ) as Record < string , unknown > ;
const dq = ( p . data_quality ? ? { } ) as Record < string , unknown > ;
const dq = ( p . data_quality ? ? { } ) as Record < string , unknown > ;
const v27 = ( p . v27_engine ? ? { } ) as Record < string , unknown > ;
const home = String ( mi . home_team ? ? "Ev Sahibi" ) ;
const home = String ( mi . home_team ? ? "Ev Sahibi" ) ;
const away = String ( mi . away_team ? ? "Deplasman" ) ;
const away = String ( mi . away_team ? ? "Deplasman" ) ;
const league = String ( mi . league ? ? "" ) ;
const league = String ( mi . league ? ? "" ) ;
// Market board - ham olası lı klar
const ms = ( mb . MS ? ? { } ) as Record < string , unknown > ;
const ms = ( mb . MS ? ? { } ) as Record < string , unknown > ;
const msProbs = ( ms . probs ? ? { } ) as Record < string , number > ;
const ou15 = ( mb . OU15 ? ? { } ) as Record < string , unknown > ;
const ou15 = ( mb . OU15 ? ? { } ) as Record < string , unknown > ;
const ou25 = ( mb . OU25 ? ? { } ) as Record < string , unknown > ;
const ou25 = ( mb . OU25 ? ? { } ) as Record < string , unknown > ;
const ou35 = ( mb . OU35 ? ? { } ) as Record < string , unknown > ;
const ou35 = ( mb . OU35 ? ? { } ) as Record < string , unknown > ;
const btts = ( mb . BTTS ? ? { } ) as Record < string , unknown > ;
const btts = ( mb . BTTS ? ? { } ) as Record < string , unknown > ;
const homeWin = Math . round ( ( msProbs [ "1" ] ? ? 0 ) * 100 ) ;
// V27 predictions
const draw = Math . round ( ( msProbs [ "X" ] ? ? 0 ) * 100 ) ;
const v27preds = ( v27 . predictions ? ? { } ) as Record < string , unknown > ;
const awayWin = Math . round ( ( msProbs [ "2" ] ? ? 0 ) * 100 ) ;
const v27ms = ( v27preds . ms ? ? { } ) as Record < string , number > ;
const ou15Probs = ( ou15 . probs ? ? { } ) as Record < string , number > ;
// Risk breakdown
const ou25Probs = ( ou25 . probs ? ? { } ) as Record < string , number > ;
const surpriseReasons = ( risk . surprise_reasons as string [ ] | undefined ) ? ? [ ] ;
const ou35Probs = ( ou35 . probs ? ? { } ) as Record < string , number > ;
const warnings = ( risk . warnings as string [ ] | undefined ) ? ? [ ] ;
const bttsProbs = ( btts . probs ? ? { } ) as Record < string , number > ;
const xgHome = Number ( sp . xg_home ? ? 0 ) . toFixed ( 2 ) ;
// Top 5 scenarios
const xgAway = Number ( sp . xg_away ? ? 0 ) . toFixed ( 2 ) ;
const top5 = ( p . scenario_top5 ? ? [ ] ) . slice ( 0 , 5 ) ;
const ftScore = String ( sp . ft ? ? "" ) ;
const ou15Over = Math . round ( ( ou15Probs . over ? ? 0 ) * 100 ) ;
const analysisData = {
const ou25Over = Math . round ( ( ou25Probs . over ? ? 0 ) * 100 ) ;
mac : ` ${ home } - ${ away } ( ${ league } ) ` ,
const ou35Under = Math . round ( ( ou35Probs . under ? ? 0 ) * 100 ) ;
ms_olasilik : {
const bttsYes = Math . round ( ( bttsProbs . yes ? ? 0 ) * 100 ) ;
ev_sahibi_kazanir : ms.probs ? ( mb . MS as Record < string , unknown > ) ? . probs : null ,
v27_ev_sahibi : v27ms.home ? Math . round ( v27ms . home * 100 ) : null ,
} ,
xg : { ev_sahibi : sp.xg_home , deplasman : sp.xg_away , toplam : sp.xg_total } ,
gol_marketleri : {
"1_5_ust" : ( ou15 . probs as Record < string , number > | undefined ) ? . over ,
"2_5_ust" : ( ou25 . probs as Record < string , number > | undefined ) ? . over ,
"3_5_alt" : ( ou35 . probs as Record < string , number > | undefined ) ? . under ,
kg_var : ( btts . probs as Record < string , number > | undefined ) ? . yes ,
} ,
skor_tahmini : sp.ft ,
en_olasilar : top5.map ( ( s ) = > ` ${ s . score } : % ${ Math . round ( s . prob * 100 ) } ` ) ,
risk : { seviye : risk.level , surpriz_skoru : risk.surprise_score , uyarilar : [ . . . surpriseReasons , . . . warnings ] . slice ( 0 , 3 ) } ,
bahis_tavsiyesi : { oynanabilir : ba.playable , karar : ba.decision , neden : ba.reason } ,
kadro : { kaynak : dq.lineup_source , kalite : dq.score } ,
} ;
const riskLevel = String ( risk . level ? ? "" ) ;
return ` Sen bir futbol bahis analistisin. Aşağıdaki maç analizini okuyup SADECE TÜRKÇE 2-3 cümle yorum yaz. Sayı ları tekrar etme, anlam çıkar.
const surpriseScore = Number ( risk . surprise_score ? ? 0 ) ;
const playable = Boolean ( ba . playable ) ;
const lineupSource = String ( dq . lineup_source ? ? "" ) ;
const top5 = ( p . scenario_top5 ? ? [ ] )
${ JSON . stringify ( analysisData , null , 2 ) }
. slice ( 0 , 3 )
. map ( ( s ) = > ` ${ s . score } (% ${ Math . round ( s . prob * 100 ) } ) ` )
. join ( ", " ) ;
// V27 MS probs if available
const v27 = ( p . v27_engine ? ? { } ) as Record < string , unknown > ;
const v27ms = ( v27 . predictions as Record < string , unknown > ) ? . ms as Record < string , number > | undefined ;
const v27Home = v27ms ? Math . round ( v27ms . home * 100 ) : null ;
const nobet = ! playable
? "Tüm oranlar çok düşük, bahis yapmak mantı klı değil."
: "Bahis açılabilir." ;
const xgComment =
Number ( xgHome ) > Number ( xgAway ) * 2
? ` ${ home } xG açısı ndan çok üstün ( ${ xgHome } - ${ xgAway } ), ${ away } gol atacak alan bulamı yor. `
: Number ( xgAway ) > Number ( xgHome ) * 2
? ` ${ away } xG açısı ndan çok üstün ( ${ xgAway } - ${ xgHome } ), ${ home } etkisiz kalı yor. `
: ` İki takı m xG açısı ndan yakı n ( ${ xgHome } - ${ xgAway } ). ` ;
const goalComment =
ou15Over >= 80
? "Maçta kesinlikle gol bekleniyor."
: ou15Over >= 65
? "Gol ihtimali yüksek."
: "Golsüz geçebilir." ;
const highSurprise = surpriseScore >= 60 ;
return ` Aşağıdaki futbol maçı için Türkçe uzman yorum yaz. Sadece Türkçe kullan, İngilizce kelime yasak. 3 cümle yaz, kı sa tut.
Maç: ${ home } - ${ away }
${ home } kazanma ihtimali: % ${ homeWin } ${ v27Home ? ` , güçlü model: % ${ v27Home } ` : "" }
Beraberlik: % ${ draw } , ${ away } kazanı r: % ${ awayWin }
${ xgComment }
${ goalComment } (1.5 üst: % ${ ou15Over } , 2.5 üst: % ${ ou25Over } )
En olası skor: ${ ftScore } . İkili bahis olası lığı: % ${ bttsYes } .
Risk: ${ riskLevel } ${ highSurprise ? ", sürpriz olabilir" : "" } .
${ nobet }
Yorum: ` ;
Türkçe yorum: ` ;
}
}
export async function generateExpertCommentary (
export async function generateExpertCommentary (