This commit is contained in:
Ladebeze66 2025-04-14 15:57:31 +02:00
parent 70af855cd5
commit e63577f0a0
6 changed files with 630 additions and 0 deletions

View File

@ -0,0 +1,2 @@
Question,Réponse
ERREUR: Impossible d'analyser le ticket: BaseLLM.interroger() got an unexpected keyword argument 'prompt',N/A (aucune image fournie)
1 Question Réponse
2 ERREUR: Impossible d'analyser le ticket: BaseLLM.interroger() got an unexpected keyword argument 'prompt' N/A (aucune image fournie)

View File

@ -0,0 +1,178 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import json
import time
import logging
from typing import Dict, Any, Optional
# Importer BaseAgent depuis le répertoire utils
from agents.utils.base_agent import BaseAgent
# Configuration du logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger("AgentTicketAnalyser_MistralMedium")
class AgentTicketAnalyser(BaseAgent):
"""
Agent spécialisé pour analyser un ticket et en extraire les informations clés.
Version optimisée pour Mistral Medium.
"""
def __init__(self, llm: Any):
"""
Initialise l'agent d'analyse de ticket avec un modèle LLM.
Args:
llm: Instance du modèle de langage à utiliser
"""
super().__init__(llm)
self.temperature = 0.2 # Température plus basse pour une analyse factuelle
self.top_p = 0.95
self.max_tokens = 2048
# System prompt spécifique pour l'analyse de tickets
self.system_prompt = """Tu es un assistant spécialisé dans l'analyse des tickets de support technique.
Ton rôle est d'analyser le contenu du ticket pour extraire les informations essentielles et de structurer cette analyse.
À partir du ticket que l'on te fournit, tu dois :
1. Extraire et synthétiser les points clés du ticket
2. Identifier les informations techniques importantes
3. Comprendre le problème principal et son contexte
4. Déterminer si des images sont mentionnées ou semblent nécessaires pour comprendre le problème
Ta réponse doit suivre un format strictement structuré :
```
1. Résumé du contexte
- Client : [Nom du contact client si mentionné]
- Sujet du ticket : [Sujet principal du ticket en une phrase]
- Description technique synthétique : [Synthèse technique du problème en 1-2 phrases]
2. Informations techniques détectées
- Logiciels/modules mentionnés : [Liste des logiciels, applications ou modules mentionnés]
- Paramètres évoqués : [Paramètres, configurations ou variables mentionnés]
- Fonctionnalités impactées : [Fonctionnalités ou processus touchés par le problème]
- Conditions spécifiques : [Conditions particulières où le problème se manifeste]
3. Analyse du problème
- Problème principal : [Description claire du problème principal]
- Impact pour l'utilisateur : [Comment ce problème affecte l'utilisateur]
- Contexte d'apparition : [Quand et comment le problème survient]
- Complexité estimée : [FAIBLE/MOYENNE/ÉLEVÉE] avec justification
4. Pertinence des images
- Images mentionnées : [OUI/NON] et leur importance [FAIBLE/MOYENNE/ÉLEVÉE]
- Justification : [Pourquoi les images sont importantes ou non pour comprendre le problème]
5. Questions pour clarification (si nécessaire)
- [Questions que le support technique devrait poser pour mieux comprendre le problème]
```
Reste factuel et concis dans ton analyse. N'invente pas d'information qui ne serait pas présente dans le ticket.
Concentre-toi uniquement sur l'analyse du contenu du ticket, pas sur la résolution du problème.
"""
def executer(self, ticket_data: Dict[str, Any]) -> str:
"""
Analyse un ticket à partir des données fournies.
Args:
ticket_data: Dictionnaire contenant les données du ticket
- 'ticket_summary': Résumé du ticket
- 'messages': Liste des messages du ticket
Returns:
str: Analyse structurée du ticket
"""
start_time = time.time()
try:
# Extraire le résumé du ticket
ticket_summary = ticket_data.get('ticket_summary', {})
ticket_code = ticket_summary.get('code', 'INCONNU')
ticket_sujet = ticket_summary.get('sujet', 'Sans sujet')
# Log des informations de base du ticket
logger.info(f"Analyse du ticket {ticket_code}: {ticket_sujet}")
print(f" Analyse du ticket {ticket_code}: {ticket_sujet[:80]}{'...' if len(ticket_sujet) > 80 else ''}")
# Construire le contexte à partir des messages
messages = ticket_data.get('messages', [])
# Construire un prompt pour analyser le ticket
ticket_prompt = self._construire_prompt_ticket(ticket_summary, messages)
# Analyser le ticket avec le LLM
analyse = self.llm.generate(
system_prompt=self.system_prompt,
prompt=ticket_prompt,
temperature=self.temperature,
top_p=self.top_p,
max_tokens=self.max_tokens
)
# Calcul du temps de génération
generation_time = time.time() - start_time
# Log de l'analyse complétée
logger.info(f"Analyse complétée en {generation_time:.2f} secondes")
print(f" Analyse complétée en {generation_time:.2f} secondes")
return analyse
except Exception as e:
logger.error(f"Erreur lors de l'analyse du ticket: {str(e)}")
return f"ERREUR: Impossible d'analyser le ticket: {str(e)}"
def _construire_prompt_ticket(self, ticket_summary: Dict[str, Any], messages: list) -> str:
"""
Construit un prompt détaillé à partir des données du ticket.
Args:
ticket_summary: Résumé du ticket
messages: Liste des messages du ticket
Returns:
str: Prompt détaillé pour l'analyse
"""
# Construire l'en-tête avec les informations du ticket
prompt = f"# TICKET: {ticket_summary.get('code', 'INCONNU')}\n"
prompt += f"Sujet: {ticket_summary.get('sujet', 'Sans sujet')}\n"
prompt += f"Statut: {ticket_summary.get('statut', 'Inconnu')}\n"
prompt += f"Priorité: {ticket_summary.get('priorité', 'Non définie')}\n"
prompt += f"Date de création: {ticket_summary.get('date_création', 'Inconnue')}\n\n"
# Ajouter la section des messages
prompt += "## MESSAGES DU TICKET\n\n"
for i, message in enumerate(messages, 1):
# Extraire les informations du message
date = message.get('date', 'Date inconnue')
auteur = message.get('auteur', 'Auteur inconnu')
role = message.get('role', 'Rôle inconnu')
contenu = message.get('contenu', '')
# Ajouter l'en-tête du message
prompt += f"### Message {i} - {date}\n"
prompt += f"De: {auteur} ({role})\n\n"
# Ajouter le contenu du message
prompt += f"{contenu}\n\n"
# Ajouter les informations sur les pièces jointes si disponibles
attachments = message.get('attachments', [])
if attachments:
prompt += f"Pièces jointes ({len(attachments)}):\n"
for attachment in attachments:
prompt += f"- {attachment.get('nom', 'Sans nom')} ({attachment.get('type', 'Type inconnu')})\n"
prompt += "\n"
# Ajouter les instructions d'analyse
prompt += "\n## INSTRUCTIONS\n"
prompt += "Analyse ce ticket selon les instructions dans ton system prompt. "
prompt += "Réponds uniquement avec l'analyse structurée demandée."
return prompt

