from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, LiteLLMModel, load_tool, tool import datetime import requests import pytz import yaml import calendar import re from bs4 import BeautifulSoup from duckduckgo_search import DDGS from tools.final_answer import FinalAnswerTool from Gradio_UI import GradioUI # Below is an example of a tool that does nothing. Amaze us with your creativity ! @tool def my_custom_tool(arg1:str, arg2:int)-> str: #it's import to specify the return type #Keep this format for the description / args / args description but feel free to modify the tool """A tool that does nothing yet Args: arg1: the first argument arg2: the second argument """ return "What magic will you build ?" @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)}" def fetch_page_text(url: str) -> str: """Retrievies only readable text from the webpage""" try: r = requests.get(url, timeout=10) soup = BeautifulSoup(r.text, 'html.parser') paragraphs = soup.find_all('p') return '\n'.join(p.get_text() for p in paragraphs if p.get_text().strip()) except Exception as e: return f"Unable to access page: {e}" def web_search(query: str, max_results: int = 5) -> list: """Simple DuckDuckGo web search via DDGS""" try: with DDGS() as ddgs: return ddgs.text(query, max_results=max_results, backend="lite") except Exception as e: return [{"title": "Search failed", "href": "", "body": str(e)}] @tool def atp_player_tournament(player: str, month: str, year: str) -> str: """ Finds ATP tournaments possibly involving a given player in a specific month and year, returning titles, links, and full text of web pages to let the LLM analyze them directly. Args: player: Player name or surname (e.g., Sinner, Alcaraz). month: Month name (e.g., January, Feb). year: 4-digit year (e.g., 2024, 2025). """ # --- VALIDATION --- try: month_number = list(calendar.month_name).index(month.capitalize()) month_full = calendar.month_name[month_number] except ValueError: return f"Invalid month: '{month}'" if not re.fullmatch(r"\d{4}", year): return f"Invalid year: '{year}'" query = f"{player} ATP tournaments {month_full} {year}" results = web_search(query) if not results or not isinstance(results, list): return f"No results found for {player} in {month_full} {year}.\nQuery used: '{query}'" # --- OUTPUT COMPOSITION --- output = f"Tournaments for {player} in {month_full} {year}:\n\n" for r in results[:3]: title = r.get("title", "No title") url = r.get("href", "") text = fetch_page_text(url) output += f"{title}\n {url}\nContent preview:\n{text[:1500]}...\n\n" web_search = DuckDuckGoSearchTool() final_answer = FinalAnswerTool() # model_id='Qwen/Qwen2.5-Coder-32B-Instruct' # 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=model_id,# it is possible that this model may be overloaded # custom_role_conversions=None, # ) MISTRAL_SMALL_LATEST = "mistral/mistral-small-latest" model = LiteLLMModel( model_id=MISTRAL_SMALL_LATEST, max_tokens=2096, temperature=0.5, custom_role_conversions=None, ) # Import tool from Hub image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True) enabled_tools = [ final_answer, atp_player_tournament, image_generation_tool, web_search ] with open("prompts.yaml", 'r') as stream: prompt_templates = yaml.safe_load(stream) agent = CodeAgent( model=model, tools=enabled_tools, ## 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 ) GradioUI(agent).launch()