mirror of
https://github.com/Ladebeze66/llm_ticket3.git
synced 2025-12-13 15:56:50 +01:00
1804-11:27avantuptest
This commit is contained in:
parent
05c033a06e
commit
9537e0285d
4
.gitignore
vendored
4
.gitignore
vendored
@ -3,9 +3,9 @@ venv/
|
||||
env/
|
||||
ENV/
|
||||
venv_new/
|
||||
reports/
|
||||
|
||||
CSV/
|
||||
|
||||
|
||||
|
||||
*.yml
|
||||
*.yaml
|
||||
|
||||
@ -13,10 +13,12 @@ class AgentTicketAnalyser(BaseAgent):
|
||||
def __init__(self, llm):
|
||||
super().__init__("AgentTicketAnalyser", llm)
|
||||
|
||||
self.temperature = 0.1
|
||||
self.top_p = 0.2
|
||||
self.max_tokens = 7000
|
||||
|
||||
self.params = {
|
||||
"temperature": 0.1,
|
||||
"top_p": 0.2,
|
||||
"max_tokens": 7000
|
||||
}
|
||||
|
||||
self.system_prompt = """Tu es un expert en analyse de tickets pour le support informatique de BRG-Lab pour la société CBAO.
|
||||
Tu interviens avant l'analyse des captures d'écran pour contextualiser le ticket, identifier les questions posées, et structurer les échanges de manière claire.
|
||||
|
||||
@ -85,12 +87,7 @@ IMPORTANT :
|
||||
if hasattr(self.llm, "prompt_system"):
|
||||
self.llm.prompt_system = self.system_prompt
|
||||
if hasattr(self.llm, "configurer"):
|
||||
self.llm.configurer(
|
||||
temperature=self.temperature,
|
||||
top_p=self.top_p,
|
||||
max_tokens=self.max_tokens
|
||||
)
|
||||
|
||||
self.llm.configurer(**self.params)
|
||||
def executer(self, ticket_data: Dict[str, Any]) -> str:
|
||||
if isinstance(ticket_data, str) and os.path.exists(ticket_data):
|
||||
ticket_data = self.ticket_loader.charger(ticket_data)
|
||||
@ -119,8 +116,9 @@ IMPORTANT :
|
||||
"ticket_id": ticket_code,
|
||||
"model_info": {
|
||||
"model": getattr(self.llm, "modele", str(type(self.llm))),
|
||||
**getattr(self.llm, "params", {})
|
||||
}
|
||||
**self.params
|
||||
},
|
||||
"source_agent": self.nom
|
||||
}
|
||||
}
|
||||
sauvegarder_donnees(ticket_code, "analyse_ticket", result, base_dir="reports", is_resultat=True)
|
||||
|
||||
321
agents/pixtral_large/agent_image_analyser.bak
Normal file
321
agents/pixtral_large/agent_image_analyser.bak
Normal file
@ -0,0 +1,321 @@
|
||||
from ..base_agent import BaseAgent
|
||||
from typing import Any, Dict
|
||||
import logging
|
||||
import os
|
||||
from PIL import Image
|
||||
import base64
|
||||
import io
|
||||
|
||||
logger = logging.getLogger("AgentImageAnalyser")
|
||||
|
||||
class AgentImageAnalyser(BaseAgent):
|
||||
"""
|
||||
Agent pour analyser les images et extraire les informations pertinentes.
|
||||
"""
|
||||
def __init__(self, llm):
|
||||
super().__init__("AgentImageAnalyser", llm)
|
||||
|
||||
# Configuration locale de l'agent
|
||||
self.temperature = 0.2
|
||||
self.top_p = 0.9
|
||||
self.max_tokens = 3000
|
||||
|
||||
# Centralisation des instructions d'analyse pour éviter la duplication
|
||||
self.instructions_analyse = """
|
||||
1. Description objective
|
||||
Décris précisément ce que montre l'image :
|
||||
- Interface logicielle, menus, fenêtres, onglets
|
||||
- Messages d'erreur, messages système, code ou script
|
||||
- Nom ou titre du logiciel ou du module si visible
|
||||
|
||||
2. Éléments techniques clés
|
||||
Identifie :
|
||||
- Versions logicielles ou modules affichés
|
||||
- Codes d'erreur visibles
|
||||
- Paramètres configurables (champs de texte, sliders, dropdowns, cases à cocher)
|
||||
- Valeurs affichées ou préremplies dans les champs
|
||||
- Éléments désactivés, grisés ou masqués (souvent non modifiables)
|
||||
- Boutons actifs/inactifs
|
||||
|
||||
3. Éléments mis en évidence
|
||||
- Recherche les zones entourées, encadrées, surlignées ou fléchées
|
||||
- Ces éléments sont souvent importants pour le client ou le support
|
||||
- Mentionne explicitement leur contenu et leur style de mise en valeur
|
||||
|
||||
4. Relation avec le problème
|
||||
- Établis le lien entre les éléments visibles et le problème décrit dans le ticket
|
||||
- Indique si des composants semblent liés à une mauvaise configuration ou une erreur
|
||||
|
||||
5. Réponses potentielles
|
||||
- Détermine si l'image apporte des éléments de réponse à une question posée dans :
|
||||
- Le titre du ticket
|
||||
- La description du problème
|
||||
|
||||
6. Lien avec la discussion
|
||||
- Vérifie si l'image fait écho à une étape décrite dans le fil de discussion
|
||||
- Note les correspondances (ex: même module, même message d'erreur que précédemment mentionné)
|
||||
|
||||
Règles importantes :
|
||||
- Ne fais AUCUNE interprétation ni diagnostic
|
||||
- Ne propose PAS de solution ou recommandation
|
||||
- Reste strictement factuel et objectif
|
||||
- Concentre-toi uniquement sur ce qui est visible dans l'image
|
||||
- Reproduis les textes exacts(ex : messages d'erreur, libellés de paramètres)
|
||||
- Prête une attention particulière aux éléments modifiables (interactifs) et non modifiables (grisés)
|
||||
"""
|
||||
|
||||
# Prompt système construit à partir des instructions centralisées
|
||||
self.system_prompt = f"""Tu es un expert en analyse d'images pour le support technique de BRG-Lab pour la société CBAO.
|
||||
Ta mission est d'analyser des captures d'écran en lien avec le contexte du ticket de support.
|
||||
|
||||
Structure ton analyse d'image de façon factuelle:
|
||||
{self.instructions_analyse}
|
||||
|
||||
Ton analyse sera utilisée comme élément factuel pour un rapport technique plus complet."""
|
||||
|
||||
# Appliquer la configuration au LLM
|
||||
self._appliquer_config_locale()
|
||||
|
||||
logger.info("AgentImageAnalyser initialisé")
|
||||
|
||||
def _appliquer_config_locale(self) -> None:
|
||||
"""
|
||||
Applique la configuration locale au modèle LLM.
|
||||
"""
|
||||
# Appliquer le prompt système
|
||||
if hasattr(self.llm, "prompt_system"):
|
||||
self.llm.prompt_system = self.system_prompt
|
||||
|
||||
# Appliquer les paramètres
|
||||
if hasattr(self.llm, "configurer"):
|
||||
params = {
|
||||
"temperature": self.temperature,
|
||||
"top_p": self.top_p,
|
||||
"max_tokens": self.max_tokens
|
||||
}
|
||||
|
||||
self.llm.configurer(**params)
|
||||
|
||||
def _verifier_image(self, image_path: str) -> bool:
|
||||
"""
|
||||
Vérifie si l'image existe et est accessible
|
||||
|
||||
Args:
|
||||
image_path: Chemin vers l'image
|
||||
|
||||
Returns:
|
||||
True si l'image existe et est accessible, False sinon
|
||||
"""
|
||||
try:
|
||||
# Vérifier que le fichier existe
|
||||
if not os.path.exists(image_path):
|
||||
logger.error(f"L'image n'existe pas: {image_path}")
|
||||
return False
|
||||
|
||||
# Vérifier que le fichier est accessible en lecture
|
||||
if not os.access(image_path, os.R_OK):
|
||||
logger.error(f"L'image n'est pas accessible en lecture: {image_path}")
|
||||
return False
|
||||
|
||||
# Vérifier que le fichier peut être ouvert comme une image
|
||||
with Image.open(image_path) as img:
|
||||
# Vérifier les dimensions de l'image
|
||||
width, height = img.size
|
||||
if width <= 0 or height <= 0:
|
||||
logger.error(f"Dimensions d'image invalides: {width}x{height}")
|
||||
return False
|
||||
|
||||
logger.info(f"Image vérifiée avec succès: {image_path} ({width}x{height})")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de la vérification de l'image {image_path}: {str(e)}")
|
||||
return False
|
||||
|
||||
def _generer_prompt_analyse(self, contexte: str, prefix: str = "") -> str:
|
||||
"""
|
||||
Génère le prompt d'analyse d'image en utilisant les instructions centralisées
|
||||
|
||||
Args:
|
||||
contexte: Contexte du ticket à inclure dans le prompt
|
||||
prefix: Préfixe optionnel (pour inclure l'image en base64 par exemple)
|
||||
|
||||
Returns:
|
||||
Prompt formaté pour l'analyse d'image
|
||||
"""
|
||||
return f"""{prefix}
|
||||
|
||||
CONTEXTE DU TICKET:
|
||||
{contexte}
|
||||
|
||||
Fournis une analyse STRICTEMENT FACTUELLE de l'image avec les sections suivantes:
|
||||
{self.instructions_analyse}"""
|
||||
|
||||
def executer(self, image_path: str, contexte: str) -> Dict[str, Any]:
|
||||
"""
|
||||
Analyse une image en tenant compte du contexte du ticket
|
||||
|
||||
Args:
|
||||
image_path: Chemin vers l'image à analyser
|
||||
contexte: Contexte du ticket (résultat de l'analyse JSON)
|
||||
|
||||
Returns:
|
||||
Dictionnaire contenant l'analyse détaillée de l'image et les métadonnées d'exécution
|
||||
"""
|
||||
image_name = os.path.basename(image_path)
|
||||
logger.info(f"Analyse de l'image: {image_name} avec contexte")
|
||||
print(f" AgentImageAnalyser: Analyse de {image_name}")
|
||||
|
||||
# Vérifier que l'image existe et est accessible
|
||||
if not self._verifier_image(image_path):
|
||||
error_message = f"L'image n'est pas accessible ou n'est pas valide: {image_name}"
|
||||
logger.error(error_message)
|
||||
print(f" ERREUR: {error_message}")
|
||||
|
||||
return {
|
||||
"analyse": f"ERREUR: {error_message}. Veuillez vérifier que l'image existe et est valide.",
|
||||
"error": True,
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True
|
||||
}
|
||||
}
|
||||
|
||||
# Générer le prompt d'analyse avec les instructions centralisées
|
||||
prompt = self._generer_prompt_analyse(contexte, "Analyse cette image en tenant compte du contexte suivant:")
|
||||
|
||||
try:
|
||||
logger.info("Envoi de la requête au LLM")
|
||||
|
||||
# Utiliser la méthode interroger_avec_image au lieu de interroger
|
||||
if hasattr(self.llm, "interroger_avec_image"):
|
||||
logger.info(f"Utilisation de la méthode interroger_avec_image pour {image_name}")
|
||||
response = self.llm.interroger_avec_image(image_path, prompt)
|
||||
else:
|
||||
# Fallback vers la méthode standard avec base64 si interroger_avec_image n'existe pas
|
||||
logger.warning(f"La méthode interroger_avec_image n'existe pas, utilisation du fallback pour {image_name}")
|
||||
# Utiliser la méthode _encoder_image_base64 du modèle directement
|
||||
if hasattr(self.llm, "_encoder_image_base64"):
|
||||
img_base64 = self.llm._encoder_image_base64(image_path)
|
||||
if img_base64:
|
||||
# Utiliser le même générateur de prompt avec l'image en base64
|
||||
prompt_base64 = self._generer_prompt_analyse(contexte, f"Analyse cette image:\n{img_base64}")
|
||||
|
||||
response = self.llm.interroger(prompt_base64)
|
||||
else:
|
||||
error_message = "Impossible d'encoder l'image en base64"
|
||||
logger.error(f"Erreur d'analyse pour {image_name}: {error_message}")
|
||||
print(f" ERREUR: {error_message}")
|
||||
|
||||
# Retourner un résultat d'erreur explicite
|
||||
return {
|
||||
"analyse": f"ERREUR: {error_message}. Veuillez vérifier que l'image est dans un format standard.",
|
||||
"error": True,
|
||||
"raw_response": "",
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True
|
||||
}
|
||||
}
|
||||
else:
|
||||
error_message = "Le modèle ne supporte pas l'encodage d'images en base64"
|
||||
logger.error(f"Erreur d'analyse pour {image_name}: {error_message}")
|
||||
print(f" ERREUR: {error_message}")
|
||||
|
||||
# Retourner un résultat d'erreur explicite
|
||||
return {
|
||||
"analyse": f"ERREUR: {error_message}. Veuillez utiliser un modèle compatible avec l'analyse d'images.",
|
||||
"error": True,
|
||||
"raw_response": "",
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True
|
||||
}
|
||||
}
|
||||
|
||||
# Vérifier si la réponse contient des indications que le modèle ne peut pas analyser l'image
|
||||
error_phrases = [
|
||||
"je ne peux pas directement visualiser",
|
||||
"je n'ai pas accès à l'image",
|
||||
"je ne peux pas voir l'image",
|
||||
"sans accès direct à l'image",
|
||||
"je n'ai pas la possibilité de voir",
|
||||
"je ne peux pas accéder directement",
|
||||
"erreur: impossible d'analyser l'image"
|
||||
]
|
||||
|
||||
# Vérifier si une des phrases d'erreur est présente dans la réponse
|
||||
if any(phrase in response.lower() for phrase in error_phrases):
|
||||
logger.warning(f"Le modèle indique qu'il ne peut pas analyser l'image: {image_name}")
|
||||
error_message = "Le modèle n'a pas pu analyser l'image correctement"
|
||||
logger.error(f"Erreur d'analyse pour {image_name}: {error_message}")
|
||||
print(f" ERREUR: {error_message}")
|
||||
|
||||
# Retourner un résultat d'erreur explicite
|
||||
return {
|
||||
"analyse": f"ERREUR: {error_message}. Veuillez vérifier que le modèle a accès à l'image ou utiliser un modèle différent.",
|
||||
"error": True,
|
||||
"raw_response": response,
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True
|
||||
}
|
||||
}
|
||||
|
||||
logger.info(f"Réponse reçue pour l'image {image_name}: {response[:100]}...")
|
||||
|
||||
# Créer un dictionnaire de résultat avec l'analyse et les métadonnées
|
||||
result = {
|
||||
"analyse": response,
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"model_info": {
|
||||
"model": getattr(self.llm, "modele", str(type(self.llm))),
|
||||
"temperature": self.temperature,
|
||||
"top_p": self.top_p,
|
||||
"max_tokens": self.max_tokens
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Enregistrer l'analyse dans l'historique avec contexte et prompt
|
||||
self.ajouter_historique("analyse_image",
|
||||
{
|
||||
"image_path": image_path,
|
||||
"contexte": contexte,
|
||||
"prompt": prompt
|
||||
},
|
||||
response)
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
error_message = f"Erreur lors de l'analyse de l'image: {str(e)}"
|
||||
logger.error(error_message)
|
||||
print(f" ERREUR: {error_message}")
|
||||
|
||||
# Retourner un résultat par défaut en cas d'erreur
|
||||
return {
|
||||
"analyse": f"ERREUR: {error_message}",
|
||||
"error": True,
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True
|
||||
}
|
||||
}
|
||||
|
||||
def _get_timestamp(self) -> str:
|
||||
"""Retourne un timestamp au format YYYYMMDD_HHMMSS"""
|
||||
from datetime import datetime
|
||||
return datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
@ -1,10 +1,9 @@
|
||||
from ..base_agent import BaseAgent
|
||||
from typing import Any, Dict
|
||||
import logging
|
||||
import os
|
||||
from typing import Dict, Any
|
||||
from PIL import Image
|
||||
import base64
|
||||
import io
|
||||
from ..utils.pipeline_logger import sauvegarder_donnees
|
||||
|
||||
logger = logging.getLogger("AgentImageAnalyser")
|
||||
|
||||
@ -15,132 +14,103 @@ class AgentImageAnalyser(BaseAgent):
|
||||
def __init__(self, llm):
|
||||
super().__init__("AgentImageAnalyser", llm)
|
||||
|
||||
# Configuration locale de l'agent
|
||||
self.temperature = 0.2
|
||||
self.top_p = 0.9
|
||||
self.max_tokens = 3000
|
||||
# Configuration personnalisable
|
||||
self.params = {
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 3000
|
||||
}
|
||||
|
||||
# Centralisation des instructions d'analyse pour éviter la duplication
|
||||
self.instructions_analyse = """
|
||||
1. Description objective
|
||||
Décris précisément ce que montre l'image :
|
||||
- Interface logicielle, menus, fenêtres, onglets
|
||||
- Messages d'erreur, messages système, code ou script
|
||||
- Nom ou titre du logiciel ou du module si visible
|
||||
self.instructions_analyse = (
|
||||
"""
|
||||
1. Description objective
|
||||
Décris précisément ce que montre l'image :
|
||||
- Interface logicielle, menus, fenêtres, onglets
|
||||
- Messages d'erreur, messages système, code ou script
|
||||
- Nom ou titre du logiciel ou du module si visible
|
||||
|
||||
2. Éléments techniques clés
|
||||
Identifie :
|
||||
- Versions logicielles ou modules affichés
|
||||
- Codes d'erreur visibles
|
||||
- Paramètres configurables (champs de texte, sliders, dropdowns, cases à cocher)
|
||||
- Valeurs affichées ou préremplies dans les champs
|
||||
- Éléments désactivés, grisés ou masqués (souvent non modifiables)
|
||||
- Boutons actifs/inactifs
|
||||
2. Éléments techniques clés
|
||||
Identifie :
|
||||
- Versions logicielles ou modules affichés
|
||||
- Codes d'erreur visibles
|
||||
- Paramètres configurables (champs de texte, sliders, dropdowns, cases à cocher)
|
||||
- Valeurs affichées ou préremplies dans les champs
|
||||
- Éléments désactivés, grisés ou masqués (souvent non modifiables)
|
||||
- Boutons actifs/inactifs
|
||||
|
||||
3. Éléments mis en évidence
|
||||
- Recherche les zones entourées, encadrées, surlignées ou fléchées
|
||||
- Ces éléments sont souvent importants pour le client ou le support
|
||||
- Mentionne explicitement leur contenu et leur style de mise en valeur
|
||||
3. Éléments mis en évidence
|
||||
- Recherche les zones entourées, encadrées, surlignées ou fléchées
|
||||
- Ces éléments sont souvent importants pour le client ou le support
|
||||
- Mentionne explicitement leur contenu et leur style de mise en valeur
|
||||
|
||||
4. Relation avec le problème
|
||||
- Établis le lien entre les éléments visibles et le problème décrit dans le ticket
|
||||
- Indique si des composants semblent liés à une mauvaise configuration ou une erreur
|
||||
4. Relation avec le problème
|
||||
- Établis le lien entre les éléments visibles et le problème décrit dans le ticket
|
||||
- Indique si des composants semblent liés à une mauvaise configuration ou une erreur
|
||||
|
||||
5. Réponses potentielles
|
||||
- Détermine si l'image apporte des éléments de réponse à une question posée dans :
|
||||
- Le titre du ticket
|
||||
- La description du problème
|
||||
5. Réponses potentielles
|
||||
- Détermine si l'image apporte des éléments de réponse à une question posée dans :
|
||||
- Le titre du ticket
|
||||
- La description du problème
|
||||
|
||||
6. Lien avec la discussion
|
||||
- Vérifie si l'image fait écho à une étape décrite dans le fil de discussion
|
||||
- Note les correspondances (ex: même module, même message d'erreur que précédemment mentionné)
|
||||
6. Lien avec la discussion
|
||||
- Vérifie si l'image fait écho à une étape décrite dans le fil de discussion
|
||||
- Note les correspondances (ex: même module, même message d'erreur que précédemment mentionné)
|
||||
|
||||
Règles importantes :
|
||||
- Ne fais AUCUNE interprétation ni diagnostic
|
||||
- Ne propose PAS de solution ou recommandation
|
||||
- Reste strictement factuel et objectif
|
||||
- Concentre-toi uniquement sur ce qui est visible dans l'image
|
||||
- Reproduis les textes exacts(ex : messages d'erreur, libellés de paramètres)
|
||||
- Prête une attention particulière aux éléments modifiables (interactifs) et non modifiables (grisés)
|
||||
"""
|
||||
Règles importantes :
|
||||
- Ne fais AUCUNE interprétation ni diagnostic
|
||||
- Ne propose PAS de solution ou recommandation
|
||||
- Reste strictement factuel et objectif
|
||||
- Concentre-toi uniquement sur ce qui est visible dans l'image
|
||||
- Reproduis les textes exacts(ex : messages d'erreur, libellés de paramètres)
|
||||
- Prête une attention particulière aux éléments modifiables (interactifs) et non modifiables (grisés)
|
||||
"""
|
||||
)
|
||||
|
||||
# Prompt système construit à partir des instructions centralisées
|
||||
self.system_prompt = f"""Tu es un expert en analyse d'images pour le support technique de BRG-Lab pour la société CBAO.
|
||||
Ta mission est d'analyser des captures d'écran en lien avec le contexte du ticket de support.
|
||||
self.system_prompt = (
|
||||
"""
|
||||
Tu es un expert en analyse d'images pour le support technique de BRG-Lab pour la société CBAO.
|
||||
Ta mission est d'analyser des captures d'écran en lien avec le contexte du ticket de support.
|
||||
|
||||
Structure ton analyse d'image de façon factuelle:
|
||||
{self.instructions_analyse}
|
||||
Structure ton analyse d'image de façon factuelle:
|
||||
{instructions}
|
||||
|
||||
Ton analyse sera utilisée comme élément factuel pour un rapport technique plus complet.
|
||||
"""
|
||||
).format(
|
||||
instructions=self.instructions_analyse
|
||||
)
|
||||
|
||||
Ton analyse sera utilisée comme élément factuel pour un rapport technique plus complet."""
|
||||
|
||||
# Appliquer la configuration au LLM
|
||||
self._appliquer_config_locale()
|
||||
|
||||
logger.info("AgentImageAnalyser initialisé")
|
||||
|
||||
def _appliquer_config_locale(self) -> None:
|
||||
"""
|
||||
Applique la configuration locale au modèle LLM.
|
||||
"""
|
||||
# Appliquer le prompt système
|
||||
if hasattr(self.llm, "prompt_system"):
|
||||
self.llm.prompt_system = self.system_prompt
|
||||
|
||||
# Appliquer les paramètres
|
||||
if hasattr(self.llm, "configurer"):
|
||||
params = {
|
||||
"temperature": self.temperature,
|
||||
"top_p": self.top_p,
|
||||
"max_tokens": self.max_tokens
|
||||
}
|
||||
|
||||
self.llm.configurer(**params)
|
||||
self.llm.configurer(**self.params)
|
||||
|
||||
def _verifier_image(self, image_path: str) -> bool:
|
||||
"""
|
||||
Vérifie si l'image existe et est accessible
|
||||
|
||||
Args:
|
||||
image_path: Chemin vers l'image
|
||||
|
||||
Returns:
|
||||
True si l'image existe et est accessible, False sinon
|
||||
"""
|
||||
try:
|
||||
# Vérifier que le fichier existe
|
||||
if not os.path.exists(image_path):
|
||||
logger.error(f"L'image n'existe pas: {image_path}")
|
||||
if not os.path.exists(image_path) or not os.access(image_path, os.R_OK):
|
||||
return False
|
||||
|
||||
# Vérifier que le fichier est accessible en lecture
|
||||
if not os.access(image_path, os.R_OK):
|
||||
logger.error(f"L'image n'est pas accessible en lecture: {image_path}")
|
||||
return False
|
||||
|
||||
# Vérifier que le fichier peut être ouvert comme une image
|
||||
with Image.open(image_path) as img:
|
||||
# Vérifier les dimensions de l'image
|
||||
width, height = img.size
|
||||
if width <= 0 or height <= 0:
|
||||
logger.error(f"Dimensions d'image invalides: {width}x{height}")
|
||||
return False
|
||||
|
||||
logger.info(f"Image vérifiée avec succès: {image_path} ({width}x{height})")
|
||||
return True
|
||||
return width > 0 and height > 0
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de la vérification de l'image {image_path}: {str(e)}")
|
||||
logger.error(f"Vérification impossible pour {image_path}: {e}")
|
||||
return False
|
||||
|
||||
def _generer_prompt_analyse(self, contexte: str, prefix: str = "") -> str:
|
||||
"""
|
||||
Génère le prompt d'analyse d'image en utilisant les instructions centralisées
|
||||
|
||||
Args:
|
||||
contexte: Contexte du ticket à inclure dans le prompt
|
||||
prefix: Préfixe optionnel (pour inclure l'image en base64 par exemple)
|
||||
|
||||
Returns:
|
||||
Prompt formaté pour l'analyse d'image
|
||||
Génère le prompt d'analyse d'image
|
||||
"""
|
||||
return f"""{prefix}
|
||||
|
||||
@ -150,93 +120,30 @@ CONTEXTE DU TICKET:
|
||||
Fournis une analyse STRICTEMENT FACTUELLE de l'image avec les sections suivantes:
|
||||
{self.instructions_analyse}"""
|
||||
|
||||
def executer(self, image_path: str, contexte: str) -> Dict[str, Any]:
|
||||
def executer(self, image_path: str, contexte: str = "") -> Dict[str, Any]:
|
||||
"""
|
||||
Analyse une image en tenant compte du contexte du ticket
|
||||
|
||||
Args:
|
||||
image_path: Chemin vers l'image à analyser
|
||||
contexte: Contexte du ticket (résultat de l'analyse JSON)
|
||||
|
||||
Returns:
|
||||
Dictionnaire contenant l'analyse détaillée de l'image et les métadonnées d'exécution
|
||||
"""
|
||||
image_name = os.path.basename(image_path)
|
||||
logger.info(f"Analyse de l'image: {image_name} avec contexte")
|
||||
print(f" AgentImageAnalyser: Analyse de {image_name}")
|
||||
|
||||
# Vérifier que l'image existe et est accessible
|
||||
if not self._verifier_image(image_path):
|
||||
error_message = f"L'image n'est pas accessible ou n'est pas valide: {image_name}"
|
||||
logger.error(error_message)
|
||||
print(f" ERREUR: {error_message}")
|
||||
return self._erreur("Erreur d'accès ou image invalide", image_path)
|
||||
|
||||
return {
|
||||
"analyse": f"ERREUR: {error_message}. Veuillez vérifier que l'image existe et est valide.",
|
||||
"error": True,
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True
|
||||
}
|
||||
}
|
||||
|
||||
# Générer le prompt d'analyse avec les instructions centralisées
|
||||
prompt = self._generer_prompt_analyse(contexte, "Analyse cette image en tenant compte du contexte suivant:")
|
||||
|
||||
try:
|
||||
logger.info("Envoi de la requête au LLM")
|
||||
prompt = self._generer_prompt_analyse(contexte, "Analyse cette image en tenant compte du contexte suivant:")
|
||||
|
||||
# Utiliser la méthode interroger_avec_image au lieu de interroger
|
||||
if hasattr(self.llm, "interroger_avec_image"):
|
||||
logger.info(f"Utilisation de la méthode interroger_avec_image pour {image_name}")
|
||||
response = self.llm.interroger_avec_image(image_path, prompt)
|
||||
else:
|
||||
# Fallback vers la méthode standard avec base64 si interroger_avec_image n'existe pas
|
||||
logger.warning(f"La méthode interroger_avec_image n'existe pas, utilisation du fallback pour {image_name}")
|
||||
# Utiliser la méthode _encoder_image_base64 du modèle directement
|
||||
if hasattr(self.llm, "_encoder_image_base64"):
|
||||
img_base64 = self.llm._encoder_image_base64(image_path)
|
||||
if img_base64:
|
||||
# Utiliser le même générateur de prompt avec l'image en base64
|
||||
prompt_base64 = self._generer_prompt_analyse(contexte, f"Analyse cette image:\n{img_base64}")
|
||||
|
||||
response = self.llm.interroger(prompt_base64)
|
||||
else:
|
||||
error_message = "Impossible d'encoder l'image en base64"
|
||||
logger.error(f"Erreur d'analyse pour {image_name}: {error_message}")
|
||||
print(f" ERREUR: {error_message}")
|
||||
|
||||
# Retourner un résultat d'erreur explicite
|
||||
return {
|
||||
"analyse": f"ERREUR: {error_message}. Veuillez vérifier que l'image est dans un format standard.",
|
||||
"error": True,
|
||||
"raw_response": "",
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True
|
||||
}
|
||||
}
|
||||
elif hasattr(self.llm, "_encoder_image_base64"):
|
||||
img_base64 = self.llm._encoder_image_base64(image_path)
|
||||
if img_base64:
|
||||
prompt_base64 = self._generer_prompt_analyse(contexte, f"Analyse cette image:\n{img_base64}")
|
||||
response = self.llm.interroger(prompt_base64)
|
||||
else:
|
||||
error_message = "Le modèle ne supporte pas l'encodage d'images en base64"
|
||||
logger.error(f"Erreur d'analyse pour {image_name}: {error_message}")
|
||||
print(f" ERREUR: {error_message}")
|
||||
|
||||
# Retourner un résultat d'erreur explicite
|
||||
return {
|
||||
"analyse": f"ERREUR: {error_message}. Veuillez utiliser un modèle compatible avec l'analyse d'images.",
|
||||
"error": True,
|
||||
"raw_response": "",
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True
|
||||
}
|
||||
}
|
||||
return self._erreur("Impossible d'encoder l'image en base64", image_path)
|
||||
else:
|
||||
return self._erreur("Le modèle ne supporte pas l'analyse d'images", image_path)
|
||||
|
||||
# Vérifier si la réponse contient des indications que le modèle ne peut pas analyser l'image
|
||||
error_phrases = [
|
||||
@ -249,71 +156,55 @@ Fournis une analyse STRICTEMENT FACTUELLE de l'image avec les sections suivantes
|
||||
"erreur: impossible d'analyser l'image"
|
||||
]
|
||||
|
||||
# Vérifier si une des phrases d'erreur est présente dans la réponse
|
||||
if any(phrase in response.lower() for phrase in error_phrases):
|
||||
logger.warning(f"Le modèle indique qu'il ne peut pas analyser l'image: {image_name}")
|
||||
error_message = "Le modèle n'a pas pu analyser l'image correctement"
|
||||
logger.error(f"Erreur d'analyse pour {image_name}: {error_message}")
|
||||
print(f" ERREUR: {error_message}")
|
||||
|
||||
# Retourner un résultat d'erreur explicite
|
||||
return {
|
||||
"analyse": f"ERREUR: {error_message}. Veuillez vérifier que le modèle a accès à l'image ou utiliser un modèle différent.",
|
||||
"error": True,
|
||||
"raw_response": response,
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True
|
||||
}
|
||||
}
|
||||
return self._erreur("Le modèle n'a pas pu analyser l'image correctement", image_path, raw=response)
|
||||
|
||||
logger.info(f"Réponse reçue pour l'image {image_name}: {response[:100]}...")
|
||||
|
||||
# Créer un dictionnaire de résultat avec l'analyse et les métadonnées
|
||||
result = {
|
||||
"analyse": response,
|
||||
"raw_response": response,
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"model_info": {
|
||||
"model": getattr(self.llm, "modele", str(type(self.llm))),
|
||||
"temperature": self.temperature,
|
||||
"top_p": self.top_p,
|
||||
"max_tokens": self.max_tokens
|
||||
}
|
||||
**self.params
|
||||
},
|
||||
"source_agent": self.nom
|
||||
}
|
||||
}
|
||||
|
||||
# Enregistrer l'analyse dans l'historique avec contexte et prompt
|
||||
self.ajouter_historique("analyse_image",
|
||||
{
|
||||
"image_path": image_path,
|
||||
"contexte": contexte,
|
||||
"prompt": prompt
|
||||
},
|
||||
response)
|
||||
# Sauvegarder les données dans le fichier
|
||||
sauvegarder_donnees(None, "analyse_image", result, base_dir="reports", is_resultat=True)
|
||||
|
||||
# Enregistrer l'analyse dans l'historique
|
||||
self.ajouter_historique(
|
||||
"analyse_image",
|
||||
{"image_path": image_path, "contexte": contexte, "prompt": prompt},
|
||||
result
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
error_message = f"Erreur lors de l'analyse de l'image: {str(e)}"
|
||||
logger.error(error_message)
|
||||
print(f" ERREUR: {error_message}")
|
||||
|
||||
# Retourner un résultat par défaut en cas d'erreur
|
||||
return {
|
||||
"analyse": f"ERREUR: {error_message}",
|
||||
return self._erreur(str(e), image_path)
|
||||
|
||||
def _erreur(self, message: str, path: str, raw: str = "") -> Dict[str, Any]:
|
||||
"""
|
||||
Crée un dictionnaire de réponse en cas d'erreur
|
||||
"""
|
||||
return {
|
||||
"analyse": f"ERREUR: {message}",
|
||||
"raw_response": raw,
|
||||
"error": True,
|
||||
"metadata": {
|
||||
"image_path": path,
|
||||
"image_name": os.path.basename(path),
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True,
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True
|
||||
}
|
||||
"source_agent": self.nom
|
||||
}
|
||||
}
|
||||
|
||||
def _get_timestamp(self) -> str:
|
||||
"""Retourne un timestamp au format YYYYMMDD_HHMMSS"""
|
||||
|
||||
@ -14,10 +14,13 @@ class AgentImageSorter(BaseAgent):
|
||||
def __init__(self, llm):
|
||||
super().__init__("AgentImageSorter", llm)
|
||||
|
||||
# Configuration personnalisable
|
||||
self.temperature = 0.2
|
||||
self.top_p = 0.8
|
||||
self.max_tokens = 300
|
||||
# Configuration centralisée dans un dictionnaire
|
||||
self.params = {
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.8,
|
||||
"max_tokens": 300
|
||||
# Ajoutez facilement d'autres paramètres ici sans modifier _appliquer_config_locale
|
||||
}
|
||||
|
||||
self.criteres_pertinence = (
|
||||
"""
|
||||
@ -66,11 +69,8 @@ class AgentImageSorter(BaseAgent):
|
||||
if hasattr(self.llm, "prompt_system"):
|
||||
self.llm.prompt_system = self.system_prompt
|
||||
if hasattr(self.llm, "configurer"):
|
||||
self.llm.configurer(
|
||||
temperature=self.temperature,
|
||||
top_p=self.top_p,
|
||||
max_tokens=self.max_tokens
|
||||
)
|
||||
# Utiliser directement le dictionnaire de paramètres
|
||||
self.llm.configurer(**self.params)
|
||||
|
||||
def _verifier_image(self, image_path: str) -> bool:
|
||||
try:
|
||||
@ -121,7 +121,7 @@ class AgentImageSorter(BaseAgent):
|
||||
"timestamp": self._get_timestamp(),
|
||||
"model_info": {
|
||||
"model": getattr(self.llm, "modele", str(type(self.llm))),
|
||||
**getattr(self.llm, "params", {})
|
||||
**self.params
|
||||
},
|
||||
"source_agent": self.nom
|
||||
}
|
||||
@ -166,4 +166,4 @@ class AgentImageSorter(BaseAgent):
|
||||
|
||||
def _get_timestamp(self) -> str:
|
||||
from datetime import datetime
|
||||
return datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
return datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
169
agents/pixtral_large/agent_image_sorter.py.bak
Normal file
169
agents/pixtral_large/agent_image_sorter.py.bak
Normal file
@ -0,0 +1,169 @@
|
||||
from ..base_agent import BaseAgent
|
||||
import logging
|
||||
import os
|
||||
from typing import Dict, Any, Tuple
|
||||
from PIL import Image
|
||||
from ..utils.pipeline_logger import sauvegarder_donnees
|
||||
|
||||
logger = logging.getLogger("AgentImageSorter")
|
||||
|
||||
class AgentImageSorter(BaseAgent):
|
||||
"""
|
||||
Agent pour trier les images et identifier celles qui sont pertinentes.
|
||||
"""
|
||||
def __init__(self, llm):
|
||||
super().__init__("AgentImageSorter", llm)
|
||||
|
||||
# Configuration personnalisable
|
||||
self.temperature = 0.2
|
||||
self.top_p = 0.8
|
||||
self.max_tokens = 300
|
||||
|
||||
self.criteres_pertinence = (
|
||||
"""
|
||||
Images PERTINENTES (réponds "oui" ou "pertinent"):
|
||||
- Captures d'écran de logiciels ou d'interfaces
|
||||
- logo BRG_LAB
|
||||
- Référence à "logociel"
|
||||
- Messages d'erreur
|
||||
- Configurations système
|
||||
- Tableaux de bord ou graphiques techniques
|
||||
- Fenêtres de diagnostic
|
||||
|
||||
Images NON PERTINENTES (réponds "non" ou "non pertinent"):
|
||||
- Photos personnelles
|
||||
- Images marketing/promotionnelles
|
||||
- Logos ou images de marque
|
||||
- Paysages, personnes ou objets non liés à l'informatique
|
||||
"""
|
||||
)
|
||||
|
||||
self.instructions_analyse = (
|
||||
"""
|
||||
IMPORTANT: Ne commence JAMAIS ta réponse par "Je ne peux pas directement visualiser l'image".
|
||||
Si tu ne peux pas analyser l'image, réponds simplement "ERREUR: Impossible d'analyser l'image".
|
||||
|
||||
Analyse d'abord ce que montre l'image, puis réponds par "oui"/"pertinent" ou "non"/"non pertinent".
|
||||
"""
|
||||
)
|
||||
|
||||
self.system_prompt = (
|
||||
"""
|
||||
Tu es un expert en tri d'images pour le support technique de BRG_Lab pour la société CBAO.
|
||||
Ta mission est de déterminer si une image est pertinente pour le support technique de logiciels.
|
||||
{criteres}
|
||||
{instructions}
|
||||
"""
|
||||
).format(
|
||||
criteres=self.criteres_pertinence,
|
||||
instructions=self.instructions_analyse
|
||||
)
|
||||
|
||||
self._appliquer_config_locale()
|
||||
logger.info("AgentImageSorter initialisé")
|
||||
|
||||
def _appliquer_config_locale(self) -> None:
|
||||
if hasattr(self.llm, "prompt_system"):
|
||||
self.llm.prompt_system = self.system_prompt
|
||||
if hasattr(self.llm, "configurer"):
|
||||
self.llm.configurer(
|
||||
temperature=self.temperature,
|
||||
top_p=self.top_p,
|
||||
max_tokens=self.max_tokens
|
||||
)
|
||||
|
||||
def _verifier_image(self, image_path: str) -> bool:
|
||||
try:
|
||||
if not os.path.exists(image_path) or not os.access(image_path, os.R_OK):
|
||||
return False
|
||||
with Image.open(image_path) as img:
|
||||
width, height = img.size
|
||||
return width > 0 and height > 0
|
||||
except Exception as e:
|
||||
logger.error(f"Vérification impossible pour {image_path}: {e}")
|
||||
return False
|
||||
|
||||
def _generer_prompt_analyse(self, prefix: str = "") -> str:
|
||||
return f"{prefix}\n\nEst-ce une image pertinente pour un ticket de support technique?\nRéponds simplement par 'oui' ou 'non' suivi d'une brève explication."
|
||||
|
||||
def executer(self, image_path: str) -> Dict[str, Any]:
|
||||
image_name = os.path.basename(image_path)
|
||||
print(f" AgentImageSorter: Évaluation de {image_name}")
|
||||
|
||||
if not self._verifier_image(image_path):
|
||||
return self._erreur("Erreur d'accès ou image invalide", image_path)
|
||||
|
||||
try:
|
||||
prompt = self._generer_prompt_analyse()
|
||||
if hasattr(self.llm, "interroger_avec_image"):
|
||||
response = self.llm.interroger_avec_image(image_path, prompt)
|
||||
elif hasattr(self.llm, "_encoder_image_base64"):
|
||||
img_base64 = self.llm._encoder_image_base64(image_path)
|
||||
prompt = self._generer_prompt_analyse(f"Analyse cette image:\n{img_base64}")
|
||||
response = self.llm.interroger(prompt)
|
||||
else:
|
||||
return self._erreur("Le modèle ne supporte pas les images", image_path)
|
||||
|
||||
if any(err in response.lower() for err in [
|
||||
"je ne peux pas", "je n'ai pas accès", "impossible d'analyser"]):
|
||||
return self._erreur("Réponse du modèle invalide", image_path, raw=response)
|
||||
|
||||
is_relevant, reason = self._analyser_reponse(response)
|
||||
print(f" Décision: Image {image_name} {'pertinente' if is_relevant else 'non pertinente'}")
|
||||
|
||||
result = {
|
||||
"is_relevant": is_relevant,
|
||||
"reason": reason,
|
||||
"raw_response": response,
|
||||
"metadata": {
|
||||
"image_path": image_path,
|
||||
"image_name": image_name,
|
||||
"timestamp": self._get_timestamp(),
|
||||
"model_info": {
|
||||
"model": getattr(self.llm, "modele", str(type(self.llm))),
|
||||
**getattr(self.llm, "params", {})
|
||||
},
|
||||
"source_agent": self.nom
|
||||
}
|
||||
}
|
||||
|
||||
# Sauvegarder les données dans le fichier
|
||||
sauvegarder_donnees(None, "tri_image", result, base_dir="reports", is_resultat=True)
|
||||
|
||||
self.ajouter_historique("tri_image", {"image_path": image_path, "prompt": prompt}, result)
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
return self._erreur(str(e), image_path)
|
||||
|
||||
def _analyser_reponse(self, response: str) -> Tuple[bool, str]:
|
||||
r = response.lower()
|
||||
first_line = r.split('\n')[0] if '\n' in r else r[:50].strip()
|
||||
if first_line.startswith("non") or "non pertinent" in first_line:
|
||||
return False, response.strip()
|
||||
if first_line.startswith("oui") or "pertinent" in first_line:
|
||||
return True, response.strip()
|
||||
|
||||
pos_keywords = ["pertinent", "utile", "important", "diagnostic"]
|
||||
neg_keywords = ["inutile", "photo", "hors sujet", "marketing", "non pertinent"]
|
||||
score = sum(kw in r for kw in pos_keywords) - sum(kw in r for kw in neg_keywords)
|
||||
return score > 0, response.strip()
|
||||
|
||||
def _erreur(self, message: str, path: str, raw: str = "") -> Dict[str, Any]:
|
||||
return {
|
||||
"is_relevant": False,
|
||||
"reason": message,
|
||||
"raw_response": raw,
|
||||
"error": True,
|
||||
"metadata": {
|
||||
"image_path": path,
|
||||
"image_name": os.path.basename(path),
|
||||
"timestamp": self._get_timestamp(),
|
||||
"error": True,
|
||||
"source_agent": self.nom
|
||||
}
|
||||
}
|
||||
|
||||
def _get_timestamp(self) -> str:
|
||||
from datetime import datetime
|
||||
return datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
170
reports/T11143/mistral-large-latest/T11143_rapport_final.json
Normal file
170
reports/T11143/mistral-large-latest/T11143_rapport_final.json
Normal file
@ -0,0 +1,170 @@
|
||||
{
|
||||
"ticket_id": "T11143",
|
||||
"timestamp": "2025-04-16 16:33:19",
|
||||
"rapport_complet": "HTTPSConnectionPool(host='api.mistral.ai', port=443): Read timed out. (read timeout=120)",
|
||||
"ticket_analyse": "### 1. Résumé du contexte\n\n**Client :**\n- Nom : Victor BOLLÉE\n- Email : v.bollee@labojcg.fr\n- Société : GIRAUD TP (JCG)\n\n**Sujet du ticket reformulé en une ou plusieurs questions :**\n- Pourquoi l'essai au bleu est-il inaccessible ?\n- Comment résoudre le problème d'accès à l'essai au bleu ?\n\n**Description technique synthétique :**\n- Le client ne parvient pas à accéder à l'essai au bleu.\n- Le support demande de vérifier l'accès à une page spécifique et de fournir une capture d'écran si nécessaire.\n- Le problème s'est résolu de lui-même par la suite.\n\n### 2. Informations techniques détectées\n\n**Logiciels/modules mentionnés :**\n- Aucun logiciel ou module spécifique n'est mentionné.\n\n**Paramètres évoqués :**\n- Aucun paramètre spécifique n'est mentionné.\n\n**Fonctionnalités impactées :**\n- Accès à l'essai au bleu.\n\n**Conditions spécifiques :**\n- Aucune condition spécifique n'est mentionnée.\n\n### 3. Fil de discussion (filtrée, nettoyée, classée)\n\n**Intervenant : Client**\n**Date : 03/04/2025 08:35:20**\n**Contenu :**\nBonjour,\nJe ne parviens pas à accéder à l’essai au bleu :\nMerci par avance pour votre.\nCordialement\n\n\n---\n\n**Intervenant : Support**\n**Date : 03/04/2025 12:17:41**\n**Contenu :**\nBonjour,\nPouvez-vous vérifier si vous avez bien accès à la page suivante en l'ouvrant dans votre navigateur :\nhttps://zk1.brg-lab.com/\nVoici ce que vous devriez voir affiché :\nSi ce n'est pas le cas, pouvez-vous me faire une capture d'écran de ce qui est affiché?\nJe reste à votre entière disposition pour toute information complémentaire.\nCordialement,\n---\nSupport technique\n\n- image.png (image/png) [ID: 145453]\n\n---\n\n**Intervenant : Client**\n**Date : 03/04/2025 12:21:13**\n**Contenu :**\nBonjour,\nLe problème s’est résolu seul par la suite.\nJe vous remercie pour votre retour.\nBonne journée\nPS : l’adresse fonctionne\n\n### 4. Éléments liés à l'analyse visuelle\n\n**Nombre d'images attachées :**\n- 2 images sont attachées au ticket.\n\n**Références aux interfaces ou options à visualiser :**\n- L'accès à l'essai au bleu.\n- La page https://zk1.brg-lab.com/.\n\n**Points à vérifier dans les captures :**\n- Vérifier l'affichage de la page https://zk1.brg-lab.com/.\n- Vérifier l'accès à l'essai au bleu.",
|
||||
"images_analyses": [
|
||||
{
|
||||
"image_name": "image.png",
|
||||
"image_path": "output/ticket_T11143/T11143_20250416_103302/attachments/image.png",
|
||||
"analyse": "### Analyse de l'",
|
||||
"sorting_info": {
|
||||
"is_relevant": true,
|
||||
"reason": "Oui.\n\nL'image montre une capture d'écran d'une page web liée à l'installation et à la configuration de Tomcat, ce qui est pertinent pour un support technique logiciel.",
|
||||
"raw_response": "Oui.\n\nL'image montre une capture d'écran d'une page web liée à l'installation et à la configuration de Tomcat, ce qui est pertinent pour un support technique logiciel.",
|
||||
"metadata": {
|
||||
"image_path": "output/ticket_T11143/T11143_20250416_103302/attachments/image.png",
|
||||
"image_name": "image.png",
|
||||
"timestamp": "20250416_162736",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.8,
|
||||
"max_tokens": 300,
|
||||
"presence_penalty": 0,
|
||||
"frequency_penalty": 0,
|
||||
"stop": [],
|
||||
"stream": false,
|
||||
"n": 1
|
||||
},
|
||||
"source_agent": "AgentImageSorter"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"image_path": "output/ticket_T11143/T11143_20250416_103302/attachments/image.png",
|
||||
"image_name": "image.png",
|
||||
"timestamp": "20250416_162832",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 3000
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"image_name": "image_145435.png",
|
||||
"image_path": "output/ticket_T11143/T11143_20250416_103302/attachments/image_145435.png",
|
||||
"analyse": "### Analyse de l'image\n\n#### 1. Description objective\nL'image montre une interface logicielle de type application web. Voici les éléments visibles :\n- **Titre de la page** : \"Essai au bleu de méthylène (MB) - NF EN 933-9 (02-2022)\"\n- **Barre de navigation horizontale** :\n - Onglets : \"ESSAI\", \"MATÉRIAUX\", \"PORTEFEUILLE\", \"OBSERVATIONS\", \"SMO\", \"HISTORIQUE\"\n - L'onglet \"ESSAI\" est actuellement sélectionné.\n- **Menu latéral gauche** :\n - Sections visibles : \"ENREGISTREMENTS\", \"FAZ\", \"RAPPORTS\"\n - Sous \"ENREGISTREMENTS\", l'option \"Essai au bleu de méthylène\" est sélectionnée.\n - Sous \"FAZ\", les options \"Fiche de foyer\" et \"Statistiques\" sont visibles.\n- **Informations de l'essai** :\n - Identifiant de l'échantillon : \"25-00075\"\n - Date de réception : \"02/04/2025\"\n - Préleveur : \"BOLLÉE Victor\"\n - Date de prélèvement : \"02/04/2025\"\n - Référence : \"25-00075\"\n - Table : \"0/2 C - CARRIÈRE ADCEG\"\n- **Pied de page** :\n - Message : \"Impossible de trouver l'adresse IP du serveur de zk1.brg-lab.com\"\n- **URL visible dans la barre d'adresse du navigateur** :\n - \"https://zk1.brg-lab.com/BRG-LAB/PAGE_programme/essai/CFAAAHVNGDAA\"\n\n#### 2. Éléments techniques clés\n- **Onglets actifs** : \"ESSAI\", \"MATÉRIAUX\", \"PORTEFEUILLE\", \"OBSERVATIONS\", \"SMO\", \"HISTORIQUE\"\n- **Menu latéral gauche** :\n - Options interactives : \"ENREGISTREMENTS\", \"FAZ\", \"RAPPORTS\"\n - Sous \"ENREGISTREMENTS\", l'option \"Essai au bleu de méthylène\" est sélectionnée.\n - Sous \"FAZ\", les options \"Fiche de foyer\" et \"Statistiques\" sont visibles et interactives.\n- **Informations de l'essai** :\n - Champs préremplis : Identifiant de l'échantillon, date de réception, préleveur, date de prélèvement, référence, table.\n- **Pied de page** :\n - Message d'erreur : \"Impossible de trouver l'adresse IP du serveur de zk1.brg-lab.com\"\n- **URL** :\n - Contient des paramètres spécifiques : \"CFAAAHVNGDAA\"\n\n#### 3. Éléments mis en évidence\nAucun élément n'est explicitement entouré, encadré, surligné ou fléché dans l'image. Tous les éléments sont affichés de manière standard.\n\n#### 4. Relation avec le problème\n- L'image montre l'interface de l'essai au bleu de méthylène, qui est directement liée au problème d'accès décrit dans le ticket.\n- Le message d'erreur dans le pied de page (\"Impossible de trouver l'adresse IP du serveur de zk1.brg-lab.com\") pourrait être lié à un problème technique, mais aucune interprétation n'est faite ici.\n\n#### 5. Réponses potentielles\n- L'image montre que l'essai au bleu de méthylène est accessible, ce qui pourrait indiquer que le problème d'accès a été résolu, comme mentionné dans le fil de discussion.\n- Le message d'erreur dans le pied de page pourrait être une piste pour des investigations techniques ultérieures.\n\n#### 6. Lien avec la discussion\n- L'image correspond à l'étape où le client a été invité à vérifier l'accès à la page https://zk1.brg-lab.com/.\n- Le client a confirmé que l'adresse fonctionnait, ce qui est cohérent avec l'affichage de l'interface dans l'image.\n- Le problème d'accès à l'essai au bleu semble résolu, comme indiqué dans le fil de discussion.",
|
||||
"sorting_info": {
|
||||
"is_relevant": true,
|
||||
"reason": "Oui.\nL'image montre une capture d'écran d'une interface logicielle de BRG-LAB, ce qui est pertinent pour un ticket de support technique.",
|
||||
"raw_response": "Oui.\nL'image montre une capture d'écran d'une interface logicielle de BRG-LAB, ce qui est pertinent pour un ticket de support technique.",
|
||||
"metadata": {
|
||||
"image_path": "output/ticket_T11143/T11143_20250416_103302/attachments/image_145435.png",
|
||||
"image_name": "image_145435.png",
|
||||
"timestamp": "20250416_162825",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.8,
|
||||
"max_tokens": 300,
|
||||
"presence_penalty": 0,
|
||||
"frequency_penalty": 0,
|
||||
"stop": [],
|
||||
"stream": false,
|
||||
"n": 1
|
||||
},
|
||||
"source_agent": "AgentImageSorter"
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"image_path": "output/ticket_T11143/T11143_20250416_103302/attachments/image_145435.png",
|
||||
"image_name": "image_145435.png",
|
||||
"timestamp": "20250416_163116",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 3000
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"chronologie_echanges": [],
|
||||
"resume": "",
|
||||
"analyse_images": "",
|
||||
"diagnostic": "",
|
||||
"statistiques": {
|
||||
"total_images": 4,
|
||||
"images_pertinentes": 2,
|
||||
"generation_time": 123.262321
|
||||
},
|
||||
"metadata": {
|
||||
"model": "mistral-large-latest",
|
||||
"model_version": "non spécifiée",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 10000,
|
||||
"generation_time": 123.262321,
|
||||
"timestamp": "2025-04-16 16:33:19",
|
||||
"agents": {
|
||||
"image_sorter": {
|
||||
"image_path": "output/ticket_T11143/T11143_20250416_103302/attachments/image.png",
|
||||
"image_name": "image.png",
|
||||
"timestamp": "20250416_162736",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.8,
|
||||
"max_tokens": 300,
|
||||
"presence_penalty": 0,
|
||||
"frequency_penalty": 0,
|
||||
"stop": [],
|
||||
"stream": false,
|
||||
"n": 1
|
||||
},
|
||||
"source_agent": "AgentImageSorter"
|
||||
},
|
||||
"image_analyser": {
|
||||
"image_path": "output/ticket_T11143/T11143_20250416_103302/attachments/image.png",
|
||||
"image_name": "image.png",
|
||||
"timestamp": "20250416_162832",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 3000
|
||||
}
|
||||
},
|
||||
"report_generator": {
|
||||
"model": "mistral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 10000,
|
||||
"prompt_version": "v3.2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"prompts_utilisés": {
|
||||
"rapport_generator": "Tu es un expert en génération de rapports techniques pour BRG-Lab pour la société CBAO.\nTa mission est de synthétiser les analyses (ticket et images) en un rapport structuré.\n\nEXIGENCE ABSOLUE - Ton rapport DOIT inclure dans l'ordre:\n1. Un résumé du problème initial (nom de la demande + description)\n2. Une analyse détaillée des images pertinentes en lien avec le problème\n3. Une synthèse globale des analyses d'images\n4. Une reconstitution du fil de discussion client/support\n5. Un tableau JSON de chronologie des échanges avec cette structure:\n```json\n{\n \"chronologie_echanges\": [\n {\"date\": \"date exacte\", \"emetteur\": \"CLIENT ou SUPPORT\", \"type\": \"Question ou Réponse\", \"contenu\": \"contenu synthétisé\"}\n ]\n}\n```\n6. Un diagnostic technique des causes probables\n\nMÉTHODE D'ANALYSE (ÉTAPES OBLIGATOIRES):\n1. ANALYSE TOUTES les images AVANT de créer le tableau des échanges\n2. Concentre-toi sur les éléments mis en évidence (encadrés/surlignés) dans chaque image\n3. Réalise une SYNTHÈSE TRANSVERSALE en expliquant comment les images se complètent\n4. Remets les images en ordre chronologique selon le fil de discussion\n5. CONSERVE TOUS les liens documentaires, FAQ et références techniques\n6. Ajoute une entrée \"Complément visuel\" dans le tableau des échanges"
|
||||
},
|
||||
"workflow": {
|
||||
"etapes": [
|
||||
{
|
||||
"numero": 1,
|
||||
"nom": "Analyse du ticket",
|
||||
"agent": "AgentTicketAnalyser",
|
||||
"description": "Extraction et analyse des informations du ticket"
|
||||
},
|
||||
{
|
||||
"numero": 2,
|
||||
"nom": "Tri des images",
|
||||
"agent": "AgentImageSorter",
|
||||
"description": "Identification des images pertinentes pour l'analyse"
|
||||
},
|
||||
{
|
||||
"numero": 3,
|
||||
"nom": "Analyse des images",
|
||||
"agent": "AgentImageAnalyser",
|
||||
"description": "Analyse détaillée des images pertinentes identifiées"
|
||||
},
|
||||
{
|
||||
"numero": 4,
|
||||
"nom": "Génération du rapport",
|
||||
"agent": "AgentReportGenerator",
|
||||
"description": "Synthèse des analyses et génération du rapport final"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
245
reports/T11143/mistral-large-latest/T11143_rapport_final.md
Normal file
245
reports/T11143/mistral-large-latest/T11143_rapport_final.md
Normal file
@ -0,0 +1,245 @@
|
||||
# Rapport d'analyse: T11143
|
||||
|
||||
## Processus d'analyse
|
||||
|
||||
_Vue d'ensemble du processus d'analyse automatisé_
|
||||
|
||||
1. **Analyse du ticket** - `AgentTicketAnalyser`
|
||||
- Extraction et analyse des informations du ticket
|
||||
|
||||
2. **Tri des images** - `AgentImageSorter`
|
||||
- Identification des images pertinentes pour l'analyse
|
||||
|
||||
3. **Analyse des images** - `AgentImageAnalyser`
|
||||
- Analyse détaillée des images pertinentes identifiées
|
||||
|
||||
4. **Génération du rapport** - `AgentReportGenerator`
|
||||
- Synthèse des analyses et génération du rapport final
|
||||
|
||||
**Statistiques:**
|
||||
- Images totales: 4
|
||||
- Images pertinentes: 2
|
||||
- Temps de génération: 123.26 secondes
|
||||
|
||||
## 1. Analyse du ticket
|
||||
|
||||
_Agent utilisé: `AgentTicketAnalyser` - Analyse du contenu du ticket_
|
||||
|
||||
```
|
||||
### 1. Résumé du contexte
|
||||
|
||||
**Client :**
|
||||
- Nom : Victor BOLLÉE
|
||||
- Email : v.bollee@labojcg.fr
|
||||
- Société : GIRAUD TP (JCG)
|
||||
|
||||
**Sujet du ticket reformulé en une ou plusieurs questions :**
|
||||
- Pourquoi l'essai au bleu est-il inaccessible ?
|
||||
- Comment résoudre le problème d'accès à l'essai au bleu ?
|
||||
|
||||
**Description technique synthétique :**
|
||||
- Le client ne parvient pas à accéder à l'essai au bleu.
|
||||
- Le support demande de vérifier l'accès à une page spécifique et de fournir une capture d'écran si nécessaire.
|
||||
- Le problème s'est résolu de lui-même par la suite.
|
||||
|
||||
### 2. Informations techniques détectées
|
||||
|
||||
**Logiciels/modules mentionnés :**
|
||||
- Aucun logiciel ou module spécifique n'est mentionné.
|
||||
|
||||
**Paramètres évoqués :**
|
||||
- Aucun paramètre spécifique n'est mentionné.
|
||||
|
||||
**Fonctionnalités impactées :**
|
||||
- Accès à l'essai au bleu.
|
||||
|
||||
**Conditions spécifiques :**
|
||||
- Aucune condition spécifique n'est mentionnée.
|
||||
|
||||
### 3. Fil de discussion (filtrée, nettoyée, classée)
|
||||
|
||||
**Intervenant : Client**
|
||||
**Date : 03/04/2025 08:35:20**
|
||||
**Contenu :**
|
||||
Bonjour,
|
||||
Je ne parviens pas à accéder à l’essai au bleu :
|
||||
Merci par avance pour votre.
|
||||
Cordialement
|
||||

|
||||
|
||||
---
|
||||
|
||||
**Intervenant : Support**
|
||||
**Date : 03/04/2025 12:17:41**
|
||||
**Contenu :**
|
||||
Bonjour,
|
||||
Pouvez-vous vérifier si vous avez bien accès à la page suivante en l'ouvrant dans votre navigateur :
|
||||
https://zk1.brg-lab.com/
|
||||
Voici ce que vous devriez voir affiché :
|
||||
Si ce n'est pas le cas, pouvez-vous me faire une capture d'écran de ce qui est affiché?
|
||||
Je reste à votre entière disposition pour toute information complémentaire.
|
||||
Cordialement,
|
||||
---
|
||||
Support technique
|
||||
|
||||
- image.png (image/png) [ID: 145453]
|
||||
|
||||
---
|
||||
|
||||
**Intervenant : Client**
|
||||
**Date : 03/04/2025 12:21:13**
|
||||
**Contenu :**
|
||||
Bonjour,
|
||||
Le problème s’est résolu seul par la suite.
|
||||
Je vous remercie pour votre retour.
|
||||
Bonne journée
|
||||
PS : l’adresse fonctionne
|
||||
|
||||
### 4. Éléments liés à l'analyse visuelle
|
||||
|
||||
**Nombre d'images attachées :**
|
||||
- 2 images sont attachées au ticket.
|
||||
|
||||
**Références aux interfaces ou options à visualiser :**
|
||||
- L'accès à l'essai au bleu.
|
||||
- La page https://zk1.brg-lab.com/.
|
||||
|
||||
**Points à vérifier dans les captures :**
|
||||
- Vérifier l'affichage de la page https://zk1.brg-lab.com/.
|
||||
- Vérifier l'accès à l'essai au bleu.
|
||||
```
|
||||
|
||||
## 2. Tri des images
|
||||
|
||||
_Agent utilisé: `AgentImageSorter` - Identifie les images pertinentes_
|
||||
|
||||
| Image | Pertinence | Raison |
|
||||
|-------|------------|--------|
|
||||
| image.png | ✅ Pertinente | Oui |
|
||||
| image_145435.png | ✅ Pertinente | Oui |
|
||||
|
||||
## 3. Analyse des images
|
||||
|
||||
_Agent utilisé: `AgentImageAnalyser` - Analyse détaillée des captures d'écran_
|
||||
|
||||
### Image 1: image.png
|
||||
|
||||
### Analyse de l'
|
||||
|
||||
### Image 2: image_145435.png
|
||||
|
||||
### Analyse de l'image
|
||||
|
||||
#### 1. Description objective
|
||||
L'image montre une interface logicielle de type application web. Voici les éléments visibles :
|
||||
- **Titre de la page** : "Essai au bleu de méthylène (MB) - NF EN 933-9 (02-2022)"
|
||||
- **Barre de navigation horizontale** :
|
||||
- Onglets : "ESSAI", "MATÉRIAUX", "PORTEFEUILLE", "OBSERVATIONS", "SMO", "HISTORIQUE"
|
||||
- L'onglet "ESSAI" est actuellement sélectionné.
|
||||
- **Menu latéral gauche** :
|
||||
- Sections visibles : "ENREGISTREMENTS", "FAZ", "RAPPORTS"
|
||||
- Sous "ENREGISTREMENTS", l'option "Essai au bleu de méthylène" est sélectionnée.
|
||||
- Sous "FAZ", les options "Fiche de foyer" et "Statistiques" sont visibles.
|
||||
- **Informations de l'essai** :
|
||||
- Identifiant de l'échantillon : "25-00075"
|
||||
- Date de réception : "02/04/2025"
|
||||
- Préleveur : "BOLLÉE Victor"
|
||||
- Date de prélèvement : "02/04/2025"
|
||||
- Référence : "25-00075"
|
||||
- Table : "0/2 C - CARRIÈRE ADCEG"
|
||||
- **Pied de page** :
|
||||
- Message : "Impossible de trouver l'adresse IP du serveur de zk1.brg-lab.com"
|
||||
- **URL visible dans la barre d'adresse du navigateur** :
|
||||
- "https://zk1.brg-lab.com/BRG-LAB/PAGE_programme/essai/CFAAAHVNGDAA"
|
||||
|
||||
#### 2. Éléments techniques clés
|
||||
- **Onglets actifs** : "ESSAI", "MATÉRIAUX", "PORTEFEUILLE", "OBSERVATIONS", "SMO", "HISTORIQUE"
|
||||
- **Menu latéral gauche** :
|
||||
- Options interactives : "ENREGISTREMENTS", "FAZ", "RAPPORTS"
|
||||
- Sous "ENREGISTREMENTS", l'option "Essai au bleu de méthylène" est sélectionnée.
|
||||
- Sous "FAZ", les options "Fiche de foyer" et "Statistiques" sont visibles et interactives.
|
||||
- **Informations de l'essai** :
|
||||
- Champs préremplis : Identifiant de l'échantillon, date de réception, préleveur, date de prélèvement, référence, table.
|
||||
- **Pied de page** :
|
||||
- Message d'erreur : "Impossible de trouver l'adresse IP du serveur de zk1.brg-lab.com"
|
||||
- **URL** :
|
||||
- Contient des paramètres spécifiques : "CFAAAHVNGDAA"
|
||||
|
||||
#### 3. Éléments mis en évidence
|
||||
Aucun élément n'est explicitement entouré, encadré, surligné ou fléché dans l'image. Tous les éléments sont affichés de manière standard.
|
||||
|
||||
#### 4. Relation avec le problème
|
||||
- L'image montre l'interface de l'essai au bleu de méthylène, qui est directement liée au problème d'accès décrit dans le ticket.
|
||||
- Le message d'erreur dans le pied de page ("Impossible de trouver l'adresse IP du serveur de zk1.brg-lab.com") pourrait être lié à un problème technique, mais aucune interprétation n'est faite ici.
|
||||
|
||||
#### 5. Réponses potentielles
|
||||
- L'image montre que l'essai au bleu de méthylène est accessible, ce qui pourrait indiquer que le problème d'accès a été résolu, comme mentionné dans le fil de discussion.
|
||||
- Le message d'erreur dans le pied de page pourrait être une piste pour des investigations techniques ultérieures.
|
||||
|
||||
#### 6. Lien avec la discussion
|
||||
- L'image correspond à l'étape où le client a été invité à vérifier l'accès à la page https://zk1.brg-lab.com/.
|
||||
- Le client a confirmé que l'adresse fonctionnait, ce qui est cohérent avec l'affichage de l'interface dans l'image.
|
||||
- Le problème d'accès à l'essai au bleu semble résolu, comme indiqué dans le fil de discussion.
|
||||
|
||||
## 3.1 Synthèse globale des analyses d'images
|
||||
|
||||
_Analyse transversale des captures d'écran_
|
||||
|
||||
### Points communs et complémentaires
|
||||
|
||||
Cette section présente une analyse transversale de toutes les images pertinentes,
|
||||
mettant en évidence les points communs et complémentaires entre elles.
|
||||
|
||||
#### Éléments mis en évidence dans les images
|
||||
|
||||
- Image 1: Aucun élément n'est explicitement entouré, encadré, surligné ou fléché dans l'image. Tous les éléments sont affichés de manière standard.
|
||||
|
||||
#### Relations avec le problème
|
||||
|
||||
- Image 1: - L'image montre l'interface de l'essai au bleu de méthylène, qui est directement liée au problème d'accès décrit dans le ticket.
|
||||
- Le message d'erreur dans le pied de page ("Impossible de trouver l'adresse IP du serveur de zk1.brg-lab.com") pourrait être lié à un problème technique, mais aucune interprétation n'est faite ici.
|
||||
|
||||
#### Liens avec la discussion
|
||||
|
||||
- Image 1: - L'image correspond à l'étape où le client a été invité à vérifier l'accès à la page https://zk1.brg-lab.com/.
|
||||
- Le client a confirmé que l'adresse fonctionnait, ce qui est cohérent avec l'affichage de l'interface dans l'image.
|
||||
- Le problème d'accès à l'essai au bleu semble résolu, comme indiqué dans le fil de discussion.
|
||||
|
||||
## 4. Synthèse finale
|
||||
|
||||
_Agent utilisé: `AgentReportGenerator` - Synthèse et conclusions_
|
||||
|
||||
## Métadonnées
|
||||
|
||||
- **Date de génération**: 2025-04-16 16:33:19
|
||||
- **Modèle principal utilisé**: mistral-large-latest
|
||||
|
||||
## Détails des analyses
|
||||
|
||||
Toutes les analyses requises ont été effectuées avec succès.
|
||||
|
||||
- **Analyse des images**: PRÉSENT
|
||||
- **Analyse du ticket**: PRÉSENT
|
||||
- **Diagnostic**: PRÉSENT
|
||||
|
||||
## Configuration des agents
|
||||
|
||||
### AgentImageSorter
|
||||
|
||||
#### Paramètres
|
||||
|
||||
|
||||
### AgentImageAnalyser
|
||||
|
||||
#### Paramètres
|
||||
|
||||
|
||||
### AgentReportGenerator
|
||||
|
||||
#### Paramètres
|
||||
|
||||
- **Modèle utilisé**: mistral-large-latest
|
||||
- **Température**: 0.2
|
||||
- **Top_p**: 0.9
|
||||
- **Max_tokens**: 10000
|
||||
- **Version du prompt**: v3.2
|
||||
Loading…
x
Reference in New Issue
Block a user