Final_Assignment_Template / agent_multimedia.py
Nicolas Fremondiere
Use multiAgent instead of tools
067e6fe
Raw
History Blame Contribute Delete
4.39 kB
# 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