Spaces:
Sleeping
Sleeping
| 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 ! | |
| 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)}" | |
| 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() |