llm_lab/agents/analyse_image.py
2025-03-26 15:02:58 +01:00

94 lines
3.6 KiB
Python

import os
import json
from typing import Dict, List, Any, Optional
from datetime import datetime
from agents.base_agent import Agent
from core.factory import LLMFactory
class AgentAnalyseImage(Agent):
"""
Agent pour analyser des images avec LlamaVision
"""
def __init__(self, nom: str = "AgentAnalyseImage"):
super().__init__(nom)
self.llm = LLMFactory.create("llamavision")
self.questions_standard = [
"Décris en détail ce que tu vois sur cette image.",
"Quels sont les éléments principaux visibles sur cette image?",
"Y a-t-il du texte visible sur cette image? Si oui, peux-tu le transcrire?",
"Quelle est l'ambiance générale de cette image?"
]
def executer(self, image_path: str, json_data: Optional[Dict[str, Any]] = None,
question: Optional[str] = None) -> Dict[str, Any]:
"""
Analyse une image avec Llama Vision
Args:
image_path: Chemin vers l'image à analyser
json_data: Données JSON optionnelles associées à l'image
question: Question à poser au modèle (si None, utilise les questions standard)
Returns:
Résultats de l'analyse sous forme de dictionnaire
"""
# Vérification de l'existence de l'image
if not os.path.exists(image_path):
resultat = {"erreur": f"L'image {image_path} n'existe pas"}
self.ajouter_historique("analyse_image_erreur", image_path, resultat)
return resultat
# Préparation de la liste des questions à poser
questions_a_poser = [question] if question else self.questions_standard
# Exécution de l'analyse pour chaque question
resultats = {
"image": image_path,
"timestamp": datetime.now().isoformat(),
"analyses": []
}
# Encodage de l'image en base64 pour l'API
with open(image_path, "rb") as image_file:
image_data = image_file.read()
# Traitement pour chaque question
for q in questions_a_poser:
try:
# Appel du modèle via la factory
reponse = self.llm.generate(q, images=[image_data])
# Ajout du résultat
resultats["analyses"].append({
"question": q,
"reponse": reponse
})
# Ajout à l'historique
self.ajouter_historique("analyse_image", q, reponse[:200] + "...")
except Exception as e:
resultats["analyses"].append({
"question": q,
"erreur": str(e)
})
self.ajouter_historique("analyse_image_erreur", q, str(e))
return resultats
def sauvegarder_resultats(self, chemin_fichier: str, resultats: Dict[str, Any]) -> bool:
"""
Sauvegarde les résultats d'analyse dans un fichier JSON
"""
try:
# Création du dossier parent si nécessaire
os.makedirs(os.path.dirname(os.path.abspath(chemin_fichier)), exist_ok=True)
with open(chemin_fichier, 'w', encoding='utf-8') as f:
json.dump(resultats, f, ensure_ascii=False, indent=2)
self.ajouter_historique("sauvegarder_resultats", chemin_fichier, "Résultats sauvegardés")
return True
except Exception as e:
self.ajouter_historique("sauvegarder_resultats_erreur", chemin_fichier, str(e))
return False