from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool import datetime import requests import pytz import yaml from tools.final_answer import FinalAnswerTool import xml.etree.ElementTree as ET import os from Gradio_UI import GradioUI HF_SECRET = os.getenv("HF_TOKEN") # Below is an example of a tool that does nothing. Amaze us with your creativity ! @tool def paper_finder(topics:list, max_paper: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 """ Searches arxiv.org for the most recently updated research papers on specified topics. Args: topics: A list of topic keywords or phrases (e.g., ['Computer Vision', 'NLP']) to guide the search. max_paper: The maximum number of papers to retrieve for each topic. """ results = [] for topic in topics: # request to the arxiv page query = requests.utils.quote(topic) url = f"http://export.arxiv.org/api/query?search_query=all:{query}&sortBy=lastUpdatedDate&sortOrder=descending&max_results={max_paper}" try: response = requests.get(url) response.raise_for_status() # parsing element tree as text root = ET.fromstring(response.text) # extract paper information papers = [] # arxiv returns responses in Atom 1.0 format "https://info.arxiv.org/help/api/user-manual.html#32-the-api-response" namespace = {"atom": 'http://www.w3.org/2005/Atom'} # list of the returned Atom results for entry in root.findall('atom:entry', namespace): title = entry.find('atom:title', namespace).text.strip() summary = entry.find('atom:summary', namespace).text.strip() published = entry.find('atom:published', namespace).text.strip()[:10] link = entry.find('./atom:link[@title="pdf"]', namespace) if link is not None: pdf_url = link.get('href') else: pdf_url = "No PDF link available" # Authors of the paper authors = [] for author in entry.findall('atom:author/atom:name', namespace): authors.append(author.text.strip()) # Adding paper papers.append({ "title": title, "authors": ", ".join(authors[:3]) + ("..." if len(authors) > 3 else ""), "published": published, "summary": summary[:150] + "..." if len(summary) > 150 else summary, "pdf_url": pdf_url }) # Format the results for this topic topic_results = f"\n## Latest papers on {topic} ({len(papers)})\n\n" for i, paper in enumerate(papers, 1): topic_results += f"{i}. {paper['title']}\n" topic_results += f" Authors: {paper['authors']}\n" topic_results += f" Published: {paper['published']}\n" topic_results += f" Summary: {paper['summary']}\n" topic_results += f" PDF: {paper['pdf_url']}\n\n" results.append(topic_results) except Exception as e: results.append(f"\n## Error searching for {topic}: {str(e)}\n") return "\n".join(results) if results else "No papers found for the given topics. Try different search terms." @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, paper_finder, 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 ) GradioUI(agent).launch()