Spaces:
Sleeping
Sleeping
from smolagents import CodeAgent, HfApiModel, DuckDuckGoSearchTool, VisitWebpageTool, load_tool, tool | |
import datetime | |
import requests | |
import pytz | |
import yaml | |
from tools.final_answer import FinalAnswerTool | |
from Gradio_UI import GradioUI | |
import xml.etree.ElementTree as ET | |
def pull_ecb_eur_usd_rate(requested_date: str = None) -> str: | |
""" | |
A tool that fetches the EUR-to-USD exchange rate from the European Central Bank for today. | |
Args: | |
requested_date: (Optional) A string in "YYYY-MM-DD" format. If provided and it is not equal to today's date, | |
the function returns an error. | |
Returns: | |
A string indicating the exchange rate as of the ECB data's date, or an error message if: | |
- the requested date is not today, or | |
- the ECB data is not updated for today. | |
""" | |
try: | |
# Determine today's date in the ECB's (Central European) timezone. | |
brussels_tz = pytz.timezone("Europe/Brussels") | |
today = datetime.datetime.now(brussels_tz).date() | |
# If a date is provided, check that it matches today's date. | |
if requested_date: | |
try: | |
req_date = datetime.datetime.strptime(requested_date, "%Y-%m-%d").date() | |
except Exception: | |
return f"Error: The provided date '{requested_date}' is not in the correct format (YYYY-MM-DD)." | |
if req_date != today: | |
return f"Error: The requested date {req_date} is not available. Only today's data ({today}) is supported." | |
# Fetch the ECB daily XML data. | |
url = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml" | |
response = requests.get(url) | |
if response.status_code != 200: | |
return f"Error: Received status code {response.status_code} from ECB." | |
xml_content = response.content | |
tree = ET.ElementTree(ET.fromstring(xml_content)) | |
root = tree.getroot() | |
# Define namespaces used in the ECB XML. | |
ns = { | |
'gesmes': 'http://www.gesmes.org/xml/2002-08-01', | |
'def': 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref' | |
} | |
# Locate the Cube element with the time attribute. | |
time_cube = root.find('.//def:Cube/def:Cube', ns) | |
if time_cube is not None: | |
data_date = time_cube.get('time') | |
# If ECB's data date is not today, return an error. | |
if data_date != str(today): | |
return f"Error: ECB data is not updated for today. Latest available data is for {data_date}." | |
# Find the Cube element for USD. | |
usd_cube = time_cube.find("def:Cube[@currency='USD']", ns) | |
if usd_cube is not None: | |
rate = usd_cube.get('rate') | |
return f"As of {data_date}, EUR 1 is equivalent to {rate} USD." | |
return "Error: USD rate not found in ECB data." | |
except Exception as e: | |
return f"Error fetching ECB rate: {str(e)}" | |
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'). | |
Returns: | |
A string with the current local time in the specified timezone. | |
""" | |
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)}" | |
# Tools for final answer and additional capabilities. | |
final_answer = FinalAnswerTool() | |
search_result = DuckDuckGoSearchTool() | |
visit_webpage = VisitWebpageTool() | |
# Initialize the model. | |
model = HfApiModel( | |
max_tokens=2096, | |
temperature=0.5, | |
model_id='Qwen/Qwen2.5-Coder-32B-Instruct', | |
custom_role_conversions=None, | |
) | |
# Import image generation tool from Hub (if needed). | |
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True) | |
# Load prompt templates from the YAML file. | |
with open("prompts.yaml", 'r') as stream: | |
prompt_templates = yaml.safe_load(stream) | |
# Create the CodeAgent and register the tools (including the updated ECB rate tool). | |
agent = CodeAgent( | |
model=model, | |
tools=[final_answer, get_current_time_in_timezone, pull_ecb_eur_usd_rate], | |
max_steps=10, | |
verbosity_level=1, | |
grammar=None, | |
planning_interval=None, | |
name=None, | |
description=None, | |
prompt_templates=prompt_templates | |
) | |
# Launch the Gradio UI for interacting with the agent. | |
GradioUI(agent).launch() | |