Alptraum's picture
Update app.py
d1e8586 verified
Raw
History Blame Contribute Delete
6.4 kB
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()