View File

@ -0,0 +1,193 @@
from agents.utils.base_agent import BaseAgent
import logging
import os
from typing import List, Dict, Any, Optional
import json
logger = logging.getLogger("AgentImageSorter")
class AgentImageSorter(BaseAgent):
"""
Agent pour trier les images et identifier celles qui sont pertinentes pour l'analyse.
"""
def __init__(self, llm):
super().__init__(llm)
# Configuration locale de l'agent
self.system_prompt = """Tu es un agent spécialisé dans l'analyse et le tri d'images pour le support technique.
Ta mission est d'identifier les images pertinentes pour comprendre un problème technique, en distinguant
celles qui contiennent des informations utiles (captures d'écran, photos de produits défectueux, etc.)
de celles qui sont décoratives ou non informatives.
Suis ces directives pour évaluer chaque image:
1. Identifie le contenu principal de l'image (capture d'écran, photo, schéma, etc.)
2. Évalue si l'image contient des informations utiles pour comprendre le problème technique
3. Détermine si l'image montre un problème, une erreur, ou une situation anormale
4. Examine si l'image contient du texte ou des messages d'erreur importants
Pour chaque image, tu dois fournir:
- Une description concise du contenu (1-2 phrases)
- Un niveau de pertinence (Élevé/Moyen/Faible)
- Une justification de ton évaluation"""
self.image_batch_size = 3 # Nombre d'images à analyser par lot
def executer(self, attachments_dir: str, contexte: Optional[Dict] = None) -> Dict[str, Dict[str, Any]]:
"""
Trie les images dans un répertoire de pièces jointes et identifie celles qui sont pertinentes.
Args:
attachments_dir: Chemin vers le répertoire des pièces jointes
contexte: Contexte optionnel sur le ticket pour aider à l'analyse
Returns:
Dictionnaire avec les chemins des images comme clés et les résultats d'analyse comme valeurs
"""
logger.info(f"Tri des images dans: {attachments_dir}")
# Vérifier si attachments_dir est un fichier ou un dossier
if os.path.isfile(attachments_dir):
logger.info(f"Le chemin fourni est un fichier et non un dossier: {attachments_dir}")
# Si c'est un fichier image, on le traite directement
if attachments_dir.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff')):
images = [attachments_dir]
# Le vrai dossier est le répertoire parent
attachments_dir = os.path.dirname(attachments_dir)
else:
logger.error(f"Le fichier n'est pas une image: {attachments_dir}")
return {}
# Vérifier que le répertoire existe
elif not os.path.exists(attachments_dir):
logger.error(f"Le répertoire {attachments_dir} n'existe pas")
return {}
else:
# Lister les images du répertoire
images = [os.path.join(attachments_dir, f) for f in os.listdir(attachments_dir)
if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff'))]
if not images:
logger.info(f"Aucune image trouvée dans {attachments_dir}")
return {}
logger.info(f"Nombre d'images trouvées: {len(images)}")
# Analyser les images individuellement ou par lots selon la configuration
resultats = {}
# Préparer un contexte spécifique pour l'analyse des images
contexte_analyse = "Aucun contexte disponible."
if contexte:
# Extraire des informations pertinentes du contexte
sujet = contexte.get("sujet", "")
description = contexte.get("description", "")
if sujet and description:
contexte_analyse = f"Sujet du ticket: {sujet}\nDescription du problème: {description}"
elif sujet:
contexte_analyse = f"Sujet du ticket: {sujet}"
elif description:
contexte_analyse = f"Description du problème: {description}"
# Traitement image par image
for image_path in images:
image_name = os.path.basename(image_path)
logger.info(f"Analyse de l'image: {image_name}")
prompt = f"""Analyse cette image dans le contexte suivant:
{contexte_analyse}
Réponds au format JSON avec la structure suivante:
{{
"description": "Description concise du contenu",
"pertinence": "Élevé/Moyen/Faible",
"justification": "Pourquoi cette image est pertinente ou non",
"contenu_technique": true/false
}}"""
# Analyser l'image
try:
resultat_brut = self.llm.interroger_avec_image(image_path, prompt)
# Extraire le JSON de la réponse
json_str = self._extraire_json(resultat_brut)
if json_str:
try:
# Charger le JSON
analyse = json.loads(json_str)
# Ajouter le chemin complet pour référence
analyse["image_path"] = image_path
resultats[image_path] = analyse
pertinence = analyse.get("pertinence", "").lower()
logger.info(f"Image {image_name} - Pertinence: {pertinence}")
except json.JSONDecodeError:
logger.error(f"Erreur de décodage JSON pour {image_name}")
resultats[image_path] = {
"description": "Erreur d'analyse",
"pertinence": "Inconnue",
"justification": "Erreur de traitement de la réponse",
"contenu_technique": False,
"image_path": image_path
}
else:
logger.error(f"Format de réponse incorrect pour {image_name}")
# Créer une entrée avec les informations disponibles
resultats[image_path] = {
"description": "Analyse non disponible",
"pertinence": "Inconnue",
"justification": "Format de réponse incorrect",
"contenu_technique": False,
"image_path": image_path
}
except Exception as e:
logger.error(f"Erreur lors de l'analyse de l'image {image_name}: {str(e)}")
resultats[image_path] = {
"description": "Erreur d'analyse",
"pertinence": "Inconnue",
"justification": f"Exception: {str(e)}",
"contenu_technique": False,
"image_path": image_path
}
return resultats
def _extraire_json(self, texte: str) -> Optional[str]:
"""
Extrait le contenu JSON d'une chaîne de texte.
Args:
texte: Texte contenant potentiellement du JSON
Returns:
Chaîne JSON extraite ou None si aucun JSON n'est trouvé
"""
# Chercher des accolades ouvrantes et fermantes
debut = texte.find('{')
fin = texte.rfind('}')
if debut != -1 and fin != -1 and fin > debut:
return texte[debut:fin+1]
return None
def filtrer_images_pertinentes(self, resultats: Dict[str, Dict[str, Any]]) -> List[str]:
"""
Filtre les images pour ne conserver que celles qui sont pertinentes.
Args:
resultats: Dictionnaire avec les résultats d'analyse des images
Returns:
Liste des chemins des images pertinentes
"""
pertinentes = []
for image_path, analyse in resultats.items():
pertinence = analyse.get("pertinence", "").lower()
contenu_technique = analyse.get("contenu_technique", False)
# Considérer comme pertinentes les images avec pertinence élevée ou moyenne
# ou celles marquées comme ayant un contenu technique
if pertinence in ["élevé", "moyen", "eleve", "elevé", "medium", "high", "moyenne"] or contenu_technique:
pertinentes.append(image_path)
return pertinentes

View File

@ -0,0 +1 @@
Question,Réponse
1 Question Réponse

View File

@ -0,0 +1,81 @@
{
"ticket_id": "T9656",
"timestamp": "2025-04-14 15:49:35",
"rapport_complet": "# Rapport d'analyse: ERREUR - Impossible d'analyser le ticket: BaseLLM.interroger() got an unexpected keyword argument 'prompt'\n\n## Résumé du problème\nLe client a signalé une erreur lors de l'analyse d'un ticket. Le message d'erreur indique que la fonction BaseLLM.interroger() a reçu un argument inattendu nommé 'prompt'.\n\n## Analyse des images\nÉtant donné qu'aucune image n'a été fournie pour ce ticket, cette section sera laissée vide.\n\n## 3.1 Synthèse globale des analyses d'images\n\n_Analyse transversale des captures d'écran_\n\nComme aucune image n'a été fournie pour ce ticket, il n'y a pas de synthèse globale des analyses d'images à fournir.\n\n## Fil de discussion\nLe fil de discussion se compose uniquement du message initial du client et de l'analyse du support technique.\n\n## Tableau questions/réponses\n\n```json\n{\n \"chronologie_echanges\": [\n {\n \"date\": \"date demande\",\n \"emetteur\": \"CLIENT\",\n \"type\": \"Question\",\n \"contenu\": \"ERREUR: Impossible d'analyser le ticket: BaseLLM.interroger() got an unexpected keyword argument 'prompt'\"\n },\n {\n \"date\": \"date analyse\",\n \"emetteur\": \"SUPPORT\",\n \"type\": \"Complément visuel\",\n \"contenu\": \"N/A (aucune image fournie)\"\n }\n ]\n}\n```\n\n## Diagnostic technique\n\nLe message d'erreur indique qu'une fonction BaseLLM.interroger() a reçu un argument inattendu nommé 'prompt'. Cela suggère que la fonction a été appelée avec un paramètre non prévu, ce qui a entraîné une erreur. Il est possible que le code appelant cette fonction ait été modifié ou qu'il y ait une incompatibilité entre les versions de différentes bibliothèques utilisées.\n\nPour résoudre ce problème, il est recommandé de vérifier la documentation de la fonction BaseLLM.interroger() pour confirmer les arguments attendus et de s'assurer que le code appelant cette fonction est correctement configuré. Il peut également être utile de vérifier les versions des bibliothèques utilisées et de mettre à jour si nécessaire.",
"ticket_analyse": "ERREUR: Impossible d'analyser le ticket: BaseLLM.interroger() got an unexpected keyword argument 'prompt'",
"images_analyses": [],
"chronologie_echanges": [
{
"date": "date demande",
"emetteur": "CLIENT",
"type": "Question",
"contenu": "ERREUR: Impossible d'analyser le ticket: BaseLLM.interroger() got an unexpected keyword argument 'prompt'"
},
{
"date": "date analyse",
"emetteur": "SUPPORT",
"type": "Complément visuel",
"contenu": "N/A (aucune image fournie)"
}
],
"resume": "Le client a signalé une erreur lors de l'analyse d'un ticket. Le message d'erreur indique que la fonction BaseLLM.interroger() a reçu un argument inattendu nommé 'prompt'.\n\n### Fil de discussion\nLe fil de discussion se compose uniquement du message initial du client et de l'analyse du support technique.",
"analyse_images": "Étant donné qu'aucune image n'a été fournie pour ce ticket, cette section sera laissée vide.",
"diagnostic": "Le message d'erreur indique qu'une fonction BaseLLM.interroger() a reçu un argument inattendu nommé 'prompt'. Cela suggère que la fonction a été appelée avec un paramètre non prévu, ce qui a entraîné une erreur. Il est possible que le code appelant cette fonction ait été modifié ou qu'il y ait une incompatibilité entre les versions de différentes bibliothèques utilisées.\n\nPour résoudre ce problème, il est recommandé de vérifier la documentation de la fonction BaseLLM.interroger() pour confirmer les arguments attendus et de s'assurer que le code appelant cette fonction est correctement configuré. Il peut également être utile de vérifier les versions des bibliothèques utilisées et de mettre à jour si nécessaire.",
"statistiques": {
"total_images": 3,
"images_pertinentes": 0,
"generation_time": 13.265363
},
"metadata": {
"model": "mistral-medium",
"model_version": "non spécifiée",
"temperature": 0.2,
"top_p": 0.9,
"max_tokens": 10000,
"generation_time": 13.265363,
"timestamp": "2025-04-14 15:49:35",
"agents": {
"report_generator": {
"model": "mistral-medium",
"temperature": 0.2,
"top_p": 0.9,
"max_tokens": 10000,
"prompt_version": "v3.2"
}
}
},
"prompts_utilisés": {
"report_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",
"ticket_analyser": "Prompt de l'agent d'analyse de ticket (non récupéré dynamiquement)",
"image_sorter": "Prompt de l'agent de tri d'images (non récupéré dynamiquement)",
"image_analyser": "Prompt de l'agent d'analyse d'images (non récupéré dynamiquement)"
},
"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,175 @@
# Rapport d'analyse: T9656
## 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: 3
- Images pertinentes: 0
- Temps de génération: 13.27 secondes
## 1. Analyse du ticket
_Agent utilisé: `AgentTicketAnalyser` - Analyse du contenu du ticket_
```
ERREUR: Impossible d'analyser le ticket: BaseLLM.interroger() got an unexpected keyword argument 'prompt'
```
## 2. Tri des images
_Agent utilisé: `AgentImageSorter` - Identifie les images pertinentes_
*Aucune image n'a été triée*
## 3. Analyse des images
_Agent utilisé: `AgentImageAnalyser` - Analyse détaillée des captures d'écran_
*Aucune image pertinente n'a été identifiée pour ce ticket.*
## 3.1 Synthèse globale des analyses d'images
_Analyse transversale des captures d'écran_
*Pas de synthèse globale disponible en l'absence d'images pertinentes.*
## 4. Synthèse finale
_Agent utilisé: `AgentReportGenerator` - Synthèse et conclusions_
### Résumé du problème
Le client a signalé une erreur lors de l'analyse d'un ticket. Le message d'erreur indique que la fonction BaseLLM.interroger() a reçu un argument inattendu nommé 'prompt'.
### Fil de discussion
Le fil de discussion se compose uniquement du message initial du client et de l'analyse du support technique.
### Chronologie des échanges
Le fil de discussion se compose uniquement du message initial du client et de l'analyse du support technique.
### Tableau des questions et réponses
_Synthèse des questions et réponses avec intégration des informations des images_
| Date | Émetteur | Type | Contenu |
| ---- | -------- | ---- | ------- |
| date demande | CLIENT | Question | ERREUR: Impossible d'analyser le ticket: BaseLLM.interroger() got an unexpected keyword argument 'prompt' |
| date analyse | SUPPORT | Complément visuel | N/A (aucune image fournie) |
### Diagnostic technique
_Conclusion basée sur l'analyse du ticket, des images et des échanges_
Le message d'erreur indique qu'une fonction BaseLLM.interroger() a reçu un argument inattendu nommé 'prompt'. Cela suggère que la fonction a été appelée avec un paramètre non prévu, ce qui a entraîné une erreur. Il est possible que le code appelant cette fonction ait été modifié ou qu'il y ait une incompatibilité entre les versions de différentes bibliothèques utilisées.
Pour résoudre ce problème, il est recommandé de vérifier la documentation de la fonction BaseLLM.interroger() pour confirmer les arguments attendus et de s'assurer que le code appelant cette fonction est correctement configuré. Il peut également être utile de vérifier les versions des bibliothèques utilisées et de mettre à jour si nécessaire.
## Métadonnées
- **Date de génération**: 2025-04-14 15:49:35
- **Modèle principal utilisé**: mistral-medium
## Détails des analyses
**ATTENTION**: Les sections suivantes sont incomplètes: Analyse des images
- **Analyse des images**: PRÉSENT
- **Analyse du ticket**: PRÉSENT
- **Diagnostic**: PRÉSENT
## Configuration des agents
### AgentTicketAnalyser
#### Prompt système
<details>
<summary>Afficher le prompt système</summary>
```
Prompt de l'agent d'analyse de ticket (non récupéré dynamiquement)
```
</details>
### AgentImageSorter
#### Prompt système
<details>
<summary>Afficher le prompt système</summary>
```
Prompt de l'agent de tri d'images (non récupéré dynamiquement)
```
</details>
### AgentImageAnalyser
#### Prompt système
<details>
<summary>Afficher le prompt système</summary>
```
Prompt de l'agent d'analyse d'images (non récupéré dynamiquement)
```
</details>
### AgentReportGenerator
#### Paramètres
- **Modèle utilisé**: mistral-medium
- **Température**: 0.2
- **Top_p**: 0.9
- **Max_tokens**: 10000
- **Version du prompt**: v3.2
#### Prompt système
<details>
<summary>Afficher le prompt système</summary>
```
Tu es un expert en génération de rapports techniques pour BRG-Lab pour la société CBAO.
Ta mission est de synthétiser les analyses (ticket et images) en un rapport structuré.
EXIGENCE ABSOLUE - Ton rapport DOIT inclure dans l'ordre:
1. Un résumé du problème initial (nom de la demande + description)
2. Une analyse détaillée des images pertinentes en lien avec le problème
3. Une synthèse globale des analyses d'images
4. Une reconstitution du fil de discussion client/support
5. Un tableau JSON de chronologie des échanges avec cette structure:
```json
{
"chronologie_echanges": [
{"date": "date exacte", "emetteur": "CLIENT ou SUPPORT", "type": "Question ou Réponse", "contenu": "contenu synthétisé"}
]
}
```
6. Un diagnostic technique des causes probables
MÉTHODE D'ANALYSE (ÉTAPES OBLIGATOIRES):
1. ANALYSE TOUTES les images AVANT de créer le tableau des échanges
2. Concentre-toi sur les éléments mis en évidence (encadrés/surlignés) dans chaque image
3. Réalise une SYNTHÈSE TRANSVERSALE en expliquant comment les images se complètent
4. Remets les images en ordre chronologique selon le fil de discussion
5. CONSERVE TOUS les liens documentaires, FAQ et références techniques
6. Ajoute une entrée "Complément visuel" dans le tableau des échanges
```
</details>