import gradio as gr import pandas as pd import numpy as np import onnxruntime as ort import sys from pathlib import Path sys.path.append("rd2l_pred") from training_data_prep import list_format, modification, league_money, df_gen from feature_engineering import heroes, hero_information def prepare_single_player_data(user_id, mmr, comf_1, comf_2, comf_3, comf_4, comf_5): """Creates a draft sheet format DataFrame for a single player""" # Create player data in the format expected by the original pipeline player_data = { 'Discord ID': ['N/A'], # Placeholder for Discord ID 'Dotabuff Link': [user_id], 'MMR': [mmr], 'Comfort (Pos 1)': [comf_1], 'Comfort (Pos 2)': [comf_2], 'Comfort (Pos 3)': [comf_3], 'Comfort (Pos 4)': [comf_4], 'Comfort (Pos 5)': [comf_5], 'Player statement': ['N/A'] # Placeholder for player statement } return pd.DataFrame(player_data) def prepare_mock_captains(): """Creates a minimal captains DataFrame for the league money calculation""" captains_data = { 'Name': ['Mock Captain'], 'Dotabuff': ['N/A'], 'MMR': [3000], "Buck's Bucks": [100], 'Crub Cents': [100], 'Remaining': [100] } return pd.DataFrame(captains_data) def predict_cost(user_id, mmr, comf_1, comf_2, comf_3, comf_4, comf_5): """Main prediction function for Gradio interface""" try: # Create a single-player draft sheet draft_df = prepare_single_player_data(user_id, mmr, comf_1, comf_2, comf_3, comf_4, comf_5) captains_df = prepare_mock_captains() # Use the original pipeline functions money = league_money(captains_df, 'prediction') prepped_data = df_gen(draft_df, money, 'prediction') # Load and use the model model_path = Path("model/rd2l_forest.onnx") session = ort.InferenceSession(str(model_path)) # Get hero information using the original feature engineering try: player_id = modification(user_id) # Use the original modification function hero_stats = hero_information(player_id) # Add hero stats to prepped data for col, value in hero_stats.items(): prepped_data[col] = value except Exception as e: print(f"Warning - Error fetching hero data: {str(e)}") # Make prediction input_name = session.get_inputs()[0].name prediction = session.run(None, {input_name: prepped_data.values.astype(np.float32)})[0] predicted_cost = round(float(prediction[0]), 2) return f"""Predicted Cost: {predicted_cost} Player Details: - MMR: {mmr} - Position Comfort: * Pos 1: {comf_1} * Pos 2: {comf_2} * Pos 3: {comf_3} * Pos 4: {comf_4} * Pos 5: {comf_5} Note: This prediction is based on historical data and player statistics from OpenDota.""" except Exception as e: return f"Error in prediction pipeline: {str(e)}\n\nDebug info:\n{type(e).__name__}: {str(e)}" # Create Gradio interface demo = gr.Interface( fn=predict_cost, inputs=[ gr.Textbox(label="Player ID or Link to OpenDota/Dotabuff", placeholder="Enter player ID or full profile URL"), gr.Number(label="MMR", value=3000), gr.Slider(1, 5, value=3, step=1, label="Comfort (Pos 1)"), gr.Slider(1, 5, value=3, step=1, label="Comfort (Pos 2)"), gr.Slider(1, 5, value=3, step=1, label="Comfort (Pos 3)"), gr.Slider(1, 5, value=3, step=1, label="Comfort (Pos 4)"), gr.Slider(1, 5, value=3, step=1, label="Comfort (Pos 5)") ], examples=[ ["https://www.dotabuff.com/players/188649776", 6812, 5, 5, 4, 2, 1] ], outputs=gr.Textbox(label="Prediction Results"), title="RD2L Player Cost Predictor", description="""This tool predicts the auction cost for RD2L players based on their MMR, position comfort levels, and historical performance data from OpenDota. Enter a player's OpenDota ID or profile URL along with their current stats to get a predicted cost.""", article="""### How it works - The predictor uses machine learning trained on historical RD2L draft data - Player statistics are fetched from OpenDota API - Position comfort levels range from 1 (least comfortable) to 5 (most comfortable) - Predictions are based on both current stats and historical performance ### Notes - MMR should be the player's current solo MMR - Position comfort should reflect actual role experience - Predictions are estimates and may vary from actual draft results""" ) if __name__ == "__main__": demo.launch()