File size: 4,952 Bytes
9b5b26a
 
 
c19d193
4c92eeb
ef06b26
bdfba38
ef06b26
6aae614
9b5b26a
 
ef06b26
 
8f16b96
ef06b26
9b5b26a
ef06b26
9b5b26a
ef06b26
bdfba38
9b5b26a
bdfba38
 
9b5b26a
bdfba38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ef06b26
 
bdfba38
 
 
 
 
 
ef06b26
 
bdfba38
 
 
ef06b26
bdfba38
ef06b26
bdfba38
 
 
ef06b26
bdfba38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ef06b26
bdfba38
 
ef06b26
 
bdfba38
 
 
 
 
 
 
 
 
 
ef06b26
ae7a494
ef06b26
4c92eeb
ae7a494
ef06b26
e121372
8f16b96
 
 
 
13d500a
8c01ffb
ef06b26
 
861422e
4c92eeb
ef06b26
8c01ffb
8fe992b
bdfba38
8c01ffb
 
 
861422e
8fe992b
 
ef06b26
 
8f16b96
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import datetime
import requests
import pytz
import yaml
import os
from typing import Dict, Union
from bs4 import BeautifulSoup
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI

# Load the API key from Hugging Face Spaces secrets (environment variable)
API_KEY = os.getenv("CRICKETDATA_API_KEY", "default_key_if_not_found")
HF_TOKEN = os.getenv("HF_TOKEN", "default_hf_token_if_not_found")
BASE_URL = "https://api.cricketdata.org/v1"

# Custom Tool: Analyze Cricketer Form
@tool
def analyze_cricketer_form(player_name: str, role: str) -> str:
    """Analyzes the recent form of a cricketer based on their role.
    Args:
        player_name: The name of the cricketer.
        role: The role of the player (batter, bowler, wicketkeeper, fielder).
    """
    try:
        # Fetch player ID from API
        player_id = get_player_id(player_name)
        if not player_id:
            return f"Player '{player_name}' not found."
        
        # Fetch basic player details
        player_details = get_player_details(player_id)
        
        # Scrape detailed stats
        detailed_stats = scrape_cricketer_stats(player_name, role)
        
        # Generate form analysis
        return format_analysis(player_name, role, player_details, detailed_stats)
    
    except Exception as e:
        return f"Error analyzing cricketer's form: {str(e)}"


def get_player_id(player_name: str):
    response = requests.get(f"{BASE_URL}/players?name={player_name}", headers={"Authorization": f"Bearer {API_KEY}"})
    if response.status_code == 200:
        data = response.json()
        return data.get("id")
    return None


def get_player_details(player_id: str):
    response = requests.get(f"{BASE_URL}/player/{player_id}", headers={"Authorization": f"Bearer {API_KEY}"})
    if response.status_code == 200:
        return response.json()
    return {}


def scrape_cricketer_stats(player_name: str, role: str):
    """Scrapes recent performance stats from an online cricket stats website."""
    try:
        search_url = f"https://stats.espncricinfo.com/ci/engine/player/{player_name.replace(' ', '_')}.html"
        headers = {"User-Agent": "Mozilla/5.0"}
        response = requests.get(search_url, headers=headers)
        
        if response.status_code != 200:
            return {"error": "Failed to fetch data from ESPN Cricinfo"}
        
        soup = BeautifulSoup(response.text, "html.parser")
        
        if role.lower() == "batter":
            stats = {
                "last_50_scores": extract_batting_scores(soup),
                "batting_avg": extract_batting_average(soup),
                "strike_rate": extract_strike_rate(soup),
            }
        elif role.lower() == "bowler":
            stats = {
                "last_50_wickets": extract_wickets(soup),
                "bowling_economy": extract_bowling_economy(soup),
                "bowling_speed": extract_bowling_speed(soup),
            }
        elif role.lower() == "wicketkeeper":
            stats = {
                "catches": extract_catches(soup),
                "stumpings": extract_stumpings(soup),
                "missed_stumpings": extract_missed_stumpings(soup),
            }
        elif role.lower() == "fielder":
            stats = {
                "catches": extract_fielder_catches(soup),
                "direct_runouts": extract_direct_runouts(soup),
            }
        else:
            stats = {"error": "Invalid role specified"}
        
        return stats
    
    except Exception as e:
        return {"error": f"Error scraping data: {str(e)}"}


def format_analysis(player_name, role, player_details, detailed_stats):
    return f"""
    Cricketer: {player_name}
    Role: {role}
    Country: {player_details.get('country', 'Unknown')}
    Batting Style: {player_details.get('battingStyle', 'Unknown')}
    Bowling Style: {player_details.get('bowlingStyle', 'Unknown')}
    
    Recent Performance:
    {detailed_stats}
    """

# Initialize tools
final_answer = FinalAnswerTool()

# Model setup
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud',
custom_role_conversions=None,
)

# Load prompt templates
with open("prompts.yaml", 'r') as stream:
    prompt_templates = yaml.safe_load(stream)

# Initialize the agent
agent = CodeAgent(
    model=model,
    tools=[final_answer, analyze_cricketer_form],
    max_steps=6,
    verbosity_level=1,
    grammar=None,
    prompt_templates=prompt_templates
)

# Launch the Gradio UI
if __name__ == "__main__":
    GradioUI(agent).launch()



# If the agent does not answer, the model is overloaded, please use another model or the following Hugging Face Endpoint that also contains qwen2.5 coder:
# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud'