# Fonction pour lire et encoder une image en base64 import base64 import os from pathlib import Path import yt_dlp from dotenv import load_dotenv from smolagents import tool, ToolCallingAgent, LiteLLMModel import google.generativeai as genai from ressources_getter import DOWNLOAD_FOLDER, delete_tmp_files, create_download_folder_if_not_exist import mimetypes load_dotenv() @tool def download_video_youtube(url : str)-> str | None: """ Télécharge une vidéo YouTube dans un dossier local. Args: url (str): URL de la vidéo YouTube Returns: file_path (str): Chemin du fichier téléchargé ou None en cas d'erreur """ try: # Créer le dossier de téléchargement s'il n'existe pas create_download_folder_if_not_exist() file_path = f'{DOWNLOAD_FOLDER}/tmp_video.mp4' # Configuration pour yt-dlp ydl_opts = { 'outtmpl': file_path, # Format du nom de fichier 'format': 'best[height<=720]', # Qualité maximale 720p (ajustable) 'noplaylist': True, # Télécharger seulement la vidéo, pas la playlist } # Télécharger la vidéo with yt_dlp.YoutubeDL(ydl_opts) as ydl: print(f"Téléchargement de: {url}") ydl.download([url]) print("Téléchargement terminé avec succès!") return file_path except Exception as e: print(f"Erreur lors du téléchargement: {str(e)}") return None @tool def analyze_media_content(media_path: str, user_prompt: str) -> str: """ Analyse le contenu du média en utilisant Gemini 2.5 Flash via le SDK Google Generative AI. (Ce n'est pas LiteLLM qui fait l'appel multimodal ici, mais le SDK direct pour gérer les parties vidéo). Args: media_path (str): Chemin du fichier local à analyser. user_prompt (str): Requête de l'utilisateur pour guider l'analyse. Returns: str: Résultat de l'analyse du fichier. """ try: with open(media_path, "rb") as file: file_bytes = file.read() encoded_video = base64.b64encode(file_bytes).decode('utf-8') # Déterminer le type MIME du fichier mime_type, encoding = mimetypes.guess_type(media_path) file_part = { "inline_data": { "mime_type": mime_type, "data": encoded_video } } genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) # Assure que l'API Key est configurée model = genai.GenerativeModel('gemini-2.5-flash') # Utilise le modèle directement via le SDK response = model.generate_content([user_prompt, file_part]) return response.text except Exception as e: return f"Erreur lors de l'analyse de la vidéo : {e}" def create_multimedia_agent(): """ Crée un agent multimédia capable de télécharger et d'analyser des vidéos YouTube. Il peut également analyser des fichiers multimédias locaux (vidéos, images, musique). Returns: BasicAgent: Instance de l'agent multimédia. """ gemini_flash_vlm_model = LiteLLMModel(model_id="gemini/gemini-2.5-flash", api_key=os.getenv("GOOGLE_API_KEY")) system_prompt = """Tu es un expert en analyse de vidéo,image et fichier son. Ton rôle est d'analyser les fichiers fournies en utilisant les outils à ta disposition. Lorsque tu reçois un lien d'une vidéo youtube, utilise la fonction 'download_video_youtube' pour télécharger la vidéo. Si tu as un fichier video,image ou son local, utilise la fonction 'analyze_media_content' pour analyser le contenu. Utilise tes outils pour répondre aux questions de l'utilisateur concernant le contenu du fichier. Fait bien attention à supprimer les fichiers temporaires téléchargées après analyse pour économiser de l'espace disque avec l'outil delete_tmp_files. Fournis un réponse concise et sans points ou virgules. """ # Crée l'agent en lui passant l'instance de LiteLLMModel video_agent = ToolCallingAgent( name="multimedia_analysis_agent", model=gemini_flash_vlm_model, # Passe l'instance LiteLLMModel ici tools=[analyze_media_content, download_video_youtube,delete_tmp_files], # Liste des outils que l'agent peut utiliser description=system_prompt, ) return video_agent