from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool import datetime import requests import pytz import yaml 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 get_movie_recommendation(mood: str, location: str) -> str: """A tool that recommends movies based on user's mood and local weather conditions. Args: mood: The user's current mood (e.g., 'happy', 'sad', 'excited', 'relaxed', 'nostalgic') location: The user's location to check weather (e.g., 'London', 'New York') """ # Using a class to maintain state of previously recommended movies if not hasattr(get_movie_recommendation, '_previous_recommendations'): get_movie_recommendation._previous_recommendations = set() try: # Get weather data using wttr.in (free weather API) weather_url = f"https://wttr.in/{location}?format=%C" weather_response = requests.get(weather_url) if weather_response.status_code != 200: return f"Error: Could not fetch weather for {location}" weather_condition = weather_response.text.strip().lower() # Define mood and weather based movie genre mappings mood_genres = { "happy": ["Comedy", "Musical", "Adventure"], "sad": ["Drama", "Romance", "Independent"], "excited": ["Action", "Thriller", "Sci-Fi"], "relaxed": ["Documentary", "Animation", "Family"], "nostalgic": ["Classic", "Drama", "Romance"] } weather_genres = { "clear": ["Adventure", "Comedy", "Action"], "rain": ["Drama", "Noir", "Mystery"], "clouds": ["Sci-Fi", "Fantasy", "Mystery"], "snow": ["Romance", "Family", "Fantasy"], "thunderstorm": ["Horror", "Thriller", "Mystery"] } # Get recommended genres based on mood and weather selected_genres = mood_genres.get(mood.lower(), ["Drama"]) for weather_key in weather_genres: if weather_key in weather_condition: selected_genres.extend(weather_genres[weather_key]) break # Use OMDB API to fetch movie recommendations omdb_api_key = "59341a1e" # Free tier API key primary_genre = selected_genres[0] # Add page parameter for pagination (1-100) import random page = random.randint(1, 10) # Randomly select a page movie_url = f"http://www.omdbapi.com/?apikey={omdb_api_key}&s={primary_genre}&type=movie&page={page}" movie_response = requests.get(movie_url) if movie_response.status_code != 200: return f"Error: Could not fetch movie recommendation" movie_data = movie_response.json() if movie_data.get("Response") == "False": return f"No movies found for your current mood and weather" # Get all movies from the search result movies = movie_data.get("Search", []) if not movies: return f"No movies available for the current criteria" # Filter out previously recommended movies new_movies = [movie for movie in movies if movie['imdbID'] not in get_movie_recommendation._previous_recommendations] # If all movies on this page have been recommended, clear history and use all movies if not new_movies: get_movie_recommendation._previous_recommendations.clear() new_movies = movies # Randomly select a movie from the available ones selected_movie = random.choice(new_movies) # Add the selected movie to previous recommendations get_movie_recommendation._previous_recommendations.add(selected_movie['imdbID']) # Get detailed information for the selected movie detail_url = f"http://www.omdbapi.com/?apikey={omdb_api_key}&i={selected_movie['imdbID']}" detail_response = requests.get(detail_url) movie_details = detail_response.json() # Format the recommendation response recommendation = ( f"Based on your mood ({mood}) and the weather in {location} ({weather_condition}), " f"I recommend watching:\n\n" f"Title: {movie_details['Title']}\n" f"Year: {movie_details['Year']}\n" f"Genre: {movie_details['Genre']}\n" f"Plot: {movie_details['Plot']}\n" f"IMDb Rating: {movie_details.get('imdbRating', 'N/A')}" ) return recommendation except Exception as e: return f"Error getting movie recommendation: {str(e)}" @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, get_current_time_in_timezone, image_generation_tool,get_movie_recommendation], ## 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()