UmarAF commited on
Commit
af99cab
ยท
verified ยท
1 Parent(s): e8e8687

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +242 -198
app.py CHANGED
@@ -1,199 +1,243 @@
1
- import gradio as gr
2
- import pandas as pd
3
- import numpy as np
4
- import joblib
5
- import pickle
6
-
7
- # --- 1. LOAD MODEL & DATA ---
8
- model = joblib.load('xgboost_valorant_model.pkl')
9
-
10
- with open('player_knowledge_base.pkl', 'rb') as f:
11
- knowledge_base = pickle.load(f)
12
-
13
- with open('training_columns.pkl', 'rb') as f:
14
- training_columns = pickle.load(f)
15
-
16
- # Daftar Map & Agent (Sesuaikan dengan data Anda)
17
- MAP_LIST = ['Ascent', 'Bind', 'Breeze', 'Fracture', 'Haven', 'Icebox', 'Lotus', 'Pearl', 'Split', 'Sunset', 'Abyss']
18
- AGENT_LIST = ['Jett', 'Raze', 'Reyna', 'Phoenix', 'Yoru', 'Neon', 'Iso', # Duelist
19
- 'Sova', 'Fade', 'Breach', 'Skye', 'Kayo', 'Gekko', # Initiator
20
- 'Omen', 'Brimstone', 'Viper', 'Astra', 'Harbor', 'Clove', 'Waylay', # Controller
21
- 'Sage', 'Cypher', 'Killjoy', 'Chamber', 'Deadlock', 'Vyse', 'Tejo', 'Veto'] # Sentinel
22
-
23
- # --- 2. FUNGSI PREDIKSI ---
24
- def predict_match(map_name, t1_side,
25
- t1_p1_name, t1_p1_agent, t1_p2_name, t1_p2_agent,
26
- t1_p3_name, t1_p3_agent, t1_p4_name, t1_p4_agent, t1_p5_name, t1_p5_agent,
27
- t2_p1_name, t2_p1_agent, t2_p2_name, t2_p2_agent,
28
- t2_p3_name, t2_p3_agent, t2_p4_name, t2_p4_agent, t2_p5_name, t2_p5_agent):
29
-
30
- # A. Buat DataFrame Input Kosong
31
- input_data = pd.DataFrame(columns=training_columns)
32
- input_data.loc[0] = 0 # Isi baris pertama dengan 0 semua
33
-
34
- # B. Helper: Ambil Stats dari Knowledge Base
35
- def get_stats(player, agent):
36
- # Jika player/agent ada di database, ambil statsnya
37
- # Jika tidak (player baru), pakai nilai default (WR=0.5, Exp=0)
38
- key = (player, agent)
39
- stats = knowledge_base.get(key, {'Agent_WR': 0.5, 'General_WR': 0.5, 'Exp': 0})
40
- return stats
41
-
42
- # C. Isi Fitur Winrate (Skenario 4 Logic)
43
- # Team 1
44
- t1_inputs = [
45
- (t1_p1_name, t1_p1_agent), (t1_p2_name, t1_p2_agent), (t1_p3_name, t1_p3_agent),
46
- (t1_p4_name, t1_p4_agent), (t1_p5_name, t1_p5_agent)
47
- ]
48
-
49
- t1_general_wrs = []
50
-
51
- for i, (p_name, p_agent) in enumerate(t1_inputs):
52
- stats = get_stats(p_name, p_agent)
53
- idx = i + 1
54
-
55
- # Isi ke DataFrame (Cek apakah kolom ada di training_columns agar tidak error)
56
- if f'T1_P{idx}_Agent_WR' in training_columns:
57
- input_data.at[0, f'T1_P{idx}_Agent_WR'] = stats['Agent_WR']
58
- if f'T1_P{idx}_General_WR' in training_columns:
59
- input_data.at[0, f'T1_P{idx}_General_WR'] = stats['General_WR']
60
- if f'T1_P{idx}_Agent_Exp' in training_columns:
61
- input_data.at[0, f'T1_P{idx}_Agent_Exp'] = stats['Exp']
62
-
63
- t1_general_wrs.append(stats['General_WR'])
64
-
65
- # Team 2 (Lakukan hal sama)
66
- t2_inputs = [
67
- (t2_p1_name, t2_p1_agent), (t2_p2_name, t2_p2_agent), (t2_p3_name, t2_p3_agent),
68
- (t2_p4_name, t2_p4_agent), (t2_p5_name, t2_p5_agent)
69
- ]
70
- t2_general_wrs = []
71
-
72
- for i, (p_name, p_agent) in enumerate(t2_inputs):
73
- stats = get_stats(p_name, p_agent)
74
- idx = i + 1
75
- if f'T2_P{idx}_Agent_WR' in training_columns:
76
- input_data.at[0, f'T2_P{idx}_Agent_WR'] = stats['Agent_WR']
77
- if f'T2_P{idx}_General_WR' in training_columns:
78
- input_data.at[0, f'T2_P{idx}_General_WR'] = stats['General_WR']
79
- if f'T2_P{idx}_Agent_Exp' in training_columns:
80
- input_data.at[0, f'T2_P{idx}_Agent_Exp'] = stats['Exp']
81
- t2_general_wrs.append(stats['General_WR'])
82
-
83
- # D. Hitung WR Diff
84
- if 'WR_Diff' in training_columns:
85
- t1_avg = np.mean(t1_general_wrs)
86
- t2_avg = np.mean(t2_general_wrs)
87
- input_data.at[0, 'WR_Diff'] = t1_avg - t2_avg
88
-
89
- # E. One-Hot Encoding Manual (Set Nilai 1)
90
- # Map
91
- map_col = f'MAP_{map_name}'
92
- if map_col in training_columns:
93
- input_data.at[0, map_col] = 1
94
-
95
- # Start Side (Jika ada fitur ini)
96
- if 'T1_StartSide_Defense' in training_columns:
97
- input_data.at[0, 'T1_StartSide_Defense'] = 1 if t1_side == 'Defense' else 0
98
- if 'T2_StartSide_Defense' in training_columns: # Biasanya kebalikan T1
99
- input_data.at[0, 'T2_StartSide_Defense'] = 1 if t1_side == 'Attack' else 0
100
-
101
- # Agent OHE
102
- # T1 Agents
103
- for _, agent in t1_inputs:
104
- # Jika pakai logika "T1_P1_Agent_Jett" (Slot Based)
105
- # Atau "T1_Has_Jett" (Aggregated Based) - Sesuaikan dengan model terakhir Anda!
106
-
107
- # Asumsi: Masih pakai Slot Based (sesuai kode terakhir di chat)
108
- # Kita loop kolom training untuk mencocokkan
109
- pass
110
-
111
- # Karena OHE manual agak ribet mencocokkan nama kolom tepatnya,
112
- # kita gunakan cara pintar: Loop semua input agent, cari kolom yang sesuai di training_columns
113
-
114
- # Set T1 Agents
115
- for i, (_, agent) in enumerate(t1_inputs):
116
- col_name = f'T1_P{i+1}_Agent_{agent}'
117
- if col_name in training_columns:
118
- input_data.at[0, col_name] = 1
119
-
120
- # Set T2 Agents
121
- for i, (_, agent) in enumerate(t2_inputs):
122
- col_name = f'T2_P{i+1}_Agent_{agent}'
123
- if col_name in training_columns:
124
- input_data.at[0, col_name] = 1
125
-
126
- # --- 3. PREDIKSI ---
127
- # Convert ke float agar aman
128
- input_data = input_data.astype(float)
129
-
130
- prob = model.predict_proba(input_data)[0]
131
- win_prob_t1 = prob[1] # Probabilitas kelas 1 (T1 Win)
132
-
133
- winner = "TEAM 1" if win_prob_t1 > 0.5 else "TEAM 2"
134
- confidence = win_prob_t1 if win_prob_t1 > 0.5 else 1 - win_prob_t1
135
-
136
- return f"{winner} WIN ({confidence:.1%} Confidence)"
137
-
138
- # --- 3. UI GRADIO ---
139
- with gr.Blocks(title="Valorant Match Predictor") as demo:
140
- gr.Markdown("# ๐Ÿ”ฎ Valorant AI Predictor (Skenario 4)")
141
- gr.Markdown("Prediksi pemenang berdasarkan sejarah performa player dan komposisi agent.")
142
-
143
- with gr.Row():
144
- with gr.Column():
145
- map_input = gr.Dropdown(MAP_LIST, label="Select Map")
146
- side_input = gr.Radio(["Attack", "Defense"], label="Team 1 Start Side", value="Attack")
147
-
148
- with gr.Row():
149
- # Team 1 Inputs
150
- with gr.Column():
151
- gr.Markdown("### ๐Ÿ”ต Team 1 Roster")
152
- t1_p1_n = gr.Textbox(label="P1 Name", placeholder="e.g. f0rsakeN")
153
- t1_p1_a = gr.Dropdown(AGENT_LIST, label="P1 Agent")
154
-
155
- t1_p2_n = gr.Textbox(label="P2 Name", placeholder="e.g. mindfreak")
156
- t1_p2_a = gr.Dropdown(AGENT_LIST, label="P2 Agent")
157
-
158
- t1_p3_n = gr.Textbox(label="P3 Name")
159
- t1_p3_a = gr.Dropdown(AGENT_LIST, label="P3 Agent")
160
-
161
- t1_p4_n = gr.Textbox(label="P4 Name")
162
- t1_p4_a = gr.Dropdown(AGENT_LIST, label="P4 Agent")
163
-
164
- t1_p5_n = gr.Textbox(label="P5 Name")
165
- t1_p5_a = gr.Dropdown(AGENT_LIST, label="P5 Agent")
166
-
167
- # Team 2 Inputs
168
- with gr.Column():
169
- gr.Markdown("### ๐Ÿ”ด Team 2 Roster")
170
- t2_p1_n = gr.Textbox(label="P1 Name", placeholder="e.g. Tenz")
171
- t2_p1_a = gr.Dropdown(AGENT_LIST, label="P1 Agent")
172
-
173
- t2_p2_n = gr.Textbox(label="P2 Name", placeholder="e.g. Zekken")
174
- t2_p2_a = gr.Dropdown(AGENT_LIST, label="P2 Agent")
175
-
176
- t2_p3_n = gr.Textbox(label="P3 Name")
177
- t2_p3_a = gr.Dropdown(AGENT_LIST, label="P3 Agent")
178
-
179
- t2_p4_n = gr.Textbox(label="P4 Name")
180
- t2_p4_a = gr.Dropdown(AGENT_LIST, label="P4 Agent")
181
-
182
- t2_p5_n = gr.Textbox(label="P5 Name")
183
- t2_p5_a = gr.Dropdown(AGENT_LIST, label="P5 Agent")
184
-
185
- btn = gr.Button("๐Ÿš€ PREDICT WINNER", variant="primary")
186
- output = gr.Label(label="Prediction Result")
187
-
188
- # Connect Button
189
- btn.click(
190
- fn=predict_match,
191
- inputs=[
192
- map_input, side_input,
193
- t1_p1_n, t1_p1_a, t1_p2_n, t1_p2_a, t1_p3_n, t1_p3_a, t1_p4_n, t1_p4_a, t1_p5_n, t1_p5_a,
194
- t2_p1_n, t2_p1_a, t2_p2_n, t2_p2_a, t2_p3_n, t2_p3_a, t2_p4_n, t2_p4_a, t2_p5_n, t2_p5_a
195
- ],
196
- outputs=output
197
- )
198
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
  demo.launch()
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ import numpy as np
4
+ import joblib
5
+ import pickle
6
+
7
+ # --- 1. LOAD MODEL & DATA ---
8
+ # Pastikan file-file .pkl ini ada di folder yang sama saat di-upload ke Hugging Face
9
+ try:
10
+ model = joblib.load('xgboost_valorant_model.pkl')
11
+ with open('player_knowledge_base.pkl', 'rb') as f:
12
+ knowledge_base = pickle.load(f)
13
+ with open('training_columns.pkl', 'rb') as f:
14
+ training_columns = pickle.load(f)
15
+ print("โœ… Model dan Data berhasil dimuat.")
16
+ except Exception as e:
17
+ print(f"โŒ Error loading files: {e}")
18
+ # Dummy data untuk mencegah crash saat development lokal tanpa file
19
+ knowledge_base = {}
20
+ training_columns = []
21
+
22
+ # Daftar Map & Agent (Sesuaikan dengan data Anda)
23
+ MAP_LIST = ['Ascent', 'Bind', 'Breeze', 'Fracture', 'Haven', 'Icebox', 'Lotus', 'Pearl', 'Split', 'Sunset', 'Abyss']
24
+ AGENT_LIST = ['Jett', 'Raze', 'Reyna', 'Phoenix', 'Yoru', 'Neon', 'Iso', # Duelist
25
+ 'Sova', 'Fade', 'Breach', 'Skye', 'Kayo', 'Gekko', # Initiator
26
+ 'Omen', 'Brimstone', 'Viper', 'Astra', 'Harbor', 'Clove', 'Waylay', # Controller
27
+ 'Sage', 'Cypher', 'Killjoy', 'Chamber', 'Deadlock', 'Vyse', 'Tejo', 'Veto'] # Sentinel
28
+
29
+ # --- 2. FUNGSI PREDIKSI ---
30
+ def predict_match(map_name, t1_side,
31
+ t1_p1_name, t1_p1_agent, t1_p2_name, t1_p2_agent,
32
+ t1_p3_name, t1_p3_agent, t1_p4_name, t1_p4_agent, t1_p5_name, t1_p5_agent,
33
+ t2_p1_name, t2_p1_agent, t2_p2_name, t2_p2_agent,
34
+ t2_p3_name, t2_p3_agent, t2_p4_name, t2_p4_agent, t2_p5_name, t2_p5_agent):
35
+
36
+ # A. Buat DataFrame Input Kosong
37
+ input_data = pd.DataFrame(columns=training_columns)
38
+ input_data.loc[0] = 0 # Isi baris pertama dengan 0 semua
39
+
40
+ # B. Helper: Ambil Stats dari Knowledge Base
41
+ def get_stats(player, agent):
42
+ # Normalisasi input nama player (strip whitespace)
43
+ player_clean = player.strip() if player else ""
44
+ key = (player_clean, agent)
45
+
46
+ # Ambil stats, default 0.5 jika tidak ada
47
+ stats = knowledge_base.get(key, {'Agent_WR': 0.5, 'General_WR': 0.5, 'Exp': 0})
48
+ return stats
49
+
50
+ # C. Isi Fitur Winrate (Skenario 4 Logic)
51
+ # Team 1 Inputs
52
+ t1_inputs = [
53
+ (t1_p1_name, t1_p1_agent), (t1_p2_name, t1_p2_agent), (t1_p3_name, t1_p3_agent),
54
+ (t1_p4_name, t1_p4_agent), (t1_p5_name, t1_p5_agent)
55
+ ]
56
+ t1_general_wrs = []
57
+
58
+ for i, (p_name, p_agent) in enumerate(t1_inputs):
59
+ stats = get_stats(p_name, p_agent)
60
+ idx = i + 1
61
+
62
+ if f'T1_P{idx}_Agent_WR' in training_columns:
63
+ input_data.at[0, f'T1_P{idx}_Agent_WR'] = stats['Agent_WR']
64
+ if f'T1_P{idx}_General_WR' in training_columns:
65
+ input_data.at[0, f'T1_P{idx}_General_WR'] = stats['General_WR']
66
+ if f'T1_P{idx}_Agent_Exp' in training_columns:
67
+ input_data.at[0, f'T1_P{idx}_Agent_Exp'] = stats['Exp']
68
+
69
+ t1_general_wrs.append(stats['General_WR'])
70
+
71
+ # Team 2 Inputs
72
+ t2_inputs = [
73
+ (t2_p1_name, t2_p1_agent), (t2_p2_name, t2_p2_agent), (t2_p3_name, t2_p3_agent),
74
+ (t2_p4_name, t2_p4_agent), (t2_p5_name, t2_p5_agent)
75
+ ]
76
+ t2_general_wrs = []
77
+
78
+ for i, (p_name, p_agent) in enumerate(t2_inputs):
79
+ stats = get_stats(p_name, p_agent)
80
+ idx = i + 1
81
+
82
+ if f'T2_P{idx}_Agent_WR' in training_columns:
83
+ input_data.at[0, f'T2_P{idx}_Agent_WR'] = stats['Agent_WR']
84
+ if f'T2_P{idx}_General_WR' in training_columns:
85
+ input_data.at[0, f'T2_P{idx}_General_WR'] = stats['General_WR']
86
+ if f'T2_P{idx}_Agent_Exp' in training_columns:
87
+ input_data.at[0, f'T2_P{idx}_Agent_Exp'] = stats['Exp']
88
+
89
+ t2_general_wrs.append(stats['General_WR'])
90
+
91
+ # D. Hitung WR Diff
92
+ if 'WR_Diff' in training_columns:
93
+ t1_avg = np.mean(t1_general_wrs)
94
+ t2_avg = np.mean(t2_general_wrs)
95
+ input_data.at[0, 'WR_Diff'] = t1_avg - t2_avg
96
+
97
+ # E. One-Hot Encoding Manual
98
+ # Map
99
+ map_col = f'MAP_{map_name}'
100
+ if map_col in training_columns:
101
+ input_data.at[0, map_col] = 1
102
+
103
+ # Start Side
104
+ if 'T1_StartSide_Defense' in training_columns:
105
+ input_data.at[0, 'T1_StartSide_Defense'] = 1 if t1_side == 'Defense' else 0
106
+ if 'T2_StartSide_Defense' in training_columns:
107
+ input_data.at[0, 'T2_StartSide_Defense'] = 1 if t1_side == 'Attack' else 0
108
+
109
+ # Agent OHE (Slot Based)
110
+ # T1 Agents
111
+ for i, (_, agent) in enumerate(t1_inputs):
112
+ col_name = f'T1_P{i+1}_Agent_{agent}'
113
+ if col_name in training_columns:
114
+ input_data.at[0, col_name] = 1
115
+
116
+ # T2 Agents
117
+ for i, (_, agent) in enumerate(t2_inputs):
118
+ col_name = f'T2_P{i+1}_Agent_{agent}'
119
+ if col_name in training_columns:
120
+ input_data.at[0, col_name] = 1
121
+
122
+ # ==============================================================================
123
+ # --- BAGIAN DEBUGGING YANG DITAMBAHKAN ---
124
+ # Log ini akan muncul di Terminal / Logs Hugging Face, bukan di UI
125
+ print("\n" + "="*40)
126
+ print(f"๐Ÿ” DEBUGGING PREDICTION INPUT")
127
+ print(f"Map: {map_name} | T1 Side: {t1_side}")
128
+ print("-" * 40)
129
+
130
+ print("๐Ÿ”ต TIM 1 STATS:")
131
+ for i, (p, a) in enumerate(t1_inputs):
132
+ # Ambil nilai yang sudah masuk ke input_data
133
+ wr = input_data.at[0, f'T1_P{i+1}_Agent_WR']
134
+ gen_wr = input_data.at[0, f'T1_P{i+1}_General_WR']
135
+ exp = input_data.at[0, f'T1_P{i+1}_Agent_Exp']
136
+
137
+ status = "โœ… FOUND" if wr != 0.5 or gen_wr != 0.5 else "โŒ NOT FOUND (Using Default)"
138
+ print(f" P{i+1}: {p:<15} ({a:<8}) | WR: {wr:.2f} | GenWR: {gen_wr:.2f} | Exp: {exp:<3} -> {status}")
139
+
140
+ print("-" * 40)
141
+ print("๐Ÿ”ด TIM 2 STATS:")
142
+ for i, (p, a) in enumerate(t2_inputs):
143
+ wr = input_data.at[0, f'T2_P{i+1}_Agent_WR']
144
+ gen_wr = input_data.at[0, f'T2_P{i+1}_General_WR']
145
+ exp = input_data.at[0, f'T2_P{i+1}_Agent_Exp']
146
+
147
+ status = "โœ… FOUND" if wr != 0.5 or gen_wr != 0.5 else "โŒ NOT FOUND (Using Default)"
148
+ print(f" P{i+1}: {p:<15} ({a:<8}) | WR: {wr:.2f} | GenWR: {gen_wr:.2f} | Exp: {exp:<3} -> {status}")
149
+
150
+ if 'WR_Diff' in training_columns:
151
+ print("-" * 40)
152
+ print(f"๐Ÿ“Š Final WR_Diff (T1 - T2): {input_data.at[0, 'WR_Diff']:.4f}")
153
+ if input_data.at[0, 'WR_Diff'] > 0:
154
+ print(" -> Tim 1 Secara Statistik Lebih Unggul.")
155
+ elif input_data.at[0, 'WR_Diff'] < 0:
156
+ print(" -> Tim 2 Secara Statistik Lebih Unggul.")
157
+ else:
158
+ print(" -> Kekuatan Statistik Seimbang (Netral).")
159
+
160
+ print("="*40 + "\n")
161
+ # ==============================================================================
162
+
163
+ # --- 3. PREDIKSI ---
164
+ input_data = input_data.astype(float)
165
+
166
+ try:
167
+ prob = model.predict_proba(input_data)[0]
168
+ win_prob_t1 = prob[1]
169
+
170
+ if win_prob_t1 > 0.5:
171
+ winner = "๐Ÿ”ต TEAM 1 WINS"
172
+ confidence = win_prob_t1
173
+ color = "blue"
174
+ else:
175
+ winner = "๐Ÿ”ด TEAM 2 WINS"
176
+ confidence = 1 - win_prob_t1
177
+ color = "red"
178
+
179
+ # Format Output Debugging ke UI juga (Optional)
180
+ debug_msg = "โœ… Data found for players."
181
+ # Cek jika banyak player not found (WR_Diff 0)
182
+ if 'WR_Diff' in input_data and input_data.at[0, 'WR_Diff'] == 0:
183
+ debug_msg = "โš ๏ธ WARNING: Player stats not found (WR_Diff = 0). Check spelling!"
184
+
185
+ return f"{winner}\nConfidence: {confidence:.1%}\n({debug_msg})"
186
+
187
+ except Exception as e:
188
+ return f"Error during prediction: {str(e)}"
189
+
190
+ # --- 3. UI GRADIO ---
191
+ with gr.Blocks(title="Valorant Match Predictor") as demo:
192
+ gr.Markdown("# ๐Ÿ”ฎ Valorant AI Predictor (Skenario 4)")
193
+ gr.Markdown("Prediksi pemenang berdasarkan sejarah performa player dan komposisi agent.")
194
+
195
+ with gr.Row():
196
+ with gr.Column():
197
+ map_input = gr.Dropdown(MAP_LIST, label="Select Map")
198
+ side_input = gr.Radio(["Attack", "Defense"], label="Team 1 Start Side", value="Attack")
199
+
200
+ with gr.Row():
201
+ # Team 1 Inputs
202
+ with gr.Column():
203
+ gr.Markdown("### ๐Ÿ”ต Team 1 Roster")
204
+ t1_p1_n = gr.Textbox(label="P1 Name", placeholder="e.g. f0rsakeN")
205
+ t1_p1_a = gr.Dropdown(AGENT_LIST, label="P1 Agent")
206
+ t1_p2_n = gr.Textbox(label="P2 Name", placeholder="e.g. mindfreak")
207
+ t1_p2_a = gr.Dropdown(AGENT_LIST, label="P2 Agent")
208
+ t1_p3_n = gr.Textbox(label="P3 Name")
209
+ t1_p3_a = gr.Dropdown(AGENT_LIST, label="P3 Agent")
210
+ t1_p4_n = gr.Textbox(label="P4 Name")
211
+ t1_p4_a = gr.Dropdown(AGENT_LIST, label="P4 Agent")
212
+ t1_p5_n = gr.Textbox(label="P5 Name")
213
+ t1_p5_a = gr.Dropdown(AGENT_LIST, label="P5 Agent")
214
+
215
+ # Team 2 Inputs
216
+ with gr.Column():
217
+ gr.Markdown("### ๐Ÿ”ด Team 2 Roster")
218
+ t2_p1_n = gr.Textbox(label="P1 Name", placeholder="e.g. Tenz")
219
+ t2_p1_a = gr.Dropdown(AGENT_LIST, label="P1 Agent")
220
+ t2_p2_n = gr.Textbox(label="P2 Name", placeholder="e.g. Zekken")
221
+ t2_p2_a = gr.Dropdown(AGENT_LIST, label="P2 Agent")
222
+ t2_p3_n = gr.Textbox(label="P3 Name")
223
+ t2_p3_a = gr.Dropdown(AGENT_LIST, label="P3 Agent")
224
+ t2_p4_n = gr.Textbox(label="P4 Name")
225
+ t2_p4_a = gr.Dropdown(AGENT_LIST, label="P4 Agent")
226
+ t2_p5_n = gr.Textbox(label="P5 Name")
227
+ t2_p5_a = gr.Dropdown(AGENT_LIST, label="P5 Agent")
228
+
229
+ btn = gr.Button("๐Ÿš€ PREDICT WINNER", variant="primary")
230
+ output = gr.Label(label="Prediction Result")
231
+
232
+ # Connect Button
233
+ btn.click(
234
+ fn=predict_match,
235
+ inputs=[
236
+ map_input, side_input,
237
+ t1_p1_n, t1_p1_a, t1_p2_n, t1_p2_a, t1_p3_n, t1_p3_a, t1_p4_n, t1_p4_a, t1_p5_n, t1_p5_a,
238
+ t2_p1_n, t2_p1_a, t2_p2_n, t2_p2_a, t2_p3_n, t2_p3_a, t2_p4_n, t2_p4_a, t2_p5_n, t2_p5_a
239
+ ],
240
+ outputs=output
241
+ )
242
+
243
  demo.launch()