from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool import datetime import json import requests import xml.etree.ElementTree as ET import time import pytz import yaml from tools.final_answer import FinalAnswerTool from Gradio_UI import GradioUI @tool def get_boardgame_from_bgg(name: str) -> str: """A tool to get boardgame details form Boardgamegeek community site using the BGG xml api Args: name: boardgame name Returns name, id, rank in BGG, description and link to selected boardgame """ # search for game id search_url = f"https://boardgamegeek.com/xmlapi2/search?query={name}&type=boardgame" response = requests.get(search_url) if response.status_code != 200: return '{"error": "BoardGameGeek could not be reached"})' root = ET.fromstring(response.content) items = root.findall(".//item") if not items: return '{"error": "game not found"}' # We asume first entry as correct result, human interaction to select entry in future version game_id = items[0].get('id') # giving bgg api some time to rest time.sleep(1) # get game detail details_url = f"https://boardgamegeek.com/xmlapi2/thing?id={game_id}&stats=1" response = requests.get(details_url) if response.status_code != 200: return '{"error": "game detail not found"}' root = ET.fromstring(response.content) # obtain basic information name = root.find(".//name[@type='primary']").get('value') description = root.find(".//description").text rank = root.find(".//rank[@name='boardgame']").get('value') return json.dumps({ "name": name, "id": game_id, "description": description[:500] + "..." if description and len(description) > 500 else description, "rank": int(rank), "bgg_url": f"https://boardgamegeek.com/boardgame/{game_id}" }) @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() model = HfApiModel( max_tokens=1048, temperature=0.5, #model_id='Qwen/Qwen2.5-Coder-1.5B-Instruct', #model_id='https://wxknx1kg971u7k1n.us-east-1.aws.endpoints.huggingface.cloud', # it is possible that this model may be overloaded model_id='deepseek-ai/DeepSeek-R1-Distill-Qwen-32B', custom_role_conversions=None, ) # Import tool from Hub image_generation_tool = load_tool("m-ric/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=[get_boardgame_from_bgg, DuckDuckGoSearchTool() , image_generation_tool, final_answer], ## 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()