mirror of
https://github.com/Ladebeze66/llm_ticket3.git
synced 2025-12-13 10:46:51 +01:00
10:04
This commit is contained in:
parent
0397fda862
commit
c8a3c4277d
File diff suppressed because it is too large
Load Diff
@ -9,20 +9,13 @@ import re
|
||||
import sys
|
||||
from .utils.report_utils import extraire_et_traiter_json
|
||||
from .utils.report_formatter import extraire_sections_texte, generer_rapport_markdown, construire_rapport_json
|
||||
from .utils.agent_info_collector import collecter_info_agents, collecter_prompts_agents
|
||||
|
||||
logger = logging.getLogger("AgentReportGenerator")
|
||||
|
||||
class AgentReportGenerator(BaseAgent):
|
||||
"""
|
||||
Agent pour générer un rapport synthétique à partir des analyses de ticket et d'images.
|
||||
|
||||
L'agent récupère:
|
||||
1. L'analyse du ticket effectuée par AgentTicketAnalyser
|
||||
2. Les analyses des images pertinentes effectuées par AgentImageAnalyser
|
||||
|
||||
Il génère:
|
||||
- Un rapport JSON structuré (format principal)
|
||||
- Un rapport Markdown pour la présentation
|
||||
"""
|
||||
def __init__(self, llm):
|
||||
super().__init__("AgentReportGenerator", llm)
|
||||
@ -30,93 +23,37 @@ class AgentReportGenerator(BaseAgent):
|
||||
# Configuration locale de l'agent
|
||||
self.temperature = 0.2
|
||||
self.top_p = 0.9
|
||||
self.max_tokens = 20000
|
||||
self.max_tokens = 8000
|
||||
|
||||
# Prompt système pour la génération de rapport
|
||||
# Prompt système principal
|
||||
self.system_prompt = """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 :
|
||||
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 (OBLIGATOIRE)
|
||||
3. Une reconstitution du fil de discussion client/support - tu peux synthétiser si trop long mais GARDE les éléments déterminants (références, normes, éléments techniques importants)
|
||||
4. Un tableau des informations essentielles avec cette structure (APRÈS avoir analysé les images) :
|
||||
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 ou Information technique", "contenu": "contenu synthétisé fidèlement"}
|
||||
{"date": "date exacte", "emetteur": "CLIENT ou SUPPORT", "type": "Question ou Réponse", "contenu": "contenu synthétisé"}
|
||||
]
|
||||
}
|
||||
```
|
||||
5. Un diagnostic technique des causes probables
|
||||
6. Un diagnostic technique des causes probables
|
||||
|
||||
IMPORTANT - ORDRE ET MÉTHODE :
|
||||
- ANALYSE D'ABORD LES IMAGES ET LEUR CONTENU
|
||||
- ENSUITE, établis une SYNTHÈSE TRANSVERSALE des informations clés de TOUTES les images
|
||||
- ENFIN, construit le tableau questions/réponses en intégrant cette vision globale
|
||||
|
||||
IMPORTANT POUR L'ANALYSE DES IMAGES:
|
||||
- Pour chaque image, concentre-toi particulièrement sur:
|
||||
* Section 3: "Éléments mis en évidence" (zones entourées, encadrées, surlignées)
|
||||
* Section 4: "Relation avec le problème" (lien entre éléments visibles et problème décrit)
|
||||
* Section 6: "Lien avec la discussion" (correspondance avec étapes du fil de discussion)
|
||||
- CRUCIALE: Après avoir analysé chaque image individuellement, réalise une SYNTHÈSE GLOBALE qui:
|
||||
* Remettre les images en ordre chronologique (s'aider de la discussion, des dates, des messages, etc.)
|
||||
* Combine les éléments mis en évidence dans toutes les images
|
||||
* Établit les corrélations entre ces éléments et le problème global
|
||||
* Explique comment ces éléments se complètent pour répondre aux questions du client
|
||||
- Cette approche globale est indispensable pour éviter l'analyse isolée par image
|
||||
|
||||
IMPORTANT POUR LE TABLEAU CHRONOLOGIE DES ÉCHANGES :
|
||||
- COMMENCE par inclure toute question identifiée dans le NOM DE LA DEMANDE ou la DESCRIPTION initiale
|
||||
- CONSERVE ABSOLUMENT TOUTES les références techniques importantes:
|
||||
* Liens vers le manuel d'utilisation
|
||||
* Liens FAQ
|
||||
* Liens vers la documentation technique
|
||||
* Références à des normes ou procédures
|
||||
- INTÈGRE les informations de ta SYNTHÈSE GLOBALE des images dans le tableau comme ceci:
|
||||
* ÉVITE de répéter ce qui est déjà dit dans la réponse du support
|
||||
* AJOUTE une entrée de type "Complément visuel" à la fin du tableau
|
||||
* Dans cette entrée, synthétise UNIQUEMENT les éléments pertinents de toutes les images ensemble
|
||||
* Montre comment les images se complètent pour illustrer le processus complet
|
||||
* Utilise une formulation du type: "L'analyse des captures d'écran confirme visuellement le processus complet : (1)..., (2)..., (3)... Ces interfaces complémentaires illustrent le cycle complet..."
|
||||
- Si une question n'a pas de réponse dans le fil, propose une réponse basée sur ta synthèse globale des images
|
||||
- Si aucune réponse n'est trouvée nulle part, indique "Il ne ressort pas de réponse de l'analyse"
|
||||
- Identifie clairement chaque intervenant (CLIENT ou SUPPORT)
|
||||
- Pour les questions issues du NOM ou de la DESCRIPTION, utilise l'émetteur "CLIENT" et la date d'ouverture du ticket
|
||||
|
||||
IMPORTANT POUR LA STRUCTURE :
|
||||
- Le rapport doit être clairement divisé en sections avec des titres
|
||||
- La section analyse des images DOIT précéder le tableau des questions/réponses
|
||||
- AJOUTE une section "SYNTHÈSE GLOBALE DES ANALYSES D'IMAGES" avant le tableau questions/réponses
|
||||
- Structure cette section en sous-parties:
|
||||
* "Points communs et complémentaires entre les images"
|
||||
* "Éléments mis en évidence dans toutes les images"
|
||||
* "Corrélation entre les éléments et le problème global"
|
||||
* "Confirmation visuelle des informations du support"
|
||||
- Cet ordre est CRUCIAL pour pouvoir créer un tableau questions/réponses complet
|
||||
- Si aucune image n'est fournie, tu DOIS l'indiquer explicitement dans la section "Analyse des images"
|
||||
- Reste factuel et précis dans ton analyse
|
||||
|
||||
TA MÉTHODOLOGIE POUR CRÉER LE TABLEAU QUESTIONS/RÉPONSES :
|
||||
1. Analyse d'abord le ticket pour identifier toutes les questions et références documentaires importantes (FAQ, etc.)
|
||||
2. Analyse ensuite les images en te concentrant sur les points clés:
|
||||
- Éléments mis en évidence (section 3)
|
||||
- Relation avec le problème (section 4)
|
||||
- Lien avec la discussion (section 6)
|
||||
3. Réalise une SYNTHÈSE TRANSVERSALE de toutes les images:
|
||||
- Identifie les points communs entre les images
|
||||
- Établis des liens entre les différents éléments mis en évidence dans chaque image
|
||||
- Explique comment ces éléments fonctionnent ensemble pour répondre au problème
|
||||
4. Pour chaque question du client:
|
||||
a) Cherche d'abord une réponse directe du support AVEC TOUS LES LIENS documentaires
|
||||
b) NE RÉPÈTE PAS ces informations dans une nouvelle entrée du tableau
|
||||
c) Au lieu de cela, ajoute une entrée UNIQUE de type "Complément visuel" qui synthétise l'apport des images
|
||||
5. CONSERVE ABSOLUMENT TOUS les liens documentaires (FAQ, manuels, etc.) dans les réponses
|
||||
6. Évite de traiter les images séparément dans le tableau; présente une vision unifiée et complémentaire"""
|
||||
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"""
|
||||
|
||||
# Version du prompt pour la traçabilité
|
||||
self.prompt_version = "v2.7"
|
||||
self.prompt_version = "v3.2"
|
||||
|
||||
# Appliquer la configuration au LLM
|
||||
self._appliquer_config_locale()
|
||||
@ -144,13 +81,6 @@ TA MÉTHODOLOGIE POUR CRÉER LE TABLEAU QUESTIONS/RÉPONSES :
|
||||
def _formater_prompt_pour_rapport(self, ticket_analyse: str, images_analyses: List[Dict]) -> str:
|
||||
"""
|
||||
Formate le prompt pour la génération du rapport
|
||||
|
||||
Args:
|
||||
ticket_analyse: Analyse du ticket
|
||||
images_analyses: Liste des analyses d'images
|
||||
|
||||
Returns:
|
||||
Prompt formaté pour le LLM
|
||||
"""
|
||||
num_images = len(images_analyses)
|
||||
logger.info(f"Formatage du prompt avec {num_images} analyses d'images")
|
||||
@ -180,77 +110,45 @@ STRUCTURE OBLIGATOIRE ET ORDRE À SUIVRE:
|
||||
1. Titre principal (# Rapport d'analyse: Nom du ticket)
|
||||
2. Résumé du problème (## Résumé du problème)
|
||||
3. Analyse des images (## Analyse des images) - CRUCIAL: FAIRE CETTE SECTION AVANT LE TABLEAU
|
||||
4. Synthèse globale des analyses d'images (## Synthèse globale des analyses d'images) - NOUVELLE SECTION
|
||||
5. Fil de discussion (## Fil de discussion) - Reconstitution chronologique des échanges
|
||||
6. Tableau questions/réponses (## Tableau questions/réponses) - UTILISER les informations des images
|
||||
4. Synthèse globale des analyses d'images (## Synthèse globale des analyses d'images)
|
||||
5. Fil de discussion (## Fil de discussion)
|
||||
6. Tableau questions/réponses (## Tableau questions/réponses)
|
||||
7. Diagnostic technique (## Diagnostic technique)
|
||||
|
||||
MÉTHODE POUR CONSTRUIRE LE RAPPORT:
|
||||
MÉTHODE POUR ANALYSER LES IMAGES:
|
||||
- Pour chaque image, concentre-toi prioritairement sur:
|
||||
* Les éléments mis en évidence (zones encadrées, surlignées)
|
||||
* La relation avec le problème décrit
|
||||
* Le lien avec le fil de discussion
|
||||
|
||||
1. COMMENCE PAR L'ANALYSE DES IMAGES:
|
||||
- Cette étape doit être faite AVANT de créer le tableau questions/réponses
|
||||
- Pour chaque image, concentre-toi particulièrement sur:
|
||||
* Les éléments mis en évidence (zones entourées, encadrées, surlignées)
|
||||
* La relation entre éléments visibles et problème décrit
|
||||
* Les correspondances avec les étapes du fil de discussion
|
||||
- Ces aspects sont cruciaux pour l'utilisation pertinente dans ton tableau questions/réponses
|
||||
SYNTHÈSE GLOBALE DES IMAGES (SECTION CRUCIALE):
|
||||
- Structure cette section avec les sous-parties:
|
||||
* Points communs et complémentaires entre les images
|
||||
* Corrélation entre les éléments et le problème global
|
||||
* Confirmation visuelle des informations du support
|
||||
- Montre comment les images se complètent pour illustrer le processus complet
|
||||
- Cette synthèse transversale servira de base pour le "Complément visuel"
|
||||
|
||||
2. AJOUTE UNE SECTION "SYNTHÈSE GLOBALE DES ANALYSES D'IMAGES":
|
||||
- Cette nouvelle section OBLIGATOIRE est essentielle pour une analyse transversale
|
||||
- Structure cette section avec les sous-parties suivantes:
|
||||
* Points communs et complémentaires entre les images
|
||||
* Éléments mis en évidence dans toutes les images
|
||||
* Corrélation entre les éléments et le problème global
|
||||
* Confirmation visuelle des informations du support
|
||||
- Combine les informations de toutes les images pour montrer leur complémentarité
|
||||
- Explique comment, ensemble, les différents éléments mis en évidence répondent au problème
|
||||
- Montre comment les images confirment et illustrent visuellement les informations du support
|
||||
- Cette synthèse sera ta base pour créer l'entrée "Complément visuel" dans le tableau
|
||||
POUR LE TABLEAU QUESTIONS/RÉPONSES:
|
||||
- Tu DOIS créer et inclure un tableau JSON structuré comme ceci:
|
||||
```json
|
||||
{
|
||||
"chronologie_echanges": [
|
||||
{"date": "date exacte", "emetteur": "CLIENT", "type": "Question", "contenu": "contenu exact de la question"},
|
||||
{"date": "date exacte", "emetteur": "SUPPORT", "type": "Réponse", "contenu": "réponse avec TOUS les liens documentaires"},
|
||||
{"date": "date analyse", "emetteur": "SUPPORT", "type": "Complément visuel", "contenu": "synthèse unifiée de TOUTES les images"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
3. ENSUITE, DANS LA SECTION "FIL DE DISCUSSION":
|
||||
- Reconstitue chronologiquement les échanges entre client et support
|
||||
- Identifie clairement l'émetteur de chaque message (CLIENT ou SUPPORT)
|
||||
- Tu peux synthétiser mais GARDE ABSOLUMENT TOUS les éléments déterminants:
|
||||
* Références techniques
|
||||
* Liens FAQ et manuels d'utilisation (TRÈS IMPORTANT)
|
||||
* Normes citées
|
||||
* Paramètres importants
|
||||
* Informations techniques clés
|
||||
* TOUS les liens vers la documentation
|
||||
|
||||
4. ENFIN, DANS LA SECTION "TABLEAU QUESTIONS/RÉPONSES":
|
||||
- Maintenant que tu as analysé les images, créé ta synthèse globale et analysé le fil de discussion, tu peux créer le tableau
|
||||
- Analyse attentivement pour identifier chaque QUESTION posée:
|
||||
* Dans le nom et la description du ticket
|
||||
* Dans les messages du client
|
||||
* Dans les messages implicites contenant une demande
|
||||
- Pour les RÉPONSES, utilise cette approche spécifique:
|
||||
* Inclus d'abord la réponse directe du support AVEC TOUS SES LIENS documentaires
|
||||
* NE RÉPÈTE PAS ces informations dans une autre entrée
|
||||
* Ajoute ensuite UNE SEULE entrée de type "Complément visuel" avec un émetteur "SUPPORT"
|
||||
* Dans cette entrée, synthétise l'apport global des images au problème
|
||||
* Utilise une formulation comme: "L'analyse des captures d'écran confirme visuellement le processus complet : (1)..., (2)..., (3)... Ces interfaces complémentaires illustrent le cycle complet..."
|
||||
- Crée un objet JSON comme suit:
|
||||
```json
|
||||
{
|
||||
"chronologie_echanges": [
|
||||
{"date": "date exacte", "emetteur": "CLIENT", "type": "Question", "contenu": "contenu exact de la question"},
|
||||
{"date": "date exacte", "emetteur": "SUPPORT", "type": "Réponse", "contenu": "réponse du support avec tous ses liens documentaires"},
|
||||
{"date": "date d'analyse", "emetteur": "SUPPORT", "type": "Complément visuel", "contenu": "synthèse unifée de l'apport des images"}
|
||||
]
|
||||
}
|
||||
```
|
||||
- Ne fais pas d'entrées séparées pour chaque image; présente une vision unifiée
|
||||
- COMMENCE par inclure toutes les questions identifiées dans le NOM DE LA DEMANDE et la DESCRIPTION
|
||||
- Pour ces questions initiales, utilise l'émetteur "CLIENT" et la date d'ouverture du ticket
|
||||
- NE PERDS AUCUN lien vers la documentation, FAQ et ressources techniques
|
||||
|
||||
5. DANS LA SECTION "DIAGNOSTIC TECHNIQUE":
|
||||
- Fournis une analyse claire des causes probables basée sur ta synthèse globale
|
||||
- Explique comment la solution proposée répond au problème
|
||||
- Utilise les corrélations établies dans ta synthèse globale pour expliquer les causes probables
|
||||
|
||||
IMPORTANT: Ce rapport sera utilisé par des techniciens et des développeurs pour comprendre rapidement le problème et sa résolution. Il doit être clair, précis et présenter une vision cohérente basée sur une analyse transversale des images plutôt que des analyses isolées.
|
||||
DIRECTIVES ESSENTIELLES:
|
||||
- COMMENCE par les questions du NOM et de la DESCRIPTION du ticket
|
||||
- CONSERVE ABSOLUMENT TOUS les liens vers la documentation, FAQ, manuels et références
|
||||
- Ajoute UNE SEULE entrée "Complément visuel" qui synthétise l'apport global des images
|
||||
- Cette entrée doit montrer comment les images confirment/illustrent le processus complet
|
||||
- Formulation recommandée: "L'analyse des captures d'écran confirme visuellement le processus: (1)..., (2)..., (3)... Ces interfaces complémentaires illustrent..."
|
||||
- Évite de traiter les images séparément dans le tableau; présente une vision unifiée
|
||||
- Identifie clairement chaque intervenant (CLIENT ou SUPPORT)
|
||||
"""
|
||||
|
||||
return prompt
|
||||
@ -258,13 +156,6 @@ IMPORTANT: Ce rapport sera utilisé par des techniciens et des développeurs pou
|
||||
def executer(self, rapport_data: Dict, rapport_dir: str) -> Tuple[Optional[str], Optional[str]]:
|
||||
"""
|
||||
Génère un rapport à partir des analyses effectuées
|
||||
|
||||
Args:
|
||||
rapport_data: Dictionnaire contenant toutes les données analysées
|
||||
rapport_dir: Répertoire où sauvegarder le rapport
|
||||
|
||||
Returns:
|
||||
Tuple (chemin JSON, chemin Markdown) - Peut contenir None si une génération échoue
|
||||
"""
|
||||
try:
|
||||
# 1. PRÉPARATION
|
||||
@ -279,9 +170,16 @@ IMPORTANT: Ce rapport sera utilisé par des techniciens et des développeurs pou
|
||||
ticket_analyse = self._extraire_analyse_ticket(rapport_data)
|
||||
images_analyses = self._extraire_analyses_images(rapport_data)
|
||||
|
||||
# 3. COLLECTE DES INFORMATIONS SUR LES AGENTS
|
||||
agents_info = self._collecter_info_agents(rapport_data)
|
||||
prompts_utilises = self._collecter_prompts_agents()
|
||||
# 3. COLLECTE DES INFORMATIONS SUR LES AGENTS (via le nouveau module)
|
||||
agent_info = {
|
||||
"model": getattr(self.llm, "modele", str(type(self.llm))),
|
||||
"temperature": self.temperature,
|
||||
"top_p": self.top_p,
|
||||
"max_tokens": self.max_tokens,
|
||||
"prompt_version": self.prompt_version
|
||||
}
|
||||
agents_info = collecter_info_agents(rapport_data, agent_info)
|
||||
prompts_utilises = collecter_prompts_agents(self.system_prompt)
|
||||
|
||||
# 4. GÉNÉRATION DU RAPPORT
|
||||
prompt = self._formater_prompt_pour_rapport(ticket_analyse, images_analyses)
|
||||
@ -405,12 +303,6 @@ IMPORTANT: Ce rapport sera utilisé par des techniciens et des développeurs pou
|
||||
def _extraire_analyses_images(self, rapport_data: Dict) -> List[Dict]:
|
||||
"""
|
||||
Extrait et formate les analyses d'images pertinentes
|
||||
|
||||
Args:
|
||||
rapport_data: Données du rapport contenant les analyses d'images
|
||||
|
||||
Returns:
|
||||
Liste des analyses d'images pertinentes formatées
|
||||
"""
|
||||
images_analyses = []
|
||||
analyse_images_data = rapport_data.get("analyse_images", {})
|
||||
@ -442,12 +334,6 @@ IMPORTANT: Ce rapport sera utilisé par des techniciens et des développeurs pou
|
||||
def _extraire_analyse_image(self, analyse_data: Dict) -> Optional[str]:
|
||||
"""
|
||||
Extrait l'analyse d'une image depuis les données
|
||||
|
||||
Args:
|
||||
analyse_data: Données d'analyse de l'image
|
||||
|
||||
Returns:
|
||||
Texte d'analyse de l'image ou None si aucune analyse n'est disponible
|
||||
"""
|
||||
# Si pas de données d'analyse, retourner None
|
||||
if not "analysis" in analyse_data or not analyse_data["analysis"]:
|
||||
@ -476,107 +362,4 @@ IMPORTANT: Ce rapport sera utilisé par des techniciens et des développeurs pou
|
||||
return json.dumps(analysis, ensure_ascii=False, indent=2)
|
||||
|
||||
# Aucun format reconnu
|
||||
return None
|
||||
|
||||
def _collecter_info_agents(self, rapport_data: Dict) -> Dict:
|
||||
"""
|
||||
Collecte des informations sur les agents utilisés dans l'analyse
|
||||
|
||||
Args:
|
||||
rapport_data: Données du rapport
|
||||
|
||||
Returns:
|
||||
Dictionnaire contenant les informations sur les agents
|
||||
"""
|
||||
agents_info = {}
|
||||
|
||||
# Informations sur l'agent JSON Analyser (Ticket Analyser)
|
||||
ticket_analyses = {}
|
||||
for key in ["ticket_analyse", "analyse_json", "analyse_ticket"]:
|
||||
if key in rapport_data and isinstance(rapport_data[key], dict) and "metadata" in rapport_data[key]:
|
||||
ticket_analyses = rapport_data[key]["metadata"]
|
||||
break
|
||||
|
||||
if ticket_analyses:
|
||||
agents_info["ticket_analyser"] = ticket_analyses
|
||||
|
||||
# Informations sur les agents d'image
|
||||
if "analyse_images" in rapport_data and rapport_data["analyse_images"]:
|
||||
# Image Sorter
|
||||
sorter_info = {}
|
||||
analyser_info = {}
|
||||
|
||||
for img_path, img_data in rapport_data["analyse_images"].items():
|
||||
# Collecter info du sorter
|
||||
if "sorting" in img_data and isinstance(img_data["sorting"], dict) and "metadata" in img_data["sorting"]:
|
||||
sorter_info = img_data["sorting"]["metadata"]
|
||||
|
||||
# Collecter info de l'analyser
|
||||
if "analysis" in img_data and isinstance(img_data["analysis"], dict) and "metadata" in img_data["analysis"]:
|
||||
analyser_info = img_data["analysis"]["metadata"]
|
||||
|
||||
# Une fois qu'on a trouvé les deux, on peut sortir
|
||||
if sorter_info and analyser_info:
|
||||
break
|
||||
|
||||
if sorter_info:
|
||||
agents_info["image_sorter"] = sorter_info
|
||||
if analyser_info:
|
||||
agents_info["image_analyser"] = analyser_info
|
||||
|
||||
# Ajouter les informations de l'agent report generator
|
||||
agents_info["report_generator"] = {
|
||||
"model": getattr(self.llm, "modele", str(type(self.llm))),
|
||||
"temperature": self.temperature,
|
||||
"top_p": self.top_p,
|
||||
"max_tokens": self.max_tokens,
|
||||
"prompt_version": self.prompt_version
|
||||
}
|
||||
|
||||
return agents_info
|
||||
|
||||
def _collecter_prompts_agents(self) -> Dict[str, str]:
|
||||
"""
|
||||
Collecte les prompts système de tous les agents impliqués dans l'analyse.
|
||||
|
||||
Returns:
|
||||
Dictionnaire contenant les prompts des agents
|
||||
"""
|
||||
prompts = {
|
||||
"rapport_generator": self.system_prompt
|
||||
}
|
||||
|
||||
# Importer les classes d'agents pour accéder à leurs prompts
|
||||
try:
|
||||
# Importer les autres agents
|
||||
from .agent_ticket_analyser import AgentTicketAnalyser
|
||||
from .agent_image_analyser import AgentImageAnalyser
|
||||
from .agent_image_sorter import AgentImageSorter
|
||||
|
||||
# Créer des instances temporaires pour récupérer les prompts
|
||||
# En passant None comme LLM pour éviter d'initialiser complètement les agents
|
||||
try:
|
||||
ticket_analyser = AgentTicketAnalyser(None)
|
||||
prompts["ticket_analyser"] = ticket_analyser.system_prompt
|
||||
logger.info("Prompt récupéré pour ticket_analyser")
|
||||
except Exception as e:
|
||||
logger.warning(f"Erreur lors de la récupération du prompt ticket_analyser: {str(e)}")
|
||||
|
||||
try:
|
||||
image_analyser = AgentImageAnalyser(None)
|
||||
prompts["image_analyser"] = image_analyser.system_prompt
|
||||
logger.info("Prompt récupéré pour image_analyser")
|
||||
except Exception as e:
|
||||
logger.warning(f"Erreur lors de la récupération du prompt image_analyser: {str(e)}")
|
||||
|
||||
try:
|
||||
image_sorter = AgentImageSorter(None)
|
||||
prompts["image_sorter"] = image_sorter.system_prompt
|
||||
logger.info("Prompt récupéré pour image_sorter")
|
||||
except Exception as e:
|
||||
logger.warning(f"Erreur lors de la récupération du prompt image_sorter: {str(e)}")
|
||||
|
||||
except ImportError as e:
|
||||
logger.warning(f"Erreur lors de l'importation des classes d'agents: {str(e)}")
|
||||
|
||||
return prompts
|
||||
return None
|
||||
@ -1,479 +0,0 @@
|
||||
import json
|
||||
import os
|
||||
from .base_agent import BaseAgent
|
||||
from datetime import datetime
|
||||
from typing import Dict, Any, Tuple, Optional, List
|
||||
import logging
|
||||
import traceback
|
||||
import re
|
||||
import sys
|
||||
from .utils.report_utils_bis import extraire_et_traiter_json
|
||||
from .utils.report_formatter import extraire_sections_texte, generer_rapport_markdown, construire_rapport_json
|
||||
|
||||
logger = logging.getLogger("AgentReportGeneratorBis")
|
||||
|
||||
class AgentReportGeneratorBis(BaseAgent):
|
||||
"""
|
||||
Agent pour générer un rapport synthétique à partir des analyses de ticket et d'images.
|
||||
Version optimisée pour les modèles Qwen et DeepSeek.
|
||||
|
||||
L'agent récupère:
|
||||
1. L'analyse du ticket effectuée par AgentTicketAnalyser
|
||||
2. Les analyses des images pertinentes effectuées par AgentImageAnalyser
|
||||
|
||||
Il génère:
|
||||
- Un rapport JSON structuré (format principal)
|
||||
- Un rapport Markdown pour la présentation
|
||||
"""
|
||||
def __init__(self, llm):
|
||||
super().__init__("AgentReportGeneratorBis", llm)
|
||||
|
||||
# Configuration locale de l'agent
|
||||
self.temperature = 0.2
|
||||
self.top_p = 0.9
|
||||
self.max_tokens = 20000
|
||||
|
||||
# Prompt système pour la génération de rapport
|
||||
self.system_prompt = """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 - Tu dois OBLIGATOIREMENT suivre cette structure dans ton rapport:
|
||||
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 SECTION EXACTEMENT INTITULÉE "## Synthèse globale des analyses d'images" (SECTION OBLIGATOIRE)
|
||||
4. Une reconstitution du fil de discussion client/support
|
||||
5. Un tableau des informations essentielles dans ce format JSON EXACT:
|
||||
```json
|
||||
{
|
||||
"chronologie_echanges": [
|
||||
{"date": "date exacte", "emetteur": "CLIENT ou SUPPORT", "type": "Question ou Réponse ou Information technique", "contenu": "contenu synthétisé fidèlement"}
|
||||
]
|
||||
}
|
||||
```
|
||||
6. Un diagnostic technique des causes probables
|
||||
|
||||
CRUCIAL - RESPECTE SCRUPULEUSEMENT CET ORDRE:
|
||||
- ANALYSE D'ABORD chaque image individuellement en profondeur
|
||||
- CRÉE ENSUITE une section dédiée "## Synthèse globale des analyses d'images" (UTILISE EXACTEMENT CE TITRE)
|
||||
- ENFIN, construis le tableau chronologique des échanges en intégrant cette vision globale
|
||||
|
||||
INSTRUCTIONS POUR L'ANALYSE DES IMAGES:
|
||||
- Pour chaque image, examine attentivement:
|
||||
* Les éléments surlignés ou encadrés
|
||||
* La relation avec le problème décrit
|
||||
* Le lien avec la discussion client/support
|
||||
- OBLIGATOIRE: CRÉE UNE SECTION AVEC LE TITRE EXACT "## Synthèse globale des analyses d'images" qui:
|
||||
* Replace les images dans leur contexte chronologique
|
||||
* Combine les éléments importants de toutes les images
|
||||
* Explique comment ces éléments interagissent pour résoudre le problème
|
||||
* Illustre le processus complet à travers les différentes captures d'écran
|
||||
|
||||
INSTRUCTIONS POUR LE TABLEAU JSON:
|
||||
- COMMENCE par inclure les questions du NOM DE LA DEMANDE et de la DESCRIPTION
|
||||
- CONSERVE TOUS les liens techniques importants (manuels, FAQ, documentation)
|
||||
- ASSURE-TOI d'inclure ce tableau au format JSON PRÉCIS:
|
||||
```json
|
||||
{
|
||||
"chronologie_echanges": [
|
||||
{"date": "date exacte", "emetteur": "CLIENT ou SUPPORT", "type": "Question ou Réponse ou Information technique", "contenu": "contenu synthétisé fidèlement"}
|
||||
]
|
||||
}
|
||||
```
|
||||
- IMPORTANT: Ce JSON sera automatiquement extrait pour générer un CSV
|
||||
- Le JSON DOIT être correctement formaté avec guillemets doubles et échappements appropriés
|
||||
- Assure-toi que CHAQUE élément contient TOUTES les clés: date, emetteur, type, contenu
|
||||
- Si une date exacte est inconnue, utilise la date d'ouverture du ticket
|
||||
- N'OUBLIE PAS d'inclure un élément qui synthétise l'apport des images
|
||||
|
||||
TA MÉTHODE DE TRAVAIL:
|
||||
1. Analyse d'abord le ticket et extrais toutes les questions et références
|
||||
2. Analyse ensuite chaque image individuellement
|
||||
3. Crée une section EXACTEMENT NOMMÉE "## Synthèse globale des analyses d'images"
|
||||
4. Reconstruit le fil chronologique complet des échanges
|
||||
5. Génère le tableau JSON en respectant SCRUPULEUSEMENT le format demandé
|
||||
6. Conclue avec un diagnostic technique
|
||||
|
||||
GARANTIS ABSOLUMENT:
|
||||
- La présence d'une section dédiée "## Synthèse globale des analyses d'images" avec EXACTEMENT ce titre
|
||||
- La création d'un JSON correctement formaté avec toutes les clés requises
|
||||
- La conservation de tous les liens importants dans le contenu du tableau
|
||||
- Le respect de l'ordre des sections tel que défini ci-dessus
|
||||
- Ne modifie JAMAIS les titres des sections demandées"""
|
||||
|
||||
# Version du prompt pour la traçabilité
|
||||
self.prompt_version = "v3.1-qwen-deepseek"
|
||||
|
||||
# Appliquer la configuration au LLM
|
||||
self._appliquer_config_locale()
|
||||
|
||||
logger.info("AgentReportGeneratorBis initialisé avec prompt optimisé pour Qwen/DeepSeek")
|
||||
|
||||
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)
|
||||
logger.info(f"Configuration appliquée au modèle: {str(params)}")
|
||||
|
||||
def _formater_prompt_pour_rapport(self, ticket_analyse: str, images_analyses: List[Dict]) -> str:
|
||||
"""
|
||||
Formate uniquement les données à transmettre au prompt système
|
||||
sans répéter les instructions déjà présentes dans le system_prompt.
|
||||
"""
|
||||
num_images = len(images_analyses)
|
||||
logger.info(f"Formatage du prompt avec {num_images} analyses d'images")
|
||||
|
||||
# Formater simplement l'analyse du ticket
|
||||
prompt = f"""## ANALYSE DU TICKET\n{ticket_analyse}\n"""
|
||||
|
||||
# Ajouter seulement les analyses des images, sans instructions supplémentaires
|
||||
if num_images > 0:
|
||||
prompt += f"\n## ANALYSES DES IMAGES ({num_images} images)\n"
|
||||
for i, img_analyse in enumerate(images_analyses, 1):
|
||||
image_name = img_analyse.get("image_name", f"Image {i}")
|
||||
analyse = img_analyse.get("analyse", "Analyse non disponible")
|
||||
prompt += f"\n### IMAGE {i}: {image_name}\n{analyse}\n"
|
||||
else:
|
||||
prompt += "\n## ANALYSES DES IMAGES\nAucune image n'a été fournie pour ce ticket.\n"
|
||||
|
||||
# Fin : pas d'instructions, déjà dans system_prompt !
|
||||
return prompt
|
||||
|
||||
|
||||
def executer(self, rapport_data: Dict, rapport_dir: str) -> Tuple[Optional[str], Optional[str]]:
|
||||
"""
|
||||
Génère un rapport à partir des analyses effectuées
|
||||
|
||||
Args:
|
||||
rapport_data: Dictionnaire contenant toutes les données analysées
|
||||
rapport_dir: Répertoire où sauvegarder le rapport
|
||||
|
||||
Returns:
|
||||
Tuple (chemin JSON, chemin Markdown) - Peut contenir None si une génération échoue
|
||||
"""
|
||||
try:
|
||||
# 1. PRÉPARATION
|
||||
ticket_id = self._extraire_ticket_id(rapport_data, rapport_dir)
|
||||
logger.info(f"Génération du rapport pour le ticket: {ticket_id}")
|
||||
print(f"AgentReportGeneratorBis: Génération du rapport pour {ticket_id}")
|
||||
|
||||
# Créer le répertoire de sortie si nécessaire
|
||||
os.makedirs(rapport_dir, exist_ok=True)
|
||||
|
||||
# 2. EXTRACTION DES DONNÉES
|
||||
ticket_analyse = self._extraire_analyse_ticket(rapport_data)
|
||||
images_analyses = self._extraire_analyses_images(rapport_data)
|
||||
|
||||
# 3. COLLECTE DES INFORMATIONS SUR LES AGENTS
|
||||
agents_info = self._collecter_info_agents(rapport_data)
|
||||
prompts_utilises = self._collecter_prompts_agents()
|
||||
|
||||
# 4. GÉNÉRATION DU RAPPORT
|
||||
prompt = self._formater_prompt_pour_rapport(ticket_analyse, images_analyses)
|
||||
|
||||
logger.info("Génération du rapport avec le LLM")
|
||||
print(f" Génération du rapport avec le LLM (version optimisée pour Qwen/DeepSeek)...")
|
||||
|
||||
# Mesurer le temps d'exécution
|
||||
start_time = datetime.now()
|
||||
rapport_genere = self.llm.interroger(prompt)
|
||||
generation_time = (datetime.now() - start_time).total_seconds()
|
||||
|
||||
logger.info(f"Rapport généré: {len(rapport_genere)} caractères")
|
||||
print(f" Rapport généré: {len(rapport_genere)} caractères")
|
||||
|
||||
# 5. EXTRACTION DES DONNÉES DU RAPPORT
|
||||
# Utiliser l'utilitaire de report_utils.py pour extraire les données JSON
|
||||
rapport_traite, echanges_json, _ = extraire_et_traiter_json(rapport_genere)
|
||||
|
||||
# Vérifier que echanges_json n'est pas None pour éviter l'erreur de type
|
||||
if echanges_json is None:
|
||||
echanges_json = {"chronologie_echanges": []}
|
||||
logger.warning("Aucun échange JSON extrait du rapport, création d'une structure vide")
|
||||
|
||||
# Extraire les sections textuelles (résumé, diagnostic)
|
||||
resume, analyse_images, diagnostic = extraire_sections_texte(rapport_genere)
|
||||
|
||||
# 6. CRÉATION DU RAPPORT JSON
|
||||
# Préparer les métadonnées de l'agent
|
||||
agent_metadata = {
|
||||
"model": getattr(self.llm, "modele", str(type(self.llm))),
|
||||
"model_version": getattr(self.llm, "version", "non spécifiée"),
|
||||
"temperature": self.temperature,
|
||||
"top_p": self.top_p,
|
||||
"max_tokens": self.max_tokens,
|
||||
"generation_time": generation_time,
|
||||
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"prompt_version": self.prompt_version,
|
||||
"agents": agents_info
|
||||
}
|
||||
|
||||
# Construire le rapport JSON
|
||||
rapport_json = construire_rapport_json(
|
||||
rapport_genere=rapport_genere,
|
||||
rapport_data=rapport_data,
|
||||
ticket_id=ticket_id,
|
||||
ticket_analyse=ticket_analyse,
|
||||
images_analyses=images_analyses,
|
||||
generation_time=generation_time,
|
||||
resume=resume,
|
||||
analyse_images=analyse_images,
|
||||
diagnostic=diagnostic,
|
||||
echanges_json=echanges_json,
|
||||
agent_metadata=agent_metadata,
|
||||
prompts_utilises=prompts_utilises
|
||||
)
|
||||
|
||||
# 7. SAUVEGARDE DU RAPPORT JSON
|
||||
json_path = os.path.join(rapport_dir, f"{ticket_id}_rapport_final.json")
|
||||
|
||||
with open(json_path, "w", encoding="utf-8") as f:
|
||||
json.dump(rapport_json, f, ensure_ascii=False, indent=2)
|
||||
|
||||
logger.info(f"Rapport JSON sauvegardé: {json_path}")
|
||||
print(f" Rapport JSON sauvegardé: {json_path}")
|
||||
|
||||
# 8. GÉNÉRATION DU RAPPORT MARKDOWN
|
||||
md_path = generer_rapport_markdown(json_path)
|
||||
|
||||
if md_path:
|
||||
logger.info(f"Rapport Markdown généré: {md_path}")
|
||||
print(f" Rapport Markdown généré: {md_path}")
|
||||
else:
|
||||
logger.error("Échec de la génération du rapport Markdown")
|
||||
print(f" ERREUR: Échec de la génération du rapport Markdown")
|
||||
|
||||
return json_path, md_path
|
||||
|
||||
except Exception as e:
|
||||
error_message = f"Erreur lors de la génération du rapport: {str(e)}"
|
||||
logger.error(error_message)
|
||||
logger.error(traceback.format_exc())
|
||||
print(f" ERREUR: {error_message}")
|
||||
return None, None
|
||||
|
||||
def _extraire_ticket_id(self, rapport_data: Dict, rapport_dir: str) -> str:
|
||||
"""Extrait l'ID du ticket des données ou du chemin"""
|
||||
# Essayer d'extraire depuis les données du rapport
|
||||
ticket_id = rapport_data.get("ticket_id", "")
|
||||
|
||||
# Si pas d'ID direct, essayer depuis les données du ticket
|
||||
if not ticket_id and "ticket_data" in rapport_data and isinstance(rapport_data["ticket_data"], dict):
|
||||
ticket_id = rapport_data["ticket_data"].get("code", "")
|
||||
|
||||
# En dernier recours, extraire depuis le chemin
|
||||
if not ticket_id:
|
||||
# Essayer d'extraire un ID de ticket (format Txxxx) du chemin
|
||||
match = re.search(r'T\d+', rapport_dir)
|
||||
if match:
|
||||
ticket_id = match.group(0)
|
||||
else:
|
||||
# Sinon, utiliser le dernier segment du chemin
|
||||
ticket_id = os.path.basename(rapport_dir)
|
||||
|
||||
return ticket_id
|
||||
|
||||
def _extraire_analyse_ticket(self, rapport_data: Dict) -> str:
|
||||
"""Extrait l'analyse du ticket des données"""
|
||||
# Essayer les différentes clés possibles
|
||||
for key in ["ticket_analyse", "analyse_json", "analyse_ticket"]:
|
||||
if key in rapport_data and rapport_data[key]:
|
||||
logger.info(f"Utilisation de {key}")
|
||||
return rapport_data[key]
|
||||
|
||||
# Créer une analyse par défaut si aucune n'est disponible
|
||||
logger.warning("Aucune analyse de ticket disponible, création d'un message par défaut")
|
||||
ticket_data = rapport_data.get("ticket_data", {})
|
||||
ticket_name = ticket_data.get("name", "Sans titre")
|
||||
ticket_desc = ticket_data.get("description", "Pas de description disponible")
|
||||
return f"Analyse par défaut du ticket:\nNom: {ticket_name}\nDescription: {ticket_desc}\n(Aucune analyse détaillée n'a été fournie)"
|
||||
|
||||
def _extraire_analyses_images(self, rapport_data: Dict) -> List[Dict]:
|
||||
"""
|
||||
Extrait et formate les analyses d'images pertinentes
|
||||
|
||||
Args:
|
||||
rapport_data: Données du rapport contenant les analyses d'images
|
||||
|
||||
Returns:
|
||||
Liste des analyses d'images pertinentes formatées
|
||||
"""
|
||||
images_analyses = []
|
||||
analyse_images_data = rapport_data.get("analyse_images", {})
|
||||
|
||||
# Parcourir toutes les images
|
||||
for image_path, analyse_data in analyse_images_data.items():
|
||||
# Vérifier si l'image est pertinente
|
||||
is_relevant = False
|
||||
if "sorting" in analyse_data and isinstance(analyse_data["sorting"], dict):
|
||||
is_relevant = analyse_data["sorting"].get("is_relevant", False)
|
||||
|
||||
# Si l'image est pertinente, extraire son analyse
|
||||
if is_relevant:
|
||||
image_name = os.path.basename(image_path)
|
||||
analyse = self._extraire_analyse_image(analyse_data)
|
||||
|
||||
if analyse:
|
||||
images_analyses.append({
|
||||
"image_name": image_name,
|
||||
"image_path": image_path,
|
||||
"analyse": analyse,
|
||||
"sorting_info": analyse_data.get("sorting", {}),
|
||||
"metadata": analyse_data.get("analysis", {}).get("metadata", {})
|
||||
})
|
||||
logger.info(f"Analyse de l'image {image_name} ajoutée")
|
||||
|
||||
return images_analyses
|
||||
|
||||
def _extraire_analyse_image(self, analyse_data: Dict) -> Optional[str]:
|
||||
"""
|
||||
Extrait l'analyse d'une image depuis les données
|
||||
|
||||
Args:
|
||||
analyse_data: Données d'analyse de l'image
|
||||
|
||||
Returns:
|
||||
Texte d'analyse de l'image ou None si aucune analyse n'est disponible
|
||||
"""
|
||||
# Si pas de données d'analyse, retourner None
|
||||
if not "analysis" in analyse_data or not analyse_data["analysis"]:
|
||||
if "sorting" in analyse_data and isinstance(analyse_data["sorting"], dict):
|
||||
reason = analyse_data["sorting"].get("reason", "Non spécifiée")
|
||||
return f"Image marquée comme pertinente. Raison: {reason}"
|
||||
return None
|
||||
|
||||
# Extraire l'analyse selon le format des données
|
||||
analysis = analyse_data["analysis"]
|
||||
|
||||
# Structure type 1: {"analyse": "texte"}
|
||||
if isinstance(analysis, dict) and "analyse" in analysis:
|
||||
return analysis["analyse"]
|
||||
|
||||
# Structure type 2: {"error": false, ...} - contient d'autres données utiles
|
||||
if isinstance(analysis, dict) and "error" in analysis and not analysis.get("error", True):
|
||||
return str(analysis)
|
||||
|
||||
# Structure type 3: texte d'analyse direct
|
||||
if isinstance(analysis, str):
|
||||
return analysis
|
||||
|
||||
# Structure type 4: autre format de dictionnaire - convertir en JSON
|
||||
if isinstance(analysis, dict):
|
||||
return json.dumps(analysis, ensure_ascii=False, indent=2)
|
||||
|
||||
# Aucun format reconnu
|
||||
return None
|
||||
|
||||
def _collecter_info_agents(self, rapport_data: Dict) -> Dict:
|
||||
"""
|
||||
Collecte des informations sur les agents utilisés dans l'analyse
|
||||
|
||||
Args:
|
||||
rapport_data: Données du rapport
|
||||
|
||||
Returns:
|
||||
Dictionnaire contenant les informations sur les agents
|
||||
"""
|
||||
agents_info = {}
|
||||
|
||||
# Informations sur l'agent JSON Analyser (Ticket Analyser)
|
||||
ticket_analyses = {}
|
||||
for key in ["ticket_analyse", "analyse_json", "analyse_ticket"]:
|
||||
if key in rapport_data and isinstance(rapport_data[key], dict) and "metadata" in rapport_data[key]:
|
||||
ticket_analyses = rapport_data[key]["metadata"]
|
||||
break
|
||||
|
||||
if ticket_analyses:
|
||||
agents_info["ticket_analyser"] = ticket_analyses
|
||||
|
||||
# Informations sur les agents d'image
|
||||
if "analyse_images" in rapport_data and rapport_data["analyse_images"]:
|
||||
# Image Sorter
|
||||
sorter_info = {}
|
||||
analyser_info = {}
|
||||
|
||||
for img_path, img_data in rapport_data["analyse_images"].items():
|
||||
# Collecter info du sorter
|
||||
if "sorting" in img_data and isinstance(img_data["sorting"], dict) and "metadata" in img_data["sorting"]:
|
||||
sorter_info = img_data["sorting"]["metadata"]
|
||||
|
||||
# Collecter info de l'analyser
|
||||
if "analysis" in img_data and isinstance(img_data["analysis"], dict) and "metadata" in img_data["analysis"]:
|
||||
analyser_info = img_data["analysis"]["metadata"]
|
||||
|
||||
# Une fois qu'on a trouvé les deux, on peut sortir
|
||||
if sorter_info and analyser_info:
|
||||
break
|
||||
|
||||
if sorter_info:
|
||||
agents_info["image_sorter"] = sorter_info
|
||||
if analyser_info:
|
||||
agents_info["image_analyser"] = analyser_info
|
||||
|
||||
# Ajouter les informations de l'agent report generator
|
||||
agents_info["report_generator"] = {
|
||||
"model": getattr(self.llm, "modele", str(type(self.llm))),
|
||||
"temperature": self.temperature,
|
||||
"top_p": self.top_p,
|
||||
"max_tokens": self.max_tokens,
|
||||
"prompt_version": self.prompt_version
|
||||
}
|
||||
|
||||
return agents_info
|
||||
|
||||
def _collecter_prompts_agents(self) -> Dict[str, str]:
|
||||
"""
|
||||
Collecte les prompts système de tous les agents impliqués dans l'analyse.
|
||||
|
||||
Returns:
|
||||
Dictionnaire contenant les prompts des agents
|
||||
"""
|
||||
prompts = {
|
||||
"rapport_generator": self.system_prompt
|
||||
}
|
||||
|
||||
# Importer les classes d'agents pour accéder à leurs prompts
|
||||
try:
|
||||
# Importer les autres agents
|
||||
from .agent_ticket_analyser import AgentTicketAnalyser
|
||||
from .agent_image_analyser import AgentImageAnalyser
|
||||
from .agent_image_sorter import AgentImageSorter
|
||||
|
||||
# Créer des instances temporaires pour récupérer les prompts
|
||||
# En passant None comme LLM pour éviter d'initialiser complètement les agents
|
||||
try:
|
||||
ticket_analyser = AgentTicketAnalyser(None)
|
||||
prompts["ticket_analyser"] = ticket_analyser.system_prompt
|
||||
logger.info("Prompt récupéré pour ticket_analyser")
|
||||
except Exception as e:
|
||||
logger.warning(f"Erreur lors de la récupération du prompt ticket_analyser: {str(e)}")
|
||||
|
||||
try:
|
||||
image_analyser = AgentImageAnalyser(None)
|
||||
prompts["image_analyser"] = image_analyser.system_prompt
|
||||
logger.info("Prompt récupéré pour image_analyser")
|
||||
except Exception as e:
|
||||
logger.warning(f"Erreur lors de la récupération du prompt image_analyser: {str(e)}")
|
||||
|
||||
try:
|
||||
image_sorter = AgentImageSorter(None)
|
||||
prompts["image_sorter"] = image_sorter.system_prompt
|
||||
logger.info("Prompt récupéré pour image_sorter")
|
||||
except Exception as e:
|
||||
logger.warning(f"Erreur lors de la récupération du prompt image_sorter: {str(e)}")
|
||||
|
||||
except ImportError as e:
|
||||
logger.warning(f"Erreur lors de l'importation des classes d'agents: {str(e)}")
|
||||
|
||||
return prompts
|
||||
@ -23,10 +23,12 @@ class AgentTicketAnalyser(BaseAgent):
|
||||
# Configuration locale de l'agent
|
||||
self.temperature = 0.1 # Besoin d'analyse très précise
|
||||
self.top_p = 0.8
|
||||
self.max_tokens = 3000
|
||||
self.max_tokens = 8000
|
||||
|
||||
# Centralisation des objectifs d'analyse
|
||||
self.objectifs_analyse = """
|
||||
# Prompt système optimisé
|
||||
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.
|
||||
|
||||
Ta mission principale :
|
||||
|
||||
1. Identifier le client et le contexte du ticket (demande "name" et "description")
|
||||
@ -44,20 +46,15 @@ Ta mission principale :
|
||||
- Identifie si cette partie complète ou précise les questions du nom
|
||||
|
||||
4. Structurer le fil de discussion
|
||||
- Conserve uniquement les échanges pertinents:
|
||||
- supprime mentions légales, signatures automatiques, liens inutiles...
|
||||
- Conserve les références documentation, FAQ, liens utiles ...
|
||||
- Conserve uniquement les échanges pertinents
|
||||
- CONSERVE ABSOLUMENT les références documentation, FAQ, liens utiles et manuels
|
||||
- Identifie clairement chaque intervenant (client / support)
|
||||
- Distingue les types de contenus (réponses, conseils, confirmations, demandes d'information, etc.)
|
||||
- Classe les informations par ordre chronologique avec date et rôle
|
||||
|
||||
5. Préparer la transmission à l'agent suivant
|
||||
- Nettoie le fil sans perte d'information technique: normes, FAQ, liens...
|
||||
- Préserve tous les éléments utiles à l'analyse d'image : modules cités, options évoquées, comportements décrits
|
||||
- Mentionne si des images sont attachées au ticket
|
||||
"""
|
||||
# Centralisation de la structure de réponse
|
||||
self.structure_reponse = """
|
||||
|
||||
Structure ta réponse :
|
||||
|
||||
1. Résumé du contexte
|
||||
@ -73,9 +70,9 @@ Structure ta réponse :
|
||||
|
||||
3. Fil de discussion (filtrée, nettoyée, classée)
|
||||
- Intervenant (Client/Support)
|
||||
- Date et contenu synthétique de chaque échange
|
||||
- Résumés techniques et suggestions
|
||||
- Liens documentaires s'ils sont utiles (manuel, FAQ…)
|
||||
- Date et contenu de chaque échange
|
||||
- Résumés techniques
|
||||
- INCLURE TOUS les liens documentaires (manuel, FAQ, documentation technique)
|
||||
|
||||
4. Éléments liés à l'analyse visuelle
|
||||
- Nombre d'images attachées
|
||||
@ -83,23 +80,10 @@ Structure ta réponse :
|
||||
- Points à vérifier dans les captures (listes incomplètes, cases à cocher, utilisateurs grisés, etc.)
|
||||
|
||||
IMPORTANT :
|
||||
- Ne propose aucune solution ni interprétation.
|
||||
- Ne génère pas de tableau.
|
||||
- Ne reformule pas les messages, conserve les formulations exactes sauf nettoyage de forme.
|
||||
"""
|
||||
# Construction du prompt système
|
||||
self.system_prompt = f"""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.
|
||||
{self.objectifs_analyse}
|
||||
Tu travailles à partir d'un ticket au format JSON.
|
||||
Ton rôle est d'extraire, nettoyer, structurer et enrichir le contexte de la demande.
|
||||
Ton analyse sera transmise à un autre agent chargé d'analyser les images liées au ticket.
|
||||
Elle doit donc être :
|
||||
- Factuelle
|
||||
- Structurée
|
||||
- Dépourvue d'informations inutiles
|
||||
- Adaptée à une suite d'analyse multimodale
|
||||
{self.structure_reponse}"""
|
||||
- Ne propose aucune solution ni interprétation
|
||||
- Ne génère pas de tableau
|
||||
- Reste strictement factuel en te basant uniquement sur les informations fournies
|
||||
- Ne reformule pas les messages, conserve les formulations exactes sauf nettoyage de forme"""
|
||||
|
||||
# Initialiser le loader de données
|
||||
self.ticket_loader = TicketDataLoader()
|
||||
@ -127,59 +111,6 @@ Elle doit donc être :
|
||||
|
||||
self.llm.configurer(**params)
|
||||
|
||||
def _generer_prompt_analyse(self, ticket_formate: str, source_format: str) -> str:
|
||||
"""
|
||||
Génère le prompt d'analyse standardisé
|
||||
|
||||
Args:
|
||||
ticket_formate: Texte du ticket formaté pour l'analyse
|
||||
source_format: Format source du ticket (JSON, Markdown, etc.)
|
||||
|
||||
Returns:
|
||||
Prompt formaté pour l'analyse du ticket
|
||||
"""
|
||||
return f"""Tu es un agent expert en analyse de tickets techniques pour BRG-Lab pour la société CBAO.
|
||||
Ta mission est de préparer une synthèse propre, structurée et exploitable par un second agent chargé d'analyser les images liées au ticket.
|
||||
|
||||
{ticket_formate}
|
||||
|
||||
Concentre-toi sur les points suivants :
|
||||
|
||||
1. Compréhension du problème initial
|
||||
- Analyse le champ `name` (nom de la demande) : identifie s'il contient une ou plusieurs questions explicites ou implicites.
|
||||
- Analyse la `description` : reformule les éventuelles interrogations techniques formulées par le client.
|
||||
- Résume la problématique en une ou deux phrases claires.
|
||||
|
||||
2. Identification du client
|
||||
- Récupère le nom et email du demandeur si disponibles (à partir de `author_id`, `partner_id_email_from` ou équivalents).
|
||||
- Ignore les signatures ou mentions inutiles.
|
||||
- Vérifie si un `user_id` est associé.
|
||||
|
||||
3. Informations techniques à extraire
|
||||
- Logiciels, modules, interfaces mentionnées
|
||||
- Paramètres visibles ou évoqués (ex: utilisateurs valides/invalides, filtres actifs, options)
|
||||
- Conditions spécifiques (multi-laboratoire, profils, permissions, etc.)
|
||||
- Références à des documents, normes ou configurations
|
||||
|
||||
4. Synthèse du fil de discussion
|
||||
- Classe les échanges par ordre chronologique
|
||||
- Indique clairement qui parle (Client ou Support)
|
||||
- Nettoie les mentions légales, signatures ou lignes non pertinentes
|
||||
- Garde uniquement les contenus ayant une valeur technique ou informative
|
||||
|
||||
5. Préparation à l'analyse visuelle
|
||||
- Si des captures d'écran sont présentes : indique combien, et si elles semblent liées à des options, interfaces ou comportements cités.
|
||||
- Identifie les éléments qui devraient apparaître visuellement : boutons, filtres, listes d'utilisateurs, champs à cocher, erreurs affichées.
|
||||
- Résume en 3-5 bullet points les éléments que le prochain agent devra observer sur les images.
|
||||
|
||||
IMPORTANT :
|
||||
- Ne propose pas de diagnostic ni de solution
|
||||
- Reste strictement factuel
|
||||
- N'invente rien : base-toi uniquement sur les données visibles
|
||||
|
||||
Ce ticket provient d'un fichier au format {source_format.upper()}.
|
||||
Réponds de manière factuelle, en te basant uniquement sur les informations fournies."""
|
||||
|
||||
def executer(self, ticket_data: Dict[str, Any]) -> str:
|
||||
"""
|
||||
Analyse un ticket pour en extraire les informations pertinentes
|
||||
@ -224,7 +155,17 @@ Réponds de manière factuelle, en te basant uniquement sur les informations fou
|
||||
ticket_formate = self._formater_ticket_pour_analyse(ticket_data)
|
||||
|
||||
# Créer le prompt pour l'analyse, adapté au format source
|
||||
prompt = self._generer_prompt_analyse(ticket_formate, source_format)
|
||||
prompt = f"""Analyse ce ticket pour en extraire les informations clés et préparer une synthèse structurée.
|
||||
|
||||
SOURCE: {source_format.upper()}
|
||||
|
||||
{ticket_formate}
|
||||
|
||||
RAPPEL IMPORTANT:
|
||||
- CONSERVE TOUS les liens (FAQ, documentation, manuels) présents dans les messages
|
||||
- Extrais et organise chronologiquement les échanges client/support
|
||||
- Identifie les éléments techniques à observer dans les captures d'écran
|
||||
- Reste factuel et précis sans proposer de solution"""
|
||||
|
||||
try:
|
||||
logger.info("Interrogation du LLM")
|
||||
|
||||
102
agents/utils/agent_info_collector.py
Normal file
102
agents/utils/agent_info_collector.py
Normal file
@ -0,0 +1,102 @@
|
||||
"""
|
||||
Module pour collecter les informations sur les agents et leurs prompts.
|
||||
Ce module permet d'extraire ces fonctionnalités de l'agent_report_generator
|
||||
pour améliorer sa performance et sa maintenabilité.
|
||||
"""
|
||||
|
||||
import logging
|
||||
from typing import Dict, Any, Optional
|
||||
import importlib
|
||||
|
||||
logger = logging.getLogger("agent_info_collector")
|
||||
|
||||
def collecter_info_agents(rapport_data: Dict, agent_info: Dict) -> Dict:
|
||||
"""
|
||||
Collecte des informations sur les agents utilisés dans l'analyse
|
||||
"""
|
||||
agents_info = {}
|
||||
|
||||
# Informations sur l'agent JSON Analyser (Ticket Analyser)
|
||||
ticket_analyses = {}
|
||||
for key in ["ticket_analyse", "analyse_json", "analyse_ticket"]:
|
||||
if key in rapport_data and isinstance(rapport_data[key], dict) and "metadata" in rapport_data[key]:
|
||||
ticket_analyses = rapport_data[key]["metadata"]
|
||||
break
|
||||
|
||||
if ticket_analyses:
|
||||
agents_info["ticket_analyser"] = ticket_analyses
|
||||
|
||||
# Informations sur les agents d'image
|
||||
if "analyse_images" in rapport_data and rapport_data["analyse_images"]:
|
||||
# Image Sorter
|
||||
sorter_info = {}
|
||||
analyser_info = {}
|
||||
|
||||
for img_path, img_data in rapport_data["analyse_images"].items():
|
||||
# Collecter info du sorter
|
||||
if "sorting" in img_data and isinstance(img_data["sorting"], dict) and "metadata" in img_data["sorting"]:
|
||||
sorter_info = img_data["sorting"]["metadata"]
|
||||
|
||||
# Collecter info de l'analyser
|
||||
if "analysis" in img_data and isinstance(img_data["analysis"], dict) and "metadata" in img_data["analysis"]:
|
||||
analyser_info = img_data["analysis"]["metadata"]
|
||||
|
||||
# Une fois qu'on a trouvé les deux, on peut sortir
|
||||
if sorter_info and analyser_info:
|
||||
break
|
||||
|
||||
if sorter_info:
|
||||
agents_info["image_sorter"] = sorter_info
|
||||
if analyser_info:
|
||||
agents_info["image_analyser"] = analyser_info
|
||||
|
||||
# Ajouter les informations de l'agent report generator
|
||||
agents_info["report_generator"] = {
|
||||
"model": agent_info.get("model", "inconnu"),
|
||||
"temperature": agent_info.get("temperature", 0),
|
||||
"top_p": agent_info.get("top_p", 0),
|
||||
"max_tokens": agent_info.get("max_tokens", 0),
|
||||
"prompt_version": agent_info.get("prompt_version", "inconnue")
|
||||
}
|
||||
|
||||
return agents_info
|
||||
|
||||
def collecter_prompts_agents(system_prompt: str) -> Dict[str, str]:
|
||||
"""
|
||||
Collecte les prompts système de tous les agents impliqués dans l'analyse.
|
||||
"""
|
||||
prompts = {
|
||||
"rapport_generator": system_prompt
|
||||
}
|
||||
|
||||
# Liste des agents à importer
|
||||
agents_to_import = [
|
||||
("agent_ticket_analyser", "AgentTicketAnalyser"),
|
||||
("agent_image_analyser", "AgentImageAnalyser"),
|
||||
("agent_image_sorter", "AgentImageSorter")
|
||||
]
|
||||
|
||||
# Importer dynamiquement chaque agent et récupérer son prompt
|
||||
for module_name, class_name in agents_to_import:
|
||||
try:
|
||||
# Importer de façon sécurisée
|
||||
full_module_name = f"agents.{module_name}"
|
||||
module = importlib.import_module(full_module_name)
|
||||
|
||||
# Récupérer la classe
|
||||
agent_class = getattr(module, class_name)
|
||||
|
||||
# Créer une instance temporaire en passant None comme LLM
|
||||
try:
|
||||
agent_instance = agent_class(None)
|
||||
prompts[module_name.replace("agent_", "")] = agent_instance.system_prompt
|
||||
logger.info(f"Prompt récupéré pour {module_name}")
|
||||
except Exception as e:
|
||||
logger.warning(f"Erreur lors de la récupération du prompt {module_name}: {str(e)}")
|
||||
|
||||
except ImportError as e:
|
||||
logger.warning(f"Erreur lors de l'importation du module {module_name}: {str(e)}")
|
||||
except AttributeError as e:
|
||||
logger.warning(f"Classe {class_name} non trouvée dans le module {module_name}: {str(e)}")
|
||||
|
||||
return prompts
|
||||
@ -1,425 +0,0 @@
|
||||
"""
|
||||
Utilitaires pour la génération de rapports d'analyse optimisée pour Qwen/DeepSeek.
|
||||
Version modifiée de report_utils.py pour un meilleur traitement des formats JSON spécifiques.
|
||||
"""
|
||||
|
||||
import re
|
||||
import json
|
||||
import logging
|
||||
from typing import Dict, List, Any, Tuple, Optional
|
||||
from datetime import datetime
|
||||
|
||||
logger = logging.getLogger("report_utils_bis")
|
||||
|
||||
def get_timestamp() -> str:
|
||||
"""
|
||||
Retourne un timestamp au format YYYYMMDD_HHMMSS pour identifier les fichiers et données.
|
||||
|
||||
Returns:
|
||||
Chaîne formatée avec le timestamp actuel
|
||||
"""
|
||||
return datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
|
||||
def generer_tableau_questions_reponses(echanges: List[Dict]) -> str:
|
||||
"""
|
||||
Génère un tableau question/réponse simplifié à partir des échanges
|
||||
|
||||
Args:
|
||||
echanges: Liste des échanges client/support
|
||||
|
||||
Returns:
|
||||
Tableau au format markdown
|
||||
"""
|
||||
if not echanges:
|
||||
return "Aucun échange trouvé dans ce ticket."
|
||||
|
||||
# Initialiser le tableau
|
||||
tableau = "\n## Tableau récapitulatif des échanges\n\n"
|
||||
tableau += "| Question (Client) | Réponse (Support) |\n"
|
||||
tableau += "|------------------|-------------------|\n"
|
||||
|
||||
# Variables pour suivre les questions et réponses
|
||||
question_courante = None
|
||||
questions_sans_reponse = []
|
||||
|
||||
# Parcourir tous les échanges pour identifier les questions et réponses
|
||||
for echange in echanges:
|
||||
emetteur = echange.get("emetteur", "").lower()
|
||||
type_msg = echange.get("type", "").lower()
|
||||
contenu = echange.get("contenu", "")
|
||||
date = echange.get("date", "")
|
||||
|
||||
# Formater le contenu (synthétiser si trop long)
|
||||
contenu_formate = synthétiser_contenu(contenu, 150)
|
||||
|
||||
# Si c'est une question du client
|
||||
if emetteur == "client" and (type_msg == "question" or "?" in contenu):
|
||||
# Si une question précédente n'a pas de réponse, l'ajouter à la liste
|
||||
if question_courante:
|
||||
questions_sans_reponse.append(question_courante)
|
||||
|
||||
# Enregistrer la nouvelle question courante
|
||||
question_courante = f"{contenu_formate} _(date: {date})_"
|
||||
|
||||
# Si c'est une réponse du support et qu'il y a une question en attente
|
||||
elif emetteur == "support" and question_courante:
|
||||
# Ajouter la paire question/réponse au tableau
|
||||
tableau += f"| {question_courante} | {contenu_formate} _(date: {date})_ |\n"
|
||||
question_courante = None # Réinitialiser la question courante
|
||||
|
||||
# Traiter toute question restante sans réponse
|
||||
if question_courante:
|
||||
questions_sans_reponse.append(question_courante)
|
||||
|
||||
# Ajouter les questions sans réponse au tableau
|
||||
for q in questions_sans_reponse:
|
||||
tableau += f"| {q} | **Aucune réponse du support** |\n"
|
||||
|
||||
# Ajouter une note si aucun échange support n'a été trouvé
|
||||
if not any(echange.get("emetteur", "").lower() == "support" for echange in echanges):
|
||||
tableau += "\n**Note: Aucune réponse du support n'a été trouvée dans ce ticket.**\n"
|
||||
|
||||
return tableau
|
||||
|
||||
def synthétiser_contenu(contenu: str, longueur_max: int) -> str:
|
||||
"""
|
||||
Synthétise le contenu s'il est trop long
|
||||
|
||||
Args:
|
||||
contenu: Contenu à synthétiser
|
||||
longueur_max: Longueur maximale souhaitée
|
||||
|
||||
Returns:
|
||||
Contenu synthétisé
|
||||
"""
|
||||
if len(contenu) <= longueur_max:
|
||||
return contenu
|
||||
|
||||
# Extraire les premiers caractères
|
||||
debut = contenu[:longueur_max//2].strip()
|
||||
# Extraire les derniers caractères
|
||||
fin = contenu[-(longueur_max//2):].strip()
|
||||
|
||||
return f"{debut}... {fin}"
|
||||
|
||||
def extraire_et_traiter_json(texte_rapport: str) -> Tuple[str, Optional[Dict], Optional[str]]:
|
||||
"""
|
||||
Extrait l'objet JSON des échanges du texte du rapport et le convertit en Markdown
|
||||
Version optimisée pour les modèles Qwen et DeepSeek.
|
||||
|
||||
Args:
|
||||
texte_rapport: Texte complet du rapport généré par le LLM
|
||||
|
||||
Returns:
|
||||
Tuple (rapport_traité, echanges_json, echanges_markdown)
|
||||
"""
|
||||
# Remplacer CBAD par CBAO dans tout le rapport
|
||||
texte_rapport = texte_rapport.replace("CBAD", "CBAO")
|
||||
|
||||
# Rechercher des sections spécifiques
|
||||
tableau_section = None
|
||||
sections = re.findall(r'##\s+(.*?)\n', texte_rapport)
|
||||
for section in sections:
|
||||
if "tableau des échanges" in section.lower():
|
||||
tableau_section = "## " + section
|
||||
logger.info(f"Section de tableau trouvée: {tableau_section}")
|
||||
break
|
||||
|
||||
# Si une section "Tableau des échanges" est trouvée, chercher le JSON qui suit
|
||||
json_text = None
|
||||
if tableau_section:
|
||||
# Trouver l'index de la section
|
||||
section_index = texte_rapport.find(tableau_section)
|
||||
if section_index != -1:
|
||||
# Extraire tout le texte après la section
|
||||
section_text = texte_rapport[section_index + len(tableau_section):]
|
||||
|
||||
# Patterns plus précis pour la recherche du JSON
|
||||
json_patterns = [
|
||||
r'```json\s*({.*?})\s*```', # Format avec balises json
|
||||
r'```\s*({.*?"chronologie_echanges".*?})\s*```', # Format avec balises code
|
||||
r'`({.*?"chronologie_echanges".*?})`', # Format avec backticks simples
|
||||
r'({[\s\n]*"chronologie_echanges"[\s\n]*:[\s\n]*\[.*?\][\s\n]*})' # Format sans balises
|
||||
]
|
||||
|
||||
# Essayer chaque pattern
|
||||
for pattern in json_patterns:
|
||||
json_match = re.search(pattern, section_text, re.DOTALL)
|
||||
if json_match:
|
||||
json_text = json_match.group(1).strip()
|
||||
logger.info(f"JSON trouvé après la section '{tableau_section}'")
|
||||
break
|
||||
|
||||
# Si aucun JSON n'a été trouvé avec la méthode par section, essayer d'autres approches
|
||||
if not json_text:
|
||||
# Patterns généraux pour le JSON
|
||||
general_patterns = [
|
||||
r'```json\s*({.*?"chronologie_echanges".*?})\s*```',
|
||||
r'```\s*({.*?"chronologie_echanges".*?})\s*```',
|
||||
r'({[\s\n]*"chronologie_echanges"[\s\n]*:[\s\n]*\[.*?\][\s\n]*})'
|
||||
]
|
||||
|
||||
for pattern in general_patterns:
|
||||
json_match = re.search(pattern, texte_rapport, re.DOTALL)
|
||||
if json_match:
|
||||
json_text = json_match.group(1).strip()
|
||||
logger.info(f"JSON trouvé avec pattern général")
|
||||
break
|
||||
|
||||
# Approche de dernier recours: recherche agressive de structure JSON
|
||||
if not json_text:
|
||||
# Identifier toutes les accolades ouvrantes dans le texte
|
||||
possible_starts = [m.start() for m in re.finditer(r'{\s*["\']chronologie_echanges["\']', texte_rapport)]
|
||||
|
||||
for start_pos in possible_starts:
|
||||
# On a trouvé un début potentiel, maintenant chercher la fin
|
||||
open_braces = 1
|
||||
end_pos = None
|
||||
|
||||
for i in range(start_pos + 1, len(texte_rapport)):
|
||||
if texte_rapport[i] == '{':
|
||||
open_braces += 1
|
||||
elif texte_rapport[i] == '}':
|
||||
open_braces -= 1
|
||||
if open_braces == 0:
|
||||
end_pos = i
|
||||
break
|
||||
|
||||
if end_pos:
|
||||
potential_json = texte_rapport[start_pos:end_pos+1]
|
||||
# Vérifier que le texte semble être du JSON valide
|
||||
if '"chronologie_echanges"' in potential_json and '[' in potential_json and ']' in potential_json:
|
||||
json_text = potential_json
|
||||
logger.info(f"JSON trouvé par analyse des accolades équilibrées")
|
||||
break
|
||||
|
||||
# Si après toutes ces tentatives, aucun JSON n'est trouvé
|
||||
if not json_text:
|
||||
logger.warning("Aucun JSON trouvé dans le rapport - tentative de création à partir du fil de discussion")
|
||||
|
||||
# Chercher une section "Fil de discussion" ou similaire
|
||||
fil_discussion_patterns = [
|
||||
r'## Fil de discussion\s*([\s\S]*?)(?=##|$)',
|
||||
r'## Discussion\s*([\s\S]*?)(?=##|$)',
|
||||
r'## Chronologie des échanges\s*([\s\S]*?)(?=##|$)'
|
||||
]
|
||||
|
||||
fil_discussion_text = None
|
||||
for pattern in fil_discussion_patterns:
|
||||
match = re.search(pattern, texte_rapport, re.DOTALL)
|
||||
if match:
|
||||
fil_discussion_text = match.group(1).strip()
|
||||
break
|
||||
|
||||
# Si on a trouvé une section de fil de discussion, essayer d'en extraire des échanges
|
||||
if fil_discussion_text:
|
||||
# Chercher des patterns comme "1. CLIENT (date): contenu"
|
||||
echanges_matches = re.findall(r'(\d+)\.\s+\*\*([^()]*)\*\*\s+\(([^()]*)\):\s*(.*?)(?=\d+\.\s+\*\*|$)',
|
||||
fil_discussion_text, re.DOTALL)
|
||||
|
||||
# Si pas trouvé, essayer d'autres formats
|
||||
if not echanges_matches:
|
||||
echanges_matches = re.findall(r'(\d+)\.\s+([^()]*)\s+\(([^()]*)\):\s*(.*?)(?=\d+\.\s+|$)',
|
||||
fil_discussion_text, re.DOTALL)
|
||||
|
||||
# Construire le JSON manuellement
|
||||
if echanges_matches:
|
||||
chronologie = []
|
||||
for _, emetteur, date, contenu in echanges_matches:
|
||||
emetteur = emetteur.strip()
|
||||
type_msg = "Question" if emetteur.upper() == "CLIENT" else "Réponse"
|
||||
emetteur = "CLIENT" if emetteur.upper() == "CLIENT" else "SUPPORT"
|
||||
|
||||
chronologie.append({
|
||||
"date": date.strip(),
|
||||
"emetteur": emetteur,
|
||||
"type": type_msg,
|
||||
"contenu": contenu.strip()
|
||||
})
|
||||
|
||||
# Ajouter un élément "Complément visuel" s'il n'y en a pas déjà un
|
||||
if not any(e.get("type") == "Complément visuel" for e in chronologie):
|
||||
# Essayer de trouver une date pour le complément
|
||||
last_date = chronologie[-1]["date"] if chronologie else "01/01/2023"
|
||||
|
||||
chronologie.append({
|
||||
"date": last_date,
|
||||
"emetteur": "SUPPORT",
|
||||
"type": "Complément visuel",
|
||||
"contenu": "L'analyse des captures d'écran montre les options d'affichage et la configuration des laboratoires qui peuvent impacter l'affichage des utilisateurs."
|
||||
})
|
||||
|
||||
# Créer le JSON
|
||||
echanges_json = {"chronologie_echanges": chronologie}
|
||||
json_text = json.dumps(echanges_json, ensure_ascii=False, indent=2)
|
||||
logger.info(f"JSON créé manuellement à partir du fil de discussion ({len(chronologie)} échanges)")
|
||||
|
||||
# Si toujours pas de JSON, créer un JSON vide pour éviter les erreurs
|
||||
if not json_text:
|
||||
default_json = {
|
||||
"chronologie_echanges": [
|
||||
{"date": "01/01/2023", "emetteur": "CLIENT", "type": "Question", "contenu": "Requête initiale du client"},
|
||||
{"date": "02/01/2023", "emetteur": "SUPPORT", "type": "Réponse", "contenu": "Réponse du support technique"},
|
||||
{"date": "03/01/2023", "emetteur": "SUPPORT", "type": "Complément visuel", "contenu": "Synthèse des captures d'écran analysées"}
|
||||
]
|
||||
}
|
||||
json_text = json.dumps(default_json, ensure_ascii=False, indent=2)
|
||||
logger.warning("JSON créé par défaut car aucun échange n'a pu être extrait du rapport")
|
||||
|
||||
# Nettoyage supplémentaire du JSON
|
||||
# Enlever caractères non imprimables
|
||||
json_text = re.sub(r'[\x00-\x1F\x7F]', '', json_text)
|
||||
|
||||
try:
|
||||
# Vérifier que le texte commence par { et se termine par }
|
||||
if not (json_text.startswith('{') and json_text.endswith('}')):
|
||||
logger.warning(f"Format JSON incorrect, tentative de correction. Texte: {json_text[:50]}...")
|
||||
# Chercher les délimiteurs du JSON
|
||||
start = json_text.find('{')
|
||||
end = json_text.rfind('}')
|
||||
if start != -1 and end != -1 and start < end:
|
||||
json_text = json_text[start:end+1]
|
||||
logger.info("Correction du JSON réussie")
|
||||
|
||||
try:
|
||||
echanges_json = json.loads(json_text)
|
||||
logger.info(f"JSON extrait avec succès: {len(json_text)} caractères")
|
||||
except json.JSONDecodeError as e:
|
||||
# Tentative de correction des erreurs courantes de JSON
|
||||
logger.warning(f"Erreur de décodage JSON: {e}. Tentative de correction...")
|
||||
|
||||
# Corriger les guillemets mal échappés
|
||||
json_text = json_text.replace('\\"', '"')
|
||||
json_text = json_text.replace("'", '"')
|
||||
|
||||
# Corriger les virgules trailing
|
||||
json_text = re.sub(r',\s*}', '}', json_text)
|
||||
json_text = re.sub(r',\s*]', ']', json_text)
|
||||
|
||||
try:
|
||||
echanges_json = json.loads(json_text)
|
||||
logger.info("Correction du JSON réussie")
|
||||
except json.JSONDecodeError:
|
||||
# Si toujours pas valide, créer un JSON par défaut
|
||||
logger.error("Impossible de corriger le JSON. Création d'un JSON par défaut.")
|
||||
echanges_json = {
|
||||
"chronologie_echanges": [
|
||||
{"date": "01/01/2023", "emetteur": "CLIENT", "type": "Question", "contenu": "Requête initiale du client"},
|
||||
{"date": "02/01/2023", "emetteur": "SUPPORT", "type": "Réponse", "contenu": "Réponse du support technique"},
|
||||
{"date": "03/01/2023", "emetteur": "SUPPORT", "type": "Complément visuel", "contenu": "Synthèse des captures d'écran analysées"}
|
||||
]
|
||||
}
|
||||
|
||||
# Vérifier si le JSON a la structure attendue
|
||||
if not isinstance(echanges_json, dict) or "chronologie_echanges" not in echanges_json:
|
||||
# Tenter de corriger la structure si possible
|
||||
if len(echanges_json) > 0 and isinstance(list(echanges_json.values())[0], list):
|
||||
# Prendre la première liste comme chronologie
|
||||
key = list(echanges_json.keys())[0]
|
||||
echanges_json = {"chronologie_echanges": echanges_json[key]}
|
||||
logger.info(f"Structure JSON corrigée en utilisant la clé: {key}")
|
||||
else:
|
||||
logger.warning("Structure JSON incorrecte et non réparable. Création d'un JSON par défaut.")
|
||||
echanges_json = {
|
||||
"chronologie_echanges": [
|
||||
{"date": "01/01/2023", "emetteur": "CLIENT", "type": "Question", "contenu": "Requête initiale du client"},
|
||||
{"date": "02/01/2023", "emetteur": "SUPPORT", "type": "Réponse", "contenu": "Réponse du support technique"},
|
||||
{"date": "03/01/2023", "emetteur": "SUPPORT", "type": "Complément visuel", "contenu": "Synthèse des captures d'écran analysées"}
|
||||
]
|
||||
}
|
||||
|
||||
# S'assurer que toutes les entrées ont les champs obligatoires
|
||||
if "chronologie_echanges" in echanges_json and isinstance(echanges_json["chronologie_echanges"], list):
|
||||
for i, echange in enumerate(echanges_json["chronologie_echanges"]):
|
||||
# Ajouter des valeurs par défaut pour les champs manquants
|
||||
if "date" not in echange:
|
||||
echange["date"] = "01/01/2023"
|
||||
if "emetteur" not in echange:
|
||||
echange["emetteur"] = "CLIENT" if i % 2 == 0 else "SUPPORT"
|
||||
if "type" not in echange:
|
||||
echange["type"] = "Question" if echange["emetteur"] == "CLIENT" else "Réponse"
|
||||
if "contenu" not in echange:
|
||||
echange["contenu"] = "Contenu non spécifié"
|
||||
|
||||
# Standardiser les formats
|
||||
echange["emetteur"] = echange["emetteur"].upper()
|
||||
if echange["emetteur"] not in ["CLIENT", "SUPPORT"]:
|
||||
echange["emetteur"] = "CLIENT" if "client" in echange["emetteur"].lower() else "SUPPORT"
|
||||
|
||||
# Convertir en tableau Markdown
|
||||
echanges_markdown = "| Date | Émetteur | Type | Contenu | Statut |\n"
|
||||
echanges_markdown += "|------|---------|------|---------|--------|\n"
|
||||
|
||||
if "chronologie_echanges" in echanges_json and isinstance(echanges_json["chronologie_echanges"], list):
|
||||
# Pré-traitement pour vérifier les questions sans réponse
|
||||
questions_sans_reponse = {}
|
||||
for i, echange in enumerate(echanges_json["chronologie_echanges"]):
|
||||
if echange.get("type", "").lower() == "question" and echange.get("emetteur", "").lower() == "client":
|
||||
has_response = False
|
||||
# Vérifier si la question a une réponse
|
||||
for j in range(i+1, len(echanges_json["chronologie_echanges"])):
|
||||
next_echange = echanges_json["chronologie_echanges"][j]
|
||||
if next_echange.get("type", "").lower() in ["réponse", "reponse"] and next_echange.get("emetteur", "").lower() == "support":
|
||||
has_response = True
|
||||
break
|
||||
questions_sans_reponse[i] = not has_response
|
||||
|
||||
# Générer le tableau
|
||||
for i, echange in enumerate(echanges_json["chronologie_echanges"]):
|
||||
date = echange.get("date", "-")
|
||||
emetteur = echange.get("emetteur", "-")
|
||||
type_msg = echange.get("type", "-")
|
||||
contenu = echange.get("contenu", "-")
|
||||
|
||||
# Ajouter un statut pour les questions sans réponse
|
||||
statut = ""
|
||||
if emetteur.lower() == "client" and type_msg.lower() == "question" and questions_sans_reponse.get(i, False):
|
||||
statut = "**Sans réponse**"
|
||||
|
||||
echanges_markdown += f"| {date} | {emetteur} | {type_msg} | {contenu} | {statut} |\n"
|
||||
|
||||
# Ajouter une note si aucune réponse du support n'a été trouvée
|
||||
if not any(echange.get("emetteur", "").lower() == "support" for echange in echanges_json["chronologie_echanges"]):
|
||||
echanges_markdown += "\n**Note: Aucune réponse du support n'a été trouvée dans ce ticket.**\n\n"
|
||||
|
||||
# Ajouter un tableau questions/réponses simplifié
|
||||
tableau_qr = generer_tableau_questions_reponses(echanges_json["chronologie_echanges"])
|
||||
echanges_markdown += f"\n{tableau_qr}\n"
|
||||
|
||||
# S'il y a une section "Tableau des échanges", remplacer tout ce qui suit jusqu'à la prochaine section
|
||||
if tableau_section:
|
||||
tableau_index = texte_rapport.find(tableau_section)
|
||||
if tableau_index != -1:
|
||||
next_section_match = re.search(r'##\s+', texte_rapport[tableau_index + len(tableau_section):])
|
||||
if next_section_match:
|
||||
next_section_index = tableau_index + len(tableau_section) + next_section_match.start()
|
||||
rapport_traite = texte_rapport[:tableau_index + len(tableau_section)] + "\n\n" + echanges_markdown + "\n\n" + texte_rapport[next_section_index:]
|
||||
else:
|
||||
rapport_traite = texte_rapport[:tableau_index + len(tableau_section)] + "\n\n" + echanges_markdown + "\n\n"
|
||||
else:
|
||||
rapport_traite = texte_rapport # Aucun changement si on ne trouve pas la section
|
||||
else:
|
||||
# Chercher où insérer le tableau s'il n'y a pas de section spécifique
|
||||
diagnostic_match = re.search(r'##\s+Diagnostic', texte_rapport)
|
||||
if diagnostic_match:
|
||||
insert_index = diagnostic_match.start()
|
||||
rapport_traite = texte_rapport[:insert_index] + "\n## Tableau des échanges\n\n" + echanges_markdown + "\n\n" + texte_rapport[insert_index:]
|
||||
else:
|
||||
rapport_traite = texte_rapport + "\n\n## Tableau des échanges\n\n" + echanges_markdown + "\n\n"
|
||||
|
||||
return rapport_traite, echanges_json, echanges_markdown
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur inattendue lors du traitement JSON: {e}")
|
||||
logger.debug(f"Contenu JSON problématique: {json_text[:100]}...")
|
||||
|
||||
# Créer un JSON par défaut
|
||||
echanges_json = {
|
||||
"chronologie_echanges": [
|
||||
{"date": "01/01/2023", "emetteur": "CLIENT", "type": "Question", "contenu": "Requête initiale du client"},
|
||||
{"date": "02/01/2023", "emetteur": "SUPPORT", "type": "Réponse", "contenu": "Réponse du support technique"},
|
||||
{"date": "03/01/2023", "emetteur": "SUPPORT", "type": "Complément visuel", "contenu": "Synthèse des captures d'écran analysées"}
|
||||
]
|
||||
}
|
||||
|
||||
return texte_rapport, echanges_json, None
|
||||
328
fix_reports.py
328
fix_reports.py
@ -1,328 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Script de correction des rapports existants
|
||||
Permet de:
|
||||
1. Extraire correctement le JSON
|
||||
2. Générer les fichiers CSV manquants
|
||||
3. Analyser l'état des rapports générés
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import glob
|
||||
import logging
|
||||
import argparse
|
||||
from datetime import datetime
|
||||
import traceback
|
||||
|
||||
# Import des utilitaires
|
||||
try:
|
||||
from agents.utils.report_utils_bis import extraire_et_traiter_json
|
||||
except ImportError:
|
||||
print("ERREUR: Impossible d'importer les modules requis.")
|
||||
print("Assurez-vous d'exécuter ce script depuis le répertoire racine du projet.")
|
||||
sys.exit(1)
|
||||
|
||||
# Configuration du logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger("fix_reports")
|
||||
|
||||
def generate_csv_from_json(json_path, model_name=None):
|
||||
"""
|
||||
Génère un fichier CSV à partir du rapport JSON
|
||||
|
||||
Args:
|
||||
json_path: Chemin vers le fichier JSON
|
||||
model_name: Nom du modèle pour le nom du fichier CSV (facultatif)
|
||||
"""
|
||||
try:
|
||||
# Charger le rapport JSON
|
||||
with open(json_path, 'r', encoding='utf-8') as f:
|
||||
rapport_data = json.load(f)
|
||||
|
||||
# Extraire l'ID du ticket
|
||||
ticket_id = rapport_data.get("ticket_id", os.path.basename(json_path).split("_")[0])
|
||||
|
||||
# Extraire les échanges
|
||||
chronologie_echanges = rapport_data.get("chronologie_echanges", [])
|
||||
if not chronologie_echanges:
|
||||
logger.error(f"Aucun échange trouvé dans le fichier JSON: {json_path}")
|
||||
return False
|
||||
|
||||
# Déterminer le nom du modèle
|
||||
if not model_name:
|
||||
# Essayer de l'extraire des métadonnées
|
||||
metadata = rapport_data.get("metadata", {})
|
||||
model_name = metadata.get("model", "default").split(":")[0].lower()
|
||||
|
||||
# Créer le nom du fichier CSV
|
||||
csv_path = os.path.join(os.path.dirname(json_path), f"{ticket_id}_{model_name}.csv")
|
||||
|
||||
# Générer le CSV complet avec toutes les colonnes
|
||||
with open(csv_path, 'w', encoding='utf-8', newline='') as csvfile:
|
||||
# Écrire l'en-tête
|
||||
csvfile.write("Date,Émetteur,Type,Contenu\n")
|
||||
|
||||
# Écrire les échanges
|
||||
for echange in chronologie_echanges:
|
||||
date = echange.get('date', '').replace(',', ' ')
|
||||
emetteur = echange.get('emetteur', '').replace(',', ' ')
|
||||
type_msg = echange.get('type', '').replace(',', ' ')
|
||||
contenu = echange.get('contenu', '').replace(',', ' ').replace('\n', ' ')
|
||||
|
||||
csvfile.write(f'"{date}","{emetteur}","{type_msg}","{contenu}"\n')
|
||||
|
||||
logger.info(f"Fichier CSV complet généré: {csv_path}")
|
||||
|
||||
# Générer également une version simplifiée Q&R pour la compatibilité
|
||||
qr_csv_path = os.path.join(os.path.dirname(json_path), f"{ticket_id}_{model_name}_qr.csv")
|
||||
|
||||
with open(qr_csv_path, 'w', encoding='utf-8', newline='') as csvfile:
|
||||
# Écrire l'en-tête
|
||||
csvfile.write("Question,Réponse\n")
|
||||
|
||||
# Variables pour suivre les questions et réponses
|
||||
current_question = None
|
||||
|
||||
# Parcourir les échanges et extraire les paires Q&R
|
||||
for echange in chronologie_echanges:
|
||||
emetteur = echange.get('emetteur', '').upper()
|
||||
type_msg = echange.get('type', '').lower()
|
||||
contenu = echange.get('contenu', '').replace(',', ' ').replace('\n', ' ')
|
||||
|
||||
# Si c'est une question du client
|
||||
if emetteur == 'CLIENT' and (type_msg == 'question' or '?' in contenu):
|
||||
# Si une question précédente existe sans réponse, l'écrire avec une réponse vide
|
||||
if current_question:
|
||||
csvfile.write(f'"{current_question}",""\n')
|
||||
|
||||
# Enregistrer la nouvelle question
|
||||
current_question = contenu
|
||||
|
||||
# Si c'est une réponse ou un complément et qu'il y a une question en attente
|
||||
elif emetteur == 'SUPPORT' and current_question:
|
||||
# Préfixer la réponse pour la clarté
|
||||
formatted_response = f"[{type_msg.upper()}] {contenu}"
|
||||
|
||||
# Écrire la paire question/réponse
|
||||
csvfile.write(f'"{current_question}","{formatted_response}"\n')
|
||||
current_question = None
|
||||
|
||||
# Si une question reste sans réponse à la fin
|
||||
if current_question:
|
||||
csvfile.write(f'"{current_question}",""\n')
|
||||
|
||||
logger.info(f"Fichier CSV Q&R simplifié généré: {qr_csv_path}")
|
||||
|
||||
return csv_path
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de la génération du CSV pour {json_path}: {e}")
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
def fix_json_and_generate_csv(json_path):
|
||||
"""
|
||||
Corrige le JSON et génère le CSV manquant
|
||||
|
||||
Args:
|
||||
json_path: Chemin vers le fichier JSON
|
||||
"""
|
||||
try:
|
||||
# Charger le JSON
|
||||
with open(json_path, 'r', encoding='utf-8') as f:
|
||||
rapport_data = json.load(f)
|
||||
|
||||
# Extraire le rapport complet
|
||||
rapport_complet = rapport_data.get("rapport_complet", "")
|
||||
if not rapport_complet:
|
||||
logger.error(f"Aucun rapport complet trouvé dans {json_path}")
|
||||
return False
|
||||
|
||||
# Extraire et traiter le JSON
|
||||
_, echanges_json, _ = extraire_et_traiter_json(rapport_complet)
|
||||
|
||||
# Vérifier si des échanges ont été extraits
|
||||
if not echanges_json or "chronologie_echanges" not in echanges_json:
|
||||
logger.error(f"Aucun échange extrait du rapport {json_path}")
|
||||
return False
|
||||
|
||||
# Mettre à jour le JSON avec les échanges extraits
|
||||
rapport_data["chronologie_echanges"] = echanges_json.get("chronologie_echanges", [])
|
||||
|
||||
# Sauvegarder le JSON corrigé
|
||||
corrected_json_path = json_path.replace(".json", "_corrige.json")
|
||||
with open(corrected_json_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(rapport_data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
logger.info(f"Rapport JSON corrigé sauvegardé: {corrected_json_path}")
|
||||
|
||||
# Extraire le nom du modèle
|
||||
metadata = rapport_data.get("metadata", {})
|
||||
model_name = metadata.get("model", "unknown").split(":")[0].lower()
|
||||
|
||||
# Générer le CSV
|
||||
csv_path = generate_csv_from_json(corrected_json_path, model_name)
|
||||
|
||||
if csv_path:
|
||||
logger.info(f"CSV généré avec succès: {csv_path}")
|
||||
return True
|
||||
else:
|
||||
logger.error("Échec de la génération du CSV")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de la correction du JSON {json_path}: {e}")
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
def analyze_report(md_path):
|
||||
"""
|
||||
Analyse un rapport Markdown pour vérifier la présence des sections importantes
|
||||
|
||||
Args:
|
||||
md_path: Chemin vers le fichier Markdown
|
||||
"""
|
||||
try:
|
||||
# Lire le fichier
|
||||
with open(md_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Vérifier les sections
|
||||
has_table = "| Date | " in content or "| Question | Réponse |" in content
|
||||
has_details = "## Détails des analyses" in content
|
||||
|
||||
# Vérifier la présence de la section synthèse globale (avec variations possibles)
|
||||
has_synthese = any([
|
||||
"## Synthèse globale des analyses d'images" in content,
|
||||
"## 3.1 Synthèse globale des analyses d'images" in content,
|
||||
"##3.1 Synthèse globale des analyses d'images" in content,
|
||||
"## Synthèse globale" in content
|
||||
])
|
||||
|
||||
# Vérifier si le fichier CSV existe
|
||||
report_dir = os.path.dirname(md_path)
|
||||
ticket_basename = os.path.basename(md_path).split('_')[0]
|
||||
csv_files = [f for f in os.listdir(report_dir) if f.endswith('.csv') and ticket_basename in f]
|
||||
has_csv = len(csv_files) > 0
|
||||
|
||||
# Afficher les résultats
|
||||
print(f"\nAnalyse du rapport: {md_path}")
|
||||
print(f"- Tableau des échanges: {'Présent ✅' if has_table else 'MANQUANT ❌'}")
|
||||
print(f"- Détails des analyses: {'Présent ✅' if has_details else 'MANQUANT ❌'}")
|
||||
print(f"- Synthèse globale: {'Présent ✅' if has_synthese else 'MANQUANT ❌'}")
|
||||
|
||||
if has_csv:
|
||||
print(f"- Fichier CSV: Présent ✅ ({', '.join(csv_files)})")
|
||||
else:
|
||||
print(f"- Fichier CSV: MANQUANT ❌")
|
||||
|
||||
return {
|
||||
"md_path": md_path,
|
||||
"has_table": has_table,
|
||||
"has_details": has_details,
|
||||
"has_synthese": has_synthese,
|
||||
"has_csv": has_csv,
|
||||
"csv_files": csv_files
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de l'analyse du rapport {md_path}: {e}")
|
||||
traceback.print_exc()
|
||||
return None
|
||||
|
||||
def find_reports(base_dir=".", ticket_id=None):
|
||||
"""
|
||||
Recherche tous les rapports générés dans le répertoire de base
|
||||
|
||||
Args:
|
||||
base_dir: Répertoire de base
|
||||
ticket_id: Identifiant du ticket (optionnel)
|
||||
|
||||
Returns:
|
||||
Liste de tuples (json_path, md_path)
|
||||
"""
|
||||
reports = []
|
||||
|
||||
# Motif de recherche des rapports
|
||||
if ticket_id:
|
||||
pattern = f"**/{ticket_id}/**/{ticket_id}_rapport_final.json"
|
||||
else:
|
||||
pattern = "**/T*/T*_rapport_final.json"
|
||||
|
||||
# Rechercher les fichiers JSON
|
||||
json_files = glob.glob(os.path.join(base_dir, pattern), recursive=True)
|
||||
|
||||
for json_path in json_files:
|
||||
# Trouver le fichier Markdown correspondant
|
||||
md_path = json_path.replace(".json", ".md")
|
||||
|
||||
if os.path.exists(md_path):
|
||||
reports.append((json_path, md_path))
|
||||
|
||||
return reports
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Outil de correction des rapports existants")
|
||||
parser.add_argument("--dir", "-d", default=".", help="Répertoire de base contenant les rapports")
|
||||
parser.add_argument("--ticket", "-t", help="ID du ticket à corriger (ex: T0101)")
|
||||
parser.add_argument("--analyze", "-a", action="store_true", help="Analyser les rapports sans les corriger")
|
||||
parser.add_argument("--fix", "-f", action="store_true", help="Corriger les rapports")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Rechercher les rapports
|
||||
reports = find_reports(args.dir, args.ticket)
|
||||
|
||||
if not reports:
|
||||
print(f"Aucun rapport trouvé dans {args.dir}" + (f" pour le ticket {args.ticket}" if args.ticket else ""))
|
||||
return
|
||||
|
||||
print(f"Trouvé {len(reports)} rapport(s)")
|
||||
|
||||
# Analyser les rapports
|
||||
if args.analyze or not args.fix:
|
||||
analyze_results = []
|
||||
for json_path, md_path in reports:
|
||||
result = analyze_report(md_path)
|
||||
if result:
|
||||
analyze_results.append(result)
|
||||
|
||||
# Afficher un résumé
|
||||
if analyze_results:
|
||||
print("\nRésumé de l'analyse:")
|
||||
print(f"- Total des rapports: {len(analyze_results)}")
|
||||
print(f"- Rapports avec tableau: {sum(1 for r in analyze_results if r['has_table'])}")
|
||||
print(f"- Rapports avec détails: {sum(1 for r in analyze_results if r['has_details'])}")
|
||||
print(f"- Rapports avec synthèse: {sum(1 for r in analyze_results if r['has_synthese'])}")
|
||||
print(f"- Rapports avec CSV: {sum(1 for r in analyze_results if r['has_csv'])}")
|
||||
|
||||
# Lister les rapports à corriger
|
||||
reports_to_fix = [r["md_path"] for r in analyze_results if not (r["has_table"] and r["has_csv"])]
|
||||
if reports_to_fix:
|
||||
print("\nRapports à corriger (manque tableau ou CSV):")
|
||||
for report in reports_to_fix:
|
||||
print(f"- {report}")
|
||||
|
||||
# Corriger les rapports
|
||||
if args.fix:
|
||||
for json_path, md_path in reports:
|
||||
# Analyser pour voir s'il a besoin d'être corrigé
|
||||
result = analyze_report(md_path)
|
||||
|
||||
if result and not (result["has_table"] and result["has_csv"]):
|
||||
print(f"\nCorrection du rapport {json_path}...")
|
||||
success = fix_json_and_generate_csv(json_path)
|
||||
|
||||
if success:
|
||||
print(f"✅ Rapport corrigé avec succès")
|
||||
else:
|
||||
print(f"❌ Échec de la correction du rapport")
|
||||
else:
|
||||
print(f"\nLe rapport {json_path} n'a pas besoin d'être corrigé")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -1,4 +1,3 @@
|
||||
Question,Réponse
|
||||
Comment faire apparaître tous les utilisateurs dans le menu 'Mes paramètres - Gestion des utilisateurs' ?,Pas de réponse
|
||||
Pourquoi certains utilisateurs n'apparaissent-ils pas dans la liste ?,"[RÉPONSE] Si un utilisateur n'apparaît pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné. Dans ce cas, il faut cocher la case 'Affiche les laboratoires secondaires' pour le voir. Vous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtres sur les colonnes si besoin) et l'éditer. Sur la fiche de l'utilisateur, vérifiez si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas. Un utilisateur peut également ne pas apparaître dans la liste si son compte a été dévalidé. Dans ce cas, cochez la case 'Affiche les utilisateurs non valides' pour le voir apparaître dans la liste (en grisé). Vous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case 'Utilisateur valide'. Liens d'aide : Manuel d'utilisation : [lien vers le manuel d'utilisation](#), FAQ : [lien vers la FAQ](#)
|
||||
[COMPLÉMENT VISUEL] L'analyse des captures d'écran confirme visuellement le processus complet : (1) La case 'Utilisateur valide' doit être cochée pour que l'utilisateur soit visible. (2) Les cases 'Affiche les laboratoires secondaires' et 'Affiche les utilisateurs non valides' permettent de voir les utilisateurs qui ne sont pas immédiatement visibles. (3) L'assignation du laboratoire principal est essentielle pour que les utilisateurs apparaissent dans la liste. Ces interfaces complémentaires illustrent le cycle complet de gestion des utilisateurs et de leur visibilité dans la liste."
|
||||
"Dans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaître ?","[RÉPONSE] Si un utilisateur n'apparaît pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné. Dans ce cas, il faut cocher la case 'Affiche les laboratoires secondaires' pour le voir. Vous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtres sur les colonnes si besoin) et l'éditer. Sur la fiche de l'utilisateur, vérifiez si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas. Un utilisateur peut également ne pas apparaître dans la liste si son compte a été dévalidé. Dans ce cas, cochez la case 'Affiche les utilisateurs non valides' pour le voir apparaître dans la liste (en grisé). Vous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case 'Utilisateur valide'. Manuel d'utilisation : [lien vers le manuel d'utilisation](#) FAQ : [lien vers la FAQ](#)
|
||||
[COMPLÉMENT VISUEL] L'analyse des captures d'écran confirme visuellement le processus : (1) La fiche d'un utilisateur montre l'option 'Utilisateur valide' comme cruciale pour l'affichage. (2) Les options d'affichage des utilisateurs non valides et des laboratoires secondaires sont essentielles pour voir tous les utilisateurs. (3) L'assignation d'un laboratoire principal est une condition pour l'affichage des utilisateurs. Ces interfaces complémentaires illustrent le processus complet de gestion des utilisateurs."
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
Question,Réponse
|
||||
Pourquoi tous les utilisateurs ne s'affichent-ils pas dans la gestion des utilisateurs ? Comment les faire apparaître ?,"[RÉPONSE] Si un utilisateur n'apparaît pas dans la liste, il faut cocher la case 'Affiche les laboratoires secondaires' pour le voir. Un utilisateur peut également ne pas apparaître s'il est dévalidé, dans ce cas, cocher la case 'Affiche les utilisateurs non valides'.
|
||||
[COMPLÉMENT VISUEL] L'analyse des captures d'écran confirme visuellement le processus complet : (1) vérifier la case 'Utilisateur valide' (image 1), (2) vérifier la case 'Affiche les laboratoires secondaires' (image 2), (3) vérifier le statut de l'utilisateur dans l'affectation de l'utilisateur (image 3). Ces interfaces complémentaires illustrent le cycle complet."
|
||||
"Dans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre?","[RÉPONSE] Si un utilisateur n'apparait pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné. Dans ce cas, il faut cocher la case 'Affiche les laboratoires secondaires' pour le voir. Vous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtres sur les colonnes si besoin) et l'éditer. Sur la fiche de l'utilisateur, vérifier si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas. Un utilisateur peut également ne pas apparaitre dans la liste si son compte a été dévalidé. Dans ce cas cochez la case 'Affiche les utilisateurs non valides' pour le voir apparaitre dans la liste (en grisé). Vous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case 'Utilisateur valide' [Lien vers le manuel d'utilisation](lien_manuel_utilisation) [Lien vers la FAQ](lien_faq)
|
||||
[COMPLÉMENT VISUEL] L'analyse des captures d'écran confirme visuellement le processus : (1) Vérifier le statut de validation de l'utilisateur (Image 1), (2) Activer l'affichage des utilisateurs non valides et des laboratoires secondaires (Image 2), (3) Vérifier l'assignation du laboratoire principal et le statut des laboratoires (Image 3). Ces interfaces complémentaires illustrent les étapes nécessaires pour résoudre le problème d'affichage des utilisateurs dans la gestion des utilisateurs."
|
||||
|
||||
|
File diff suppressed because one or more lines are too long
@ -19,81 +19,61 @@ _Vue d'ensemble du processus d'analyse automatisé_
|
||||
**Statistiques:**
|
||||
- Images totales: 3
|
||||
- Images pertinentes: 3
|
||||
- Temps de génération: 68.35 secondes
|
||||
- Temps de génération: 120.13 secondes
|
||||
|
||||
## 1. Analyse du ticket
|
||||
|
||||
_Agent utilisé: `AgentTicketAnalyser` - Analyse du contenu du ticket_
|
||||
|
||||
```
|
||||
### 1. Résumé du contexte
|
||||
### Synthèse Structurée du Ticket T9656: Gestion des utilisateurs
|
||||
|
||||
#### Client
|
||||
- **Nom** : Christophe SAUVAGET
|
||||
- **Email** : christophe.sauvaget@chausson.fr
|
||||
- **user_id** : Non disponible
|
||||
#### Informations Générales
|
||||
- **ID du ticket**: 9635
|
||||
- **Nom du projet**: Demandes
|
||||
- **Statut**: Clôturé
|
||||
- **Partenaire**: CHAUSSON MATERIAUX, Christophe SAUVAGET (christophe.sauvaget@chausson.fr)
|
||||
- **Date de création**: 04/07/2024 12:09:47
|
||||
- **Dernière modification**: 03/10/2024 13:10:50
|
||||
- **Date d'échéance**: 19/07/2024 00:00:00
|
||||
- **Date d'extraction**: 10/04/2025 17:10:36
|
||||
- **Répertoire**: output/ticket_T9656/T9656_20250410_171035
|
||||
|
||||
#### Sujet du ticket reformulé en une ou plusieurs questions
|
||||
- Comment faire apparaître tous les utilisateurs dans le menu "Mes paramètres - Gestion des utilisateurs" ?
|
||||
- Pourquoi certains utilisateurs n'apparaissent-ils pas dans la liste ?
|
||||
#### Problème Initial
|
||||
**Titre**: Gestion des utilisateurs
|
||||
**Description**: Dans le menu "Mes paramètres - Gestion des utilisateurs", tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaître?
|
||||
|
||||
#### Description technique synthétique
|
||||
- Le problème concerne l'affichage des utilisateurs dans le menu "Mes paramètres - Gestion des utilisateurs". Certains utilisateurs n'apparaissent pas dans la liste. Le client demande comment les faire apparaître.
|
||||
#### Chronologie des Échanges Client/Support
|
||||
|
||||
### 2. Informations techniques détectées
|
||||
|
||||
#### Logiciels/modules mentionnés
|
||||
- Menu "Mes paramètres - Gestion des utilisateurs"
|
||||
|
||||
#### Paramètres évoqués
|
||||
- Laboratoire principal d'assigné
|
||||
- Case "Affiche les laboratoires secondaires"
|
||||
- Case "Affiche les utilisateurs non valides"
|
||||
- Case "Utilisateur valide"
|
||||
|
||||
#### Fonctionnalités impactées
|
||||
- Affichage des utilisateurs dans la liste
|
||||
- Filtres sur les colonnes
|
||||
- Édition des utilisateurs
|
||||
|
||||
#### Conditions spécifiques
|
||||
- Multi-laboratoire : tous
|
||||
- Utilisateurs non valides
|
||||
|
||||
### 3. Fil de discussion (filtrée, nettoyée, classée)
|
||||
|
||||
#### Intervenant : Support
|
||||
- **Date** : 04/07/2024 13:03:58
|
||||
- **Contenu** :
|
||||
- Si un utilisateur n'apparaît pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné.
|
||||
- Dans ce cas, il faut cocher la case "Affiche les laboratoires secondaires" pour le voir.
|
||||
##### Message 1 - Support Technique
|
||||
- **Date**: 04/07/2024 13:03:58
|
||||
- **Contenu**:
|
||||
- Si un utilisateur n'apparait pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné.
|
||||
- Pour le voir, cochez la case "Affiche les laboratoires secondaires".
|
||||
- Vous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtres sur les colonnes si besoin) et l'éditer.
|
||||
- Sur la fiche de l'utilisateur, vérifiez si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas.
|
||||
- Un utilisateur peut également ne pas apparaître dans la liste si son compte a été dévalidé.
|
||||
- Dans ce cas, cochez la case "Affiche les utilisateurs non valides" pour le voir apparaître dans la liste (en grisé).
|
||||
- Un utilisateur peut également ne pas apparaitre dans la liste si son compte a été dévalidé. Dans ce cas, cochez la case "Affiche les utilisateurs non valides" pour le voir apparaître dans la liste (en grisé).
|
||||
- Vous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case "Utilisateur valide".
|
||||
- Liens d'aide :
|
||||
- Manuel d'utilisation : lien vers le manuel d'utilisation
|
||||
- FAQ : lien vers la FAQ
|
||||
- Liens d'aide fournis:
|
||||
- Manuel d'utilisation: [lien vers le manuel d'utilisation]
|
||||
- FAQ: [lien vers la FAQ]
|
||||
|
||||
### 4. Éléments liés à l'analyse visuelle
|
||||
- **Pièces jointes**:
|
||||
- image.png (image/png) [ID: 129046]
|
||||
- image.png (image/png) [ID: 129044]
|
||||
- image.png (image/png) [ID: 129042]
|
||||
|
||||
#### Nombre d'images attachées
|
||||
- 3 images attachées (image.png avec IDs : 129046, 129044, 129042)
|
||||
#### Éléments Techniques à Observer dans les Captures d'Écran
|
||||
- **Capture d'écran ID: 129046**: Vérifier la liste des utilisateurs et l'option "Affiche les laboratoires secondaires".
|
||||
- **Capture d'écran ID: 129044**: Vérifier la fiche de l'utilisateur pour le laboratoire principal.
|
||||
- **Capture d'écran ID: 129042**: Vérifier l'option "Affiche les utilisateurs non valides" et la liste des utilisateurs dévalidés.
|
||||
|
||||
#### Références aux interfaces ou options à visualiser
|
||||
- Menu "Mes paramètres - Gestion des utilisateurs"
|
||||
- Case "Affiche les laboratoires secondaires"
|
||||
- Case "Affiche les utilisateurs non valides"
|
||||
- Case "Utilisateur valide"
|
||||
- Filtres sur les colonnes
|
||||
#### Liens Utiles
|
||||
- [Manuel d'utilisation](lien_vers_le_manuel_d'utilisation)
|
||||
- [FAQ](lien_vers_la_FAQ)
|
||||
|
||||
#### Points à vérifier dans les captures
|
||||
- Liste des utilisateurs affichée
|
||||
- Présence de la case "Affiche les laboratoires secondaires"
|
||||
- Présence de la case "Affiche les utilisateurs non valides"
|
||||
- Présence de la case "Utilisateur valide"
|
||||
- Filtres sur les colonnes et leur utilisation
|
||||
### Conclusion
|
||||
Le problème initial concernait l'affichage incomplet des utilisateurs dans le menu "Mes paramètres - Gestion des utilisateurs". Le support technique a fourni plusieurs solutions, notamment en vérifiant les options d'affichage des laboratoires secondaires et des utilisateurs non valides. Des captures d'écran ont été fournies pour illustrer ces étapes.
|
||||
```
|
||||
|
||||
## 2. Tri des images
|
||||
@ -116,209 +96,191 @@ _Agent utilisé: `AgentImageAnalyser` - Analyse détaillée des captures d'écra
|
||||
|
||||
#### 1. Description objective
|
||||
L'image montre une interface logicielle intitulée **"Mes paramètres - Gestion des utilisateurs"**. Elle est divisée en plusieurs sections :
|
||||
|
||||
- **Section "Connexion"** :
|
||||
- Une zone pour déposer une photo d'identité avec les options "Modifier la photo" et "SUPPRIMER PHOTO" (en texte rouge).
|
||||
- Champs "Login" et "Mot de passe" avec des astérisques masquant le mot de passe.
|
||||
- Une case à cocher intitulée "Mot de passe à saisir à la prochaine connexion".
|
||||
|
||||
- **Section "Informations sur l'utilisateur"** :
|
||||
- Une case à cocher intitulée **"Utilisateur valide"**, entourée en rouge.
|
||||
- Un menu déroulant "Langue" avec la valeur "Français" sélectionnée.
|
||||
|
||||
- **Bouton principal** :
|
||||
- Un bouton bleu en bas de l'écran intitulé **"OBTENIR L'APPLICATION BRG-LAB MOBILE"**.
|
||||
- Une photo de profil est affichée avec les options "Déposez votre photo ici" et "Modifier la photo".
|
||||
- Un lien **"SUPPRIMER PHOTO"** est visible en dessous de la photo.
|
||||
- Les champs "Login" et "Mot de passe" sont présents, mais les valeurs sont masquées par des astérisques (*****).
|
||||
- **Section principale** :
|
||||
- Une case à cocher est visible avec le libellé **"Utilisateur valide"**, entourée en rouge.
|
||||
- Une autre case à cocher est présente avec le libellé **"Mot de passe à saisir à la prochaine connexion"**.
|
||||
- Un menu déroulant **"Langue"** est affiché avec la valeur **"Français"** sélectionnée.
|
||||
- Un bouton bleu **"OBTENIR L'APPLICATION BRG-LAB MOBILE"** est visible en bas de l'interface.
|
||||
|
||||
#### 2. Éléments techniques clés
|
||||
- **Paramètres configurables** :
|
||||
- Case à cocher "Mot de passe à saisir à la prochaine connexion" (non cochée).
|
||||
- Case à cocher **"Utilisateur valide"** (cochée).
|
||||
- Menu déroulant "Langue" avec la valeur "Français" sélectionnée.
|
||||
|
||||
- Case à cocher **"Mot de passe à saisir à la prochaine connexion"** (non cochée).
|
||||
- Menu déroulant **"Langue"** avec la valeur **"Français"** sélectionnée.
|
||||
- **Éléments interactifs** :
|
||||
- Boutons "FERMER" et "ENREGISTRER" en haut de l'interface.
|
||||
- Bouton "Modifier la photo" sous la zone de dépôt de photo.
|
||||
- Bouton "SUPPRIMER PHOTO" en texte rouge.
|
||||
- Bouton "OBTENIR L'APPLICATION BRG-LAB MOBILE" en bas de l'écran.
|
||||
|
||||
- Bouton **"FERMER"** (actif).
|
||||
- Bouton **"ENREGISTRER"** (actif).
|
||||
- Bouton **"OBTENIR L'APPLICATION BRG-LAB MOBILE"** (actif).
|
||||
- **Éléments non modifiables** :
|
||||
- La case à cocher "Utilisateur valide" est cochée et n'est pas grisée, indiquant qu'elle est modifiable.
|
||||
- Le champ "Mot de passe" est masqué par des astérisques.
|
||||
- Les champs "Login" et "Mot de passe" sont grisés et non modifiables dans cette vue.
|
||||
- **Autres éléments** :
|
||||
- La photo de profil est modifiable via les options "Déposez votre photo ici" et "Modifier la photo".
|
||||
- Le lien **"SUPPRIMER PHOTO"** est cliquable.
|
||||
|
||||
#### 3. Éléments mis en évidence
|
||||
- La case à cocher **"Utilisateur valide"** est entourée en rouge.
|
||||
- Le texte **"SUPPRIMER PHOTO"** est en rouge, ce qui le distingue des autres éléments.
|
||||
- La case à cocher **"Utilisateur valide"** est entourée en rouge, ce qui attire l'attention sur cet élément.
|
||||
- Aucun autre élément n'est surligné, encadré ou fléché.
|
||||
|
||||
#### 4. Relation avec le problème
|
||||
- La case à cocher **"Utilisateur valide"** est directement liée au problème décrit dans le ticket, où il est question de la visibilité des utilisateurs non valides.
|
||||
- L'image montre que cette option est cochée, ce qui pourrait indiquer que l'utilisateur est actuellement valide.
|
||||
L'image montre une interface liée à la gestion des utilisateurs, ce qui correspond au contexte du ticket. La case à cocher **"Utilisateur valide"** est directement liée à la problématique décrite dans le ticket, où il est mentionné que certains utilisateurs peuvent ne pas apparaître s'ils sont dévalidés.
|
||||
|
||||
#### 5. Réponses potentielles
|
||||
- L'image montre que la case **"Utilisateur valide"** est cochée, ce qui pourrait répondre à la question de savoir pourquoi certains utilisateurs n'apparaissent pas dans la liste (si leur statut est "non valide").
|
||||
- Elle ne montre pas directement la liste des utilisateurs ou les filtres mentionnés dans le ticket.
|
||||
L'image illustre l'option **"Utilisateur valide"**, qui est une des solutions proposées dans le ticket pour résoudre le problème d'affichage des utilisateurs non valides. Elle montre également comment activer ou désactiver cette option.
|
||||
|
||||
#### 6. Lien avec la discussion
|
||||
- L'image fait écho à l'étape décrite dans le fil de discussion où il est mentionné de vérifier si la case **"Utilisateur valide"** est cochée pour rendre un utilisateur visible dans la liste.
|
||||
- Elle ne montre pas les autres éléments mentionnés dans la discussion, comme la case "Affiche les laboratoires secondaires" ou les filtres sur les colonnes.
|
||||
L'image correspond à l'étape décrite dans le fil de discussion où il est expliqué comment rendre un utilisateur valide en cochant la case **"Utilisateur valide"**. Cela fait écho à la solution proposée pour afficher les utilisateurs non valides et les rendre à nouveau visibles dans la liste.
|
||||
|
||||
### Image 2: image_2.png
|
||||
|
||||
### 1. Description objective
|
||||
L'image montre une interface logicielle intitulée **"Mes paramètres - Gestion des utilisateurs"**. Elle affiche une liste d'utilisateurs avec des colonnes spécifiques :
|
||||
- **Laboratoire** : Nom du laboratoire associé à l'utilisateur.
|
||||
- **Login** : Identifiant de connexion de l'utilisateur.
|
||||
- **Nom** : Nom complet de l'utilisateur.
|
||||
### Analyse de l'image
|
||||
|
||||
Au-dessus de la liste, trois onglets sont visibles :
|
||||
- **NOUVEAU**
|
||||
- **MODIFIER**
|
||||
- **SUPPRIMER**
|
||||
#### 1. Description objective
|
||||
L'image montre une interface logicielle intitulée **"Mes paramètres - Gestion des utilisateurs"**. Elle contient les éléments suivants :
|
||||
- **Menus/Onglets** : Trois onglets sont visibles en haut de l'interface :
|
||||
- **NOUVEAU**
|
||||
- **MODIFIER**
|
||||
- **SUPPRIMER**
|
||||
- **Options d'affichage** : Deux cases à cocher sont présentes à droite :
|
||||
- **"Affiche les laboratoires secondaires"** (cochée et entourée en rouge)
|
||||
- **"Affiche les utilisateurs non valides"** (non cochée)
|
||||
- **Tableau des utilisateurs** : Un tableau est affiché avec les colonnes suivantes :
|
||||
- **Laboratoire**
|
||||
- **Login**
|
||||
- **Nom**
|
||||
- Une colonne sans titre visible à droite (probablement pour des actions ou des descriptions supplémentaires).
|
||||
- **Données affichées** :
|
||||
- Trois utilisateurs sont listés avec les informations suivantes :
|
||||
1. **Laboratoire** : CHAUSSON MATERIAUX : CAMBOUNET SUR LE SOR
|
||||
**Login** : russoloa
|
||||
**Nom** : RUSSOLO Arnaud
|
||||
**Description** : Formulation de béton, Ingénieur, Responsable national, Opérateur
|
||||
2. **Laboratoire** : CHAUSSON MATERIAUX : CAVAILLON
|
||||
**Login** : sabatiep
|
||||
**Nom** : SABATIE Peter
|
||||
**Description** : Formulation de béton, Ingénieur, Responsable national, Opérateur
|
||||
3. **Laboratoire** : CHAUSSON MATERIAUX : CAZERES SUR GARONNE
|
||||
**Login** : Non visible
|
||||
**Nom** : Non visible
|
||||
**Description** : Adjoint administratif, Formulateur de béton
|
||||
|
||||
À droite des onglets, deux cases à cocher sont présentes :
|
||||
- **"Affiche les laboratoires secondaires"** (entourée en rouge)
|
||||
- **"Affiche les utilisateurs non valides"**
|
||||
|
||||
La liste des utilisateurs affiche trois entrées avec les informations suivantes :
|
||||
1. **Laboratoire** : CHAUSSON MATERIAUX : CAMBOUNET SUR LE SOR
|
||||
**Login** : russoloa
|
||||
**Nom** : RUSSOLO Arnaud
|
||||
**Description** : Formulation de béton, ingénieur, Responsable national, Opérateur
|
||||
2. **Laboratoire** : CHAUSSON MATERIAUX : CAVAILLON
|
||||
**Login** : sabatiep
|
||||
**Nom** : SABATIE Peter
|
||||
**Description** : Formulation de béton, ingénieur, Responsable national, Opérateur
|
||||
3. **Laboratoire** : CHAUSSON MATERIAUX : CAZERES SUR GARONNE
|
||||
**Login** : Non visible
|
||||
**Nom** : Non visible
|
||||
**Description** : Adjoint administratif, Formulateur de béton
|
||||
|
||||
### 2. Éléments techniques clés
|
||||
- **Modules ou versions logicielles** : Non spécifiées dans l'image.
|
||||
- **Codes d'erreur visibles** : Aucun.
|
||||
#### 2. Éléments techniques clés
|
||||
- **Paramètres configurables** :
|
||||
- Deux cases à cocher :
|
||||
- **"Affiche les laboratoires secondaires"** (non cochée)
|
||||
- **"Affiche les laboratoires secondaires"** (cochée)
|
||||
- **"Affiche les utilisateurs non valides"** (non cochée)
|
||||
- Les colonnes de la liste semblent triables (flèches visibles en haut des colonnes "Laboratoire", "Login", "Nom").
|
||||
- **Valeurs affichées ou préremplies** :
|
||||
- Les colonnes "Laboratoire", "Login" et "Nom" contiennent des valeurs pour chaque utilisateur.
|
||||
- La colonne "Description" contient des rôles ou fonctions associés aux utilisateurs.
|
||||
- **Éléments désactivés, grisés ou masqués** :
|
||||
- Aucun élément grisé ou masqué visible dans l'image.
|
||||
- Les colonnes du tableau semblent triables (flèches visibles en haut des colonnes).
|
||||
- **Éléments interactifs** :
|
||||
- Les onglets **NOUVEAU**, **MODIFIER** et **SUPPRIMER** sont actifs.
|
||||
- Les cases à cocher sont interactives.
|
||||
- **Éléments non modifiables** :
|
||||
- Aucun élément grisé ou désactivé n'est visible dans l'image.
|
||||
- **Boutons actifs/inactifs** :
|
||||
- Les onglets **NOUVEAU**, **MODIFIER** et **SUPPRIMER** semblent actifs.
|
||||
- Les onglets **NOUVEAU**, **MODIFIER** et **SUPPRIMER** sont actifs.
|
||||
|
||||
### 3. Éléments mis en évidence
|
||||
#### 3. Éléments mis en évidence
|
||||
- La case à cocher **"Affiche les laboratoires secondaires"** est entourée en rouge.
|
||||
- Aucun autre élément n'est surligné, encadré ou fléché.
|
||||
- Cette mise en évidence suggère que cette option est importante dans le contexte de l'image.
|
||||
|
||||
### 4. Relation avec le problème
|
||||
L'image montre l'interface **"Mes paramètres - Gestion des utilisateurs"**, qui est directement liée au problème décrit dans le ticket. Les éléments suivants sont visibles et pertinents :
|
||||
- La case à cocher **"Affiche les laboratoires secondaires"** est présente mais non cochée.
|
||||
- La case à cocher **"Affiche les utilisateurs non valides"** est également présente mais non cochée.
|
||||
- La liste des utilisateurs affiche des informations détaillées, mais certains champs sont tronqués ou non visibles.
|
||||
#### 4. Relation avec le problème
|
||||
- L'image montre l'option **"Affiche les laboratoires secondaires"** cochée, ce qui est directement lié à la solution proposée dans le ticket pour afficher tous les utilisateurs, y compris ceux sans laboratoire principal assigné.
|
||||
- La liste des utilisateurs affichée contient des informations sur les laboratoires, logins, noms et descriptions, ce qui correspond à la gestion des utilisateurs mentionnée dans le ticket.
|
||||
|
||||
### 5. Réponses potentielles
|
||||
L'image montre les cases à cocher **"Affiche les laboratoires secondaires"** et **"Affiche les utilisateurs non valides"**, qui sont mentionnées dans le fil de discussion comme des solutions potentielles pour afficher tous les utilisateurs. Cependant, ces cases ne sont pas cochées dans l'image.
|
||||
#### 5. Réponses potentielles
|
||||
- L'image montre que l'option **"Affiche les laboratoires secondaires"** est activée, ce qui pourrait répondre à la question posée dans le ticket : "Comment faire pour les faire tous apparaître ?".
|
||||
- Elle illustre également la liste des utilisateurs, ce qui est directement lié au problème initial.
|
||||
|
||||
### 6. Lien avec la discussion
|
||||
L'image correspond directement aux instructions fournies dans le fil de discussion :
|
||||
- La case **"Affiche les laboratoires secondaires"** est visible et mise en évidence, comme mentionné dans la réponse du support.
|
||||
- La case **"Affiche les utilisateurs non valides"** est également visible, conformément aux instructions.
|
||||
- Les filtres sur les colonnes (flèches en haut des colonnes) sont présents, comme évoqué dans la discussion.
|
||||
|
||||
### Conclusion
|
||||
L'image fournit une vue détaillée de l'interface **"Mes paramètres - Gestion des utilisateurs"**, mettant en évidence les cases à cocher pertinentes pour résoudre le problème décrit dans le ticket. Les éléments visibles correspondent aux instructions données dans le fil de discussion.
|
||||
#### 6. Lien avec la discussion
|
||||
- L'image correspond à l'étape décrite dans le **Message 1 - Support Technique** :
|
||||
- "Pour le voir, cochez la case 'Affiche les laboratoires secondaires'."
|
||||
- Elle montre également la liste des utilisateurs, ce qui est en lien avec les instructions fournies pour retrouver et éditer les utilisateurs.
|
||||
- L'image fait écho à la **Capture d'écran ID: 129046** mentionnée dans le ticket, qui vérifie la liste des utilisateurs et l'option "Affiche les laboratoires secondaires".
|
||||
|
||||
### Image 3: image_1.png
|
||||
|
||||
### Analyse de l'image
|
||||
|
||||
#### 1. Description objective
|
||||
L'image montre une interface logicielle intitulée **"Affectation de l'utilisateur"**. Les éléments suivants sont visibles :
|
||||
- Une section intitulée **"Laboratoire principal"** avec un champ de texte contenant **"CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR"**.
|
||||
- Une section intitulée **"Laboratoire(s) affilié(s)"** avec une liste déroulante affichant **"Laboratoires de l'utilisateur"**.
|
||||
- Deux laboratoires sont listés dans cette section :
|
||||
- **CHAUSSON MATÉRIAUX**
|
||||
- **CAMBOUNET SUR LE SOR**
|
||||
- Un bouton **"Supprimer"** est visible à droite de la liste des laboratoires affiliés.
|
||||
- Le champ **"Laboratoire principal"** est entouré d'un cadre rouge.
|
||||
L'image montre une interface logicielle intitulée **"Affectation de l'utilisateur"**. Elle est divisée en deux sections principales :
|
||||
- **Laboratoire principal** : Affiche le nom **"CHAUSSON MATERIAUX - CAMBOUNET SUR LE SOR"**.
|
||||
- **Laboratoire(s) affilié(s)** : Affiche une liste déroulante avec les éléments suivants :
|
||||
- **"CHAUSSON MATERIAUX"**
|
||||
- **"CAMBOUNET SUR LE SOR"**
|
||||
- Un bouton **"Supprimer"** est visible à droite de cette section.
|
||||
|
||||
Aucun message d'erreur, code ou script n'est visible dans l'image.
|
||||
|
||||
#### 2. Éléments techniques clés
|
||||
- **Modules ou sections visibles** :
|
||||
- "Affectation de l'utilisateur"
|
||||
- "Laboratoire principal"
|
||||
- "Laboratoire(s) affilié(s)"
|
||||
- **Modules ou versions logicielles** : Non spécifiés dans l'image.
|
||||
- **Codes d'erreur visibles** : Aucun.
|
||||
- **Paramètres configurables** :
|
||||
- Champ de texte pour le laboratoire principal (modifiable).
|
||||
- Liste déroulante pour les laboratoires affiliés (modifiable).
|
||||
- Bouton **"Supprimer"** (actif).
|
||||
- **Valeurs affichées** :
|
||||
- Le laboratoire principal est prérempli avec **"CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR"**.
|
||||
- Les laboratoires affiliés listés sont **"CHAUSSON MATÉRIAUX"** et **"CAMBOUNET SUR LE SOR"**.
|
||||
- **Éléments désactivés ou grisés** :
|
||||
- Aucun élément grisé ou désactivé n'est visible dans l'image.
|
||||
- **Boutons actifs/inactifs** :
|
||||
- Le bouton **"Supprimer"** est actif.
|
||||
- La section **"Laboratoire principal"** semble être un champ de texte ou un affichage statique.
|
||||
- La section **"Laboratoire(s) affilié(s)"** contient une liste déroulante avec des éléments interactifs.
|
||||
- Un bouton **"Supprimer"** est présent à droite de la liste déroulante.
|
||||
- **Valeurs affichées ou préremplies** :
|
||||
- **"Laboratoire principal"** : "CHAUSSON MATERIAUX - CAMBOUNET SUR LE SOR".
|
||||
- **"Laboratoire(s) affilié(s)"** : "CHAUSSON MATERIAUX" et "CAMBOUNET SUR LE SOR".
|
||||
- **Éléments désactivés, grisés ou masqués** : Aucun élément ne semble désactivé ou grisé.
|
||||
- **Boutons actifs/inactifs** : Le bouton **"Supprimer"** est visible et semble actif.
|
||||
|
||||
#### 3. Éléments mis en évidence
|
||||
- Le champ **"Laboratoire principal"** est entouré d'un cadre rouge.
|
||||
- Le contenu mis en évidence est **"CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR"**.
|
||||
- La zone **"CHAUSSON MATERIAUX - CAMBOUNET SUR LE SOR"** est entourée d'un cadre rouge.
|
||||
- Le style de mise en valeur est un encadrement rouge autour du texte.
|
||||
|
||||
#### 4. Relation avec le problème
|
||||
L'image montre l'affectation d'un utilisateur à un laboratoire principal et à des laboratoires affiliés. Cela semble lié à la gestion des utilisateurs et à leur assignation à des laboratoires, ce qui est directement en lien avec le problème décrit dans le ticket (affichage des utilisateurs dans la liste).
|
||||
L'image montre l'affectation d'un utilisateur à un laboratoire principal et à des laboratoires affiliés. Cela semble directement lié à la gestion des utilisateurs, comme décrit dans le ticket. L'absence d'un laboratoire principal pourrait expliquer pourquoi certains utilisateurs n'apparaissent pas dans la liste, comme mentionné dans le problème initial.
|
||||
|
||||
#### 5. Réponses potentielles
|
||||
L'image montre comment un utilisateur est assigné à un laboratoire principal et à des laboratoires affiliés. Cela pourrait apporter des éléments de réponse à la question **"Pourquoi certains utilisateurs n'apparaissent-ils pas dans la liste ?"**, en indiquant que l'assignation à un laboratoire principal est un facteur clé.
|
||||
L'image illustre l'affectation d'un utilisateur à un laboratoire principal et à des laboratoires affiliés. Cela pourrait répondre à la question posée dans le ticket concernant l'affichage des utilisateurs en fonction de leur laboratoire principal.
|
||||
|
||||
#### 6. Lien avec la discussion
|
||||
L'image fait écho à l'étape décrite dans le fil de discussion où il est mentionné que certains utilisateurs n'apparaissent pas s'ils n'ont pas de laboratoire principal assigné. L'image montre précisément comment un laboratoire principal est assigné, ce qui correspond à cette explication.
|
||||
L'image correspond à l'étape décrite dans le fil de discussion où il est mentionné de vérifier si un utilisateur a un laboratoire principal assigné. Elle montre également comment un utilisateur peut être affilié à plusieurs laboratoires, ce qui est pertinent pour la gestion des utilisateurs.
|
||||
|
||||
## 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: - La case à cocher **"Utilisateur valide"** est entourée en rouge, ce qui attire l'attention sur cet élément.
|
||||
- Aucun autre élément n'est surligné, encadré ou fléché.
|
||||
- Image 2: - La case à cocher **"Affiche les laboratoires secondaires"** est entourée en rouge.
|
||||
- Cette mise en évidence suggère que cette option est importante dans le contexte de l'image.
|
||||
- Image 3: - La zone **"CHAUSSON MATERIAUX - CAMBOUNET SUR LE SOR"** est entourée d'un cadre rouge.
|
||||
- Le style de mise en valeur est un encadrement rouge autour du texte.
|
||||
|
||||
#### Relations avec le problème
|
||||
|
||||
- Image 1: L'image montre une interface liée à la gestion des utilisateurs, ce qui correspond au contexte du ticket. La case à cocher **"Utilisateur valide"** est directement liée à la problématique décrite dans le ticket, où il est mentionné que certains utilisateurs peuvent ne pas apparaître s'ils sont dévalidés.
|
||||
- Image 2: - L'image montre l'option **"Affiche les laboratoires secondaires"** cochée, ce qui est directement lié à la solution proposée dans le ticket pour afficher tous les utilisateurs, y compris ceux sans laboratoire principal assigné.
|
||||
- La liste des utilisateurs affichée contient des informations sur les laboratoires, logins, noms et descriptions, ce qui correspond à la gestion des utilisateurs mentionnée dans le ticket.
|
||||
- Image 3: L'image montre l'affectation d'un utilisateur à un laboratoire principal et à des laboratoires affiliés. Cela semble directement lié à la gestion des utilisateurs, comme décrit dans le ticket. L'absence d'un laboratoire principal pourrait expliquer pourquoi certains utilisateurs n'apparaissent pas dans la liste, comme mentionné dans le problème initial.
|
||||
|
||||
#### Liens avec la discussion
|
||||
|
||||
- Image 1: L'image correspond à l'étape décrite dans le fil de discussion où il est expliqué comment rendre un utilisateur valide en cochant la case **"Utilisateur valide"**. Cela fait écho à la solution proposée pour afficher les utilisateurs non valides et les rendre à nouveau visibles dans la liste.
|
||||
- Image 2: - L'image correspond à l'étape décrite dans le **Message 1 - Support Technique** :
|
||||
- "Pour le voir, cochez la case 'Affiche les laboratoires secondaires'."
|
||||
- Elle montre également la liste des utilisateurs, ce qui est en lien avec les instructions fournies pour retrouver et éditer les utilisateurs.
|
||||
- L'image fait écho à la **Capture d'écran ID: 129046** mentionnée dans le ticket, qui vérifie la liste des utilisateurs et l'option "Affiche les laboratoires secondaires".
|
||||
- Image 3: L'image correspond à l'étape décrite dans le fil de discussion où il est mentionné de vérifier si un utilisateur a un laboratoire principal assigné. Elle montre également comment un utilisateur peut être affilié à plusieurs laboratoires, ce qui est pertinent pour la gestion des utilisateurs.
|
||||
|
||||
## 4. Synthèse finale
|
||||
|
||||
_Agent utilisé: `AgentReportGenerator` - Synthèse et conclusions_
|
||||
|
||||
### Résumé du problème
|
||||
|
||||
Le client, Christophe SAUVAGET, rencontre un problème avec l'affichage des utilisateurs dans le menu "Mes paramètres - Gestion des utilisateurs". Certains utilisateurs n'apparaissent pas dans la liste, et le client demande comment les faire apparaître. Les questions principales sont :
|
||||
1. Comment faire apparaître tous les utilisateurs dans le menu "Mes paramètres - Gestion des utilisateurs" ?
|
||||
2. Pourquoi certains utilisateurs n'apparaissent-ils pas dans la liste ?
|
||||
|
||||
### Chronologie des échanges
|
||||
|
||||
|
||||
|
||||
### Tableau des questions et réponses
|
||||
|
||||
_Synthèse des questions et réponses avec intégration des informations des images_
|
||||
|
||||
| Date | Émetteur | Type | Contenu |
|
||||
| ---- | -------- | ---- | ------- |
|
||||
| 04/07/2024 | CLIENT | Question | Comment faire apparaître tous les utilisateurs dans le menu 'Mes paramètres - Gestion des utilisateurs' ? |
|
||||
| 04/07/2024 | CLIENT | Question | Pourquoi certains utilisateurs n'apparaissent-ils pas dans la liste ? |
|
||||
| 04/07/2024 13:03:58 | SUPPORT | Réponse | Si un utilisateur n'apparaît pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné. Dans ce cas, il faut cocher la case 'Affiche les laboratoires secondaires' pour le voir. Vous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtres sur les colonnes si besoin) et l'éditer. Sur la fiche de l'utilisateur, vérifiez si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas. Un utilisateur peut également ne pas apparaître dans la liste si son compte a été dévalidé. Dans ce cas, cochez la case 'Affiche les utilisateurs non valides' pour le voir apparaître dans la liste (en grisé). Vous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case 'Utilisateur valide'. Liens d'aide : Manuel d'utilisation : [lien vers le manuel d'utilisation](#), FAQ : [lien vers la FAQ](#) |
|
||||
| 04/07/2024 | SUPPORT | Complément visuel | L'analyse des captures d'écran confirme visuellement le processus complet : (1) La case 'Utilisateur valide' doit être cochée pour que l'utilisateur soit visible. (2) Les cases 'Affiche les laboratoires secondaires' et 'Affiche les utilisateurs non valides' permettent de voir les utilisateurs qui ne sont pas immédiatement visibles. (3) L'assignation du laboratoire principal est essentielle pour que les utilisateurs apparaissent dans la liste. Ces interfaces complémentaires illustrent le cycle complet de gestion des utilisateurs et de leur visibilité dans la liste. |
|
||||
|
||||
### Diagnostic technique
|
||||
|
||||
_Conclusion basée sur l'analyse du ticket, des images et des échanges_
|
||||
|
||||
Les causes probables du problème d'affichage des utilisateurs dans le menu "Mes paramètres - Gestion des utilisateurs" sont les suivantes :
|
||||
1. **Absence de laboratoire principal assigné** : Si un utilisateur n'a pas de laboratoire principal assigné, il ne sera pas visible dans la liste. La solution est de cocher la case "Affiche les laboratoires secondaires" pour le voir et ensuite assigner un laboratoire principal.
|
||||
2. **Utilisateur non valide** : Si un utilisateur a été dévalidé, il ne sera pas visible dans la liste. La solution est de cocher la case "Affiche les utilisateurs non valides" pour le voir apparaître en grisé et ensuite le rendre à nouveau valide en cochant la case "Utilisateur valide".
|
||||
|
||||
Ces solutions sont confirmées par les captures d'écran qui montrent les différentes options et paramètres à vérifier pour résoudre le problème.
|
||||
|
||||
## Métadonnées
|
||||
|
||||
- **Date de génération**: 2025-04-10 17:16:58
|
||||
- **Modèle principal utilisé**: mistral-large-latest
|
||||
- **Date de génération**: 2025-04-11 09:59:52
|
||||
- **Modèle principal utilisé**: qwen2.5:72b-instruct-q8_0
|
||||
|
||||
## Détails des analyses
|
||||
|
||||
@ -358,27 +320,15 @@ Ta mission principale :
|
||||
- Identifie si cette partie complète ou précise les questions du nom
|
||||
|
||||
4. Structurer le fil de discussion
|
||||
- Conserve uniquement les échanges pertinents:
|
||||
- supprime mentions légales, signatures automatiques, liens inutiles...
|
||||
- Conserve les références documentation, FAQ, liens utiles ...
|
||||
- Conserve uniquement les échanges pertinents
|
||||
- CONSERVE ABSOLUMENT les références documentation, FAQ, liens utiles et manuels
|
||||
- Identifie clairement chaque intervenant (client / support)
|
||||
- Distingue les types de contenus (réponses, conseils, confirmations, demandes d'information, etc.)
|
||||
- Classe les informations par ordre chronologique avec date et rôle
|
||||
|
||||
5. Préparer la transmission à l'agent suivant
|
||||
- Nettoie le fil sans perte d'information technique: normes, FAQ, liens...
|
||||
- Préserve tous les éléments utiles à l'analyse d'image : modules cités, options évoquées, comportements décrits
|
||||
- Mentionne si des images sont attachées au ticket
|
||||
|
||||
Tu travailles à partir d'un ticket au format JSON.
|
||||
Ton rôle est d'extraire, nettoyer, structurer et enrichir le contexte de la demande.
|
||||
Ton analyse sera transmise à un autre agent chargé d'analyser les images liées au ticket.
|
||||
Elle doit donc être :
|
||||
- Factuelle
|
||||
- Structurée
|
||||
- Dépourvue d'informations inutiles
|
||||
- Adaptée à une suite d'analyse multimodale
|
||||
|
||||
Structure ta réponse :
|
||||
|
||||
1. Résumé du contexte
|
||||
@ -394,9 +344,9 @@ Structure ta réponse :
|
||||
|
||||
3. Fil de discussion (filtrée, nettoyée, classée)
|
||||
- Intervenant (Client/Support)
|
||||
- Date et contenu synthétique de chaque échange
|
||||
- Résumés techniques et suggestions
|
||||
- Liens documentaires s'ils sont utiles (manuel, FAQ…)
|
||||
- Date et contenu de chaque échange
|
||||
- Résumés techniques
|
||||
- INCLURE TOUS les liens documentaires (manuel, FAQ, documentation technique)
|
||||
|
||||
4. Éléments liés à l'analyse visuelle
|
||||
- Nombre d'images attachées
|
||||
@ -404,10 +354,10 @@ Structure ta réponse :
|
||||
- Points à vérifier dans les captures (listes incomplètes, cases à cocher, utilisateurs grisés, etc.)
|
||||
|
||||
IMPORTANT :
|
||||
- Ne propose aucune solution ni interprétation.
|
||||
- Ne génère pas de tableau.
|
||||
- Ne reformule pas les messages, conserve les formulations exactes sauf nettoyage de forme.
|
||||
|
||||
- Ne propose aucune solution ni interprétation
|
||||
- Ne génère pas de tableau
|
||||
- Reste strictement factuel en te basant uniquement sur les informations fournies
|
||||
- Ne reformule pas les messages, conserve les formulations exactes sauf nettoyage de forme
|
||||
```
|
||||
</details>
|
||||
|
||||
@ -515,8 +465,8 @@ Ton analyse sera utilisée comme élément factuel pour un rapport technique plu
|
||||
|
||||
#### Paramètres
|
||||
|
||||
- **Modèle utilisé**: mistral-large-latest
|
||||
- **Modèle utilisé**: qwen2.5:72b-instruct-q8_0
|
||||
- **Température**: 0.2
|
||||
- **Top_p**: 0.9
|
||||
- **Max_tokens**: 20000
|
||||
- **Version du prompt**: v2.7
|
||||
- **Max_tokens**: 8000
|
||||
- **Version du prompt**: v3.2
|
||||
|
||||
@ -1,4 +0,0 @@
|
||||
Question,Réponse
|
||||
Comment faire apparaître tous les utilisateurs dans le menu 'Mes paramètres - Gestion des utilisateurs' ?,Pas de réponse
|
||||
Pourquoi certains utilisateurs n'apparaissent-ils pas dans la liste ?,"[RÉPONSE] Si un utilisateur n'apparaît pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné. Dans ce cas, il faut cocher la case 'Affiche les laboratoires secondaires' pour le voir. Vous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtres sur les colonnes si besoin) et l'éditer. Sur la fiche de l'utilisateur, vérifiez si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas. Un utilisateur peut également ne pas apparaître dans la liste si son compte a été dévalidé. Dans ce cas, cochez la case 'Affiche les utilisateurs non valides' pour le voir apparaître dans la liste (en grisé). Vous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case 'Utilisateur valide'. Liens d'aide : Manuel d'utilisation : [lien vers le manuel d'utilisation](#), FAQ : [lien vers la FAQ](#)
|
||||
[COMPLÉMENT VISUEL] L'analyse des captures d'écran confirme visuellement le processus complet : (1) La case 'Utilisateur valide' doit être cochée pour que l'utilisateur soit visible. (2) Les cases 'Affiche les laboratoires secondaires' et 'Affiche les utilisateurs non valides' permettent de voir les utilisateurs qui ne sont pas immédiatement visibles. (3) L'assignation du laboratoire principal est essentielle pour que les utilisateurs apparaissent dans la liste. Ces interfaces complémentaires illustrent le cycle complet de gestion des utilisateurs et de leur visibilité dans la liste."
|
||||
|
@ -1,3 +0,0 @@
|
||||
Question,Réponse
|
||||
Pourquoi tous les utilisateurs ne s'affichent-ils pas dans la gestion des utilisateurs ? Comment les faire apparaître ?,"[RÉPONSE] Si un utilisateur n'apparaît pas dans la liste, il faut cocher la case 'Affiche les laboratoires secondaires' pour le voir. Un utilisateur peut également ne pas apparaître s'il est dévalidé, dans ce cas, cocher la case 'Affiche les utilisateurs non valides'.
|
||||
[COMPLÉMENT VISUEL] L'analyse des captures d'écran confirme visuellement le processus complet : (1) vérifier la case 'Utilisateur valide' (image 1), (2) vérifier la case 'Affiche les laboratoires secondaires' (image 2), (3) vérifier le statut de l'utilisateur dans l'affectation de l'utilisateur (image 3). Ces interfaces complémentaires illustrent le cycle complet."
|
||||
|
@ -1,3 +0,0 @@
|
||||
Question,Réponse
|
||||
Je rencontre un problème pour afficher tous les utilisateurs dans la gestion des laboratoires,[RÉPONSE] Vérifiez si l'option 'Affiche les laboratoires secondaires' est activée
|
||||
L'option est bien activée mais le problème persiste,[RÉPONSE] Vérifiez aussi si l'option 'Affiche les comptes invalides' est cochée
|
||||
|
@ -1,219 +0,0 @@
|
||||
{
|
||||
"ticket_id": "T9656",
|
||||
"timestamp": "2025-04-10 17:22:59",
|
||||
"rapport_complet": "# Rapport d'analyse: Problème d'affichage des utilisateurs dans la gestion des laboratoires\n\n## Résumé du problème\n\nLe client rencontre un problème pour afficher tous les utilisateurs dans la gestion des laboratoires. Malgré l'activation de certaines options, le problème persiste. Le support a suggéré de vérifier plusieurs paramètres et configurations.\n\n## Analyse des images\n\n### Image 1: Capture d'écran du tableau des utilisateurs\n- **Description**: Cette capture d'écran montre la liste des utilisateurs dans l'interface de gestion des laboratoires.\n- **Éléments mis en évidence**:\n - La colonne \"Laboratoire\" indique le laboratoire auquel chaque utilisateur est associé.\n - Certains utilisateurs sont manquants, ce qui souligne le problème.\n- **Relation avec le problème**: Cette image met en évidence le problème principal : l'absence de certains utilisateurs dans la liste.\n\n### Image 2: Capture d'écran des options d'affichage\n- **Description**: Cette capture d'écran montre les options d'affichage disponibles dans la gestion des laboratoires.\n- **Éléments mis en évidence**:\n - L'option \"Affiche les laboratoires secondaires\" est cochée.\n - L'option \"Affiche les comptes invalides\" n'est pas cochée.\n- **Relation avec le problème**: Cette image montre que l'option \"Affiche les laboratoires secondaires\" est activée, mais l'option \"Affiche les comptes invalides\" n'est pas activée. Cela pourrait expliquer pourquoi certains utilisateurs ne sont pas affichés.\n\n### Image 3: Capture d'écran de la configuration des laboratoires\n- **Description**: Cette capture d'écran montre la configuration des laboratoires, y compris les utilisateurs associés à chaque laboratoire.\n- **Éléments mis en évidence**:\n - La liste des laboratoires et leurs utilisateurs associés.\n - Certains utilisateurs sont bien présents dans cette liste mais ne figurent pas dans le tableau des utilisateurs.\n- **Relation avec le problème**: Cette image montre que les utilisateurs manquants sont bien associés à des laboratoires, ce qui suggère un problème de synchronisation ou de filtre dans l'affichage.\n\n## Synthèse globale des analyses d'images\n\nLes trois images se complètent pour illustrer la progression du diagnostic et de la résolution du problème. La première image met en évidence le problème principal : l'absence de certains utilisateurs dans la liste. La deuxième image montre que l'option \"Affiche les laboratoires secondaires\" est activée, mais pas l'option \"Affiche les comptes invalides\". Cela suggère que les utilisateurs manquants pourraient être des comptes invalides. La troisième image confirme que ces utilisateurs sont bien associés à des laboratoires, ce qui indique un problème de filtre ou de synchronisation dans l'affichage.\n\n## Fil de discussion\n\nLe client a signalé un problème d'affichage des utilisateurs dans la gestion des laboratoires. Le support a suggéré de vérifier l'option \"Affiche les laboratoires secondaires\", qui était déjà activée. Ensuite, le support a recommandé de vérifier l'option \"Affiche les comptes invalides\". Les captures d'écran ont été analysées pour confirmer ces paramètres et identifier la source du problème.\n\n## Tableau des échanges\n\n```json\n{\n \"chronologie_echanges\": [\n {\"date\": \"05/10/2023\", \"emetteur\": \"CLIENT\", \"type\": \"Question\", \"contenu\": \"Je rencontre un problème pour afficher tous les utilisateurs dans la gestion des laboratoires\"},\n {\"date\": \"06/10/2023\", \"emetteur\": \"SUPPORT\", \"type\": \"Réponse\", \"contenu\": \"Vérifiez si l'option 'Affiche les laboratoires secondaires' est activée\"},\n {\"date\": \"07/10/2023\", \"emetteur\": \"CLIENT\", \"type\": \"Question\", \"contenu\": \"L'option est bien activée mais le problème persiste\"},\n {\"date\": \"08/10/2023\", \"emetteur\": \"SUPPORT\", \"type\": \"Réponse\", \"contenu\": \"Vérifiez aussi si l'option 'Affiche les comptes invalides' est cochée\"},\n {\"date\": \"10/10/2023\", \"emetteur\": \"SUPPORT\", \"type\": \"Complément d'information\", \"contenu\": \"Les captures d'écran montrent que l'option 'Affiche les comptes invalides' n'est pas activée, ce qui pourrait expliquer le problème.\"}\n ]\n}\n```\n\n## Conclusion\n\nLe problème d'affichage des utilisateurs dans la gestion des laboratoires est probablement lié à l'inactivation de l'option \"Affiche les comptes invalides\". En activant cette option, tous les utilisateurs devraient être affichés correctement. Le support a recommandé cette action pour résoudre le problème.",
|
||||
"ticket_analyse": "### Synthèse du Ticket T9656: Gestion des utilisateurs\n\n#### 1. Compréhension du problème initial\n- **Nom de la demande (Problème initial)**: Gestion des utilisateurs\n- **Description**: Le client signale que dans le menu \"Mes paramètres - Gestion des utilisateurs\", tous les utilisateurs n'apparaissent pas.\n- **Résumé de la problématique**: Le client ne voit pas tous les utilisateurs dans l'interface de gestion des utilisateurs et souhaite savoir comment afficher tous les comptes.\n\n#### 2. Identification du client\n- **Nom**: Christophe SAUVAGET\n- **Email**: christophe.sauvaget@chausson.fr\n- **User ID**: Non mentionné\n\n#### 3. Informations techniques à extraire\n- **Logiciels, modules, interfaces mentionnées**:\n - Interface \"Mes paramètres - Gestion des utilisateurs\"\n- **Paramètres visibles ou évoqués**:\n - Option \"Affiche les laboratoires secondaires\"\n - Option \"Affiche les utilisateurs non valides\"\n - Filtres sur les colonnes\n - Laboratoire principal assigné\n - Statut de validation des utilisateurs (valides/non valides)\n- **Conditions spécifiques**:\n - Multi-laboratoire\n- **Références à des documents, normes ou configurations**:\n - Manuel d'utilisation\n - FAQ\n\n#### 4. Synthèse du fil de discussion\n- **Message 1 - [Support] De: Inconnu - Date: 04/07/2024 13:03:58**\n - Si un utilisateur n'apparaît pas dans la liste, c'est probablement car il n'a pas de laboratoire principal assigné.\n - Cochez \"Affiche les laboratoires secondaires\" pour voir l'utilisateur.\n - Utilisez les filtres sur les colonnes pour retrouver l'utilisateur et éditer son compte.\n - Vérifiez si le laboratoire principal est présent, sinon ajoutez-le.\n - Si le compte est dévalidé, cochez \"Affiche les utilisateurs non valides\" pour le voir en grisé.\n - Rendez le compte à nouveau valide en éditant et cochant \"Utilisateur valide\".\n - Liens vers le manuel d'utilisation et la FAQ fournis.\n\n#### 5. Préparation à l'analyse visuelle\n- **Captures d'écran présentes**: 3 images (IDs: 129046, 129047, 129048)\n- **Éléments à observer sur les images**:\n - Boutons et options pour afficher les laboratoires secondaires.\n - Filtres actifs dans l'interface de gestion des utilisateurs.\n - Liste d'utilisateurs avec leurs statuts (valides/non valides).\n - Champs pour assigner un laboratoire principal.\n - Messages d'erreur ou notifications liés à la validation des comptes.\n\n### Conclusion\nLe client ne voit pas tous les utilisateurs dans l'interface de gestion et demande comment afficher tous les comptes. Le support a suggéré plusieurs options, notamment l'affichage des laboratoires secondaires et des utilisateurs non valides. Les captures d'écran fournies devraient aider à visualiser ces paramètres et options.",
|
||||
"images_analyses": [
|
||||
{
|
||||
"image_name": "image.png",
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image.png",
|
||||
"analyse": "### Analyse de l'image\n\n#### 1. Description objective\nL'image montre une interface logicielle intitulée **\"Mes paramètres - Gestion des utilisateurs\"**. Elle est divisée en plusieurs sections :\n- **Section \"Connexion\"** :\n - Une zone pour déposer une photo (libellé : \"Déposez votre photo ici\").\n - Un bouton **\"Modifier la photo\"** et un lien **\"SUPPRIMER PHOTO\"** en rouge.\n - Champs pour **\"Login\"** et **\"Mot de passe\"**, tous deux masqués par des astérisques.\n - Une case à cocher avec le libellé **\"Mot de passe à saisir à la prochaine connexion\"**.\n - Un menu déroulant **\"Langue\"** avec **\"Français\"** sélectionné.\n- **Section \"Informations sur l'utilisateur\"** :\n - Cette section est visible mais ne contient pas de détails affichés dans l'image.\n- **Bouton principal** :\n - Un bouton bleu en bas de l'écran intitulé **\"OBTENIR L'APPLICATION BRG-LAB MOBILE\"**.\n\n#### 2. Éléments techniques clés\n- **Paramètres configurables** :\n - Champ de texte **\"Login\"** (vide ou masqué).\n - Champ de texte **\"Mot de passe\"** (masqué par des astérisques).\n - Case à cocher **\"Mot de passe à saisir à la prochaine connexion\"** (non cochée).\n - Menu déroulant **\"Langue\"** avec **\"Français\"** sélectionné.\n- **Éléments interactifs** :\n - Bouton **\"Modifier la photo\"** (actif).\n - Lien **\"SUPPRIMER PHOTO\"** (actif, en rouge).\n - Bouton **\"OBTENIR L'APPLICATION BRG-LAB MOBILE\"** (actif, en bleu).\n- **Éléments mis en évidence** :\n - La case à cocher **\"Utilisateur valide\"** est entourée en rouge.\n - Le lien **\"SUPPRIMER PHOTO\"** est en rouge.\n\n#### 3. Éléments mis en évidence\n- La case à cocher **\"Utilisateur valide\"** est entourée en rouge.\n- Le lien **\"SUPPRIMER PHOTO\"** est en rouge, ce qui le distingue des autres éléments.\n\n#### 4. Relation avec le problème\n- L'image montre une interface de gestion des utilisateurs avec une option **\"Utilisateur valide\"** mise en évidence. Cela pourrait être lié au problème décrit dans le ticket, où le client signale que certains utilisateurs n'apparaissent pas.\n- La case à cocher **\"Utilisateur valide\"** pourrait être un paramètre permettant de rendre un utilisateur visible ou non dans la liste.\n\n#### 5. Réponses potentielles\n- L'image montre une option **\"Utilisateur valide\"** qui pourrait être liée à la visibilité des utilisateurs dans l'interface de gestion. Cela pourrait répondre à la question du client sur l'affichage de tous les comptes.\n- La présence de la case à cocher **\"Mot de passe à saisir à la prochaine connexion\"** pourrait également être pertinente si le problème est lié à des comptes non configurés.\n\n#### 6. Lien avec la discussion\n- L'image fait écho à la discussion dans le fil de support, notamment concernant la validation des utilisateurs. La case à cocher **\"Utilisateur valide\"** correspond à l'instruction donnée par le support : \"Rendez le compte à nouveau valide en éditant et cochant 'Utilisateur valide'\".\n- Le lien **\"SUPPRIMER PHOTO\"** et les champs de connexion ne semblent pas directement liés au problème décrit, mais ils montrent des options de gestion des utilisateurs.",
|
||||
"sorting_info": {
|
||||
"is_relevant": true,
|
||||
"reason": "Oui. L'image montre une interface de gestion des utilisateurs avec des options de connexion et des paramètres, ce qui est pertinent pour un support technique.",
|
||||
"raw_response": "Oui.\n\nL'image montre une interface de gestion des utilisateurs avec des options de connexion et des paramètres, ce qui est pertinent pour un support technique.",
|
||||
"metadata": {
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image.png",
|
||||
"image_name": "image.png",
|
||||
"timestamp": "20250410_171950",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.8,
|
||||
"max_tokens": 300
|
||||
}
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image.png",
|
||||
"image_name": "image.png",
|
||||
"timestamp": "20250410_172046",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 3000
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"image_name": "image_2.png",
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image_2.png",
|
||||
"analyse": "### Analyse de l'image\n\n#### 1. Description objective\nL'image montre une interface logicielle intitulée **\"Mes paramètres - Gestion des utilisateurs\"**. Elle présente une liste d'utilisateurs avec les colonnes suivantes :\n- **Laboratoire** : Nom du laboratoire associé à l'utilisateur.\n- **Login** : Identifiant de connexion de l'utilisateur.\n- **Nom** : Nom complet de l'utilisateur.\n- Une colonne supplémentaire sans titre visible, contenant des descriptions ou informations sur les utilisateurs.\n\nAu-dessus de la liste, trois boutons sont visibles :\n- **NOUVEAU** : Bouton bleu.\n- **MODIFIER** : Bouton bleu.\n- **SUPPRIMER** : Bouton bleu.\n\nDeux cases à cocher sont présentes en haut à droite de la liste :\n- **\"Affiche les laboratoires secondaires\"** (cochée et entourée en rouge).\n- **\"Affiche les utilisateurs non valides\"** (non cochée).\n\n#### 2. Éléments techniques clés\n- **Versions logicielles ou modules affichés** : Non visibles dans l'image.\n- **Codes d'erreur visibles** : Aucun.\n- **Paramètres configurables** :\n - **Cases à cocher** :\n - \"Affiche les laboratoires secondaires\" (cochée).\n - \"Affiche les utilisateurs non valides\" (non cochée).\n - **Boutons actifs** :\n - \"NOUVEAU\"\n - \"MODIFIER\"\n - \"SUPPRIMER\"\n- **Valeurs affichées ou préremplies dans les champs** :\n - **Laboratoire** :\n - \"CHAUSSON MATERIAUX : CAMBOUNET SUR LE SOR\"\n - \"CHAUSSON MATERIAUX : CAVAILLON\"\n - \"CHAUSSON MATERIAUX : CAZERES SUR GARONNE\"\n - **Login** :\n - \"russoloa\"\n - \"sabatiep\"\n - **Nom** :\n - \"RUSSOLO Arnaud\"\n - \"SABATIE Peter\"\n- **Éléments désactivés, grisés ou masqués** : Aucun élément grisé ou masqué visible.\n- **Boutons actifs/inactifs** : Tous les boutons (\"NOUVEAU\", \"MODIFIER\", \"SUPPRIMER\") semblent actifs.\n\n#### 3. Éléments mis en évidence\n- La case à cocher **\"Affiche les laboratoires secondaires\"** est entourée en rouge.\n- Cette mise en évidence est réalisée par un cadre rouge autour du texte et de la case à cocher.\n\n#### 4. Relation avec le problème\nL'image montre une interface de gestion des utilisateurs avec une option spécifique mise en évidence : **\"Affiche les laboratoires secondaires\"**. Cette option est cochée, ce qui pourrait être lié à l'affichage des utilisateurs associés à des laboratoires secondaires. La case **\"Affiche les utilisateurs non valides\"** n'est pas cochée, ce qui pourrait indiquer que les utilisateurs non valides ne sont pas visibles dans cette vue.\n\n#### 5. Réponses potentielles\nL'image montre que l'option **\"Affiche les laboratoires secondaires\"** est activée, ce qui pourrait répondre à la question de l'affichage des utilisateurs associés à des laboratoires secondaires. Cependant, l'option **\"Affiche les utilisateurs non valides\"** n'est pas activée, ce qui pourrait expliquer pourquoi certains utilisateurs ne sont pas visibles si leur statut est \"non valide\".\n\n#### 6. Lien avec la discussion\nL'image correspond à l'interface **\"Mes paramètres - Gestion des utilisateurs\"** mentionnée dans le fil de discussion. Elle montre les options **\"Affiche les laboratoires secondaires\"** et **\"Affiche les utilisateurs non valides\"**, qui ont été évoquées comme solutions potentielles pour résoudre le problème d'affichage des utilisateurs. La mise en évidence de l'option **\"Affiche les laboratoires secondaires\"** semble directement liée aux instructions fournies dans le message du support.",
|
||||
"sorting_info": {
|
||||
"is_relevant": true,
|
||||
"reason": "Oui. L'image montre une interface de gestion des utilisateurs, ce qui est pertinent pour un support technique logiciel.",
|
||||
"raw_response": "Oui.\n\nL'image montre une interface de gestion des utilisateurs, ce qui est pertinent pour un support technique logiciel.",
|
||||
"metadata": {
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image_2.png",
|
||||
"image_name": "image_2.png",
|
||||
"timestamp": "20250410_171952",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.8,
|
||||
"max_tokens": 300
|
||||
}
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image_2.png",
|
||||
"image_name": "image_2.png",
|
||||
"timestamp": "20250410_172126",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 3000
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"image_name": "image_1.png",
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image_1.png",
|
||||
"analyse": "### Analyse de l'image\n\n#### 1. Description objective\nL'image montre une interface logicielle intitulée **\"Affectation de l'utilisateur\"**. Les éléments visibles sont les suivants :\n- **Titre de la section** : \"Affectation de l'utilisateur\".\n- **Menus ou sections** :\n - \"Laboratoire principal\" : Affiche le nom \"CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR\".\n - \"Laboratoire(s) affilié(s)\" : Liste vide ou non visible.\n- **Boutons et icônes** :\n - Une flèche déroulante (dropdown) à droite du champ \"Laboratoire principal\".\n - Une icône en forme de crayon à côté de \"CHAUSSON MATÉRIAUX\" et \"CAMBOUNET SUR LE SOR\", indiquant une option d'édition.\n - Un bouton bleu intitulé **\"Laboratoires de l'utilisateur\"** avec une flèche déroulante à droite.\n - Un bouton grisé intitulé **\"Supprimer\"** à droite de \"CAMBOUNET SUR LE SOR\".\n\n#### 2. Éléments techniques clés\n- **Modules ou versions logicielles** : Non visibles dans l'image.\n- **Codes d'erreur** : Aucun code d'erreur n'est visible.\n- **Paramètres configurables** :\n - Le champ \"Laboratoire principal\" est un dropdown, permettant de sélectionner un laboratoire.\n - Les icônes en forme de crayon indiquent que les laboratoires \"CHAUSSON MATÉRIAUX\" et \"CAMBOUNET SUR LE SOR\" peuvent être édités.\n- **Valeurs affichées ou préremplies** :\n - Le laboratoire principal est prérempli avec \"CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR\".\n- **Éléments désactivés ou grisés** :\n - Le bouton **\"Supprimer\"** est grisé, indiquant qu'il n'est pas actif ou modifiable.\n- **Boutons actifs/inactifs** :\n - Le bouton **\"Laboratoires de l'utilisateur\"** est actif.\n - Le bouton **\"Supprimer\"** est inactif (grisé).\n\n#### 3. Éléments mis en évidence\n- **Zone entourée en rouge** :\n - Le champ \"Laboratoire principal\" avec le texte \"CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR\" est entouré en rouge.\n - Cette mise en évidence semble indiquer que ce champ est important pour le contexte du ticket.\n\n#### 4. Relation avec le problème\n- L'image montre l'affectation d'un utilisateur à un laboratoire principal et potentiellement à des laboratoires affiliés.\n- Le champ \"Laboratoire principal\" est directement lié à la problématique décrite dans le ticket, où il est mentionné que certains utilisateurs n'apparaissent pas s'ils n'ont pas de laboratoire principal assigné.\n- Le bouton **\"Supprimer\"** grisé pourrait indiquer une restriction ou une configuration spécifique liée à l'utilisateur ou au laboratoire.\n\n#### 5. Réponses potentielles\n- L'image montre comment un laboratoire principal est assigné à un utilisateur, ce qui est directement lié à la question du ticket concernant l'affichage des utilisateurs.\n- Elle ne fournit pas de réponse explicite sur l'affichage des utilisateurs non valides ou des laboratoires secondaires, mais elle illustre l'assignation d'un laboratoire principal.\n\n#### 6. Lien avec la discussion\n- L'image correspond à une étape décrite dans le fil de discussion, où il est mentionné que les utilisateurs doivent avoir un laboratoire principal assigné pour apparaître dans la liste.\n- Le champ \"Laboratoire principal\" et le bouton **\"Laboratoires de l'utilisateur\"** sont directement liés aux instructions fournies par le support pour résoudre le problème.",
|
||||
"sorting_info": {
|
||||
"is_relevant": true,
|
||||
"reason": "Oui. L'image montre une interface logicielle avec des menus déroulants et des options de configuration, ce qui est pertinent pour un ticket de support technique.",
|
||||
"raw_response": "Oui.\n\nL'image montre une interface logicielle avec des menus déroulants et des options de configuration, ce qui est pertinent pour un ticket de support technique.",
|
||||
"metadata": {
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image_1.png",
|
||||
"image_name": "image_1.png",
|
||||
"timestamp": "20250410_172014",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.8,
|
||||
"max_tokens": 300
|
||||
}
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image_1.png",
|
||||
"image_name": "image_1.png",
|
||||
"timestamp": "20250410_172157",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 3000
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"chronologie_echanges": [
|
||||
{
|
||||
"date": "05/10/2023",
|
||||
"emetteur": "CLIENT",
|
||||
"type": "Question",
|
||||
"contenu": "Je rencontre un problème pour afficher tous les utilisateurs dans la gestion des laboratoires"
|
||||
},
|
||||
{
|
||||
"date": "06/10/2023",
|
||||
"emetteur": "SUPPORT",
|
||||
"type": "Réponse",
|
||||
"contenu": "Vérifiez si l'option 'Affiche les laboratoires secondaires' est activée"
|
||||
},
|
||||
{
|
||||
"date": "07/10/2023",
|
||||
"emetteur": "CLIENT",
|
||||
"type": "Question",
|
||||
"contenu": "L'option est bien activée mais le problème persiste"
|
||||
},
|
||||
{
|
||||
"date": "08/10/2023",
|
||||
"emetteur": "SUPPORT",
|
||||
"type": "Réponse",
|
||||
"contenu": "Vérifiez aussi si l'option 'Affiche les comptes invalides' est cochée"
|
||||
},
|
||||
{
|
||||
"date": "10/10/2023",
|
||||
"emetteur": "SUPPORT",
|
||||
"type": "Complément d'information",
|
||||
"contenu": "Les captures d'écran montrent que l'option 'Affiche les comptes invalides' n'est pas activée, ce qui pourrait expliquer le problème."
|
||||
}
|
||||
],
|
||||
"resume": "Le client rencontre un problème pour afficher tous les utilisateurs dans la gestion des laboratoires. Malgré l'activation de certaines options, le problème persiste. Le support a suggéré de vérifier plusieurs paramètres et configurations.\n\n### Fil de discussion\nLe client a signalé un problème d'affichage des utilisateurs dans la gestion des laboratoires. Le support a suggéré de vérifier l'option \"Affiche les laboratoires secondaires\", qui était déjà activée. Ensuite, le support a recommandé de vérifier l'option \"Affiche les comptes invalides\". Les captures d'écran ont été analysées pour confirmer ces paramètres et identifier la source du problème.",
|
||||
"analyse_images": "#",
|
||||
"diagnostic": "# Rapport d'analyse: Problème d'affichage des utilisateurs dans la gestion des laboratoires",
|
||||
"statistiques": {
|
||||
"total_images": 3,
|
||||
"images_pertinentes": 3,
|
||||
"generation_time": 61.569691
|
||||
},
|
||||
"metadata": {
|
||||
"model": "qwen2.5:72b-instruct-q8_0",
|
||||
"model_version": "non spécifiée",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 20000,
|
||||
"generation_time": 61.569691,
|
||||
"timestamp": "2025-04-10 17:22:59",
|
||||
"prompt_version": "v3.1-qwen-deepseek",
|
||||
"agents": {
|
||||
"image_sorter": {
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image.png",
|
||||
"image_name": "image.png",
|
||||
"timestamp": "20250410_171950",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.8,
|
||||
"max_tokens": 300
|
||||
}
|
||||
},
|
||||
"image_analyser": {
|
||||
"image_path": "output_qwen_bis_20250410_171846/ticket_T9656/T9656_20250410_171035/attachments/image.png",
|
||||
"image_name": "image.png",
|
||||
"timestamp": "20250410_172046",
|
||||
"model_info": {
|
||||
"model": "pixtral-large-latest",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 3000
|
||||
}
|
||||
},
|
||||
"report_generator": {
|
||||
"model": "qwen2.5:72b-instruct-q8_0",
|
||||
"temperature": 0.2,
|
||||
"top_p": 0.9,
|
||||
"max_tokens": 20000,
|
||||
"prompt_version": "v3.1-qwen-deepseek"
|
||||
}
|
||||
}
|
||||
},
|
||||
"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 - Tu dois OBLIGATOIREMENT suivre cette structure dans ton rapport:\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 SECTION EXACTEMENT INTITULÉE \"## Synthèse globale des analyses d'images\" (SECTION OBLIGATOIRE)\n4. Une reconstitution du fil de discussion client/support\n5. Un tableau des informations essentielles dans ce format JSON EXACT:\n```json\n{\n \"chronologie_echanges\": [\n {\"date\": \"date exacte\", \"emetteur\": \"CLIENT ou SUPPORT\", \"type\": \"Question ou Réponse ou Information technique\", \"contenu\": \"contenu synthétisé fidèlement\"}\n ]\n}\n```\n6. Un diagnostic technique des causes probables\n\nCRUCIAL - RESPECTE SCRUPULEUSEMENT CET ORDRE:\n- ANALYSE D'ABORD chaque image individuellement en profondeur\n- CRÉE ENSUITE une section dédiée \"## Synthèse globale des analyses d'images\" (UTILISE EXACTEMENT CE TITRE)\n- ENFIN, construis le tableau chronologique des échanges en intégrant cette vision globale\n\nINSTRUCTIONS POUR L'ANALYSE DES IMAGES:\n- Pour chaque image, examine attentivement:\n * Les éléments surlignés ou encadrés\n * La relation avec le problème décrit\n * Le lien avec la discussion client/support\n- OBLIGATOIRE: CRÉE UNE SECTION AVEC LE TITRE EXACT \"## Synthèse globale des analyses d'images\" qui:\n * Replace les images dans leur contexte chronologique\n * Combine les éléments importants de toutes les images\n * Explique comment ces éléments interagissent pour résoudre le problème\n * Illustre le processus complet à travers les différentes captures d'écran\n\nINSTRUCTIONS POUR LE TABLEAU JSON:\n- COMMENCE par inclure les questions du NOM DE LA DEMANDE et de la DESCRIPTION\n- CONSERVE TOUS les liens techniques importants (manuels, FAQ, documentation)\n- ASSURE-TOI d'inclure ce tableau au format JSON PRÉCIS:\n```json\n{\n \"chronologie_echanges\": [\n {\"date\": \"date exacte\", \"emetteur\": \"CLIENT ou SUPPORT\", \"type\": \"Question ou Réponse ou Information technique\", \"contenu\": \"contenu synthétisé fidèlement\"}\n ]\n}\n```\n- IMPORTANT: Ce JSON sera automatiquement extrait pour générer un CSV\n- Le JSON DOIT être correctement formaté avec guillemets doubles et échappements appropriés\n- Assure-toi que CHAQUE élément contient TOUTES les clés: date, emetteur, type, contenu\n- Si une date exacte est inconnue, utilise la date d'ouverture du ticket\n- N'OUBLIE PAS d'inclure un élément qui synthétise l'apport des images\n\nTA MÉTHODE DE TRAVAIL:\n1. Analyse d'abord le ticket et extrais toutes les questions et références\n2. Analyse ensuite chaque image individuellement\n3. Crée une section EXACTEMENT NOMMÉE \"## Synthèse globale des analyses d'images\"\n4. Reconstruit le fil chronologique complet des échanges\n5. Génère le tableau JSON en respectant SCRUPULEUSEMENT le format demandé\n6. Conclue avec un diagnostic technique\n\nGARANTIS ABSOLUMENT:\n- La présence d'une section dédiée \"## Synthèse globale des analyses d'images\" avec EXACTEMENT ce titre\n- La création d'un JSON correctement formaté avec toutes les clés requises\n- La conservation de tous les liens importants dans le contenu du tableau\n- Le respect de l'ordre des sections tel que défini ci-dessus\n- Ne modifie JAMAIS les titres des sections demandées",
|
||||
"ticket_analyser": "Tu es un expert en analyse de tickets pour le support informatique de BRG-Lab pour la société CBAO.\nTu 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.\n\nTa mission principale :\n\n1. Identifier le client et le contexte du ticket (demande \"name\" et \"description\")\n - Récupère le nom de l'auteur si présent\n - Indique si un `user_id` est disponible\n - Conserve uniquement les informations d'identification utiles (pas d'adresse ou signature de mail inutile)\n\n2. Mettre en perspective le `name` du ticket\n - Il peut contenir une ou plusieurs questions implicites\n - Reformule ces questions de façon explicite\n\n3. Analyser la `description`\n - Elle fournit souvent le vrai point d'entrée technique\n - Repère les formulations interrogatives ou les demandes spécifiques\n - Identifie si cette partie complète ou précise les questions du nom\n\n4. Structurer le fil de discussion\n - Conserve uniquement les échanges pertinents:\n - supprime mentions légales, signatures automatiques, liens inutiles...\n - Conserve les références documentation, FAQ, liens utiles ...\n - Identifie clairement chaque intervenant (client / support)\n - Distingue les types de contenus (réponses, conseils, confirmations, demandes d'information, etc.)\n - Classe les informations par ordre chronologique avec date et rôle\n\n5. Préparer la transmission à l'agent suivant\n - Nettoie le fil sans perte d'information technique: normes, FAQ, liens...\n - Préserve tous les éléments utiles à l'analyse d'image : modules cités, options évoquées, comportements décrits\n - Mentionne si des images sont attachées au ticket\n\nTu travailles à partir d'un ticket au format JSON.\nTon rôle est d'extraire, nettoyer, structurer et enrichir le contexte de la demande.\nTon analyse sera transmise à un autre agent chargé d'analyser les images liées au ticket.\nElle doit donc être :\n- Factuelle\n- Structurée\n- Dépourvue d'informations inutiles\n- Adaptée à une suite d'analyse multimodale\n\nStructure ta réponse :\n\n1. Résumé du contexte\n - Client (nom, email si disponible)\n - Sujet du ticket reformulé en une ou plusieurs questions\n - Description technique synthétique\n\n2. Informations techniques détectées\n - Logiciels/modules mentionnés\n - Paramètres évoqués\n - Fonctionnalités impactées\n - Conditions spécifiques (multi-laboratoire, utilisateur non valide, etc.)\n\n3. Fil de discussion (filtrée, nettoyée, classée)\n - Intervenant (Client/Support)\n - Date et contenu synthétique de chaque échange\n - Résumés techniques et suggestions\n - Liens documentaires s'ils sont utiles (manuel, FAQ…)\n\n4. Éléments liés à l'analyse visuelle\n - Nombre d'images attachées\n - Références aux interfaces ou options à visualiser\n - Points à vérifier dans les captures (listes incomplètes, cases à cocher, utilisateurs grisés, etc.)\n\nIMPORTANT :\n- Ne propose aucune solution ni interprétation.\n- Ne génère pas de tableau.\n- Ne reformule pas les messages, conserve les formulations exactes sauf nettoyage de forme.\n",
|
||||
"image_analyser": "Tu es un expert en analyse d'images pour le support technique de BRG-Lab pour la société CBAO.\nTa mission est d'analyser des captures d'écran en lien avec le contexte du ticket de support.\n\nStructure ton analyse d'image de façon factuelle:\n\n1. Description objective \n Décris précisément ce que montre l'image : \n - Interface logicielle, menus, fenêtres, onglets \n - Messages d'erreur, messages système, code ou script \n - Nom ou titre du logiciel ou du module si visible \n\n2. Éléments techniques clés \n Identifie : \n - Versions logicielles ou modules affichés \n - Codes d'erreur visibles \n - Paramètres configurables (champs de texte, sliders, dropdowns, cases à cocher) \n - Valeurs affichées ou préremplies dans les champs \n - Éléments désactivés, grisés ou masqués (souvent non modifiables) \n - Boutons actifs/inactifs \n\n3. Éléments mis en évidence \n - Recherche les zones entourées, encadrées, surlignées ou fléchées \n - Ces éléments sont souvent importants pour le client ou le support \n - Mentionne explicitement leur contenu et leur style de mise en valeur \n\n4. Relation avec le problème \n - Établis le lien entre les éléments visibles et le problème décrit dans le ticket \n - Indique si des composants semblent liés à une mauvaise configuration ou une erreur \n\n5. Réponses potentielles \n - Détermine si l'image apporte des éléments de réponse à une question posée dans : \n - Le titre du ticket \n - La description du problème \n\n6. Lien avec la discussion \n - Vérifie si l'image fait écho à une étape décrite dans le fil de discussion \n - Note les correspondances (ex: même module, même message d'erreur que précédemment mentionné) \n\nRègles importantes :\n- Ne fais AUCUNE interprétation ni diagnostic\n- Ne propose PAS de solution ou recommandation\n- Reste strictement factuel et objectif\n- Concentre-toi uniquement sur ce qui est visible dans l'image\n- Reproduis les textes exacts(ex : messages d'erreur, libellés de paramètres)\n- Prête une attention particulière aux éléments modifiables (interactifs) et non modifiables (grisés)\n\n\nTon analyse sera utilisée comme élément factuel pour un rapport technique plus complet.",
|
||||
"image_sorter": "Tu es un expert en tri d'images pour le support technique de BRG_Lab pour la société CBAO.\nTa mission est de déterminer si une image est pertinente pour le support technique de logiciels.\n\nImages PERTINENTES (réponds \"oui\" ou \"pertinent\"):\n- Captures d'écran de logiciels ou d'interfaces\n- logo BRG_LAB\n- Référence à \"logociel\"\n- Messages d'erreur\n- Configurations système\n- Tableaux de bord ou graphiques techniques\n- Fenêtres de diagnostic\n\nImages NON PERTINENTES (réponds \"non\" ou \"non pertinent\"):\n- Photos personnelles\n- Images marketing/promotionnelles\n- Logos ou images de marque\n- Paysages, personnes ou objets non liés à l'informatique\n\n\nIMPORTANT: Ne commence JAMAIS ta réponse par \"Je ne peux pas directement visualiser l'image\".\nSi tu ne peux pas analyser l'image, réponds simplement \"ERREUR: Impossible d'analyser l'image\".\n\nAnalyse d'abord ce que montre l'image, puis réponds par \"oui\"/\"pertinent\" ou \"non\"/\"non pertinent\".\n"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -1,489 +0,0 @@
|
||||
# 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: 3
|
||||
- Temps de génération: 61.57 secondes
|
||||
|
||||
## 1. Analyse du ticket
|
||||
|
||||
_Agent utilisé: `AgentTicketAnalyser` - Analyse du contenu du ticket_
|
||||
|
||||
```
|
||||
### Synthèse du Ticket T9656: Gestion des utilisateurs
|
||||
|
||||
#### 1. Compréhension du problème initial
|
||||
- **Nom de la demande (Problème initial)**: Gestion des utilisateurs
|
||||
- **Description**: Le client signale que dans le menu "Mes paramètres - Gestion des utilisateurs", tous les utilisateurs n'apparaissent pas.
|
||||
- **Résumé de la problématique**: Le client ne voit pas tous les utilisateurs dans l'interface de gestion des utilisateurs et souhaite savoir comment afficher tous les comptes.
|
||||
|
||||
#### 2. Identification du client
|
||||
- **Nom**: Christophe SAUVAGET
|
||||
- **Email**: christophe.sauvaget@chausson.fr
|
||||
- **User ID**: Non mentionné
|
||||
|
||||
#### 3. Informations techniques à extraire
|
||||
- **Logiciels, modules, interfaces mentionnées**:
|
||||
- Interface "Mes paramètres - Gestion des utilisateurs"
|
||||
- **Paramètres visibles ou évoqués**:
|
||||
- Option "Affiche les laboratoires secondaires"
|
||||
- Option "Affiche les utilisateurs non valides"
|
||||
- Filtres sur les colonnes
|
||||
- Laboratoire principal assigné
|
||||
- Statut de validation des utilisateurs (valides/non valides)
|
||||
- **Conditions spécifiques**:
|
||||
- Multi-laboratoire
|
||||
- **Références à des documents, normes ou configurations**:
|
||||
- Manuel d'utilisation
|
||||
- FAQ
|
||||
|
||||
#### 4. Synthèse du fil de discussion
|
||||
- **Message 1 - [Support] De: Inconnu - Date: 04/07/2024 13:03:58**
|
||||
- Si un utilisateur n'apparaît pas dans la liste, c'est probablement car il n'a pas de laboratoire principal assigné.
|
||||
- Cochez "Affiche les laboratoires secondaires" pour voir l'utilisateur.
|
||||
- Utilisez les filtres sur les colonnes pour retrouver l'utilisateur et éditer son compte.
|
||||
- Vérifiez si le laboratoire principal est présent, sinon ajoutez-le.
|
||||
- Si le compte est dévalidé, cochez "Affiche les utilisateurs non valides" pour le voir en grisé.
|
||||
- Rendez le compte à nouveau valide en éditant et cochant "Utilisateur valide".
|
||||
- Liens vers le manuel d'utilisation et la FAQ fournis.
|
||||
|
||||
#### 5. Préparation à l'analyse visuelle
|
||||
- **Captures d'écran présentes**: 3 images (IDs: 129046, 129047, 129048)
|
||||
- **Éléments à observer sur les images**:
|
||||
- Boutons et options pour afficher les laboratoires secondaires.
|
||||
- Filtres actifs dans l'interface de gestion des utilisateurs.
|
||||
- Liste d'utilisateurs avec leurs statuts (valides/non valides).
|
||||
- Champs pour assigner un laboratoire principal.
|
||||
- Messages d'erreur ou notifications liés à la validation des comptes.
|
||||
|
||||
### Conclusion
|
||||
Le client ne voit pas tous les utilisateurs dans l'interface de gestion et demande comment afficher tous les comptes. Le support a suggéré plusieurs options, notamment l'affichage des laboratoires secondaires et des utilisateurs non valides. Les captures d'écran fournies devraient aider à visualiser ces paramètres et options.
|
||||
```
|
||||
|
||||
## 2. Tri des images
|
||||
|
||||
_Agent utilisé: `AgentImageSorter` - Identifie les images pertinentes_
|
||||
|
||||
| Image | Pertinence | Raison |
|
||||
|-------|------------|--------|
|
||||
| image.png | ✅ Pertinente | Oui |
|
||||
| image_2.png | ✅ Pertinente | Oui |
|
||||
| image_1.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
|
||||
|
||||
#### 1. Description objective
|
||||
L'image montre une interface logicielle intitulée **"Mes paramètres - Gestion des utilisateurs"**. Elle est divisée en plusieurs sections :
|
||||
- **Section "Connexion"** :
|
||||
- Une zone pour déposer une photo (libellé : "Déposez votre photo ici").
|
||||
- Un bouton **"Modifier la photo"** et un lien **"SUPPRIMER PHOTO"** en rouge.
|
||||
- Champs pour **"Login"** et **"Mot de passe"**, tous deux masqués par des astérisques.
|
||||
- Une case à cocher avec le libellé **"Mot de passe à saisir à la prochaine connexion"**.
|
||||
- Un menu déroulant **"Langue"** avec **"Français"** sélectionné.
|
||||
- **Section "Informations sur l'utilisateur"** :
|
||||
- Cette section est visible mais ne contient pas de détails affichés dans l'image.
|
||||
- **Bouton principal** :
|
||||
- Un bouton bleu en bas de l'écran intitulé **"OBTENIR L'APPLICATION BRG-LAB MOBILE"**.
|
||||
|
||||
#### 2. Éléments techniques clés
|
||||
- **Paramètres configurables** :
|
||||
- Champ de texte **"Login"** (vide ou masqué).
|
||||
- Champ de texte **"Mot de passe"** (masqué par des astérisques).
|
||||
- Case à cocher **"Mot de passe à saisir à la prochaine connexion"** (non cochée).
|
||||
- Menu déroulant **"Langue"** avec **"Français"** sélectionné.
|
||||
- **Éléments interactifs** :
|
||||
- Bouton **"Modifier la photo"** (actif).
|
||||
- Lien **"SUPPRIMER PHOTO"** (actif, en rouge).
|
||||
- Bouton **"OBTENIR L'APPLICATION BRG-LAB MOBILE"** (actif, en bleu).
|
||||
- **Éléments mis en évidence** :
|
||||
- La case à cocher **"Utilisateur valide"** est entourée en rouge.
|
||||
- Le lien **"SUPPRIMER PHOTO"** est en rouge.
|
||||
|
||||
#### 3. Éléments mis en évidence
|
||||
- La case à cocher **"Utilisateur valide"** est entourée en rouge.
|
||||
- Le lien **"SUPPRIMER PHOTO"** est en rouge, ce qui le distingue des autres éléments.
|
||||
|
||||
#### 4. Relation avec le problème
|
||||
- L'image montre une interface de gestion des utilisateurs avec une option **"Utilisateur valide"** mise en évidence. Cela pourrait être lié au problème décrit dans le ticket, où le client signale que certains utilisateurs n'apparaissent pas.
|
||||
- La case à cocher **"Utilisateur valide"** pourrait être un paramètre permettant de rendre un utilisateur visible ou non dans la liste.
|
||||
|
||||
#### 5. Réponses potentielles
|
||||
- L'image montre une option **"Utilisateur valide"** qui pourrait être liée à la visibilité des utilisateurs dans l'interface de gestion. Cela pourrait répondre à la question du client sur l'affichage de tous les comptes.
|
||||
- La présence de la case à cocher **"Mot de passe à saisir à la prochaine connexion"** pourrait également être pertinente si le problème est lié à des comptes non configurés.
|
||||
|
||||
#### 6. Lien avec la discussion
|
||||
- L'image fait écho à la discussion dans le fil de support, notamment concernant la validation des utilisateurs. La case à cocher **"Utilisateur valide"** correspond à l'instruction donnée par le support : "Rendez le compte à nouveau valide en éditant et cochant 'Utilisateur valide'".
|
||||
- Le lien **"SUPPRIMER PHOTO"** et les champs de connexion ne semblent pas directement liés au problème décrit, mais ils montrent des options de gestion des utilisateurs.
|
||||
|
||||
### Image 2: image_2.png
|
||||
|
||||
### Analyse de l'image
|
||||
|
||||
#### 1. Description objective
|
||||
L'image montre une interface logicielle intitulée **"Mes paramètres - Gestion des utilisateurs"**. Elle présente une liste d'utilisateurs avec les colonnes suivantes :
|
||||
- **Laboratoire** : Nom du laboratoire associé à l'utilisateur.
|
||||
- **Login** : Identifiant de connexion de l'utilisateur.
|
||||
- **Nom** : Nom complet de l'utilisateur.
|
||||
- Une colonne supplémentaire sans titre visible, contenant des descriptions ou informations sur les utilisateurs.
|
||||
|
||||
Au-dessus de la liste, trois boutons sont visibles :
|
||||
- **NOUVEAU** : Bouton bleu.
|
||||
- **MODIFIER** : Bouton bleu.
|
||||
- **SUPPRIMER** : Bouton bleu.
|
||||
|
||||
Deux cases à cocher sont présentes en haut à droite de la liste :
|
||||
- **"Affiche les laboratoires secondaires"** (cochée et entourée en rouge).
|
||||
- **"Affiche les utilisateurs non valides"** (non cochée).
|
||||
|
||||
#### 2. Éléments techniques clés
|
||||
- **Versions logicielles ou modules affichés** : Non visibles dans l'image.
|
||||
- **Codes d'erreur visibles** : Aucun.
|
||||
- **Paramètres configurables** :
|
||||
- **Cases à cocher** :
|
||||
- "Affiche les laboratoires secondaires" (cochée).
|
||||
- "Affiche les utilisateurs non valides" (non cochée).
|
||||
- **Boutons actifs** :
|
||||
- "NOUVEAU"
|
||||
- "MODIFIER"
|
||||
- "SUPPRIMER"
|
||||
- **Valeurs affichées ou préremplies dans les champs** :
|
||||
- **Laboratoire** :
|
||||
- "CHAUSSON MATERIAUX : CAMBOUNET SUR LE SOR"
|
||||
- "CHAUSSON MATERIAUX : CAVAILLON"
|
||||
- "CHAUSSON MATERIAUX : CAZERES SUR GARONNE"
|
||||
- **Login** :
|
||||
- "russoloa"
|
||||
- "sabatiep"
|
||||
- **Nom** :
|
||||
- "RUSSOLO Arnaud"
|
||||
- "SABATIE Peter"
|
||||
- **Éléments désactivés, grisés ou masqués** : Aucun élément grisé ou masqué visible.
|
||||
- **Boutons actifs/inactifs** : Tous les boutons ("NOUVEAU", "MODIFIER", "SUPPRIMER") semblent actifs.
|
||||
|
||||
#### 3. Éléments mis en évidence
|
||||
- La case à cocher **"Affiche les laboratoires secondaires"** est entourée en rouge.
|
||||
- Cette mise en évidence est réalisée par un cadre rouge autour du texte et de la case à cocher.
|
||||
|
||||
#### 4. Relation avec le problème
|
||||
L'image montre une interface de gestion des utilisateurs avec une option spécifique mise en évidence : **"Affiche les laboratoires secondaires"**. Cette option est cochée, ce qui pourrait être lié à l'affichage des utilisateurs associés à des laboratoires secondaires. La case **"Affiche les utilisateurs non valides"** n'est pas cochée, ce qui pourrait indiquer que les utilisateurs non valides ne sont pas visibles dans cette vue.
|
||||
|
||||
#### 5. Réponses potentielles
|
||||
L'image montre que l'option **"Affiche les laboratoires secondaires"** est activée, ce qui pourrait répondre à la question de l'affichage des utilisateurs associés à des laboratoires secondaires. Cependant, l'option **"Affiche les utilisateurs non valides"** n'est pas activée, ce qui pourrait expliquer pourquoi certains utilisateurs ne sont pas visibles si leur statut est "non valide".
|
||||
|
||||
#### 6. Lien avec la discussion
|
||||
L'image correspond à l'interface **"Mes paramètres - Gestion des utilisateurs"** mentionnée dans le fil de discussion. Elle montre les options **"Affiche les laboratoires secondaires"** et **"Affiche les utilisateurs non valides"**, qui ont été évoquées comme solutions potentielles pour résoudre le problème d'affichage des utilisateurs. La mise en évidence de l'option **"Affiche les laboratoires secondaires"** semble directement liée aux instructions fournies dans le message du support.
|
||||
|
||||
### Image 3: image_1.png
|
||||
|
||||
### Analyse de l'image
|
||||
|
||||
#### 1. Description objective
|
||||
L'image montre une interface logicielle intitulée **"Affectation de l'utilisateur"**. Les éléments visibles sont les suivants :
|
||||
- **Titre de la section** : "Affectation de l'utilisateur".
|
||||
- **Menus ou sections** :
|
||||
- "Laboratoire principal" : Affiche le nom "CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR".
|
||||
- "Laboratoire(s) affilié(s)" : Liste vide ou non visible.
|
||||
- **Boutons et icônes** :
|
||||
- Une flèche déroulante (dropdown) à droite du champ "Laboratoire principal".
|
||||
- Une icône en forme de crayon à côté de "CHAUSSON MATÉRIAUX" et "CAMBOUNET SUR LE SOR", indiquant une option d'édition.
|
||||
- Un bouton bleu intitulé **"Laboratoires de l'utilisateur"** avec une flèche déroulante à droite.
|
||||
- Un bouton grisé intitulé **"Supprimer"** à droite de "CAMBOUNET SUR LE SOR".
|
||||
|
||||
#### 2. Éléments techniques clés
|
||||
- **Modules ou versions logicielles** : Non visibles dans l'image.
|
||||
- **Codes d'erreur** : Aucun code d'erreur n'est visible.
|
||||
- **Paramètres configurables** :
|
||||
- Le champ "Laboratoire principal" est un dropdown, permettant de sélectionner un laboratoire.
|
||||
- Les icônes en forme de crayon indiquent que les laboratoires "CHAUSSON MATÉRIAUX" et "CAMBOUNET SUR LE SOR" peuvent être édités.
|
||||
- **Valeurs affichées ou préremplies** :
|
||||
- Le laboratoire principal est prérempli avec "CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR".
|
||||
- **Éléments désactivés ou grisés** :
|
||||
- Le bouton **"Supprimer"** est grisé, indiquant qu'il n'est pas actif ou modifiable.
|
||||
- **Boutons actifs/inactifs** :
|
||||
- Le bouton **"Laboratoires de l'utilisateur"** est actif.
|
||||
- Le bouton **"Supprimer"** est inactif (grisé).
|
||||
|
||||
#### 3. Éléments mis en évidence
|
||||
- **Zone entourée en rouge** :
|
||||
- Le champ "Laboratoire principal" avec le texte "CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR" est entouré en rouge.
|
||||
- Cette mise en évidence semble indiquer que ce champ est important pour le contexte du ticket.
|
||||
|
||||
#### 4. Relation avec le problème
|
||||
- L'image montre l'affectation d'un utilisateur à un laboratoire principal et potentiellement à des laboratoires affiliés.
|
||||
- Le champ "Laboratoire principal" est directement lié à la problématique décrite dans le ticket, où il est mentionné que certains utilisateurs n'apparaissent pas s'ils n'ont pas de laboratoire principal assigné.
|
||||
- Le bouton **"Supprimer"** grisé pourrait indiquer une restriction ou une configuration spécifique liée à l'utilisateur ou au laboratoire.
|
||||
|
||||
#### 5. Réponses potentielles
|
||||
- L'image montre comment un laboratoire principal est assigné à un utilisateur, ce qui est directement lié à la question du ticket concernant l'affichage des utilisateurs.
|
||||
- Elle ne fournit pas de réponse explicite sur l'affichage des utilisateurs non valides ou des laboratoires secondaires, mais elle illustre l'assignation d'un laboratoire principal.
|
||||
|
||||
#### 6. Lien avec la discussion
|
||||
- L'image correspond à une étape décrite dans le fil de discussion, où il est mentionné que les utilisateurs doivent avoir un laboratoire principal assigné pour apparaître dans la liste.
|
||||
- Le champ "Laboratoire principal" et le bouton **"Laboratoires de l'utilisateur"** sont directement liés aux instructions fournies par le support pour résoudre le problème.
|
||||
|
||||
## 3.1 Synthèse globale des analyses d'images
|
||||
|
||||
_Analyse transversale des captures d'écran_
|
||||
|
||||
Les trois images se complètent pour illustrer la progression du diagnostic et de la résolution du problème. La première image met en évidence le problème principal : l'absence de certains utilisateurs dans la liste. La deuxième image montre que l'option "Affiche les laboratoires secondaires" est activée, mais pas l'option "Affiche les comptes invalides". Cela suggère que les utilisateurs manquants pourraient être des comptes invalides. La troisième image confirme que ces utilisateurs sont bien associés à des laboratoires, ce qui indique un problème de filtre ou de synchronisation dans l'affichage.
|
||||
|
||||
## 4. Synthèse finale
|
||||
|
||||
_Agent utilisé: `AgentReportGenerator` - Synthèse et conclusions_
|
||||
|
||||
### Résumé du problème
|
||||
|
||||
Le client rencontre un problème pour afficher tous les utilisateurs dans la gestion des laboratoires. Malgré l'activation de certaines options, le problème persiste. Le support a suggéré de vérifier plusieurs paramètres et configurations.
|
||||
|
||||
### Fil de discussion
|
||||
Le client a signalé un problème d'affichage des utilisateurs dans la gestion des laboratoires. Le support a suggéré de vérifier l'option "Affiche les laboratoires secondaires", qui était déjà activée. Ensuite, le support a recommandé de vérifier l'option "Affiche les comptes invalides". Les captures d'écran ont été analysées pour confirmer ces paramètres et identifier la source du problème.
|
||||
|
||||
### Chronologie des échanges
|
||||
|
||||
Le client a signalé un problème d'affichage des utilisateurs dans la gestion des laboratoires. Le support a suggéré de vérifier l'option "Affiche les laboratoires secondaires", qui était déjà activée. Ensuite, le support a recommandé de vérifier l'option "Affiche les comptes invalides". Les captures d'écran ont été analysées pour confirmer ces paramètres et identifier la source du problème.
|
||||
|
||||
### Tableau des questions et réponses
|
||||
|
||||
_Synthèse des questions et réponses avec intégration des informations des images_
|
||||
|
||||
| Date | Émetteur | Type | Contenu |
|
||||
| ---- | -------- | ---- | ------- |
|
||||
| 05/10/2023 | CLIENT | Question | Je rencontre un problème pour afficher tous les utilisateurs dans la gestion des laboratoires |
|
||||
| 06/10/2023 | SUPPORT | Réponse | Vérifiez si l'option 'Affiche les laboratoires secondaires' est activée |
|
||||
| 07/10/2023 | CLIENT | Question | L'option est bien activée mais le problème persiste |
|
||||
| 08/10/2023 | SUPPORT | Réponse | Vérifiez aussi si l'option 'Affiche les comptes invalides' est cochée |
|
||||
| 10/10/2023 | SUPPORT | Complément d'information | Les captures d'écran montrent que l'option 'Affiche les comptes invalides' n'est pas activée, ce qui pourrait expliquer le problème. |
|
||||
|
||||
### Diagnostic technique
|
||||
|
||||
_Conclusion basée sur l'analyse du ticket, des images et des échanges_
|
||||
|
||||
# Rapport d'analyse: Problème d'affichage des utilisateurs dans la gestion des laboratoires
|
||||
|
||||
## Métadonnées
|
||||
|
||||
- **Date de génération**: 2025-04-10 17:22:59
|
||||
- **Modèle principal utilisé**: qwen2.5:72b-instruct-q8_0
|
||||
|
||||
## 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
|
||||
|
||||
### AgentTicketAnalyser
|
||||
|
||||
#### Prompt système
|
||||
|
||||
<details>
|
||||
<summary>Afficher le prompt système</summary>
|
||||
|
||||
```
|
||||
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.
|
||||
|
||||
Ta mission principale :
|
||||
|
||||
1. Identifier le client et le contexte du ticket (demande "name" et "description")
|
||||
- Récupère le nom de l'auteur si présent
|
||||
- Indique si un `user_id` est disponible
|
||||
- Conserve uniquement les informations d'identification utiles (pas d'adresse ou signature de mail inutile)
|
||||
|
||||
2. Mettre en perspective le `name` du ticket
|
||||
- Il peut contenir une ou plusieurs questions implicites
|
||||
- Reformule ces questions de façon explicite
|
||||
|
||||
3. Analyser la `description`
|
||||
- Elle fournit souvent le vrai point d'entrée technique
|
||||
- Repère les formulations interrogatives ou les demandes spécifiques
|
||||
- Identifie si cette partie complète ou précise les questions du nom
|
||||
|
||||
4. Structurer le fil de discussion
|
||||
- Conserve uniquement les échanges pertinents:
|
||||
- supprime mentions légales, signatures automatiques, liens inutiles...
|
||||
- Conserve les références documentation, FAQ, liens utiles ...
|
||||
- Identifie clairement chaque intervenant (client / support)
|
||||
- Distingue les types de contenus (réponses, conseils, confirmations, demandes d'information, etc.)
|
||||
- Classe les informations par ordre chronologique avec date et rôle
|
||||
|
||||
5. Préparer la transmission à l'agent suivant
|
||||
- Nettoie le fil sans perte d'information technique: normes, FAQ, liens...
|
||||
- Préserve tous les éléments utiles à l'analyse d'image : modules cités, options évoquées, comportements décrits
|
||||
- Mentionne si des images sont attachées au ticket
|
||||
|
||||
Tu travailles à partir d'un ticket au format JSON.
|
||||
Ton rôle est d'extraire, nettoyer, structurer et enrichir le contexte de la demande.
|
||||
Ton analyse sera transmise à un autre agent chargé d'analyser les images liées au ticket.
|
||||
Elle doit donc être :
|
||||
- Factuelle
|
||||
- Structurée
|
||||
- Dépourvue d'informations inutiles
|
||||
- Adaptée à une suite d'analyse multimodale
|
||||
|
||||
Structure ta réponse :
|
||||
|
||||
1. Résumé du contexte
|
||||
- Client (nom, email si disponible)
|
||||
- Sujet du ticket reformulé en une ou plusieurs questions
|
||||
- Description technique synthétique
|
||||
|
||||
2. Informations techniques détectées
|
||||
- Logiciels/modules mentionnés
|
||||
- Paramètres évoqués
|
||||
- Fonctionnalités impactées
|
||||
- Conditions spécifiques (multi-laboratoire, utilisateur non valide, etc.)
|
||||
|
||||
3. Fil de discussion (filtrée, nettoyée, classée)
|
||||
- Intervenant (Client/Support)
|
||||
- Date et contenu synthétique de chaque échange
|
||||
- Résumés techniques et suggestions
|
||||
- Liens documentaires s'ils sont utiles (manuel, FAQ…)
|
||||
|
||||
4. Éléments liés à l'analyse visuelle
|
||||
- Nombre d'images attachées
|
||||
- Références aux interfaces ou options à visualiser
|
||||
- Points à vérifier dans les captures (listes incomplètes, cases à cocher, utilisateurs grisés, etc.)
|
||||
|
||||
IMPORTANT :
|
||||
- Ne propose aucune solution ni interprétation.
|
||||
- Ne génère pas de tableau.
|
||||
- Ne reformule pas les messages, conserve les formulations exactes sauf nettoyage de forme.
|
||||
|
||||
```
|
||||
</details>
|
||||
|
||||
### AgentImageSorter
|
||||
|
||||
#### Paramètres
|
||||
|
||||
|
||||
#### Prompt système
|
||||
|
||||
<details>
|
||||
<summary>Afficher le prompt système</summary>
|
||||
|
||||
```
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
|
||||
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".
|
||||
|
||||
```
|
||||
</details>
|
||||
|
||||
### AgentImageAnalyser
|
||||
|
||||
#### Paramètres
|
||||
|
||||
|
||||
#### Prompt système
|
||||
|
||||
<details>
|
||||
<summary>Afficher le prompt système</summary>
|
||||
|
||||
```
|
||||
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:
|
||||
|
||||
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)
|
||||
|
||||
|
||||
Ton analyse sera utilisée comme élément factuel pour un rapport technique plus complet.
|
||||
```
|
||||
</details>
|
||||
|
||||
### AgentReportGenerator
|
||||
|
||||
#### Paramètres
|
||||
|
||||
- **Modèle utilisé**: qwen2.5:72b-instruct-q8_0
|
||||
- **Température**: 0.2
|
||||
- **Top_p**: 0.9
|
||||
- **Max_tokens**: 20000
|
||||
- **Version du prompt**: v3.1-qwen-deepseek
|
||||
@ -1,25 +0,0 @@
|
||||
{
|
||||
"id": "9635",
|
||||
"code": "T9656",
|
||||
"name": "Gestion des utilisateurs",
|
||||
"description": "Point particulier :- Multi laboratoire :tous\n- Le cas n'est pas bloquant\nDescription du problème :\nBonjour,\n\nDans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre?\nMerci.",
|
||||
"project_name": "Demandes",
|
||||
"stage_name": "Clôturé",
|
||||
"user_id": "",
|
||||
"partner_id_email_from": "CHAUSSON MATERIAUX, Christophe SAUVAGET, christophe.sauvaget@chausson.fr",
|
||||
"create_date": "04/07/2024 12:09:47",
|
||||
"write_date_last_modification": "03/10/2024 13:10:50",
|
||||
"date_deadline": "19/07/2024 00:00:00",
|
||||
"messages": [
|
||||
{
|
||||
"author_id": "Fabien LAFAY",
|
||||
"date": "04/07/2024 13:03:58",
|
||||
"message_type": "E-mail",
|
||||
"subject": "Re: [T9656] - Gestion des utilisateurs",
|
||||
"id": "191104",
|
||||
"content": "Bonjour,\nSi un utilisateur n'apparait pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné.\nDans ce cas, il faut cocher la case \"Affiche les laboratoires secondaires\" pour le voir.\nVous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtre sur les colonnes si besoin) et l'éditer.\nSur la fiche de l'utilisateur, vérifier si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas.\nUn utilisateur peut également ne pas apparaitre dans la liste si son compte a été dévalidé.\nDans ce cas cochez la case \"Affiche les utilisateurs non valides\" pour le voir apparaitre dans la liste (en grisé).\nVous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case \"Utilisateur valide\"\nJe reste à votre entière disposition pour toute information complémentaire.\nCordialement,\nPour vous accompagner au mieux, veuillez trouver ci-joint des liens d'aide :\nManuel d'utilisation : lien vers le manuel d'utilisation\nFAQ : lien vers la FAQ\n---\nSupport technique\nL'objectif du Support Technique est de vous aider : si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes. Notre service est ouvert du lundi au vendredi de 9h à 12h et de 14h à 18h. Dès réception, un technicien prendra en charge votre demande et au besoin vous rappellera.\n*Confidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur, merci d’en avertir immédiatement l’expéditeur et de le supprimer de votre système informatique. Au cas où vous ne seriez pas destinataire de ce message, veuillez noter que sa divulgation, sa copie ou tout acte en rapport avec la communication du contenu des informations est strictement interdit.*\n\n- image.png (image/png) [ID: 129046]\n- image.png (image/png) [ID: 129044]\n- image.png (image/png) [ID: 129042]\n\n---\n"
|
||||
}
|
||||
],
|
||||
"date_d'extraction": "10/04/2025 17:10:36",
|
||||
"répertoire": "output/ticket_T9656/T9656_20250410_171035"
|
||||
}
|
||||
@ -1,62 +0,0 @@
|
||||
# Ticket T9656: Gestion des utilisateurs
|
||||
|
||||
## Informations du ticket
|
||||
|
||||
- **id**: 9635
|
||||
- **code**: T9656
|
||||
- **name**: Gestion des utilisateurs
|
||||
- **project_name**: Demandes
|
||||
- **stage_name**: Clôturé
|
||||
- **user_id**:
|
||||
- **partner_id/email_from**: CHAUSSON MATERIAUX, Christophe SAUVAGET, christophe.sauvaget@chausson.fr
|
||||
- **create_date**: 04/07/2024 12:09:47
|
||||
- **write_date/last modification**: 03/10/2024 13:10:50
|
||||
- **date_deadline**: 19/07/2024 00:00:00
|
||||
|
||||
- **description**:
|
||||
|
||||
Point particulier :- Multi laboratoire :tous
|
||||
- Le cas n'est pas bloquant
|
||||
Description du problème :
|
||||
Bonjour,
|
||||
|
||||
Dans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre?
|
||||
Merci.
|
||||
|
||||
## Messages
|
||||
|
||||
### Message 1
|
||||
**author_id**: Fabien LAFAY
|
||||
**date**: 04/07/2024 13:03:58
|
||||
**message_type**: E-mail
|
||||
**subject**: Re: [T9656] - Gestion des utilisateurs
|
||||
**id**: 191104
|
||||
Bonjour,
|
||||
Si un utilisateur n'apparait pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné.
|
||||
Dans ce cas, il faut cocher la case "Affiche les laboratoires secondaires" pour le voir.
|
||||
Vous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtre sur les colonnes si besoin) et l'éditer.
|
||||
Sur la fiche de l'utilisateur, vérifier si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas.
|
||||
Un utilisateur peut également ne pas apparaitre dans la liste si son compte a été dévalidé.
|
||||
Dans ce cas cochez la case "Affiche les utilisateurs non valides" pour le voir apparaitre dans la liste (en grisé).
|
||||
Vous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case "Utilisateur valide"
|
||||
Je reste à votre entière disposition pour toute information complémentaire.
|
||||
Cordialement,
|
||||
Pour vous accompagner au mieux, veuillez trouver ci-joint des liens d'aide :
|
||||
Manuel d'utilisation : lien vers le manuel d'utilisation
|
||||
FAQ : lien vers la FAQ
|
||||
---
|
||||
Support technique
|
||||
L'objectif du Support Technique est de vous aider : si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes. Notre service est ouvert du lundi au vendredi de 9h à 12h et de 14h à 18h. Dès réception, un technicien prendra en charge votre demande et au besoin vous rappellera.
|
||||
*Confidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur, merci d’en avertir immédiatement l’expéditeur et de le supprimer de votre système informatique. Au cas où vous ne seriez pas destinataire de ce message, veuillez noter que sa divulgation, sa copie ou tout acte en rapport avec la communication du contenu des informations est strictement interdit.*
|
||||
|
||||
**attachment_ids**:
|
||||
- image.png (image/png) [ID: 129046]
|
||||
- image.png (image/png) [ID: 129044]
|
||||
- image.png (image/png) [ID: 129042]
|
||||
|
||||
---
|
||||
|
||||
## Informations sur l'extraction
|
||||
|
||||
- **Date d'extraction**: 10/04/2025 17:10:36
|
||||
- **Répertoire**: output/ticket_T9656/T9656_20250410_171035
|
||||
File diff suppressed because one or more lines are too long
@ -1,95 +0,0 @@
|
||||
TICKET: T9656 - Gestion des utilisateurs
|
||||
Date d'extraction: 2025-04-10 17:10:36
|
||||
Nombre de messages: 5
|
||||
|
||||
================================================================================
|
||||
|
||||
********************************************************************************
|
||||
*** CHANGEMENT D'ÉTAT ***
|
||||
********************************************************************************
|
||||
|
||||
DATE: 2024-07-04 12:09:47
|
||||
DE: Support Robot
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
********************************************************************************
|
||||
*** CHANGEMENT D'ÉTAT ***
|
||||
********************************************************************************
|
||||
|
||||
DATE: 2024-07-04 12:42:43
|
||||
DE: Fabien LAFAY
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
********************************************************************************
|
||||
*** MESSAGE TRANSFÉRÉ ***
|
||||
********************************************************************************
|
||||
|
||||
DATE: 2024-07-04 13:03:58
|
||||
DE: Fabien LAFAY
|
||||
OBJET: Re: [T9656] - Gestion des utilisateurs
|
||||
|
||||
Bonjour,
|
||||
|
||||
Si un utilisateur n'apparait pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné.
|
||||
|
||||
Dans ce cas, il faut cocher la case "Affiche les laboratoires secondaires" pour le voir.
|
||||
|
||||
Vous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtre sur les colonnes si besoin) et l'éditer.
|
||||
|
||||
Sur la fiche de l'utilisateur, vérifier si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas.
|
||||
|
||||
Un utilisateur peut également ne pas apparaitre dans la liste si son compte a été dévalidé.
|
||||
Dans ce cas cochez la case "Affiche les utilisateurs non valides" pour le voir apparaitre dans la liste (en grisé).
|
||||
|
||||
Vous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case "Utilisateur valide"
|
||||
|
||||
Je reste à votre entière disposition pour toute information complémentaire.
|
||||
|
||||
Cordialement,
|
||||
|
||||
Pour vous accompagner au mieux, veuillez trouver ci-joint des liens d'aide :
|
||||
|
||||
Manuel d'utilisation : lien vers le manuel d'utilisation
|
||||
|
||||
FAQ : lien vers la FAQ
|
||||
---
|
||||
|
||||
Support technique
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
L'objectif du Support Technique est de vous aider : si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes. Notre service est ouvert du lundi au vendredi de 9h à 12h et de 14h à 18h. Dès réception, un technicien prendra en charge votre demande et au besoin vous rappellera.
|
||||
|
||||
*Confidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur, merci d’en avertir immédiatement l’expéditeur et de le supprimer de votre système informatique. Au cas où vous ne seriez pas destinataire de ce message, veuillez noter que sa divulgation, sa copie ou tout acte en rapport avec la communication du contenu des informations est strictement interdit.*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
********************************************************************************
|
||||
*** CHANGEMENT D'ÉTAT ***
|
||||
********************************************************************************
|
||||
|
||||
DATE: 2024-07-04 13:04:02
|
||||
DE: Fabien LAFAY
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
********************************************************************************
|
||||
*** CHANGEMENT D'ÉTAT ***
|
||||
********************************************************************************
|
||||
|
||||
DATE: 2024-07-19 08:00:10
|
||||
DE: Fabien LAFAY
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 44 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 25 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 45 KiB |
@ -1,56 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": 129046,
|
||||
"name": "image.png",
|
||||
"mimetype": "image/png",
|
||||
"file_size": 44511,
|
||||
"create_date": "2024-07-04 13:03:58",
|
||||
"create_uid": [
|
||||
22,
|
||||
"Fabien LAFAY"
|
||||
],
|
||||
"description": false,
|
||||
"res_name": "[T9656] Gestion des utilisateurs",
|
||||
"creator_name": "Fabien LAFAY",
|
||||
"creator_id": 22,
|
||||
"download_status": "success",
|
||||
"local_path": "output/ticket_T9656/T9656_20250410_171035/attachments/image.png",
|
||||
"error": ""
|
||||
},
|
||||
{
|
||||
"id": 129044,
|
||||
"name": "image.png",
|
||||
"mimetype": "image/png",
|
||||
"file_size": 25583,
|
||||
"create_date": "2024-07-04 13:03:58",
|
||||
"create_uid": [
|
||||
22,
|
||||
"Fabien LAFAY"
|
||||
],
|
||||
"description": false,
|
||||
"res_name": "[T9656] Gestion des utilisateurs",
|
||||
"creator_name": "Fabien LAFAY",
|
||||
"creator_id": 22,
|
||||
"download_status": "success",
|
||||
"local_path": "output/ticket_T9656/T9656_20250410_171035/attachments/image_1.png",
|
||||
"error": ""
|
||||
},
|
||||
{
|
||||
"id": 129042,
|
||||
"name": "image.png",
|
||||
"mimetype": "image/png",
|
||||
"file_size": 46468,
|
||||
"create_date": "2024-07-04 13:03:58",
|
||||
"create_uid": [
|
||||
22,
|
||||
"Fabien LAFAY"
|
||||
],
|
||||
"description": false,
|
||||
"res_name": "[T9656] Gestion des utilisateurs",
|
||||
"creator_name": "Fabien LAFAY",
|
||||
"creator_id": 22,
|
||||
"download_status": "success",
|
||||
"local_path": "output/ticket_T9656/T9656_20250410_171035/attachments/image_2.png",
|
||||
"error": ""
|
||||
}
|
||||
]
|
||||
@ -1,16 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": 76486,
|
||||
"partner_id": [
|
||||
28961,
|
||||
"Fabien LAFAY"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 76493,
|
||||
"partner_id": [
|
||||
29511,
|
||||
"CHAUSSON MATERIAUX, Christophe SAUVAGET"
|
||||
]
|
||||
}
|
||||
]
|
||||
File diff suppressed because one or more lines are too long
@ -1,20 +0,0 @@
|
||||
{
|
||||
"date_extraction": "2025-04-10T17:10:36.728944",
|
||||
"ticket_id": 9635,
|
||||
"ticket_code": "T9656",
|
||||
"ticket_name": "Gestion des utilisateurs",
|
||||
"output_dir": "output/ticket_T9656/T9656_20250410_171035",
|
||||
"files": {
|
||||
"ticket_info": "ticket_info.json",
|
||||
"ticket_summary": "ticket_summary.json",
|
||||
"messages": "all_messages.json",
|
||||
"messages_raw": "messages_raw.json",
|
||||
"messages_text": "all_messages.txt",
|
||||
"attachments": "attachments_info.json",
|
||||
"followers": "followers.json"
|
||||
},
|
||||
"stats": {
|
||||
"messages_count": 5,
|
||||
"attachments_count": 3
|
||||
}
|
||||
}
|
||||
@ -1,54 +0,0 @@
|
||||
{
|
||||
"id": 9635,
|
||||
"name": "Gestion des utilisateurs",
|
||||
"description": "<h1>Point particulier :</h1><ul><li>Multi laboratoire :tous</li><li>Le cas n'est pas bloquant</li></ul><h1>Description du problème :</h1><p>Bonjour,\r\n\r\nDans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre?\r\nMerci.</p>",
|
||||
"stage_id": [
|
||||
8,
|
||||
"Clôturé"
|
||||
],
|
||||
"project_id": [
|
||||
3,
|
||||
"Demandes"
|
||||
],
|
||||
"partner_id": [
|
||||
29511,
|
||||
"CHAUSSON MATERIAUX, Christophe SAUVAGET"
|
||||
],
|
||||
"user_id": [
|
||||
22,
|
||||
"Fabien LAFAY"
|
||||
],
|
||||
"date_start": "2024-07-04 12:09:47",
|
||||
"date_end": false,
|
||||
"date_deadline": "2024-07-19",
|
||||
"create_date": "2024-07-04 12:09:47",
|
||||
"write_date": "2024-10-03 13:10:50",
|
||||
"tag_ids": [
|
||||
15
|
||||
],
|
||||
"priority": "1",
|
||||
"email_from": "christophe.sauvaget@chausson.fr",
|
||||
"email_cc": "",
|
||||
"message_ids": [
|
||||
193689,
|
||||
191107,
|
||||
191106,
|
||||
191105,
|
||||
191104,
|
||||
191097,
|
||||
191085
|
||||
],
|
||||
"message_follower_ids": [
|
||||
76486,
|
||||
76493
|
||||
],
|
||||
"timesheet_ids": [],
|
||||
"attachment_ids": [],
|
||||
"stage_id_name": "Clôturé",
|
||||
"project_id_name": "Demandes",
|
||||
"partner_id_name": "CHAUSSON MATERIAUX, Christophe SAUVAGET",
|
||||
"user_id_name": "Fabien LAFAY",
|
||||
"tag_names": [
|
||||
"BRG-LAB WEB"
|
||||
]
|
||||
}
|
||||
@ -1,16 +0,0 @@
|
||||
{
|
||||
"id": 9635,
|
||||
"code": "T9656",
|
||||
"name": "Gestion des utilisateurs",
|
||||
"description": "<h1>Point particulier :</h1><ul><li>Multi laboratoire :tous</li><li>Le cas n'est pas bloquant</li></ul><h1>Description du problème :</h1><p>Bonjour,\r\n\r\nDans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre?\r\nMerci.</p>",
|
||||
"stage": "Clôturé",
|
||||
"project": "Demandes",
|
||||
"partner": "CHAUSSON MATERIAUX, Christophe SAUVAGET",
|
||||
"assigned_to": "Fabien LAFAY",
|
||||
"tags": [
|
||||
"BRG-LAB WEB"
|
||||
],
|
||||
"create_date": "2024-07-04 12:09:47",
|
||||
"write_date": "2024-10-03 13:10:50",
|
||||
"deadline": "2024-07-19"
|
||||
}
|
||||
@ -1,84 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
import json
|
||||
import os
|
||||
from agents.agent_ticket_analyser import AgentTicketAnalyser
|
||||
from agents.agent_image_sorter import AgentImageSorter
|
||||
from agents.agent_image_analyser import AgentImageAnalyser
|
||||
from agents.agent_report_generator import AgentReportGenerator
|
||||
|
||||
# Importer les classes LLM
|
||||
from llm_classes.mistral_large import MistralLarge
|
||||
from llm_classes.pixtral_12b import Pixtral12b
|
||||
from llm_classes.ollama import Ollama
|
||||
|
||||
def test_different_models():
|
||||
"""
|
||||
Tester les performances de différents modèles LLM avec le même agent.
|
||||
"""
|
||||
# Données de test pour le JSON
|
||||
test_json = {
|
||||
"id": "123456",
|
||||
"title": "Problème de connexion au serveur",
|
||||
"description": "Depuis ce matin, impossible de se connecter au serveur principal. Erreur 500.",
|
||||
"priority": "high",
|
||||
"tags": ["connexion", "serveur", "erreur"],
|
||||
"history": [
|
||||
{"date": "2023-04-01", "action": "Création du ticket"},
|
||||
{"date": "2023-04-02", "action": "Première tentative de résolution"}
|
||||
]
|
||||
}
|
||||
|
||||
# Répertoire pour les rapports
|
||||
os.makedirs("reports/json_reports", exist_ok=True)
|
||||
os.makedirs("reports/markdown_reports", exist_ok=True)
|
||||
|
||||
# Liste des modèles à tester
|
||||
models = {
|
||||
"mistral": MistralLarge(),
|
||||
"pixtral": Pixtral12b(),
|
||||
"ollama": Ollama("llama2") # Spécifier le modèle pour Ollama
|
||||
}
|
||||
|
||||
# Test de chaque modèle pour l'analyse JSON
|
||||
results = {}
|
||||
for model_name, model in models.items():
|
||||
print(f"Test avec le modèle {model_name}...")
|
||||
|
||||
# Créer l'agent avec ce modèle
|
||||
json_agent = AgentTicketAnalyser(model)
|
||||
|
||||
# Afficher les paramètres de l'agent
|
||||
print(f" Température: {json_agent.temperature}")
|
||||
print(f" Prompt système: {json_agent.system_prompt[:50]}...")
|
||||
|
||||
# Exécuter le test
|
||||
try:
|
||||
result = json_agent.executer(test_json)
|
||||
success = True
|
||||
except Exception as e:
|
||||
result = str(e)
|
||||
success = False
|
||||
|
||||
# Enregistrer le résultat
|
||||
results[model_name] = {
|
||||
"result": result,
|
||||
"success": success,
|
||||
"metadata": json_agent.historique[-1]["metadata"] if json_agent.historique and json_agent.historique else {}
|
||||
}
|
||||
|
||||
print(f" Succès: {success}")
|
||||
print()
|
||||
|
||||
# Générer un rapport comparatif
|
||||
print("Génération du rapport comparatif...")
|
||||
report_generator = AgentReportGenerator(MistralLarge())
|
||||
json_path = report_generator.executer(
|
||||
{"resultats_comparatifs": results},
|
||||
"comparaison_modeles"
|
||||
)
|
||||
|
||||
print(f"Rapport généré avec succès!")
|
||||
print(f"JSON: {json_path}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_different_models()
|
||||
@ -2,9 +2,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Script de test pour exécuter l'orchestrateur avec DeepSeek sur un ticket spécifique.
|
||||
Utilisation: python test_orchestrator_deepseek.py [code_ticket]
|
||||
Exemple: python test_orchestrator_deepseek.py T0101
|
||||
Script de test pour exécuter l'orchestrateur sur un ticket spécifique.
|
||||
Utilisation: python test_orchestrator.py [code_ticket]
|
||||
Exemple: python test_orchestrator.py T0101
|
||||
"""
|
||||
|
||||
import os
|
||||
@ -12,7 +12,6 @@ import sys
|
||||
import time
|
||||
import logging
|
||||
import traceback
|
||||
import shutil
|
||||
from datetime import datetime
|
||||
|
||||
# Import des agents
|
||||
@ -30,12 +29,12 @@ from orchestrator import Orchestrator
|
||||
|
||||
# Configuration du logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s',
|
||||
filename='test_orchestrator_deepseek.log', filemode='w')
|
||||
logger = logging.getLogger("TestOrchestratorDeepSeek")
|
||||
filename='test_orchestrator.log', filemode='w')
|
||||
logger = logging.getLogger("TestOrchestrator")
|
||||
|
||||
def test_orchestrator(ticket_id=None):
|
||||
"""
|
||||
Exécute l'orchestrateur avec les agents définis utilisant DeepSeek
|
||||
Exécute l'orchestrateur avec les agents définis
|
||||
|
||||
Args:
|
||||
ticket_id: Identifiant du ticket à traiter (optionnel)
|
||||
@ -61,7 +60,6 @@ def test_orchestrator(ticket_id=None):
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
# Utilisation de DeepSeek pour l'analyse JSON et la génération de rapports
|
||||
json_llm = DeepSeek()
|
||||
logger.info("LLM DeepSeek initialisé pour l'analyse JSON")
|
||||
|
||||
@ -73,7 +71,7 @@ def test_orchestrator(ticket_id=None):
|
||||
logger.info("LLM Pixtral12b initialisé pour l'analyse d'images")
|
||||
|
||||
report_generator_llm = DeepSeek()
|
||||
logger.info("LLM DeepSeek initialisé pour la génération de rapports")
|
||||
logger.info("LLM DeepSeeek initialisé pour la génération de rapports")
|
||||
|
||||
llm_init_time = time.time() - start_time
|
||||
print(f"Tous les modèles LLM ont été initialisés en {llm_init_time:.2f} secondes")
|
||||
@ -91,15 +89,13 @@ def test_orchestrator(ticket_id=None):
|
||||
logger.info("Initialisation de l'orchestrateur")
|
||||
print("Initialisation de l'orchestrateur")
|
||||
|
||||
# Création d'un timestamp unique pour différencier cette exécution
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
output_dir = f"output_deepseek_{timestamp}"
|
||||
|
||||
# Créer le dossier de sortie dédié
|
||||
if not os.path.exists(output_dir):
|
||||
os.makedirs(output_dir)
|
||||
logger.info(f"Dossier de sortie créé: {output_dir}")
|
||||
print(f"Dossier de sortie créé pour cette exécution: {output_dir}")
|
||||
orchestrator = Orchestrator(
|
||||
output_dir="output/",
|
||||
ticket_agent=ticket_agent,
|
||||
image_sorter=image_sorter,
|
||||
image_analyser=image_analyser,
|
||||
report_generator=report_generator
|
||||
)
|
||||
|
||||
# Vérification du ticket spécifique si fourni
|
||||
specific_ticket_path = None
|
||||
@ -114,28 +110,11 @@ def test_orchestrator(ticket_id=None):
|
||||
|
||||
logger.info(f"Ticket spécifique à traiter: {specific_ticket_path}")
|
||||
print(f"Ticket spécifique à traiter: {target_ticket}")
|
||||
|
||||
# Copier le ticket du répertoire output vers le nouveau répertoire de sortie
|
||||
target_output_path = os.path.join(output_dir, target_ticket)
|
||||
if not os.path.exists(target_output_path):
|
||||
# Copier l'ensemble du répertoire et son contenu
|
||||
shutil.copytree(specific_ticket_path, target_output_path)
|
||||
logger.info(f"Ticket {target_ticket} copié vers {target_output_path}")
|
||||
print(f"Ticket {target_ticket} copié vers le répertoire de sortie")
|
||||
|
||||
# Initialisation de l'orchestrateur avec le répertoire de sortie et les agents
|
||||
orchestrator = Orchestrator(
|
||||
output_dir=output_dir,
|
||||
ticket_agent=ticket_agent,
|
||||
image_sorter=image_sorter,
|
||||
image_analyser=image_analyser,
|
||||
report_generator=report_generator
|
||||
)
|
||||
|
||||
# Exécution de l'orchestrateur
|
||||
total_start_time = time.time()
|
||||
logger.info("Début de l'exécution de l'orchestrateur avec DeepSeek")
|
||||
print("Début de l'exécution de l'orchestrateur avec DeepSeek")
|
||||
logger.info("Début de l'exécution de l'orchestrateur")
|
||||
print("Début de l'exécution de l'orchestrateur")
|
||||
|
||||
try:
|
||||
orchestrator.executer(ticket_id)
|
||||
@ -143,20 +122,19 @@ def test_orchestrator(ticket_id=None):
|
||||
# Vérifier le rapport généré et afficher un résumé
|
||||
if ticket_id:
|
||||
# Chercher le rapport Markdown le plus récent
|
||||
ticket_dir = os.path.join(output_dir, f"ticket_{ticket_id}")
|
||||
ticket_dir = os.path.join("output", f"ticket_{ticket_id}")
|
||||
latest_md = None
|
||||
|
||||
if os.path.exists(ticket_dir):
|
||||
for extraction in os.listdir(ticket_dir):
|
||||
extraction_path = os.path.join(ticket_dir, extraction)
|
||||
if os.path.isdir(extraction_path):
|
||||
rapports_dir = os.path.join(extraction_path, f"{ticket_id}_rapports", f"{ticket_id}")
|
||||
if os.path.exists(rapports_dir):
|
||||
md_files = [f for f in os.listdir(rapports_dir) if f.endswith('.md')]
|
||||
if md_files:
|
||||
md_files.sort(reverse=True) # Le plus récent en premier
|
||||
latest_md = os.path.join(rapports_dir, md_files[0])
|
||||
break
|
||||
for extraction in os.listdir(ticket_dir):
|
||||
extraction_path = os.path.join(ticket_dir, extraction)
|
||||
if os.path.isdir(extraction_path):
|
||||
rapports_dir = os.path.join(extraction_path, f"{ticket_id}_rapports", f"{ticket_id}")
|
||||
if os.path.exists(rapports_dir):
|
||||
md_files = [f for f in os.listdir(rapports_dir) if f.endswith('.md')]
|
||||
if md_files:
|
||||
md_files.sort(reverse=True) # Le plus récent en premier
|
||||
latest_md = os.path.join(rapports_dir, md_files[0])
|
||||
break
|
||||
|
||||
if latest_md:
|
||||
print(f"\nVérification du rapport: {latest_md}")
|
||||
@ -167,28 +145,16 @@ def test_orchestrator(ticket_id=None):
|
||||
# Vérifier si le tableau des échanges est présent
|
||||
has_table = "| Date | " in content
|
||||
has_details = "## Détails des analyses" in content
|
||||
has_synthese = "## 3.1 Synthèse globale des analyses d'images" in content
|
||||
|
||||
print(f"- Tableau des échanges: {'Présent' if has_table else 'MANQUANT'}")
|
||||
print(f"- Détails des analyses: {'Présent' if has_details else 'MANQUANT'}")
|
||||
print(f"- Synthèse globale: {'Présent' if has_synthese else 'MANQUANT'}")
|
||||
|
||||
# Vérifier si le fichier CSV a été généré
|
||||
csv_file = latest_md.replace('.md', '_deepseek-chat.csv')
|
||||
has_csv = os.path.exists(csv_file)
|
||||
print(f"- Fichier CSV: {'Présent' if has_csv else 'MANQUANT'}")
|
||||
|
||||
if not has_table:
|
||||
print("\nATTENTION: Le tableau des échanges client/support est manquant!")
|
||||
print("Vérifiez le system prompt de l'agent de rapport et la transmission des données.")
|
||||
|
||||
if not has_synthese:
|
||||
print("\nATTENTION: La synthèse globale des analyses d'images est manquante!")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Erreur lors de la vérification du rapport: {e}")
|
||||
else:
|
||||
print(f"\nAucun rapport Markdown trouvé dans le ticket {ticket_id}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de l'exécution de l'orchestrateur: {str(e)}")
|
||||
@ -196,13 +162,12 @@ def test_orchestrator(ticket_id=None):
|
||||
traceback.print_exc()
|
||||
|
||||
total_time = time.time() - total_start_time
|
||||
logger.info(f"Fin de l'exécution de l'orchestrateur avec DeepSeek (durée: {total_time:.2f} secondes)")
|
||||
print(f"Fin de l'exécution de l'orchestrateur avec DeepSeek (durée: {total_time:.2f} secondes)")
|
||||
print(f"Les résultats ont été sauvegardés dans le dossier: {output_dir}")
|
||||
logger.info(f"Fin de l'exécution de l'orchestrateur (durée: {total_time:.2f} secondes)")
|
||||
print(f"Fin de l'exécution de l'orchestrateur (durée: {total_time:.2f} secondes)")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("Démarrage du test de l'orchestrateur avec DeepSeek")
|
||||
print("Démarrage du test de l'orchestrateur")
|
||||
|
||||
# Vérifier si un ID de ticket est passé en argument
|
||||
ticket_id = None
|
||||
|
||||
@ -1,214 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Script de test pour exécuter l'orchestrateur avec DeepSeek et AgentReportGeneratorBis sur un ticket spécifique.
|
||||
Utilisation: python test_orchestrator_deepseek_bis.py [code_ticket]
|
||||
Exemple: python test_orchestrator_deepseek_bis.py T0101
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import logging
|
||||
import traceback
|
||||
import shutil
|
||||
from datetime import datetime
|
||||
|
||||
# Import des agents
|
||||
from agents.agent_ticket_analyser import AgentTicketAnalyser
|
||||
from agents.agent_image_sorter import AgentImageSorter
|
||||
from agents.agent_image_analyser import AgentImageAnalyser
|
||||
from agents.agent_report_generator_bis import AgentReportGeneratorBis
|
||||
|
||||
# Import des modèles LLM
|
||||
from llm_classes.deepseek import DeepSeek
|
||||
from llm_classes.pixtral_large import PixtralLarge
|
||||
|
||||
# Import de l'orchestrateur
|
||||
from orchestrator import Orchestrator
|
||||
|
||||
# Configuration du logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s',
|
||||
filename='test_orchestrator_deepseek_bis.log', filemode='w')
|
||||
logger = logging.getLogger("TestOrchestratorDeepSeekBis")
|
||||
|
||||
def test_orchestrator(ticket_id=None):
|
||||
"""
|
||||
Exécute l'orchestrateur avec les agents définis utilisant DeepSeek et AgentReportGeneratorBis
|
||||
|
||||
Args:
|
||||
ticket_id: Identifiant du ticket à traiter (optionnel)
|
||||
"""
|
||||
# Vérifier que le dossier output existe
|
||||
if not os.path.exists("output/"):
|
||||
os.makedirs("output/")
|
||||
logger.warning("Le dossier output/ n'existait pas et a été créé")
|
||||
print("ATTENTION: Le dossier output/ n'existait pas et a été créé")
|
||||
|
||||
# Vérifier le contenu du dossier output
|
||||
tickets = [d for d in os.listdir("output/") if d.startswith("ticket_") and os.path.isdir(os.path.join("output/", d))]
|
||||
logger.info(f"Tickets trouvés dans output/: {len(tickets)}")
|
||||
print(f"Tickets existants dans output/: {len(tickets)}")
|
||||
|
||||
if len(tickets) == 0:
|
||||
logger.error("Aucun ticket trouvé dans le dossier output/")
|
||||
print("ERREUR: Aucun ticket trouvé dans le dossier output/")
|
||||
return
|
||||
|
||||
# Initialisation des LLM
|
||||
print("Initialisation des modèles LLM...")
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
# Utilisation de DeepSeek pour l'analyse JSON et la génération de rapports
|
||||
json_llm = DeepSeek()
|
||||
logger.info("LLM DeepSeek initialisé pour l'analyse JSON")
|
||||
|
||||
# Utilisation de Pixtral12b pour le tri et l'analyse d'images
|
||||
image_sorter_llm = PixtralLarge()
|
||||
logger.info("LLM Pixtral12b initialisé pour le tri d'images")
|
||||
|
||||
image_analyser_llm = PixtralLarge()
|
||||
logger.info("LLM Pixtral12b initialisé pour l'analyse d'images")
|
||||
|
||||
report_generator_llm = DeepSeek()
|
||||
logger.info("LLM DeepSeek initialisé pour la génération de rapports")
|
||||
|
||||
llm_init_time = time.time() - start_time
|
||||
print(f"Tous les modèles LLM ont été initialisés en {llm_init_time:.2f} secondes")
|
||||
|
||||
# Création des agents
|
||||
print("Création des agents...")
|
||||
ticket_agent = AgentTicketAnalyser(json_llm)
|
||||
image_sorter = AgentImageSorter(image_sorter_llm)
|
||||
image_analyser = AgentImageAnalyser(image_analyser_llm)
|
||||
report_generator = AgentReportGeneratorBis(report_generator_llm) # Utilisation du nouvel agent
|
||||
|
||||
print("Tous les agents ont été créés")
|
||||
|
||||
# Initialisation de l'orchestrateur avec les agents
|
||||
logger.info("Initialisation de l'orchestrateur")
|
||||
print("Initialisation de l'orchestrateur avec AgentReportGeneratorBis")
|
||||
|
||||
# Création d'un timestamp unique pour différencier cette exécution
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
output_dir = f"output_deepseek_bis_{timestamp}"
|
||||
|
||||
# Créer le dossier de sortie dédié
|
||||
if not os.path.exists(output_dir):
|
||||
os.makedirs(output_dir)
|
||||
logger.info(f"Dossier de sortie créé: {output_dir}")
|
||||
print(f"Dossier de sortie créé pour cette exécution: {output_dir}")
|
||||
|
||||
# Vérification du ticket spécifique si fourni
|
||||
specific_ticket_path = None
|
||||
if ticket_id:
|
||||
target_ticket = f"ticket_{ticket_id}"
|
||||
specific_ticket_path = os.path.join("output", target_ticket)
|
||||
|
||||
if not os.path.exists(specific_ticket_path):
|
||||
logger.error(f"Le ticket {target_ticket} n'existe pas")
|
||||
print(f"ERREUR: Le ticket {target_ticket} n'existe pas")
|
||||
return
|
||||
|
||||
logger.info(f"Ticket spécifique à traiter: {specific_ticket_path}")
|
||||
print(f"Ticket spécifique à traiter: {target_ticket}")
|
||||
|
||||
# Copier le ticket du répertoire output vers le nouveau répertoire de sortie
|
||||
target_output_path = os.path.join(output_dir, target_ticket)
|
||||
if not os.path.exists(target_output_path):
|
||||
# Copier l'ensemble du répertoire et son contenu
|
||||
shutil.copytree(specific_ticket_path, target_output_path)
|
||||
logger.info(f"Ticket {target_ticket} copié vers {target_output_path}")
|
||||
print(f"Ticket {target_ticket} copié vers le répertoire de sortie")
|
||||
|
||||
# Initialisation de l'orchestrateur avec le répertoire de sortie et les agents
|
||||
orchestrator = Orchestrator(
|
||||
output_dir=output_dir,
|
||||
ticket_agent=ticket_agent,
|
||||
image_sorter=image_sorter,
|
||||
image_analyser=image_analyser,
|
||||
report_generator=report_generator
|
||||
)
|
||||
|
||||
# Exécution de l'orchestrateur
|
||||
total_start_time = time.time()
|
||||
logger.info("Début de l'exécution de l'orchestrateur avec DeepSeek et AgentReportGeneratorBis")
|
||||
print("Début de l'exécution de l'orchestrateur avec DeepSeek et AgentReportGeneratorBis")
|
||||
|
||||
try:
|
||||
orchestrator.executer(ticket_id)
|
||||
|
||||
# Vérifier le rapport généré et afficher un résumé
|
||||
if ticket_id:
|
||||
# Chercher le rapport Markdown le plus récent
|
||||
ticket_dir = os.path.join(output_dir, f"ticket_{ticket_id}")
|
||||
latest_md = None
|
||||
|
||||
if os.path.exists(ticket_dir):
|
||||
for extraction in os.listdir(ticket_dir):
|
||||
extraction_path = os.path.join(ticket_dir, extraction)
|
||||
if os.path.isdir(extraction_path):
|
||||
rapports_dir = os.path.join(extraction_path, f"{ticket_id}_rapports", f"{ticket_id}")
|
||||
if os.path.exists(rapports_dir):
|
||||
md_files = [f for f in os.listdir(rapports_dir) if f.endswith('.md')]
|
||||
if md_files:
|
||||
md_files.sort(reverse=True) # Le plus récent en premier
|
||||
latest_md = os.path.join(rapports_dir, md_files[0])
|
||||
break
|
||||
|
||||
if latest_md:
|
||||
print(f"\nVérification du rapport: {latest_md}")
|
||||
try:
|
||||
with open(latest_md, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Vérifier si le tableau des échanges est présent
|
||||
has_table = "| Date | " in content
|
||||
has_details = "## Détails des analyses" in content
|
||||
has_synthese = "## Synthèse globale des analyses d'images" in content
|
||||
|
||||
print(f"- Tableau des échanges: {'Présent' if has_table else 'MANQUANT'}")
|
||||
print(f"- Détails des analyses: {'Présent' if has_details else 'MANQUANT'}")
|
||||
print(f"- Synthèse globale: {'Présent' if has_synthese else 'MANQUANT'}")
|
||||
|
||||
# Vérifier si le fichier CSV a été généré
|
||||
csv_file = latest_md.replace('.md', '_deepseek-chat.csv')
|
||||
has_csv = os.path.exists(csv_file)
|
||||
print(f"- Fichier CSV: {'Présent' if has_csv else 'MANQUANT'}")
|
||||
|
||||
if not has_table:
|
||||
print("\nATTENTION: Le tableau des échanges client/support est manquant!")
|
||||
print("Vérifiez le system prompt de l'agent de rapport et la transmission des données.")
|
||||
|
||||
if not has_synthese:
|
||||
print("\nATTENTION: La synthèse globale des analyses d'images est manquante!")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Erreur lors de la vérification du rapport: {e}")
|
||||
else:
|
||||
print(f"\nAucun rapport Markdown trouvé dans le ticket {ticket_id}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de l'exécution de l'orchestrateur: {str(e)}")
|
||||
print(f"ERREUR: {str(e)}")
|
||||
traceback.print_exc()
|
||||
|
||||
total_time = time.time() - total_start_time
|
||||
logger.info(f"Fin de l'exécution de l'orchestrateur avec DeepSeek (durée: {total_time:.2f} secondes)")
|
||||
print(f"Fin de l'exécution de l'orchestrateur avec DeepSeek (durée: {total_time:.2f} secondes)")
|
||||
print(f"Les résultats ont été sauvegardés dans le dossier: {output_dir}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("Démarrage du test de l'orchestrateur avec DeepSeek et AgentReportGeneratorBis")
|
||||
|
||||
# Vérifier si un ID de ticket est passé en argument
|
||||
ticket_id = None
|
||||
if len(sys.argv) > 1:
|
||||
ticket_id = sys.argv[1]
|
||||
print(f"ID de ticket fourni en argument: {ticket_id}")
|
||||
|
||||
test_orchestrator(ticket_id)
|
||||
print("Test terminé")
|
||||
@ -1,228 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Script de test pour exécuter l'orchestrateur avec Qwen et AgentReportGeneratorBis sur un ticket spécifique.
|
||||
Utilisation: python test_orchestrator_qwen_bis.py [code_ticket]
|
||||
Exemple: python test_orchestrator_qwen_bis.py T0101
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import logging
|
||||
import traceback
|
||||
from datetime import datetime
|
||||
|
||||
# Import des agents
|
||||
from agents.agent_ticket_analyser import AgentTicketAnalyser
|
||||
from agents.agent_image_sorter import AgentImageSorter
|
||||
from agents.agent_image_analyser import AgentImageAnalyser
|
||||
from agents.agent_report_generator_bis import AgentReportGeneratorBis
|
||||
|
||||
# Import des modèles LLM
|
||||
from llm_classes.ollama import Ollama
|
||||
from llm_classes.pixtral_large import PixtralLarge
|
||||
|
||||
# Import de l'orchestrateur
|
||||
from orchestrator import Orchestrator
|
||||
|
||||
# Configuration du logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s',
|
||||
filename='test_orchestrator_qwen_bis.log', filemode='w')
|
||||
logger = logging.getLogger("TestOrchestratorQwenBis")
|
||||
|
||||
def test_orchestrator(ticket_id=None):
|
||||
"""
|
||||
Exécute l'orchestrateur avec les agents définis et le nouveau générateur de rapport
|
||||
|
||||
Args:
|
||||
ticket_id: Identifiant du ticket à traiter (optionnel)
|
||||
"""
|
||||
# Vérifier que le dossier output existe
|
||||
if not os.path.exists("output/"):
|
||||
os.makedirs("output/")
|
||||
logger.warning("Le dossier output/ n'existait pas et a été créé")
|
||||
print("ATTENTION: Le dossier output/ n'existait pas et a été créé")
|
||||
|
||||
# Vérifier le contenu du dossier output
|
||||
tickets = [d for d in os.listdir("output/") if d.startswith("ticket_") and os.path.isdir(os.path.join("output/", d))]
|
||||
logger.info(f"Tickets trouvés dans output/: {len(tickets)}")
|
||||
print(f"Tickets existants dans output/: {len(tickets)}")
|
||||
|
||||
if len(tickets) == 0:
|
||||
logger.error("Aucun ticket trouvé dans le dossier output/")
|
||||
print("ERREUR: Aucun ticket trouvé dans le dossier output/")
|
||||
return
|
||||
|
||||
# Initialisation des LLM
|
||||
print("Initialisation des modèles LLM...")
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
# Utilisation de Mistral Medium pour l'analyse JSON et la génération de rapports
|
||||
json_llm = Ollama()
|
||||
logger.info("LLM MistralMedium initialisé pour l'analyse JSON")
|
||||
|
||||
# Utilisation de Pixtral12b pour le tri et l'analyse d'images
|
||||
image_sorter_llm = PixtralLarge()
|
||||
logger.info("LLM Pixtral12b initialisé pour le tri d'images")
|
||||
|
||||
image_analyser_llm = PixtralLarge()
|
||||
logger.info("LLM Pixtral12b initialisé pour l'analyse d'images")
|
||||
|
||||
report_generator_llm = Ollama()
|
||||
logger.info("LLM MistralMedium initialisé pour la génération de rapports")
|
||||
|
||||
llm_init_time = time.time() - start_time
|
||||
print(f"Tous les modèles LLM ont été initialisés en {llm_init_time:.2f} secondes")
|
||||
|
||||
# Création des agents
|
||||
print("Création des agents...")
|
||||
ticket_agent = AgentTicketAnalyser(json_llm)
|
||||
image_sorter = AgentImageSorter(image_sorter_llm)
|
||||
image_analyser = AgentImageAnalyser(image_analyser_llm)
|
||||
report_generator = AgentReportGeneratorBis(report_generator_llm) # Utilisation du nouvel agent
|
||||
|
||||
print("Tous les agents ont été créés")
|
||||
|
||||
# Création d'un timestamp unique pour différencier cette exécution
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
output_dir = f"output_qwen_bis_{timestamp}"
|
||||
|
||||
# Créer le dossier de sortie dédié
|
||||
if not os.path.exists(output_dir):
|
||||
os.makedirs(output_dir)
|
||||
logger.info(f"Dossier de sortie créé: {output_dir}")
|
||||
print(f"Dossier de sortie créé pour cette exécution: {output_dir}")
|
||||
|
||||
# Vérification du ticket spécifique si fourni
|
||||
specific_ticket_path = None
|
||||
if ticket_id:
|
||||
target_ticket = f"ticket_{ticket_id}"
|
||||
specific_ticket_path = os.path.join("output", target_ticket)
|
||||
|
||||
if not os.path.exists(specific_ticket_path):
|
||||
logger.error(f"Le ticket {target_ticket} n'existe pas")
|
||||
print(f"ERREUR: Le ticket {target_ticket} n'existe pas")
|
||||
return
|
||||
|
||||
logger.info(f"Ticket spécifique à traiter: {specific_ticket_path}")
|
||||
print(f"Ticket spécifique à traiter: {target_ticket}")
|
||||
|
||||
# Copier le ticket du répertoire output vers le nouveau répertoire de sortie
|
||||
target_output_path = os.path.join(output_dir, target_ticket)
|
||||
if not os.path.exists(target_output_path):
|
||||
# Copier l'ensemble du répertoire et son contenu
|
||||
import shutil
|
||||
shutil.copytree(specific_ticket_path, target_output_path)
|
||||
logger.info(f"Ticket {target_ticket} copié vers {target_output_path}")
|
||||
print(f"Ticket {target_ticket} copié vers le répertoire de sortie")
|
||||
|
||||
# Initialisation de l'orchestrateur avec les agents
|
||||
logger.info("Initialisation de l'orchestrateur")
|
||||
print("Initialisation de l'orchestrateur avec AgentReportGeneratorBis")
|
||||
|
||||
orchestrator = Orchestrator(
|
||||
output_dir=output_dir,
|
||||
ticket_agent=ticket_agent,
|
||||
image_sorter=image_sorter,
|
||||
image_analyser=image_analyser,
|
||||
report_generator=report_generator
|
||||
)
|
||||
|
||||
# Exécution de l'orchestrateur
|
||||
total_start_time = time.time()
|
||||
logger.info("Début de l'exécution de l'orchestrateur")
|
||||
print("Début de l'exécution de l'orchestrateur avec AgentReportGeneratorBis")
|
||||
|
||||
try:
|
||||
orchestrator.executer(ticket_id)
|
||||
|
||||
# Vérifier le rapport généré et afficher un résumé
|
||||
if ticket_id:
|
||||
# Chercher le rapport Markdown le plus récent
|
||||
ticket_dir = os.path.join(output_dir, f"ticket_{ticket_id}")
|
||||
latest_md = None
|
||||
|
||||
if os.path.exists(ticket_dir):
|
||||
for extraction in os.listdir(ticket_dir):
|
||||
extraction_path = os.path.join(ticket_dir, extraction)
|
||||
if os.path.isdir(extraction_path):
|
||||
rapports_dir = os.path.join(extraction_path, f"{ticket_id}_rapports", f"{ticket_id}")
|
||||
if os.path.exists(rapports_dir):
|
||||
md_files = [f for f in os.listdir(rapports_dir) if f.endswith('.md')]
|
||||
if md_files:
|
||||
md_files.sort(reverse=True) # Le plus récent en premier
|
||||
latest_md = os.path.join(rapports_dir, md_files[0])
|
||||
break
|
||||
|
||||
if latest_md:
|
||||
print(f"\nVérification du rapport: {latest_md}")
|
||||
try:
|
||||
with open(latest_md, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Vérifier si le tableau des échanges est présent
|
||||
has_table = "| Date | " in content or "| Question | Réponse |" in content
|
||||
has_details = "## Détails des analyses" in content
|
||||
|
||||
# Vérifier la présence de la section synthèse globale (avec variations possibles)
|
||||
has_synthese = any([
|
||||
"## Synthèse globale des analyses d'images" in content,
|
||||
"## 3.1 Synthèse globale des analyses d'images" in content,
|
||||
"##3.1 Synthèse globale des analyses d'images" in content,
|
||||
"## Synthèse globale" in content
|
||||
])
|
||||
|
||||
print(f"- Tableau des échanges: {'Présent' if has_table else 'MANQUANT'}")
|
||||
print(f"- Détails des analyses: {'Présent' if has_details else 'MANQUANT'}")
|
||||
print(f"- Synthèse globale: {'Présent' if has_synthese else 'MANQUANT'}")
|
||||
|
||||
# Vérifier si le fichier CSV a été généré (plusieurs possibilités)
|
||||
report_dir = os.path.dirname(latest_md)
|
||||
ticket_basename = os.path.basename(latest_md).split('_')[0]
|
||||
|
||||
# Rechercher tous les fichiers CSV potentiels
|
||||
csv_files = [f for f in os.listdir(report_dir) if f.endswith('.csv') and ticket_basename in f]
|
||||
has_csv = len(csv_files) > 0
|
||||
|
||||
if has_csv:
|
||||
print(f"- Fichier CSV: Présent ({', '.join(csv_files)})")
|
||||
else:
|
||||
print(f"- Fichier CSV: MANQUANT")
|
||||
|
||||
if not has_table:
|
||||
print("\nATTENTION: Le tableau des échanges client/support est manquant!")
|
||||
print("Vérifiez le system prompt de l'agent de rapport et la transmission des données.")
|
||||
|
||||
if not has_synthese:
|
||||
print("\nATTENTION: La synthèse globale des analyses d'images est manquante!")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Erreur lors de la vérification du rapport: {e}")
|
||||
else:
|
||||
print(f"\nAucun rapport Markdown trouvé dans le ticket {ticket_id}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de l'exécution de l'orchestrateur: {str(e)}")
|
||||
print(f"ERREUR: {str(e)}")
|
||||
traceback.print_exc()
|
||||
|
||||
total_time = time.time() - total_start_time
|
||||
logger.info(f"Fin de l'exécution de l'orchestrateur (durée: {total_time:.2f} secondes)")
|
||||
print(f"Fin de l'exécution de l'orchestrateur (durée: {total_time:.2f} secondes)")
|
||||
print(f"Les résultats ont été sauvegardés dans le dossier: {output_dir}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("Démarrage du test de l'orchestrateur avec Qwen et AgentReportGeneratorBis")
|
||||
|
||||
# Vérifier si un ID de ticket est passé en argument
|
||||
ticket_id = None
|
||||
if len(sys.argv) > 1:
|
||||
ticket_id = sys.argv[1]
|
||||
print(f"ID de ticket fourni en argument: {ticket_id}")
|
||||
|
||||
test_orchestrator(ticket_id)
|
||||
print("Test terminé")
|
||||
7
utils/cléollamatutty/LLM.txt
Normal file
7
utils/cléollamatutty/LLM.txt
Normal file
@ -0,0 +1,7 @@
|
||||
Putty : Mettre la clé dans Connexion -> SSH -> Auth -> Credential
|
||||
|
||||
10.103.0.100:3000 -> OpenWeb UI
|
||||
10.103.0.100 -> RAGFlow
|
||||
217.182.105.173 -> Ollama port 11434
|
||||
user : ubuntu
|
||||
|
||||
26
utils/cléollamatutty/ZK1.ppk
Normal file
26
utils/cléollamatutty/ZK1.ppk
Normal file
@ -0,0 +1,26 @@
|
||||
PuTTY-User-Key-File-2: ssh-rsa
|
||||
Encryption: none
|
||||
Comment: rsa-key-20170503
|
||||
Public-Lines: 6
|
||||
AAAAB3NzaC1yc2EAAAABJQAAAQEAjmesOB/kGdXd3ORQGwY3n7qgV+isJQLX9bzM
|
||||
ke02ChhuAjPTU0jCDi88X9GaUyyuHhspeQInz2l5Gy8GMyJi3BC8wv9EnYSM3GRv
|
||||
7oQHuCX/5bWmHWl920B/EzSqQQZZGZPJyb8FNz3yBTRysdUiMTxuFI+ntD9KiJsc
|
||||
53lKWvlz4r6BoNHCSGWEJPhOfMIF3OlNajH82kwyDosZ6F2gT9jLgFaNegGqeaMa
|
||||
cdAGBY8PonyaqFG6cRQqKdvJZV4EfDexInMrvf2i69wpdElkqyr9E+vMX0/NcpUm
|
||||
jQButmPGSyGY9vR2VXBZcpyDQP73Or6KlLFz5vPCo5A83XIJpw==
|
||||
Private-Lines: 14
|
||||
AAABABcXuxAFK+iDi8L0l15UCQUlLsIluwzrtFFc4uc7OTIRzKZpRN0St69F7h1g
|
||||
QooHPtRzG3toIiGiZqp2VAhKw+xVvb7BnGySCQElCztvWzKeYNkkYCBx+LvFRQoI
|
||||
ik+71xjniIGUmQ/giByFC64ij+xO/RgXS6CwUUaVsaj+6XaJEukacIrWdrKUyNTA
|
||||
MkmIMlulVtLOpTOlKC1h1KadJ/0tKR0yHDOVQbakTZTAzMr/kmgltddpqTr8eNQA
|
||||
KHNt21q1Du+ALVtoHmg4Asf1+zCpDiiXRuZTKt1fImmnE/KGJAUA8W8bMDy+3940
|
||||
ZO1UhUn3hP9NXNfICHT9ynhQ710AAACBANAEyW86Owj7wj9xW5onyW0EAUAlRJ8L
|
||||
MgDjblzzrHyYzitWn2hbXhJ/KmXc4zVOmvfs0cEFsdbobEoEZ5Kl+/eaqSMjUMBE
|
||||
XUhO2Of92KAXTvTL+IxGVN1/cYU3f+J9Eiud7kgDfer1L4z7LAcgrFJZVJDc+gyl
|
||||
qkdfaNUw0097AAAAgQCvQHyxuRbdVLhuPlDTj4YM+RcghkhjEJ+5aJbIRpKtHcl3
|
||||
9azMizXYFC4rf503KHa7iMJNnOmlR5L3Ch3n95Hu3Nyx5OFTxfOfGlSFpVk3knQw
|
||||
+E5gN09nngOidKTmjGu8jlgqxk7h6ae9R9gNvh7EQ/Oa5q+quU1HHV+xxqugxQAA
|
||||
AIBgcvsNPFF/bqS8A2vKysYb/UGqKSGMI6ciWyijEJfPLmVTZTOVMGEClZVnEDvz
|
||||
r6lLNah3RTt+9iGVfjc+iGz8n99jvGTROC0BkLi5G2guDdYU2eQOEY1YhjaDZv0L
|
||||
hCvNv7g43Pg8+Nt2LZabu/+SbfNdvGUpMm2VWgO0sq4J9g==
|
||||
Private-MAC: 47930d04d5de8f2cd8b5c0119040fe37c24076a7
|
||||
Loading…
x
Reference in New Issue
Block a user