yagneshmb8's picture
Updating docstring to match the format of smolagents
eb9fb54 verified
Raw
History Blame Contribute Delete
5.57 kB
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from datetime import timedelta
import math
from typing import Dict
from Gradio_UI import GradioUI
# Below is an example of a tool that does nothing. Amaze us with your creativity !
@tool
def estimate_sun_times(date: datetime, lat: float, lon: float) -> Dict[str, str]:
"""
Estimate approximate sunrise and sunset times in UTC for a given date and location (no external API).
This tool uses a simplified version of the NOAA solar position algorithm to compute sun times
with acceptable accuracy (~1–5 minutes). It's fully offline and suitable for agent environments.
Args:
date: The date for which to compute sunrise and sunset. Time part is ignored.
lat: Latitude in decimal degrees. North is positive, south is negative.
lon: Longitude in decimal degrees. East is positive, west is negative.
Returns:
Dict[str, str]: A dictionary containing, "sunrise_utc": Sunrise time in UTC (ISO format: "HH:MM"), "sunset_utc": Sunset time in UTC (ISO format: "HH:MM"), "sunrise_iso": Full ISO 8601 datetime string (UTC), "sunset_iso": Full ISO 8601 datetime string (UTC)
"""
def calculate_julian_day(dt: datetime) -> float:
year, month, day = dt.year, dt.month, dt.day
if month <= 2:
year -= 1
month += 12
A = math.floor(year / 100)
B = 2 - A + math.floor(A / 4)
jd = math.floor(365.25 * (year + 4716)) + \
math.floor(30.6001 * (month + 1)) + \
day + B - 1524.5
return jd
def sun_mean_anomaly(t: float) -> float:
return (357.52911 + t * (35999.05029 - 0.0001537 * t)) % 360
def sun_equation_of_center(m: float) -> float:
m_rad = math.radians(m)
return (1.914602 - 0.004817 - 0.000014) * math.sin(m_rad) + \
(0.019993 - 0.000101) * math.sin(2 * m_rad) + \
0.000289 * math.sin(3 * m_rad)
def ecliptic_longitude(m: float, c: float) -> float:
return (m + c + 180 + 102.9372) % 360
def declination_of_sun(l: float) -> float:
return math.degrees(math.asin(math.sin(math.radians(l)) * math.sin(math.radians(23.44))))
def solar_transit(jd: float, m: float, l: float) -> float:
return jd + (0.0053 * math.sin(math.radians(m))) - (0.0069 * math.sin(math.radians(2 * l)))
def hour_angle(lat: float, decl: float) -> float:
lat_rad = math.radians(lat)
decl_rad = math.radians(decl)
ha = math.acos((math.cos(math.radians(90.833)) /
(math.cos(lat_rad) * math.cos(decl_rad))) -
math.tan(lat_rad) * math.tan(decl_rad))
return math.degrees(ha)
def jd_to_datetime(jd: float) -> datetime:
days = jd - 2440587.5
seconds = days * 86400.0
return datetime.utcfromtimestamp(seconds)
# Step 1: Julian day
jd = calculate_julian_day(date)
lng_hour = lon / 15
# Step 2: Approximate solar noon Julian century
t = (jd - 2451545.0 + lng_hour / 24) / 36525
m = sun_mean_anomaly(t)
c = sun_equation_of_center(m)
l = ecliptic_longitude(m, c)
dec = declination_of_sun(l)
ha = hour_angle(lat, dec)
delta = ha / 360
# Step 3: Solar transit and sunrise/sunset times
solar_transit_jd = solar_transit(jd, m, l)
sunrise_jd = solar_transit_jd - delta
sunset_jd = solar_transit_jd + delta
sunrise_dt = jd_to_datetime(sunrise_jd)
sunset_dt = jd_to_datetime(sunset_jd)
return {
"sunrise_utc": sunrise_dt.strftime("%H:%M"),
"sunset_utc": sunset_dt.strftime("%H:%M"),
"sunrise_iso": sunrise_dt.strftime("%Y-%m-%dT%H:%M:%SZ"),
"sunset_iso": sunset_dt.strftime("%Y-%m-%dT%H:%M:%SZ")
}
@tool
def get_current_time_in_timezone(timezone: str) -> str:
"""A tool that fetches the current local time in a specified timezone.
Args:
timezone: A string representing a valid timezone (e.g., 'America/New_York').
"""
try:
# Create timezone object
tz = pytz.timezone(timezone)
# Get current time in that 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()
# 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'
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',# it is possible that this model may be overloaded
custom_role_conversions=None,
)
# Import tool from Hub
# image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
with open("prompts.yaml", 'r') as stream:
prompt_templates = yaml.safe_load(stream)
agent = CodeAgent(
model=model,
tools=[final_answer, estimate_sun_times, get_current_time_in_timezone], ## add your tools here (don't remove final answer)
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates,
add_base_tools=True
)
GradioUI(agent).launch()