baibianxiaomage's picture
Update app.py
9b20d4a verified
import os
import datetime
import requests
import pytz
from smolagents import ToolCallingAgent, HfApiModel, tool
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI
DEFAULT_TIMEOUT = 20
def safe_request_json(url: str, *, params=None, headers=None, timeout=DEFAULT_TIMEOUT):
try:
response = requests.get(url, params=params, headers=headers, timeout=timeout)
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout:
raise RuntimeError("The request timed out. Please try again later.")
except requests.exceptions.HTTPError as e:
status_code = getattr(e.response, "status_code", "unknown")
body = ""
try:
body = e.response.text[:300]
except Exception:
pass
raise RuntimeError(f"HTTP {status_code} error. {body}")
except requests.exceptions.RequestException as e:
raise RuntimeError(f"Network request failed: {str(e)}")
except ValueError:
raise RuntimeError("The server returned invalid JSON data.")
@tool
def get_weather(location: str) -> str:
"""Get the current weather for a specified city or region.
Args:
location: A city, region, or country name, such as Beijing, Tokyo, Shanghai, or New York.
"""
try:
url = f"https://wttr.in/{location}"
params = {"format": "j1"}
data = safe_request_json(url, params=params, timeout=20)
current_list = data.get("current_condition", [])
if not current_list:
return f"Could not find weather data for '{location}'."
current = current_list[0]
temp_c = current.get("temp_C", "Unknown")
feels_like_c = current.get("FeelsLikeC", "Unknown")
humidity = current.get("humidity", "Unknown")
wind_kph = current.get("windspeedKmph", "Unknown")
weather_desc = current.get("weatherDesc", [{}])[0].get("value", "Unknown")
weather_days = data.get("weather", [])
high_c = low_c = "Unknown"
if weather_days:
high_c = weather_days[0].get("maxtempC", "Unknown")
low_c = weather_days[0].get("mintempC", "Unknown")
return (
f"Current weather in {location}:\n"
f"- Condition: {weather_desc}\n"
f"- Temperature: {temp_c}°C\n"
f"- Feels like: {feels_like_c}°C\n"
f"- Humidity: {humidity}%\n"
f"- Wind speed: {wind_kph} km/h\n"
f"- Today's high / low: {high_c}°C / {low_c}°C"
)
except Exception as e:
return f"Error fetching weather for '{location}': {str(e)}"
@tool
def get_nba_games(date: str) -> str:
"""Get NBA game results for a specific date.
Args:
date: A date in YYYY-MM-DD format, for example '2026-03-08'.
"""
api_key = os.getenv("BALLDONTLIE_API_KEY")
if not api_key:
return (
"BALLDONTLIE_API_KEY is not set. Please add your BALLDONTLIE API key "
"as an environment variable or Hugging Face Secret."
)
try:
url = "https://api.balldontlie.io/nba/v1/games"
headers = {"Authorization": api_key}
params = {
"dates[]": date,
"per_page": 100,
}
data = safe_request_json(url, params=params, headers=headers, timeout=20)
games = data.get("data", [])
if not games:
return f"No NBA games found for {date}."
results = [f"NBA games on {date}:"]
for game in games:
home_team = game.get("home_team", {}).get("full_name", "Unknown Home Team")
visitor_team = game.get("visitor_team", {}).get("full_name", "Unknown Visitor Team")
home_score = game.get("home_team_score", 0)
visitor_score = game.get("visitor_team_score", 0)
status = game.get("status", "Unknown")
if isinstance(home_score, int) and isinstance(visitor_score, int):
if home_score > visitor_score:
winner = home_team
elif visitor_score > home_score:
winner = visitor_team
else:
winner = "Tie / Not finished"
else:
winner = "Unknown"
results.append(
f"- {visitor_team} {visitor_score} : {home_score} {home_team} "
f"(Status: {status}, Winner: {winner})"
)
return "\n".join(results)
except Exception as e:
return f"Error fetching NBA games for '{date}': {str(e)}"
@tool
def get_current_time_in_timezone(timezone: str) -> str:
"""Get the current local time in a specified timezone.
Args:
timezone: A valid timezone string, such as Asia/Shanghai or America/New_York.
"""
try:
tz = pytz.timezone(timezone)
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
return f"The current local time in {timezone} is: {local_time}"
except Exception as e:
return f"Error fetching time for timezone '{timezone}': {str(e)}"
final_answer = FinalAnswerTool()
model = HfApiModel(
max_tokens=2048,
temperature=0.2,
model_id="Qwen/Qwen2.5-Coder-32B-Instruct",
custom_role_conversions=None,
)
agent = ToolCallingAgent(
model=model,
tools=[
final_answer,
get_weather,
get_nba_games,
get_current_time_in_timezone,
],
max_steps=4,
planning_interval=None,
name="Chen_Qiang",
description="An agent for weather, NBA results, and timezone queries.",
)
GradioUI(agent).launch()