1804-11:27avantuptest

This commit is contained in:
Ladebeze66 2025-04-18 11:28:06 +02:00
parent 05c033a06e
commit 9537e0285d
8 changed files with 1032 additions and 238 deletions

4
.gitignore vendored
View File

@ -3,9 +3,9 @@ venv/
env/
ENV/
venv_new/
reports/
CSV/
*.yml
*.yaml

View File

@ -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)

View 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")

View File

@ -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"""

View File

@ -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")

View 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")

View 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 à lessai au bleu :\nMerci par avance pour votre.\nCordialement\n![Image](https://odoo.cbao.fr/web/image/145435?access_token=608ac9e7-3627-4a13-a8ec-06ff5046ebf3)\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 sest résolu seul par la suite.\nJe vous remercie pour votre retour.\nBonne journée\nPS : ladresse 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"
}
]
}
}

View 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 à lessai au bleu :
Merci par avance pour votre.
Cordialement
![Image](https://odoo.cbao.fr/web/image/145435?access_token=608ac9e7-3627-4a13-a8ec-06ff5046ebf3)
---
**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 sest résolu seul par la suite.
Je vous remercie pour votre retour.
Bonne journée
PS : ladresse 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