Spaces:
Sleeping
Sleeping
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'
|