Spaces:
Sleeping
Sleeping
File size: 5,067 Bytes
15b55f0 2a0c42f 15b55f0 2a0c42f 15b55f0 1edc9d5 15b55f0 2a0c42f 1edc9d5 15b55f0 |
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 150 151 152 153 154 155 156 157 158 159 160 |
from langchain.tools import tool
import requests
from bs4 import BeautifulSoup
from typing import Optional
import re
import sys
from constants import TAVILY_KEY
import os
from tavily import TavilyClient
# Initialize Tavily client (set your API key as an environment variable)
tavily = TavilyClient(TAVILY_KEY)
@tool
def get_npb_player_info(player_name: str) -> str:
"""
Finds a Nippon Professional Baseball (NPB) player's jersey number and team name using Tavily search.
Parameters:
- player_name (str): Full name of the player (e.g., "Taisho Tamai")
Returns:
- str: The player's jersey number and team name, or an error message if not found.
"""
return get_npb_player_info_(player_name)
def get_npb_player_info_(player_name: str) -> str:
try:
# Search using Tavily for the NPB English profile page
query = f"site:npb.jp/bis/eng/players {player_name}"
search_results = tavily.search(query=query, include_answer=False)
# Find first relevant link to the NPB player profile
player_url = next(
(result["url"] for result in search_results["results"]
if re.match(r"https://npb\.jp/bis/eng/players/\d+\.html", result["url"])),
None
)
if not player_url:
return f"No player page found for '{player_name}'."
# Fetch the player page and extract number and team
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(player_url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
number = soup.find("li", {"id": "pc_v_no"})
team = soup.find("li", {"id": "pc_v_team"})
if number and team:
return f"{player_name} - #{number.text.strip()} - Team: {team.text.strip()}"
else:
return f"Player page found, but info not parsed properly: {player_url}"
except Exception as e:
return f"Error fetching info for '{player_name}': {e}"
#if __name__ == "__main__":
# print(get_npb_player_info("Taisho Tamai"))
@tool
def get_team_roster(team_name: str, year: int) -> list[dict]:
"""
Returns the team roster for a given NPB team and season.
Each player is represented as a dict with:
- name: "Last, First"
- number: jersey number (str or None if not found)
- role (pitcher, etc.)
Parameters:
- team_name (str): e.g., "Yomiuri Giants"
- year (int): e.g., 2023
Returns:
- List of dicts representing players.
"""
roster = []
player_names = get_team_players_by_season(team_name, year)
for player_name in player_names:
# Get player info
info = get_npb_player_info_(player_name)
# Try to extract number from the response
match = re.search(r"#(\d+)", info)
number = match.group(1) if match else None
roster.append({
"name": player_name,
"number": number,
"role": "Pitcher" # Static for now
})
return roster
def get_team_players_by_season(team_name: str, year: int) -> list[str]:
"""
Given a team name and year, returns the list of player names for that NPB season.
Parameters:
- team_name (str): Team name (e.g., "Yomiuri Giants")
- year (int): Season year (e.g., 2023)
Returns:
- List of player names (strings) in the format last name, first name
"""
try:
query = f"site:npb.jp/bis/eng/{year}/stats {team_name}"
search_results = tavily.search(query=query, include_answer=False)
# Find the correct stats page URL for that year
stats_url = next(
(result["url"] for result in search_results["results"]
if re.match(rf"https://npb\.jp/bis/eng/{year}/stats/.+\.html", result["url"])),
None
)
if not stats_url:
print(f"No stats page found for {team_name} in {year}.")
return []
print(stats_url)
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(stats_url, headers=headers)
safe_text = response.text.encode(sys.stdout.encoding, errors='replace').decode(sys.stdout.encoding)
response = requests.get(stats_url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
# Find all <td class="stplayer"> elements
player_tds = soup.find_all("td", class_="stplayer")
player_names = []
for td in player_tds:
player_name = td.get_text(strip=True)
player_names.append(player_name)
# Remove duplicates preserving order
player_names = list(dict.fromkeys(player_names))
return player_names
except Exception as e:
print(f"Error fetching players for {team_name} {year}: {e}")
return []
if __name__ == "__main__":
team = "Hokkaido Nippon-Ham Fighters"
season_year = 2023
players = get_team_players_by_season(team, season_year)
print(f"Players for {team} in {season_year} season:\n", players)
|