#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script d'exemple pour tester LlamaVision et les agents d'analyse d'images """ import os import json import argparse from datetime import datetime from llm_classes import LlamaVision, AgentAnalyseImage, AgentAnalyseJSON, AgentQuestionReponse def create_output_dir(): """Crée un répertoire pour les sorties basé sur la date/heure""" timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") output_dir = f"output_vision_{timestamp}" os.makedirs(output_dir, exist_ok=True) return output_dir def analyse_directe(image_path, output_dir): """Analyse directe avec LlamaVision sans passer par un agent""" print(f"\n=== Analyse directe de l'image {os.path.basename(image_path)} ===") # Création d'une instance LlamaVision vision = LlamaVision() vision.prompt_system = "Tu es un assistant d'analyse d'images très précis. Décris l'image en détail." # Chargement de l'image if not vision.set_image(image_path): print(f"Erreur: Impossible de charger l'image {image_path}") return # Analyse de l'image question = "Décris en détail cette image. Qu'est-ce que tu y vois? Y a-t-il du texte visible?" print(f"Question: {question}") reponse = vision.Interroger(question) print("\nRéponse:") print(reponse) # Sauvegarde du résultat output_file = os.path.join(output_dir, "resultat_direct.json") vision.sauvegarder_resultats(output_file) print(f"\nRésultat sauvegardé dans: {output_file}") def workflow_complet(image_path, json_path=None, output_dir=None): """ Workflow complet d'analyse d'image et traitement des données Args: image_path: Chemin vers l'image à analyser json_path: Chemin vers un fichier JSON optionnel contenant des données additionnelles output_dir: Répertoire de sortie (si None, en crée un nouveau) """ if output_dir is None: output_dir = create_output_dir() print(f"\n=== Workflow complet pour l'image {os.path.basename(image_path)} ===") print(f"Résultats sauvegardés dans: {output_dir}") # Étape 1: Chargement des données JSON existantes si disponibles json_data = None if json_path and os.path.exists(json_path): try: with open(json_path, 'r', encoding='utf-8') as f: json_data = json.load(f) print(f"Données JSON chargées depuis: {json_path}") except Exception as e: print(f"Erreur lors du chargement du JSON: {e}") # Étape 2: Analyse de l'image avec l'agent print("\n--- Étape 1: Analyse de l'image ---") agent_image = AgentAnalyseImage("Agent Vision") # Configuration des paramètres agent_image.ajuster_parametres(temperature=0.7, top_p=0.9, num_ctx=4096) # Analyse de l'image resultats_analyse = agent_image.executer(image_path, json_data) # Sauvegarde des résultats intermédiaires output_image = os.path.join(output_dir, "analyse_image.json") agent_image.sauvegarder_resultats(output_image, resultats_analyse) print(f"Analyse d'image sauvegardée dans: {output_image}") # Étape 3: Analyse des données JSON avec l'agent print("\n--- Étape 2: Analyse des données JSON ---") agent_json = AgentAnalyseJSON("Agent JSON") # Extraction de la structure structure = agent_json.extraire_structure(resultats_analyse) # Analyse des données question_analyse = "Analyse ces données extraites de l'image et résume les points principaux. Identifie les éléments clés et leur importance." resultats_json = agent_json.executer(resultats_analyse, question_analyse) # Fusion des résultats resultats_complets = agent_json.fusionner_jsons( resultats_analyse, { "meta_analyse": { "timestamp": datetime.now().isoformat(), "structure": structure, "analyse_texte": resultats_json } } ) # Sauvegarde des résultats intermédiaires output_json = os.path.join(output_dir, "analyse_complete.json") with open(output_json, 'w', encoding='utf-8') as f: json.dump(resultats_complets, f, ensure_ascii=False, indent=2) print(f"Analyse complète sauvegardée dans: {output_json}") # Étape 4: Questions/Réponses sur les données print("\n--- Étape 3: Tests de questions/réponses ---") agent_qr = AgentQuestionReponse("Agent QR") # Génération automatique de questions questions_auto = agent_qr.generer_questions(resultats_complets, nb_questions=3) print("\nQuestions générées automatiquement:") for i, q in enumerate(questions_auto): print(f"{i+1}. {q}") # Questions standard + questions générées toutes_questions = agent_qr.questions_standard + questions_auto # Exécution des questions/réponses resultats_qr = agent_qr.executer(resultats_complets, toutes_questions) # Évaluation des réponses evaluation = agent_qr.evaluer_reponses(resultats_qr["resultats_qr"]) # Fusion et sauvegarde des résultats finaux resultats_finaux = { "image": os.path.basename(image_path), "date_analyse": datetime.now().isoformat(), "donnees": resultats_complets, "questions_reponses": resultats_qr, "evaluation": evaluation } output_final = os.path.join(output_dir, "resultats_finaux.json") with open(output_final, 'w', encoding='utf-8') as f: json.dump(resultats_finaux, f, ensure_ascii=False, indent=2) print(f"\nRésultats finaux sauvegardés dans: {output_final}") # Affichage des résultats print("\n=== Résumé des résultats ===") print(f"Note moyenne des réponses: {evaluation['meta']['note_moyenne']:.1f}/10") # Affichage d'un exemple de question/réponse if resultats_qr["resultats_qr"]: exemple = resultats_qr["resultats_qr"][0] print(f"\nExemple de Q/R:") print(f"Q: {exemple['question']}") print(f"R: {exemple['reponse'][:200]}...") return resultats_finaux def main(): """Fonction principale""" parser = argparse.ArgumentParser(description="Test de LlamaVision et des agents d'analyse d'images") parser.add_argument("--image", type=str, help="Chemin vers l'image à analyser", required=True) parser.add_argument("--json", type=str, help="Chemin vers un fichier JSON optionnel avec des données additionnelles") parser.add_argument("--mode", type=str, choices=["direct", "complet"], default="complet", help="Mode d'analyse: direct (LlamaVision uniquement) ou complet (workflow avec agents)") args = parser.parse_args() # Vérification de l'existence de l'image if not os.path.exists(args.image): print(f"Erreur: L'image {args.image} n'existe pas") return # Création du répertoire de sortie output_dir = create_output_dir() # Mode d'analyse if args.mode == "direct": analyse_directe(args.image, output_dir) else: workflow_complet(args.image, args.json, output_dir) print("\nAnalyse terminée!") if __name__ == "__main__": main()