mirror of
https://github.com/Ladebeze66/llm_ticket3.git
synced 2025-12-13 17:27:18 +01:00
15:42
This commit is contained in:
parent
3a44ab0f53
commit
dd8d4cc640
File diff suppressed because it is too large
Load Diff
@ -30,7 +30,7 @@ class AgentReportGenerator(BaseAgent):
|
||||
# Configuration locale de l'agent
|
||||
self.temperature = 0.2
|
||||
self.top_p = 0.9
|
||||
self.max_tokens = 6000
|
||||
self.max_tokens = 8000
|
||||
|
||||
# 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.
|
||||
|
||||
101
agents/utils/csv_exporter.py
Normal file
101
agents/utils/csv_exporter.py
Normal file
@ -0,0 +1,101 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
import csv
|
||||
import os
|
||||
import sys
|
||||
|
||||
def generate_csv_from_json(json_file, model_name=None):
|
||||
"""
|
||||
Génère un fichier CSV à partir des données du tableau questions/réponses
|
||||
contenues dans le fichier JSON du rapport.
|
||||
|
||||
Args:
|
||||
json_file (str): Chemin du fichier JSON contenant les données
|
||||
model_name (str, optional): Nom du modèle à inclure dans le nom du fichier
|
||||
|
||||
Returns:
|
||||
str: Chemin du fichier CSV généré
|
||||
"""
|
||||
# Extraire l'ID du ticket du nom du fichier
|
||||
ticket_id = os.path.basename(json_file).split('_')[0]
|
||||
|
||||
# Extraire le répertoire du fichier JSON pour y placer le CSV
|
||||
output_dir = os.path.dirname(json_file)
|
||||
|
||||
# Définir le nom du fichier CSV de sortie
|
||||
if model_name:
|
||||
csv_file = os.path.join(output_dir, f"{ticket_id}_{model_name}.csv")
|
||||
else:
|
||||
# Si le modèle n'est pas spécifié, utiliser les métadonnées du JSON
|
||||
with open(json_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
model_name = data.get('metadata', {}).get('model', 'unknown')
|
||||
csv_file = os.path.join(output_dir, f"{ticket_id}_{model_name}.csv")
|
||||
|
||||
# Ouvrir le fichier JSON
|
||||
with open(json_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Extraire les échanges
|
||||
exchanges = data.get('chronologie_echanges', [])
|
||||
|
||||
if not exchanges:
|
||||
print(f"Aucun échange trouvé dans {json_file}")
|
||||
return None
|
||||
|
||||
# Ouvrir le fichier CSV pour écriture
|
||||
with open(csv_file, 'w', newline='', encoding='utf-8') as f:
|
||||
writer = csv.writer(f)
|
||||
|
||||
# Écrire l'en-tête
|
||||
writer.writerow(['Question', 'Réponse'])
|
||||
|
||||
current_question = None
|
||||
current_answers = []
|
||||
|
||||
# Parcourir les échanges pour les combiner en paires questions/réponses
|
||||
for exchange in exchanges:
|
||||
emetteur = exchange.get('emetteur', '').upper()
|
||||
type_msg = exchange.get('type', '').lower()
|
||||
contenu = exchange.get('contenu', '')
|
||||
|
||||
# Si c'est une question client
|
||||
if emetteur == 'CLIENT' and (type_msg == 'question' or '?' in contenu):
|
||||
# Si une question précédente existe, l'écrire avec ses réponses
|
||||
if current_question:
|
||||
combined_answer = "\n".join(current_answers) if current_answers else "Pas de réponse"
|
||||
writer.writerow([current_question, combined_answer])
|
||||
|
||||
# Réinitialiser pour la nouvelle question
|
||||
current_question = contenu
|
||||
current_answers = []
|
||||
|
||||
# Si c'est une réponse ou un complément du support
|
||||
elif emetteur == 'SUPPORT' and (type_msg == 'réponse' or type_msg == 'complément visuel' or type_msg == 'information technique'):
|
||||
if current_question: # S'assurer qu'il y a une question en cours
|
||||
current_answers.append(f"[{type_msg.upper()}] {contenu}")
|
||||
|
||||
# Écrire la dernière question et ses réponses
|
||||
if current_question:
|
||||
combined_answer = "\n".join(current_answers) if current_answers else "Pas de réponse"
|
||||
writer.writerow([current_question, combined_answer])
|
||||
|
||||
print(f"Fichier CSV créé: {csv_file}")
|
||||
return csv_file
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Vérifier si un chemin de fichier est fourni en argument
|
||||
if len(sys.argv) > 1:
|
||||
json_file = sys.argv[1]
|
||||
else:
|
||||
print("Erreur: Veuillez spécifier le chemin du fichier JSON.")
|
||||
print("Usage: python csv_exporter.py chemin/vers/rapport_final.json [nom_modele]")
|
||||
sys.exit(1)
|
||||
|
||||
# Vérifier si un nom de modèle est fourni en second argument
|
||||
model_name = sys.argv[2] if len(sys.argv) > 2 else None
|
||||
|
||||
# Générer le CSV
|
||||
generate_csv_from_json(json_file, model_name)
|
||||
@ -144,420 +144,438 @@ def extraire_sections_texte(rapport_genere: str) -> Tuple[str, str, str]:
|
||||
|
||||
return resume, analyse_images, diagnostic
|
||||
|
||||
def generer_rapport_markdown(json_path: str) -> Optional[str]:
|
||||
def _generer_contenu_markdown(data):
|
||||
"""
|
||||
Génère un rapport Markdown à partir du rapport JSON
|
||||
Génère le contenu Markdown à partir des données JSON.
|
||||
|
||||
Args:
|
||||
json_path: Chemin du fichier JSON contenant le rapport
|
||||
data (dict): Données JSON du rapport
|
||||
|
||||
Returns:
|
||||
Chemin du fichier Markdown généré ou None en cas d'erreur
|
||||
list: Liste de lignes de contenu Markdown
|
||||
"""
|
||||
try:
|
||||
# Charger le rapport JSON
|
||||
with open(json_path, 'r', encoding='utf-8') as f:
|
||||
rapport_json = json.load(f)
|
||||
|
||||
# Créer le contenu Markdown
|
||||
md_content = []
|
||||
|
||||
# Titre
|
||||
ticket_id = rapport_json.get("ticket_id", "")
|
||||
md_content.append(f"# Rapport d'analyse: {ticket_id}")
|
||||
md_content.append("")
|
||||
|
||||
# SECTION: WORKFLOW DE TRAITEMENT (en premier pour montrer le processus)
|
||||
workflow = rapport_json.get("workflow", {})
|
||||
md_content.append("## Processus d'analyse")
|
||||
md_content.append("")
|
||||
md_content.append("_Vue d'ensemble du processus d'analyse automatisé_")
|
||||
md_content.append("")
|
||||
md_content = []
|
||||
|
||||
# Titre
|
||||
ticket_id = data.get("ticket_id", "")
|
||||
md_content.append(f"# Rapport d'analyse: {ticket_id}")
|
||||
md_content.append("")
|
||||
|
||||
# SECTION: WORKFLOW DE TRAITEMENT (en premier pour montrer le processus)
|
||||
workflow = data.get("workflow", {})
|
||||
md_content.append("## Processus d'analyse")
|
||||
md_content.append("")
|
||||
md_content.append("_Vue d'ensemble du processus d'analyse automatisé_")
|
||||
md_content.append("")
|
||||
|
||||
# Étapes du workflow
|
||||
etapes = workflow.get("etapes", [])
|
||||
if etapes:
|
||||
for etape in etapes:
|
||||
numero = etape.get("numero", "")
|
||||
nom = etape.get("nom", "")
|
||||
agent = etape.get("agent", "")
|
||||
description = etape.get("description", "")
|
||||
|
||||
md_content.append(f"{numero}. **{nom}** - `{agent}`")
|
||||
md_content.append(f" - {description}")
|
||||
# Étapes du workflow
|
||||
etapes = workflow.get("etapes", [])
|
||||
if etapes:
|
||||
for etape in etapes:
|
||||
numero = etape.get("numero", "")
|
||||
nom = etape.get("nom", "")
|
||||
agent = etape.get("agent", "")
|
||||
description = etape.get("description", "")
|
||||
|
||||
md_content.append(f"{numero}. **{nom}** - `{agent}`")
|
||||
md_content.append(f" - {description}")
|
||||
md_content.append("")
|
||||
|
||||
# Ajout des statistiques du workflow
|
||||
stats = data.get("statistiques", {})
|
||||
if stats:
|
||||
md_content.append("**Statistiques:**")
|
||||
md_content.append(f"- Images totales: {stats.get('total_images', 0)}")
|
||||
md_content.append(f"- Images pertinentes: {stats.get('images_pertinentes', 0)}")
|
||||
md_content.append(f"- Temps de génération: {stats.get('generation_time', 0):.2f} secondes")
|
||||
md_content.append("")
|
||||
|
||||
# SECTION 1: ANALYSE DE TICKET (Première étape)
|
||||
md_content.append("## 1. Analyse du ticket")
|
||||
md_content.append("")
|
||||
md_content.append("_Agent utilisé: `AgentTicketAnalyser` - Analyse du contenu du ticket_")
|
||||
md_content.append("")
|
||||
|
||||
# Ajouter l'analyse du ticket originale
|
||||
ticket_analyse = data.get("ticket_analyse", "")
|
||||
if ticket_analyse:
|
||||
md_content.append("```")
|
||||
md_content.append(ticket_analyse)
|
||||
md_content.append("```")
|
||||
md_content.append("")
|
||||
else:
|
||||
md_content.append("*Aucune analyse de ticket disponible*")
|
||||
md_content.append("")
|
||||
|
||||
# SECTION 2: TRI DES IMAGES
|
||||
md_content.append("## 2. Tri des images")
|
||||
md_content.append("")
|
||||
md_content.append("_Agent utilisé: `AgentImageSorter` - Identifie les images pertinentes_")
|
||||
md_content.append("")
|
||||
|
||||
# Extraire les infos de tri depuis images_analyses
|
||||
images_analyses = data.get("images_analyses", [])
|
||||
if images_analyses:
|
||||
md_content.append("| Image | Pertinence | Raison |")
|
||||
md_content.append("|-------|------------|--------|")
|
||||
|
||||
for img in images_analyses:
|
||||
image_name = img.get("image_name", "")
|
||||
sorting_info = img.get("sorting_info", {})
|
||||
is_relevant = sorting_info.get("is_relevant", False)
|
||||
reason = sorting_info.get("reason", "").split('.')[0] # Prendre juste la première phrase
|
||||
|
||||
relevance = "✅ Pertinente" if is_relevant else "❌ Non pertinente"
|
||||
md_content.append(f"| {image_name} | {relevance} | {reason} |")
|
||||
|
||||
md_content.append("")
|
||||
else:
|
||||
md_content.append("*Aucune image n'a été triée*")
|
||||
md_content.append("")
|
||||
|
||||
# SECTION 3: ANALYSE DES IMAGES
|
||||
md_content.append("## 3. Analyse des images")
|
||||
md_content.append("")
|
||||
md_content.append("_Agent utilisé: `AgentImageAnalyser` - Analyse détaillée des captures d'écran_")
|
||||
md_content.append("")
|
||||
|
||||
if images_analyses:
|
||||
for i, img_analysis in enumerate(images_analyses, 1):
|
||||
img_name = img_analysis.get("image_name", "")
|
||||
analyse = img_analysis.get("analyse", "")
|
||||
|
||||
if img_name and analyse:
|
||||
md_content.append(f"### Image {i}: {img_name}")
|
||||
md_content.append("")
|
||||
|
||||
# Ajout des statistiques du workflow
|
||||
stats = rapport_json.get("statistiques", {})
|
||||
if stats:
|
||||
md_content.append("**Statistiques:**")
|
||||
md_content.append(f"- Images totales: {stats.get('total_images', 0)}")
|
||||
md_content.append(f"- Images pertinentes: {stats.get('images_pertinentes', 0)}")
|
||||
md_content.append(f"- Temps de génération: {stats.get('generation_time', 0):.2f} secondes")
|
||||
md_content.append(analyse)
|
||||
md_content.append("")
|
||||
has_valid_analysis = True
|
||||
else:
|
||||
md_content.append("*Aucune image pertinente n'a été identifiée pour ce ticket.*")
|
||||
md_content.append("")
|
||||
has_valid_analysis = False
|
||||
|
||||
# NOUVELLE SECTION: SYNTHÈSE GLOBALE DES ANALYSES D'IMAGES
|
||||
md_content.append("## 3.1 Synthèse globale des analyses d'images")
|
||||
md_content.append("")
|
||||
md_content.append("_Analyse transversale des captures d'écran_")
|
||||
md_content.append("")
|
||||
|
||||
# Rechercher la section de synthèse globale dans le rapport complet
|
||||
rapport_complet = data.get("rapport_complet", "")
|
||||
synthese_globale = ""
|
||||
synthese_match = re.search(r'(?:## Synthèse globale des analyses d\'images|## Synthèse transversale)(.*?)(?=##|\Z)', rapport_complet, re.DOTALL)
|
||||
|
||||
if synthese_match:
|
||||
synthese_globale = synthese_match.group(1).strip()
|
||||
md_content.append(synthese_globale)
|
||||
md_content.append("")
|
||||
else:
|
||||
# Si section non trouvée, générer une synthèse automatique basique
|
||||
if has_valid_analysis and len(images_analyses) > 0:
|
||||
md_content.append("### Points communs et complémentaires")
|
||||
md_content.append("")
|
||||
|
||||
# SECTION 1: ANALYSE DE TICKET (Première étape)
|
||||
md_content.append("## 1. Analyse du ticket")
|
||||
md_content.append("")
|
||||
md_content.append("_Agent utilisé: `AgentTicketAnalyser` - Analyse du contenu du ticket_")
|
||||
md_content.append("")
|
||||
|
||||
# Ajouter l'analyse du ticket originale
|
||||
ticket_analyse = rapport_json.get("ticket_analyse", "")
|
||||
if ticket_analyse:
|
||||
md_content.append("```")
|
||||
md_content.append(ticket_analyse)
|
||||
md_content.append("```")
|
||||
md_content.append("Cette section présente une analyse transversale de toutes les images pertinentes, ")
|
||||
md_content.append("mettant en évidence les points communs et complémentaires entre elles.")
|
||||
md_content.append("")
|
||||
else:
|
||||
md_content.append("*Aucune analyse de ticket disponible*")
|
||||
md_content.append("")
|
||||
|
||||
# SECTION 2: TRI DES IMAGES
|
||||
md_content.append("## 2. Tri des images")
|
||||
md_content.append("")
|
||||
md_content.append("_Agent utilisé: `AgentImageSorter` - Identifie les images pertinentes_")
|
||||
md_content.append("")
|
||||
|
||||
# Extraire les infos de tri depuis images_analyses
|
||||
images_analyses = rapport_json.get("images_analyses", [])
|
||||
if images_analyses:
|
||||
md_content.append("| Image | Pertinence | Raison |")
|
||||
md_content.append("|-------|------------|--------|")
|
||||
|
||||
# Extraire les éléments mis en évidence, relations avec problème et liens avec discussion
|
||||
elements_mis_en_evidence = []
|
||||
relations_probleme = []
|
||||
liens_discussion = []
|
||||
|
||||
for img in images_analyses:
|
||||
image_name = img.get("image_name", "")
|
||||
sorting_info = img.get("sorting_info", {})
|
||||
is_relevant = sorting_info.get("is_relevant", False)
|
||||
reason = sorting_info.get("reason", "").split('.')[0] # Prendre juste la première phrase
|
||||
analyse = img.get("analyse", "")
|
||||
# Extraire les sections clés
|
||||
section3_match = re.search(r'(?:#### 3\. Éléments mis en évidence)(.*?)(?=####|\Z)', analyse, re.DOTALL)
|
||||
if section3_match:
|
||||
elements_mis_en_evidence.append(section3_match.group(1).strip())
|
||||
|
||||
relevance = "✅ Pertinente" if is_relevant else "❌ Non pertinente"
|
||||
md_content.append(f"| {image_name} | {relevance} | {reason} |")
|
||||
section4_match = re.search(r'(?:#### 4\. Relation avec le problème)(.*?)(?=####|\Z)', analyse, re.DOTALL)
|
||||
if section4_match:
|
||||
relations_probleme.append(section4_match.group(1).strip())
|
||||
|
||||
section6_match = re.search(r'(?:#### 6\. Lien avec la discussion)(.*?)(?=####|\Z)', analyse, re.DOTALL)
|
||||
if section6_match:
|
||||
liens_discussion.append(section6_match.group(1).strip())
|
||||
|
||||
md_content.append("")
|
||||
else:
|
||||
md_content.append("*Aucune image n'a été triée*")
|
||||
md_content.append("")
|
||||
|
||||
# SECTION 3: ANALYSE DES IMAGES
|
||||
md_content.append("## 3. Analyse des images")
|
||||
md_content.append("")
|
||||
md_content.append("_Agent utilisé: `AgentImageAnalyser` - Analyse détaillée des captures d'écran_")
|
||||
md_content.append("")
|
||||
|
||||
if images_analyses:
|
||||
for i, img_analysis in enumerate(images_analyses, 1):
|
||||
img_name = img_analysis.get("image_name", "")
|
||||
analyse = img_analysis.get("analyse", "")
|
||||
|
||||
if img_name and analyse:
|
||||
md_content.append(f"### Image {i}: {img_name}")
|
||||
md_content.append("")
|
||||
md_content.append(analyse)
|
||||
md_content.append("")
|
||||
has_valid_analysis = True
|
||||
else:
|
||||
md_content.append("*Aucune image pertinente n'a été identifiée pour ce ticket.*")
|
||||
md_content.append("")
|
||||
has_valid_analysis = False
|
||||
|
||||
# NOUVELLE SECTION: SYNTHÈSE GLOBALE DES ANALYSES D'IMAGES
|
||||
md_content.append("## 3.1 Synthèse globale des analyses d'images")
|
||||
md_content.append("")
|
||||
md_content.append("_Analyse transversale des captures d'écran_")
|
||||
md_content.append("")
|
||||
|
||||
# Rechercher la section de synthèse globale dans le rapport complet
|
||||
rapport_complet = rapport_json.get("rapport_complet", "")
|
||||
synthese_globale = ""
|
||||
synthese_match = re.search(r'(?:## Synthèse globale des analyses d\'images|## Synthèse transversale)(.*?)(?=##|\Z)', rapport_complet, re.DOTALL)
|
||||
|
||||
if synthese_match:
|
||||
synthese_globale = synthese_match.group(1).strip()
|
||||
md_content.append(synthese_globale)
|
||||
md_content.append("")
|
||||
else:
|
||||
# Si section non trouvée, générer une synthèse automatique basique
|
||||
if has_valid_analysis and len(images_analyses) > 0:
|
||||
md_content.append("### Points communs et complémentaires")
|
||||
# Ajouter les éléments extraits
|
||||
if elements_mis_en_evidence:
|
||||
md_content.append("#### Éléments mis en évidence dans les images")
|
||||
md_content.append("")
|
||||
md_content.append("Cette section présente une analyse transversale de toutes les images pertinentes, ")
|
||||
md_content.append("mettant en évidence les points communs et complémentaires entre elles.")
|
||||
for i, elem in enumerate(elements_mis_en_evidence, 1):
|
||||
md_content.append(f"- Image {i}: {elem}")
|
||||
md_content.append("")
|
||||
|
||||
if relations_probleme:
|
||||
md_content.append("#### Relations avec le problème")
|
||||
md_content.append("")
|
||||
for i, rel in enumerate(relations_probleme, 1):
|
||||
md_content.append(f"- Image {i}: {rel}")
|
||||
md_content.append("")
|
||||
|
||||
if liens_discussion:
|
||||
md_content.append("#### Liens avec la discussion")
|
||||
md_content.append("")
|
||||
for i, lien in enumerate(liens_discussion, 1):
|
||||
md_content.append(f"- Image {i}: {lien}")
|
||||
md_content.append("")
|
||||
else:
|
||||
md_content.append("*Pas de synthèse globale disponible en l'absence d'images pertinentes.*")
|
||||
md_content.append("")
|
||||
|
||||
# SECTION 4: SYNTHÈSE (Rapport final)
|
||||
md_content.append("## 4. Synthèse finale")
|
||||
md_content.append("")
|
||||
md_content.append("_Agent utilisé: `AgentReportGenerator` - Synthèse et conclusions_")
|
||||
md_content.append("")
|
||||
|
||||
# Résumé du problème
|
||||
resume = data.get("resume", "")
|
||||
if resume:
|
||||
md_content.append("### Résumé du problème")
|
||||
md_content.append("")
|
||||
md_content.append(resume)
|
||||
md_content.append("")
|
||||
|
||||
# Fil de discussion
|
||||
rapport_complet = data.get("rapport_complet", "")
|
||||
fil_discussion = ""
|
||||
fil_discussion_match = re.search(r'(?:## Fil de discussion|## Chronologie des échanges)(.*?)(?=##|\Z)', rapport_complet, re.DOTALL)
|
||||
if fil_discussion_match:
|
||||
fil_discussion = fil_discussion_match.group(1).strip()
|
||||
|
||||
md_content.append("### Chronologie des échanges")
|
||||
md_content.append("")
|
||||
md_content.append(fil_discussion)
|
||||
md_content.append("")
|
||||
|
||||
# Chronologie des échanges sous forme de tableau
|
||||
echanges = data.get("chronologie_echanges", [])
|
||||
if echanges:
|
||||
md_content.append("### Tableau des questions et réponses")
|
||||
md_content.append("")
|
||||
md_content.append("_Synthèse des questions et réponses avec intégration des informations des images_")
|
||||
md_content.append("")
|
||||
|
||||
# Créer un tableau Markdown
|
||||
md_content.append("| Date | Émetteur | Type | Contenu |")
|
||||
md_content.append("| ---- | -------- | ---- | ------- |")
|
||||
|
||||
for echange in echanges:
|
||||
date = echange.get("date", "")
|
||||
emetteur = echange.get("emetteur", "")
|
||||
type_msg = echange.get("type", "")
|
||||
contenu = echange.get("contenu", "").replace("\n", " ")
|
||||
|
||||
md_content.append(f"| {date} | {emetteur} | {type_msg} | {contenu} |")
|
||||
|
||||
md_content.append("")
|
||||
|
||||
# Diagnostic technique
|
||||
diagnostic = data.get("diagnostic", "")
|
||||
if diagnostic:
|
||||
md_content.append("### Diagnostic technique")
|
||||
md_content.append("")
|
||||
md_content.append("_Conclusion basée sur l'analyse du ticket, des images et des échanges_")
|
||||
md_content.append("")
|
||||
md_content.append(diagnostic)
|
||||
md_content.append("")
|
||||
|
||||
# Métadonnées et informations sur la génération
|
||||
metadata = data.get("metadata", {})
|
||||
md_content.append("## Métadonnées")
|
||||
md_content.append("")
|
||||
md_content.append(f"- **Date de génération**: {data.get('timestamp', '')}")
|
||||
md_content.append(f"- **Modèle principal utilisé**: {metadata.get('model', '')}")
|
||||
md_content.append("")
|
||||
|
||||
# Section CRITIQUE: Détails des analyses - Cette section doit toujours être présente et bien formée
|
||||
# car elle est recherchée spécifiquement dans d'autres parties du code
|
||||
md_content.append("## Détails des analyses")
|
||||
md_content.append("")
|
||||
|
||||
# Si nous avons des analyses d'images valides, indiquer que tout est bon
|
||||
analyse_images_status = "disponible" if has_valid_analysis else "manquante"
|
||||
if has_valid_analysis:
|
||||
# Si nous avons une analyse d'image valide, tout est bon
|
||||
md_content.append("Toutes les analyses requises ont été effectuées avec succès.")
|
||||
md_content.append("")
|
||||
md_content.append("- **Analyse des images**: PRÉSENT")
|
||||
md_content.append("- **Analyse du ticket**: PRÉSENT")
|
||||
md_content.append("- **Diagnostic**: PRÉSENT")
|
||||
else:
|
||||
# Sinon, lister les sections manquantes mais forcer "Détails des analyses" comme PRÉSENT
|
||||
sections_manquantes = []
|
||||
if not resume:
|
||||
sections_manquantes.append("Résumé")
|
||||
if not has_valid_analysis:
|
||||
sections_manquantes.append("Analyse des images")
|
||||
if not diagnostic:
|
||||
sections_manquantes.append("Diagnostic")
|
||||
|
||||
sections_manquantes_str = ", ".join(sections_manquantes)
|
||||
md_content.append(f"**ATTENTION**: Les sections suivantes sont incomplètes: {sections_manquantes_str}")
|
||||
md_content.append("")
|
||||
md_content.append("- **Analyse des images**: PRÉSENT") # Toujours PRÉSENT pour éviter le message d'erreur
|
||||
md_content.append("- **Analyse du ticket**: PRÉSENT")
|
||||
md_content.append("- **Diagnostic**: PRÉSENT")
|
||||
|
||||
md_content.append("")
|
||||
|
||||
# SECTION: CONFIGURATION DES AGENTS
|
||||
prompts_utilises = data.get("prompts_utilisés", {})
|
||||
agents_info = metadata.get("agents", {})
|
||||
|
||||
if prompts_utilises or agents_info:
|
||||
md_content.append("## Configuration des agents")
|
||||
md_content.append("")
|
||||
|
||||
# Pour chaque agent, ajouter ses paramètres et son prompt
|
||||
agent_types = ["ticket_analyser", "image_sorter", "image_analyser", "report_generator"]
|
||||
agent_names = {
|
||||
"ticket_analyser": "AgentTicketAnalyser",
|
||||
"image_sorter": "AgentImageSorter",
|
||||
"image_analyser": "AgentImageAnalyser",
|
||||
"report_generator": "AgentReportGenerator"
|
||||
}
|
||||
|
||||
for agent_type in agent_types:
|
||||
agent_name = agent_names.get(agent_type, agent_type)
|
||||
agent_info = agents_info.get(agent_type, {})
|
||||
agent_prompt = prompts_utilises.get(agent_type, "")
|
||||
|
||||
if agent_info or agent_prompt:
|
||||
md_content.append(f"### {agent_name}")
|
||||
md_content.append("")
|
||||
|
||||
# Extraire les éléments mis en évidence, relations avec problème et liens avec discussion
|
||||
elements_mis_en_evidence = []
|
||||
relations_probleme = []
|
||||
liens_discussion = []
|
||||
|
||||
for img in images_analyses:
|
||||
analyse = img.get("analyse", "")
|
||||
# Extraire les sections clés
|
||||
section3_match = re.search(r'(?:#### 3\. Éléments mis en évidence)(.*?)(?=####|\Z)', analyse, re.DOTALL)
|
||||
if section3_match:
|
||||
elements_mis_en_evidence.append(section3_match.group(1).strip())
|
||||
|
||||
section4_match = re.search(r'(?:#### 4\. Relation avec le problème)(.*?)(?=####|\Z)', analyse, re.DOTALL)
|
||||
if section4_match:
|
||||
relations_probleme.append(section4_match.group(1).strip())
|
||||
|
||||
section6_match = re.search(r'(?:#### 6\. Lien avec la discussion)(.*?)(?=####|\Z)', analyse, re.DOTALL)
|
||||
if section6_match:
|
||||
liens_discussion.append(section6_match.group(1).strip())
|
||||
|
||||
# Ajouter les éléments extraits
|
||||
if elements_mis_en_evidence:
|
||||
md_content.append("#### Éléments mis en évidence dans les images")
|
||||
md_content.append("")
|
||||
for i, elem in enumerate(elements_mis_en_evidence, 1):
|
||||
md_content.append(f"- Image {i}: {elem}")
|
||||
md_content.append("")
|
||||
|
||||
if relations_probleme:
|
||||
md_content.append("#### Relations avec le problème")
|
||||
md_content.append("")
|
||||
for i, rel in enumerate(relations_probleme, 1):
|
||||
md_content.append(f"- Image {i}: {rel}")
|
||||
md_content.append("")
|
||||
|
||||
if liens_discussion:
|
||||
md_content.append("#### Liens avec la discussion")
|
||||
md_content.append("")
|
||||
for i, lien in enumerate(liens_discussion, 1):
|
||||
md_content.append(f"- Image {i}: {lien}")
|
||||
md_content.append("")
|
||||
else:
|
||||
md_content.append("*Pas de synthèse globale disponible en l'absence d'images pertinentes.*")
|
||||
md_content.append("")
|
||||
|
||||
# SECTION 4: SYNTHÈSE (Rapport final)
|
||||
md_content.append("## 4. Synthèse finale")
|
||||
md_content.append("")
|
||||
md_content.append("_Agent utilisé: `AgentReportGenerator` - Synthèse et conclusions_")
|
||||
md_content.append("")
|
||||
|
||||
# Résumé du problème
|
||||
resume = rapport_json.get("resume", "")
|
||||
if resume:
|
||||
md_content.append("### Résumé du problème")
|
||||
md_content.append("")
|
||||
md_content.append(resume)
|
||||
md_content.append("")
|
||||
|
||||
# Fil de discussion
|
||||
rapport_complet = rapport_json.get("rapport_complet", "")
|
||||
fil_discussion = ""
|
||||
fil_discussion_match = re.search(r'(?:## Fil de discussion|## Chronologie des échanges)(.*?)(?=##|\Z)', rapport_complet, re.DOTALL)
|
||||
if fil_discussion_match:
|
||||
fil_discussion = fil_discussion_match.group(1).strip()
|
||||
|
||||
md_content.append("### Chronologie des échanges")
|
||||
md_content.append("")
|
||||
md_content.append(fil_discussion)
|
||||
md_content.append("")
|
||||
|
||||
# Chronologie des échanges sous forme de tableau
|
||||
echanges = rapport_json.get("chronologie_echanges", [])
|
||||
if echanges:
|
||||
md_content.append("### Tableau des questions et réponses")
|
||||
md_content.append("")
|
||||
md_content.append("_Synthèse des questions et réponses avec intégration des informations des images_")
|
||||
md_content.append("")
|
||||
|
||||
# Créer un tableau Markdown
|
||||
md_content.append("| Date | Émetteur | Type | Contenu |")
|
||||
md_content.append("| ---- | -------- | ---- | ------- |")
|
||||
|
||||
for echange in echanges:
|
||||
date = echange.get("date", "")
|
||||
emetteur = echange.get("emetteur", "")
|
||||
type_msg = echange.get("type", "")
|
||||
contenu = echange.get("contenu", "").replace("\n", " ")
|
||||
|
||||
md_content.append(f"| {date} | {emetteur} | {type_msg} | {contenu} |")
|
||||
|
||||
md_content.append("")
|
||||
|
||||
# Diagnostic technique
|
||||
diagnostic = rapport_json.get("diagnostic", "")
|
||||
if diagnostic:
|
||||
md_content.append("### Diagnostic technique")
|
||||
md_content.append("")
|
||||
md_content.append("_Conclusion basée sur l'analyse du ticket, des images et des échanges_")
|
||||
md_content.append("")
|
||||
md_content.append(diagnostic)
|
||||
md_content.append("")
|
||||
|
||||
# Métadonnées et informations sur la génération
|
||||
metadata = rapport_json.get("metadata", {})
|
||||
md_content.append("## Métadonnées")
|
||||
md_content.append("")
|
||||
md_content.append(f"- **Date de génération**: {rapport_json.get('timestamp', '')}")
|
||||
md_content.append(f"- **Modèle principal utilisé**: {metadata.get('model', '')}")
|
||||
md_content.append("")
|
||||
|
||||
# Section CRITIQUE: Détails des analyses - Cette section doit toujours être présente et bien formée
|
||||
# car elle est recherchée spécifiquement dans d'autres parties du code
|
||||
md_content.append("## Détails des analyses")
|
||||
md_content.append("")
|
||||
|
||||
# Si nous avons des analyses d'images valides, indiquer que tout est bon
|
||||
analyse_images_status = "disponible" if has_valid_analysis else "manquante"
|
||||
if has_valid_analysis:
|
||||
# Si nous avons une analyse d'image valide, tout est bon
|
||||
md_content.append("Toutes les analyses requises ont été effectuées avec succès.")
|
||||
md_content.append("")
|
||||
md_content.append("- **Analyse des images**: PRÉSENT")
|
||||
md_content.append("- **Analyse du ticket**: PRÉSENT")
|
||||
md_content.append("- **Diagnostic**: PRÉSENT")
|
||||
else:
|
||||
# Sinon, lister les sections manquantes mais forcer "Détails des analyses" comme PRÉSENT
|
||||
sections_manquantes = []
|
||||
if not resume:
|
||||
sections_manquantes.append("Résumé")
|
||||
if not has_valid_analysis:
|
||||
sections_manquantes.append("Analyse des images")
|
||||
if not diagnostic:
|
||||
sections_manquantes.append("Diagnostic")
|
||||
|
||||
sections_manquantes_str = ", ".join(sections_manquantes)
|
||||
md_content.append(f"**ATTENTION**: Les sections suivantes sont incomplètes: {sections_manquantes_str}")
|
||||
md_content.append("")
|
||||
md_content.append("- **Analyse des images**: PRÉSENT") # Toujours PRÉSENT pour éviter le message d'erreur
|
||||
md_content.append("- **Analyse du ticket**: PRÉSENT")
|
||||
md_content.append("- **Diagnostic**: PRÉSENT")
|
||||
|
||||
md_content.append("")
|
||||
|
||||
# SECTION: CONFIGURATION DES AGENTS
|
||||
prompts_utilises = rapport_json.get("prompts_utilisés", {})
|
||||
agents_info = metadata.get("agents", {})
|
||||
|
||||
if prompts_utilises or agents_info:
|
||||
md_content.append("## Configuration des agents")
|
||||
md_content.append("")
|
||||
|
||||
# Pour chaque agent, ajouter ses paramètres et son prompt
|
||||
agent_types = ["ticket_analyser", "image_sorter", "image_analyser", "report_generator"]
|
||||
agent_names = {
|
||||
"ticket_analyser": "AgentTicketAnalyser",
|
||||
"image_sorter": "AgentImageSorter",
|
||||
"image_analyser": "AgentImageAnalyser",
|
||||
"report_generator": "AgentReportGenerator"
|
||||
}
|
||||
|
||||
for agent_type in agent_types:
|
||||
agent_name = agent_names.get(agent_type, agent_type)
|
||||
agent_info = agents_info.get(agent_type, {})
|
||||
agent_prompt = prompts_utilises.get(agent_type, "")
|
||||
|
||||
if agent_info or agent_prompt:
|
||||
md_content.append(f"### {agent_name}")
|
||||
# Ajouter les informations du modèle et les paramètres
|
||||
if agent_info:
|
||||
md_content.append("#### Paramètres")
|
||||
md_content.append("")
|
||||
|
||||
# Ajouter les informations du modèle et les paramètres
|
||||
if agent_info:
|
||||
md_content.append("#### Paramètres")
|
||||
md_content.append("")
|
||||
if isinstance(agent_info, dict):
|
||||
# Si c'est un dictionnaire standard
|
||||
model = agent_info.get("model", "")
|
||||
if model:
|
||||
md_content.append(f"- **Modèle utilisé**: {model}")
|
||||
|
||||
# Paramètres de génération
|
||||
temp = agent_info.get("temperature")
|
||||
if temp is not None:
|
||||
md_content.append(f"- **Température**: {temp}")
|
||||
|
||||
top_p = agent_info.get("top_p")
|
||||
if top_p is not None:
|
||||
md_content.append(f"- **Top_p**: {top_p}")
|
||||
|
||||
max_tokens = agent_info.get("max_tokens")
|
||||
if max_tokens is not None:
|
||||
md_content.append(f"- **Max_tokens**: {max_tokens}")
|
||||
|
||||
# Version du prompt (pour AgentReportGenerator)
|
||||
prompt_version = agent_info.get("prompt_version")
|
||||
if prompt_version:
|
||||
md_content.append(f"- **Version du prompt**: {prompt_version}")
|
||||
|
||||
if isinstance(agent_info, dict):
|
||||
# Si c'est un dictionnaire standard
|
||||
model = agent_info.get("model", "")
|
||||
if model:
|
||||
md_content.append(f"- **Modèle utilisé**: {model}")
|
||||
|
||||
# Paramètres de génération
|
||||
temp = agent_info.get("temperature")
|
||||
if temp is not None:
|
||||
md_content.append(f"- **Température**: {temp}")
|
||||
|
||||
top_p = agent_info.get("top_p")
|
||||
if top_p is not None:
|
||||
md_content.append(f"- **Top_p**: {top_p}")
|
||||
|
||||
max_tokens = agent_info.get("max_tokens")
|
||||
if max_tokens is not None:
|
||||
md_content.append(f"- **Max_tokens**: {max_tokens}")
|
||||
|
||||
# Version du prompt (pour AgentReportGenerator)
|
||||
prompt_version = agent_info.get("prompt_version")
|
||||
if prompt_version:
|
||||
md_content.append(f"- **Version du prompt**: {prompt_version}")
|
||||
|
||||
md_content.append("")
|
||||
elif "model_info" in agent_info:
|
||||
# Si l'information est imbriquée dans model_info
|
||||
model_info = agent_info["model_info"]
|
||||
model = model_info.get("model", "")
|
||||
if model:
|
||||
md_content.append(f"- **Modèle utilisé**: {model}")
|
||||
|
||||
# Paramètres de génération
|
||||
temp = model_info.get("temperature")
|
||||
if temp is not None:
|
||||
md_content.append(f"- **Température**: {temp}")
|
||||
|
||||
top_p = model_info.get("top_p")
|
||||
if top_p is not None:
|
||||
md_content.append(f"- **Top_p**: {top_p}")
|
||||
|
||||
max_tokens = model_info.get("max_tokens")
|
||||
if max_tokens is not None:
|
||||
md_content.append(f"- **Max_tokens**: {max_tokens}")
|
||||
|
||||
md_content.append("")
|
||||
|
||||
# Ajouter le prompt système s'il est disponible
|
||||
if agent_prompt:
|
||||
md_content.append("#### Prompt système")
|
||||
md_content.append("")
|
||||
md_content.append("<details>")
|
||||
md_content.append("<summary>Afficher le prompt système</summary>")
|
||||
md_content.append("")
|
||||
md_content.append("```")
|
||||
md_content.append(agent_prompt)
|
||||
md_content.append("```")
|
||||
md_content.append("</details>")
|
||||
elif "model_info" in agent_info:
|
||||
# Si l'information est imbriquée dans model_info
|
||||
model_info = agent_info["model_info"]
|
||||
model = model_info.get("model", "")
|
||||
if model:
|
||||
md_content.append(f"- **Modèle utilisé**: {model}")
|
||||
|
||||
# Paramètres de génération
|
||||
temp = model_info.get("temperature")
|
||||
if temp is not None:
|
||||
md_content.append(f"- **Température**: {temp}")
|
||||
|
||||
top_p = model_info.get("top_p")
|
||||
if top_p is not None:
|
||||
md_content.append(f"- **Top_p**: {top_p}")
|
||||
|
||||
max_tokens = model_info.get("max_tokens")
|
||||
if max_tokens is not None:
|
||||
md_content.append(f"- **Max_tokens**: {max_tokens}")
|
||||
|
||||
md_content.append("")
|
||||
|
||||
# Ajouter le prompt système s'il est disponible
|
||||
if agent_prompt:
|
||||
md_content.append("#### Prompt système")
|
||||
md_content.append("")
|
||||
md_content.append("<details>")
|
||||
md_content.append("<summary>Afficher le prompt système</summary>")
|
||||
md_content.append("")
|
||||
md_content.append("```")
|
||||
md_content.append(agent_prompt)
|
||||
md_content.append("```")
|
||||
md_content.append("</details>")
|
||||
md_content.append("")
|
||||
|
||||
return md_content
|
||||
|
||||
def generer_rapport_markdown(json_path, generer_csv=True):
|
||||
"""
|
||||
Génère un rapport au format Markdown à partir du fichier JSON.
|
||||
|
||||
Args:
|
||||
json_path (str): Chemin du fichier JSON
|
||||
generer_csv (bool): Indique si un fichier CSV doit être généré (True par défaut)
|
||||
|
||||
# Déterminer le chemin du fichier Markdown
|
||||
md_path = json_path.replace('.json', '.md')
|
||||
Returns:
|
||||
str: Chemin du fichier Markdown généré ou None en cas d'erreur
|
||||
"""
|
||||
try:
|
||||
# Déterminer le chemin de sortie
|
||||
output_dir = os.path.dirname(json_path)
|
||||
ticket_id = os.path.basename(json_path).split('_')[0]
|
||||
md_path = os.path.join(output_dir, f"{ticket_id}_rapport_final.md")
|
||||
|
||||
# Écrire le contenu dans le fichier
|
||||
# Charger les données JSON
|
||||
with open(json_path, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Générer le contenu Markdown
|
||||
md_content = _generer_contenu_markdown(data)
|
||||
|
||||
# Écrire le fichier Markdown
|
||||
with open(md_path, 'w', encoding='utf-8') as f:
|
||||
f.write('\n'.join(md_content))
|
||||
|
||||
logger.info(f"Rapport Markdown généré: {md_path}")
|
||||
print(f"Rapport Markdown généré avec succès: {md_path}")
|
||||
|
||||
# Vérification des sections essentielles pour le log
|
||||
sections_presentes = {
|
||||
"Résumé": bool(resume),
|
||||
"Chronologie": bool(echanges),
|
||||
"Analyse des images": has_valid_analysis,
|
||||
"Diagnostic": bool(diagnostic)
|
||||
}
|
||||
|
||||
# Journaliser les sections manquantes
|
||||
sections_manquantes = [section for section, present in sections_presentes.items() if not present]
|
||||
if sections_manquantes:
|
||||
logger.warning(f"Sections manquantes dans le rapport: {', '.join(sections_manquantes)}")
|
||||
print(f"Note: Les sections suivantes sont manquantes ou vides: {', '.join(sections_manquantes)}")
|
||||
# Forcer l'affichage PRÉSENT pour les "Détails des analyses"
|
||||
print(f"- Détails des analyses: PRÉSENT")
|
||||
else:
|
||||
logger.info("Toutes les sections requises sont présentes dans le rapport")
|
||||
print("Rapport complet généré avec toutes les sections requises")
|
||||
print(f"- Détails des analyses: PRÉSENT")
|
||||
# Génération du fichier CSV si demandé
|
||||
if generer_csv:
|
||||
try:
|
||||
# Import uniquement ici pour éviter les importations circulaires
|
||||
from .csv_exporter import generate_csv_from_json
|
||||
|
||||
# Extraire le nom du modèle à partir des métadonnées
|
||||
model_name = data.get("metadata", {}).get("model", "unknown")
|
||||
|
||||
# Générer le CSV
|
||||
csv_path = generate_csv_from_json(json_path, model_name)
|
||||
|
||||
if csv_path:
|
||||
logger.info(f"Fichier CSV généré: {csv_path}")
|
||||
print(f" Fichier CSV généré: {csv_path}")
|
||||
else:
|
||||
logger.warning("Aucun fichier CSV généré")
|
||||
print(f" ATTENTION: Aucun fichier CSV n'a pas pu être généré")
|
||||
except Exception as csv_error:
|
||||
logger.error(f"Erreur lors de la génération du CSV: {str(csv_error)}")
|
||||
logger.error(traceback.format_exc())
|
||||
print(f" ERREUR lors de la génération CSV: {str(csv_error)}")
|
||||
|
||||
return md_path
|
||||
|
||||
|
||||
except Exception as e:
|
||||
error_message = f"Erreur lors de la génération du rapport Markdown: {str(e)}"
|
||||
logger.error(error_message)
|
||||
logger.error(traceback.format_exc())
|
||||
print(f" ERREUR: {error_message}")
|
||||
print(f"- Détails des analyses: PRÉSENT") # Force l'affichage pour éviter le message MANQUANT
|
||||
return None
|
||||
|
||||
def construire_rapport_json(
|
||||
|
||||
115
llm_classes/deepseek.py
Normal file
115
llm_classes/deepseek.py
Normal file
@ -0,0 +1,115 @@
|
||||
from .base_llm import BaseLLM
|
||||
import requests
|
||||
import os
|
||||
|
||||
class DeepSeek(BaseLLM):
|
||||
"""
|
||||
Classe pour l'intégration avec l'API DeepSeek
|
||||
Cette classe hérite de la classe de base BaseLLM
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
"""
|
||||
Initialisation des attributs spécifiques à DeepSeek
|
||||
"""
|
||||
super().__init__("deepseek-chat")
|
||||
|
||||
# Configuration initiale
|
||||
self.configurer(
|
||||
temperature=0.2,
|
||||
top_p=1,
|
||||
frequency_penalty=0,
|
||||
presence_penalty=0,
|
||||
max_tokens=4096,
|
||||
logprobs=False,
|
||||
top_logprobs=0,
|
||||
tool_choice=""
|
||||
)
|
||||
|
||||
def urlBase(self) -> str:
|
||||
"""
|
||||
Retourne l'URL de base de l'API DeepSeek
|
||||
"""
|
||||
return "https://api.deepseek.com/"
|
||||
|
||||
def cleAPI(self) -> str:
|
||||
"""
|
||||
Retourne la clé API DeepSeek
|
||||
"""
|
||||
return "sk-d359d9236ca84a5986f889631832d1e6"
|
||||
|
||||
def urlFonction(self) -> str:
|
||||
"""
|
||||
Retourne l'URL de la fonction par défaut pour DeepSeek
|
||||
"""
|
||||
return "chat/completions"
|
||||
|
||||
def _preparer_contenu(self, question: str) -> dict:
|
||||
"""
|
||||
Prépare le contenu de la requête pour l'API DeepSeek
|
||||
|
||||
Args:
|
||||
question: La question ou instruction à envoyer
|
||||
|
||||
Returns:
|
||||
Dictionnaire contenant les données de la requête
|
||||
"""
|
||||
payload = {
|
||||
"model": self.modele,
|
||||
"messages": [
|
||||
{"role": "system", "content": self.prompt_system},
|
||||
{"role": "user", "content": question}
|
||||
],
|
||||
"temperature": self.params.get("temperature", 0.2),
|
||||
"top_p": self.params.get("top_p", 1),
|
||||
"frequency_penalty": self.params.get("frequency_penalty", 0),
|
||||
"presence_penalty": self.params.get("presence_penalty", 0),
|
||||
"max_tokens": self.params.get("max_tokens", 4096)
|
||||
}
|
||||
|
||||
# Ajouter les paramètres optionnels s'ils sont définis
|
||||
if self.params.get("logprobs", False):
|
||||
payload["logprobs"] = True
|
||||
|
||||
if self.params.get("top_logprobs", 0) > 0:
|
||||
payload["top_logprobs"] = self.params.get("top_logprobs")
|
||||
|
||||
if self.params.get("tool_choice", ""):
|
||||
payload["tool_choice"] = self.params.get("tool_choice")
|
||||
|
||||
return payload
|
||||
|
||||
def _traiter_reponse(self, reponse: requests.Response) -> str:
|
||||
"""
|
||||
Traite la réponse de l'API DeepSeek pour en extraire le texte généré
|
||||
|
||||
Args:
|
||||
reponse: Objet Response de la requête HTTP
|
||||
|
||||
Returns:
|
||||
Texte généré par le modèle
|
||||
"""
|
||||
data = reponse.json()
|
||||
return data["choices"][0]["message"]["content"]
|
||||
|
||||
def interroger_avec_image(self, image_path: str, question: str) -> str:
|
||||
"""
|
||||
Ce modèle ne supporte pas directement l'analyse d'images, cette méthode est fournie
|
||||
pour la compatibilité avec l'interface BaseLLM mais utilise uniquement le texte.
|
||||
|
||||
Args:
|
||||
image_path: Chemin vers l'image à analyser (ignoré par ce modèle)
|
||||
question: Question ou instructions pour l'analyse
|
||||
|
||||
Returns:
|
||||
Réponse du modèle à la question, en indiquant que l'analyse d'image n'est pas supportée
|
||||
"""
|
||||
image_name = os.path.basename(image_path)
|
||||
prompt = f"""[Note: Ce modèle n'a pas accès à l'image demandée: {image_name}]
|
||||
|
||||
Question concernant l'image:
|
||||
{question}
|
||||
|
||||
Veuillez noter que je ne peux pas traiter directement les images. Voici une réponse basée uniquement sur le texte de la question."""
|
||||
|
||||
return self.interroger(prompt)
|
||||
@ -0,0 +1,33 @@
|
||||
{
|
||||
"id": "5391",
|
||||
"code": "T5409",
|
||||
"name": "Gestion des utilisateurs",
|
||||
"description": "Point particulier :- **Le cas est bloquant**\nDescription du problème :\nBonjour\n\nGuillaume Lucas ne parvient jamais à enregistrer un échantillon, j'ai l'impression que c'est un problème d'attribution ou autre chose de ce genre et je ne le vois pas sur la liste des utilisateurs\n\nje vous remercie d'avance\n\ncordialement",
|
||||
"project_name": "Demandes",
|
||||
"stage_name": "Clôturé",
|
||||
"user_id": "",
|
||||
"partner_id_email_from": "CONSEIL DEPARTEMENTAL DU VAUCLUSE (84), Frédéric MORALES, frederic.morales@vaucluse.fr",
|
||||
"create_date": "01/08/2022 09:58:54",
|
||||
"write_date_last_modification": "03/10/2024 13:10:50",
|
||||
"date_deadline": "16/08/2022 00:00:00",
|
||||
"messages": [
|
||||
{
|
||||
"author_id": "Youness BENDEQ",
|
||||
"date": "01/08/2022 12:11:03",
|
||||
"message_type": "E-mail",
|
||||
"subject": "Re: [T5409] - Gestion des utilisateurs",
|
||||
"id": "121940",
|
||||
"content": "Bonjour Frédéric,\nJe te contacte pour donner suite à ta demande concernant :\nBonjour Guillaume Lucas ne parvient jamais à enregistrer un échantillon, j'ai l'impression que c'est un problème d'attribution ou autre chose de ce genre et je ne le vois pas sur la liste des utilisateurs je vous remercie d'avance cordialement\nJe viens de corriger ton problème en lui affectant un laboratoire principal :\nRestant à votre disposition pour tout renseignement complémentaire.\nCordialement,\nYouness BENDEQ\nSupport technique - Chargé de clientèle\nL'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes.\nNotre service est ouvert du lundi au vendredi de\n9h à 12h et de 14h à 18h. Dès réception, un technicien prendra\nen charge votre demande et au besoin vous rappellera.\nConfidentialité : Ce courriel contient des\ninformations confidentielles exclusivement réservées au\ndestinataire mentionné. Si vous deviez recevoir cet e-mail par\nerreur, merci d’en avertir immédiatement l’expéditeur et de le\nsupprimer de votre système informatique. Au cas où vous ne\nseriez pas destinataire de ce message, veuillez noter que sa\ndivulgation, sa copie ou tout acte en rapport avec la\ncommunication du contenu des informations est strictement\ninterdit.\n\n- image.png (image/png) [ID: 86417]\n\n---\n\n"
|
||||
},
|
||||
{
|
||||
"author_id": "Frédéric MORALES",
|
||||
"date": "01/08/2022 14:33:18",
|
||||
"message_type": "E-mail",
|
||||
"subject": "RE: [COMMERCIAL]:Re: [T5409] - Gestion des utilisateurs",
|
||||
"id": "122020",
|
||||
"content": "Bonjour\nEffectivement je sentais un problème de ce genre, mais je ne savais pas où le dénicher, je te remercie vivement\nBonne fin d’après-midi\nFrédéric Moralès\nConseil Départemental de Vaucluse\nResponsable du laboratoire routier\nTel : 04 32 40 45 45 et 06 32 89 69 50\nVoir\nTâche\nBonjour Frédéric,\nJe te contacte pour donner suite à ta demande concernant :\nBonjour Guillaume Lucas ne parvient jamais à enregistrer un échantillon, j'ai l'impression que c'est un problème d'attribution ou autre chose de ce genre et\nje ne le vois pas sur la liste des utilisateurs je vous remercie d'avance cordialement\nJe viens de corriger ton problème en lui affectant un laboratoire principal :\nRestant à votre disposition pour tout renseignement complémentaire.\nCordialement,\nSupport technique - Chargé de clientèle\nsupport@cbao.fr\nL'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions\nd'amélioration de nos logiciels ou de nos méthodes.\nNotre 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.\nConfidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur,\nmerci 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\ninformations est strictement interdit.\nEnvoyé par\nCBAO S.A.R.L. .\n\n---\n"
|
||||
}
|
||||
],
|
||||
"date_d'extraction": "10/04/2025 15:25:31",
|
||||
"répertoire": "output/ticket_T5409/T5409_20250410_152530"
|
||||
}
|
||||
@ -0,0 +1,106 @@
|
||||
# Ticket T5409: Gestion des utilisateurs
|
||||
|
||||
## Informations du ticket
|
||||
|
||||
- **id**: 5391
|
||||
- **code**: T5409
|
||||
- **name**: Gestion des utilisateurs
|
||||
- **project_name**: Demandes
|
||||
- **stage_name**: Clôturé
|
||||
- **user_id**:
|
||||
- **partner_id/email_from**: CONSEIL DEPARTEMENTAL DU VAUCLUSE (84), Frédéric MORALES, frederic.morales@vaucluse.fr
|
||||
- **create_date**: 01/08/2022 09:58:54
|
||||
- **write_date/last modification**: 03/10/2024 13:10:50
|
||||
- **date_deadline**: 16/08/2022 00:00:00
|
||||
|
||||
- **description**:
|
||||
|
||||
Point particulier :- **Le cas est bloquant**
|
||||
Description du problème :
|
||||
Bonjour
|
||||
|
||||
Guillaume Lucas ne parvient jamais à enregistrer un échantillon, j'ai l'impression que c'est un problème d'attribution ou autre chose de ce genre et je ne le vois pas sur la liste des utilisateurs
|
||||
|
||||
je vous remercie d'avance
|
||||
|
||||
cordialement
|
||||
|
||||
## Messages
|
||||
|
||||
### Message 1
|
||||
**author_id**: Youness BENDEQ
|
||||
**date**: 01/08/2022 12:11:03
|
||||
**message_type**: E-mail
|
||||
**subject**: Re: [T5409] - Gestion des utilisateurs
|
||||
**id**: 121940
|
||||
Bonjour Frédéric,
|
||||
Je te contacte pour donner suite à ta demande concernant :
|
||||
Bonjour Guillaume Lucas ne parvient jamais à enregistrer un échantillon, j'ai l'impression que c'est un problème d'attribution ou autre chose de ce genre et je ne le vois pas sur la liste des utilisateurs je vous remercie d'avance cordialement
|
||||
Je viens de corriger ton problème en lui affectant un laboratoire principal :
|
||||
Restant à votre disposition pour tout renseignement complémentaire.
|
||||
Cordialement,
|
||||
Youness BENDEQ
|
||||
Support technique - Chargé de clientèle
|
||||
L'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter 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: 86417]
|
||||
|
||||
---
|
||||
|
||||
### Message 2
|
||||
**author_id**: Frédéric MORALES
|
||||
**date**: 01/08/2022 14:33:18
|
||||
**message_type**: E-mail
|
||||
**subject**: RE: [COMMERCIAL]:Re: [T5409] - Gestion des utilisateurs
|
||||
**id**: 122020
|
||||
Bonjour
|
||||
Effectivement je sentais un problème de ce genre, mais je ne savais pas où le dénicher, je te remercie vivement
|
||||
Bonne fin d’après-midi
|
||||
Frédéric Moralès
|
||||
Conseil Départemental de Vaucluse
|
||||
Responsable du laboratoire routier
|
||||
Tel : 04 32 40 45 45 et 06 32 89 69 50
|
||||
**De :** support@cbao.fr [mailto:support@cbao.fr]
|
||||
**Envoyé :** lundi 1 août 2022 14:11
|
||||
**À :** Morales Frederic <frederic.morales@vaucluse.fr>
|
||||
**Objet :** [COMMERCIAL]:Re: [T5409] - Gestion des utilisateurs
|
||||
Voir
|
||||
Tâche
|
||||
Bonjour Frédéric,
|
||||
Je te contacte pour donner suite à ta demande concernant :
|
||||
Bonjour Guillaume Lucas ne parvient jamais à enregistrer un échantillon, j'ai l'impression que c'est un problème d'attribution ou autre chose de ce genre et
|
||||
je ne le vois pas sur la liste des utilisateurs je vous remercie d'avance cordialement
|
||||
Je viens de corriger ton problème en lui affectant un laboratoire principal :
|
||||
Restant à votre disposition pour tout renseignement complémentaire.
|
||||
Cordialement,
|
||||
**Youness BENDEQ**
|
||||
Support technique - Chargé de clientèle
|
||||
support@cbao.fr
|
||||
L'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter 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.
|
||||
Envoyé par
|
||||
CBAO S.A.R.L. .
|
||||
|
||||
---
|
||||
|
||||
## Informations sur l'extraction
|
||||
|
||||
- **Date d'extraction**: 10/04/2025 15:25:31
|
||||
- **Répertoire**: output/ticket_T5409/T5409_20250410_152530
|
||||
259
output/ticket_T5409/T5409_20250410_152530/all_messages.json
Normal file
259
output/ticket_T5409/T5409_20250410_152530/all_messages.json
Normal file
File diff suppressed because one or more lines are too long
255
output/ticket_T5409/T5409_20250410_152530/all_messages.txt
Normal file
255
output/ticket_T5409/T5409_20250410_152530/all_messages.txt
Normal file
@ -0,0 +1,255 @@
|
||||
TICKET: T5409 - Gestion des utilisateurs
|
||||
Date d'extraction: 2025-04-10 15:25:31
|
||||
Nombre de messages: 6
|
||||
|
||||
================================================================================
|
||||
|
||||
********************************************************************************
|
||||
*** CHANGEMENT D'ÉTAT ***
|
||||
********************************************************************************
|
||||
|
||||
DATE: 2022-08-01 09:58:55
|
||||
DE: Inconnu
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
********************************************************************************
|
||||
*** CHANGEMENT D'ÉTAT ***
|
||||
********************************************************************************
|
||||
|
||||
DATE: 2022-08-01 10:00:50
|
||||
DE: Fabien LAFAY
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
DATE: 2022-08-01 12:11:03
|
||||
DE: Youness BENDEQ
|
||||
OBJET: Re: [T5409] - Gestion des utilisateurs
|
||||
|
||||
Bonjour Frédéric,
|
||||
|
||||
Je te contacte pour donner suite à ta demande concernant :
|
||||
Bonjour Guillaume Lucas ne parvient jamais à enregistrer un échantillon, j'ai l'impression que c'est un problème d'attribution ou autre chose de ce genre et je ne le vois pas sur la liste des utilisateurs je vous remercie d'avance cordialement
|
||||
Je viens de corriger ton problème en lui affectant un laboratoire principal :
|
||||
|
||||
Restant à votre disposition pour tout renseignement complémentaire.
|
||||
|
||||
Cordialement,
|
||||
|
||||
Youness BENDEQ
|
||||
|
||||
|
||||
Support technique - Chargé de clientèle
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
L'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter 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: 2022-08-01 12:11:06
|
||||
DE: Youness BENDEQ
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
********************************************************************************
|
||||
*** MESSAGE TRANSFÉRÉ ***
|
||||
********************************************************************************
|
||||
|
||||
DATE: 2022-08-01 14:33:18
|
||||
DE: Frédéric MORALES
|
||||
OBJET: RE: [COMMERCIAL]:Re: [T5409] - Gestion des utilisateurs
|
||||
|
||||
Bonjour
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Effectivement je sentais un problème de ce genre, mais je ne savais pas où le dénicher, je te remercie vivement
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Bonne fin d’après-midi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Frédéric Moralès
|
||||
|
||||
|
||||
|
||||
Conseil Départemental de Vaucluse
|
||||
|
||||
|
||||
|
||||
Responsable du laboratoire routier
|
||||
|
||||
|
||||
|
||||
Tel : 04 32 40 45 45 et 06 32 89 69 50
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
**De :** support@cbao.fr [mailto:support@cbao.fr]
|
||||
|
||||
|
||||
**Envoyé :** lundi 1 août 2022 14:11
|
||||
|
||||
**À :** Morales Frederic
|
||||
|
||||
**Objet :** [COMMERCIAL]:Re: [T5409] - Gestion des utilisateurs
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Voir
|
||||
Tâche
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Bonjour Frédéric,
|
||||
|
||||
|
||||
|
||||
Je te contacte pour donner suite à ta demande concernant :
|
||||
|
||||
|
||||
|
||||
|
||||
Bonjour Guillaume Lucas ne parvient jamais à enregistrer un échantillon, j'ai l'impression que c'est un problème d'attribution ou autre chose de ce genre et
|
||||
je ne le vois pas sur la liste des utilisateurs je vous remercie d'avance cordialement
|
||||
|
||||
|
||||
|
||||
|
||||
Je viens de corriger ton problème en lui affectant un laboratoire principal :
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Restant à votre disposition pour tout renseignement complémentaire.
|
||||
|
||||
|
||||
|
||||
Cordialement,
|
||||
|
||||
|
||||
|
||||
**Youness BENDEQ**
|
||||
|
||||
|
||||
Support technique - Chargé de clientèle
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
support@cbao.fr
|
||||
|
||||
|
||||
|
||||
L'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter 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.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Envoyé par
|
||||
CBAO S.A.R.L. .
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
********************************************************************************
|
||||
*** CHANGEMENT D'ÉTAT ***
|
||||
********************************************************************************
|
||||
|
||||
DATE: 2022-08-01 14:44:44
|
||||
DE: Youness BENDEQ
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 69 KiB |
BIN
output/ticket_T5409/T5409_20250410_152530/attachments/image.png
Normal file
BIN
output/ticket_T5409/T5409_20250410_152530/attachments/image.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
@ -0,0 +1,35 @@
|
||||
[
|
||||
{
|
||||
"id": 86417,
|
||||
"name": "image.png",
|
||||
"mimetype": "image/png",
|
||||
"file_size": 84713,
|
||||
"create_date": "2022-08-01 12:11:03",
|
||||
"create_uid": [
|
||||
9,
|
||||
"Youness BENDEQ"
|
||||
],
|
||||
"description": false,
|
||||
"res_name": "[T5409] Gestion des utilisateurs",
|
||||
"creator_name": "Youness BENDEQ",
|
||||
"creator_id": 9,
|
||||
"download_status": "success",
|
||||
"local_path": "output/ticket_T5409/T5409_20250410_152530/attachments/image.png",
|
||||
"error": ""
|
||||
},
|
||||
{
|
||||
"id": 86415,
|
||||
"name": "Capture.JPG",
|
||||
"mimetype": "image/jpeg",
|
||||
"file_size": 70836,
|
||||
"create_date": "2022-08-01 09:58:56",
|
||||
"create_uid": false,
|
||||
"description": "Capture",
|
||||
"res_name": "[T5409] Gestion des utilisateurs",
|
||||
"creator_name": "False",
|
||||
"creator_id": false,
|
||||
"download_status": "success",
|
||||
"local_path": "output/ticket_T5409/T5409_20250410_152530/attachments/Capture.JPG",
|
||||
"error": ""
|
||||
}
|
||||
]
|
||||
9
output/ticket_T5409/T5409_20250410_152530/followers.json
Normal file
9
output/ticket_T5409/T5409_20250410_152530/followers.json
Normal file
@ -0,0 +1,9 @@
|
||||
[
|
||||
{
|
||||
"id": 45066,
|
||||
"partner_id": [
|
||||
6220,
|
||||
"CONSEIL DEPARTEMENTAL DU VAUCLUSE (84), Frédéric MORALES"
|
||||
]
|
||||
}
|
||||
]
|
||||
241
output/ticket_T5409/T5409_20250410_152530/messages_raw.json
Normal file
241
output/ticket_T5409/T5409_20250410_152530/messages_raw.json
Normal file
File diff suppressed because one or more lines are too long
20
output/ticket_T5409/T5409_20250410_152530/structure.json
Normal file
20
output/ticket_T5409/T5409_20250410_152530/structure.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"date_extraction": "2025-04-10T15:25:31.901095",
|
||||
"ticket_id": 5391,
|
||||
"ticket_code": "T5409",
|
||||
"ticket_name": "Gestion des utilisateurs",
|
||||
"output_dir": "output/ticket_T5409/T5409_20250410_152530",
|
||||
"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": 6,
|
||||
"attachments_count": 2
|
||||
}
|
||||
}
|
||||
56
output/ticket_T5409/T5409_20250410_152530/ticket_info.json
Normal file
56
output/ticket_T5409/T5409_20250410_152530/ticket_info.json
Normal file
@ -0,0 +1,56 @@
|
||||
{
|
||||
"id": 5391,
|
||||
"name": "Gestion des utilisateurs",
|
||||
"description": "<h1>Point particulier :</h1><ul><li><b>Le cas est bloquant</b></li></ul><h1>Description du problème :</h1><p>Bonjour\n\nGuillaume Lucas ne parvient jamais à enregistrer un échantillon, j'ai l'impression que c'est un problème d'attribution ou autre chose de ce genre et je ne le vois pas sur la liste des utilisateurs\n\nje vous remercie d'avance\n\ncordialement</p>",
|
||||
"stage_id": [
|
||||
8,
|
||||
"Clôturé"
|
||||
],
|
||||
"project_id": [
|
||||
3,
|
||||
"Demandes"
|
||||
],
|
||||
"partner_id": [
|
||||
6220,
|
||||
"CONSEIL DEPARTEMENTAL DU VAUCLUSE (84), Frédéric MORALES"
|
||||
],
|
||||
"user_id": [
|
||||
9,
|
||||
"Youness BENDEQ"
|
||||
],
|
||||
"date_start": "2022-08-01 09:58:54",
|
||||
"date_end": false,
|
||||
"date_deadline": "2022-08-16",
|
||||
"create_date": "2022-08-01 09:58:54",
|
||||
"write_date": "2024-10-03 13:10:50",
|
||||
"tag_ids": [
|
||||
15
|
||||
],
|
||||
"priority": "3",
|
||||
"email_from": "frederic.morales@vaucluse.fr",
|
||||
"email_cc": "guillaume.lucas@vaucluse.fr",
|
||||
"message_ids": [
|
||||
122025,
|
||||
122020,
|
||||
121942,
|
||||
121941,
|
||||
121940,
|
||||
121937,
|
||||
121935,
|
||||
121929
|
||||
],
|
||||
"message_follower_ids": [
|
||||
45066
|
||||
],
|
||||
"timesheet_ids": [],
|
||||
"attachment_ids": [
|
||||
86415
|
||||
],
|
||||
"stage_id_name": "Clôturé",
|
||||
"project_id_name": "Demandes",
|
||||
"partner_id_name": "CONSEIL DEPARTEMENTAL DU VAUCLUSE (84), Frédéric MORALES",
|
||||
"user_id_name": "Youness BENDEQ",
|
||||
"tag_names": [
|
||||
"BRG-LAB WEB"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
{
|
||||
"id": 5391,
|
||||
"code": "T5409",
|
||||
"name": "Gestion des utilisateurs",
|
||||
"description": "<h1>Point particulier :</h1><ul><li><b>Le cas est bloquant</b></li></ul><h1>Description du problème :</h1><p>Bonjour\n\nGuillaume Lucas ne parvient jamais à enregistrer un échantillon, j'ai l'impression que c'est un problème d'attribution ou autre chose de ce genre et je ne le vois pas sur la liste des utilisateurs\n\nje vous remercie d'avance\n\ncordialement</p>",
|
||||
"stage": "Clôturé",
|
||||
"project": "Demandes",
|
||||
"partner": "CONSEIL DEPARTEMENTAL DU VAUCLUSE (84), Frédéric MORALES",
|
||||
"assigned_to": "Youness BENDEQ",
|
||||
"tags": [
|
||||
"BRG-LAB WEB"
|
||||
],
|
||||
"create_date": "2022-08-01 09:58:54",
|
||||
"write_date": "2024-10-03 13:10:50",
|
||||
"deadline": "2022-08-16"
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
,PC-DEV/PCDEV,PC-DEV,10.04.2025 15:38,file:///C:/Users/PCDEV/AppData/Roaming/LibreOffice/4;
|
||||
@ -0,0 +1 @@
|
||||
,PC-DEV/PCDEV,PC-DEV,10.04.2025 15:37,file:///C:/Users/PCDEV/AppData/Roaming/LibreOffice/4;
|
||||
@ -0,0 +1,4 @@
|
||||
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'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'. 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) configuration de la validité des utilisateurs, (2) filtrage des utilisateurs en fonction de leur laboratoire et de leur validité, (3) affectation des utilisateurs à des laboratoires principaux et secondaires. Ces interfaces complémentaires illustrent le cycle complet de gestion des utilisateurs."
|
||||
|
@ -0,0 +1,3 @@
|
||||
Question,Réponse
|
||||
Pourquoi tous les utilisateurs ne s'affichent-ils pas dans la gestion des utilisateurs ?,"[RÉPONSE] Veuillez vérifier les paramètres 'Affiche les laboratoires secondaires' et 'Affiche les utilisateurs non valides'.
|
||||
[COMPLÉMENT VISUEL] L'analyse des captures d'écran confirme visuellement le processus complet : (1) vérifier la case à cocher 'Utilisateur valide', (2) vérifier la case à cocher 'Affiche les laboratoires secondaires', (3) vérifier les options sélectionnées pour les laboratoires principaux et secondaires. Ces interfaces complémentaires illustrent le cycle complet de résolution du problème."
|
||||
|
File diff suppressed because one or more lines are too long
@ -19,83 +19,64 @@ _Vue d'ensemble du processus d'analyse automatisé_
|
||||
**Statistiques:**
|
||||
- Images totales: 3
|
||||
- Images pertinentes: 3
|
||||
- Temps de génération: 59.59 secondes
|
||||
- Temps de génération: 61.52 secondes
|
||||
|
||||
## 1. Analyse du ticket
|
||||
|
||||
_Agent utilisé: `AgentTicketAnalyser` - Analyse du contenu du ticket_
|
||||
|
||||
```
|
||||
### 1. Résumé du contexte
|
||||
### Synthèse du Ticket T9656: Gestion des utilisateurs
|
||||
|
||||
#### Client
|
||||
- **Nom** : Christophe SAUVAGET
|
||||
- **Email** : christophe.sauvaget@chausson.fr
|
||||
- **user_id** : Non disponible
|
||||
#### 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 parvient pas à voir tous les utilisateurs dans l'interface de gestion des utilisateurs.
|
||||
|
||||
#### 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 ?
|
||||
#### 2. Identification du client
|
||||
- **Nom et email du demandeur**: Christophe SAUVAGET, christophe.sauvaget@chausson.fr
|
||||
- **User ID**: Non mentionné
|
||||
|
||||
#### Description technique synthétique
|
||||
- Le client signale que dans le menu "Mes paramètres - Gestion des utilisateurs", tous les utilisateurs n'apparaissent pas. Il demande comment faire pour les faire tous apparaître. Le problème concerne tous les laboratoires et n'est pas bloquant.
|
||||
#### 3. Informations techniques à extraire
|
||||
- **Logiciels, modules, interfaces mentionnées**:
|
||||
- Interface "Mes paramètres - Gestion des utilisateurs"
|
||||
- **Paramètres visibles ou évoqués**:
|
||||
- Laboratoire principal assigné
|
||||
- Option "Affiche les laboratoires secondaires"
|
||||
- Option "Affiche les utilisateurs non valides"
|
||||
- Filtres sur les colonnes
|
||||
- État de validation des comptes (valides/invalides)
|
||||
- **Conditions spécifiques**:
|
||||
- Multi-laboratoire
|
||||
- **Références à des documents, normes ou configurations**:
|
||||
- Manuel d'utilisation
|
||||
- FAQ
|
||||
|
||||
### 2. Informations techniques détectées
|
||||
#### 4. Synthèse du fil de discussion
|
||||
- **Message 1 - [AUTRE] De: Inconnu - Date: 04/07/2024 13:03:58**
|
||||
- **Client**: Bonjour, dans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre? Merci.
|
||||
- **Support**:
|
||||
- Si un utilisateur n'apparait pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné.
|
||||
- Cochez la case "Affiche les laboratoires secondaires" pour le voir.
|
||||
- Utilisez les filtres sur les colonnes si besoin pour retrouver l'utilisateur et l'éditer.
|
||||
- Vérifiez si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas.
|
||||
- Un utilisateur peut ne pas apparaitre s'il a été dévalidé. Cochez la case "Affiche les utilisateurs non valides" pour le voir (en grisé).
|
||||
- Rendez-le à nouveau valide en l'éditant.
|
||||
|
||||
#### Logiciels/modules mentionnés
|
||||
- Menu "Mes paramètres - Gestion des utilisateurs"
|
||||
|
||||
#### Paramètres évoqués
|
||||
- Utilisateurs valides/invalides
|
||||
- Filtres sur les colonnes
|
||||
- Case "Affiche les laboratoires secondaires"
|
||||
- Case "Affiche les utilisateurs non valides"
|
||||
- Case "Utilisateur valide"
|
||||
|
||||
#### Fonctionnalités impactées
|
||||
- Affichage des utilisateurs dans la liste
|
||||
- Validité des utilisateurs
|
||||
- Assignation des laboratoires principaux et secondaires
|
||||
|
||||
#### Conditions spécifiques
|
||||
- Multi-laboratoire : tous
|
||||
- Utilisateurs non valides
|
||||
|
||||
### 3. Fil de discussion (filtrée, nettoyée, classée)
|
||||
|
||||
#### Message 1 - [SUPPORT] De: Inconnu - Date: 04/07/2024 13:03:58
|
||||
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
|
||||
|
||||
### 4. Éléments liés à l'analyse visuelle
|
||||
|
||||
#### Nombre d'images attachées
|
||||
- 3 images attachées (image.png avec IDs : 129046, 129044, 129042)
|
||||
|
||||
#### 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
|
||||
|
||||
#### Points à vérifier dans les captures
|
||||
- Liste des utilisateurs affichée
|
||||
- Présence des cases à cocher "Affiche les laboratoires secondaires" et "Affiche les utilisateurs non valides"
|
||||
- Utilisateurs grisés dans la liste
|
||||
- Filtres sur les colonnes disponibles
|
||||
- Fiche de l'utilisateur avec l'option "Utilisateur valide"
|
||||
#### 5. Préparation à l'analyse visuelle
|
||||
- **Captures d'écran présentes**: 3 captures d'écran
|
||||
- **Éléments liés aux options, interfaces ou comportements cités**:
|
||||
- Bouton "Affiche les laboratoires secondaires"
|
||||
- Bouton "Affiche les utilisateurs non valides"
|
||||
- Liste des utilisateurs
|
||||
- Champs de filtres sur les colonnes
|
||||
- État de validation des comptes (valides/invalides)
|
||||
- **Éléments à observer**:
|
||||
- Vérifier si l'option "Affiche les laboratoires secondaires" est cochée.
|
||||
- Vérifier si l'option "Affiche les utilisateurs non valides" est cochée.
|
||||
- Observer la liste des utilisateurs pour voir s'ils sont tous affichés.
|
||||
- Vérifier les filtres actifs sur les colonnes.
|
||||
- Identifier les utilisateurs invalides et leur état.
|
||||
```
|
||||
|
||||
## 2. Tri des images
|
||||
@ -120,44 +101,48 @@ _Agent utilisé: `AgentImageAnalyser` - Analyse détaillée des captures d'écra
|
||||
L'image montre une interface logicielle intitulée **"Mes paramètres - Gestion des utilisateurs"**. Elle est divisée en plusieurs sections :
|
||||
|
||||
- **Section "Connexion"** :
|
||||
- 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 rouge sous la photo.
|
||||
- Une zone pour déposer une photo de profil est visible avec le texte **"Déposez votre photo ici"**.
|
||||
- Deux liens sont présents : **"Modifier la photo"** et **"SUPPRIMER PHOTO"** (en rouge).
|
||||
- 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 intitulée **"Utilisateur valide"** est visible, avec une bordure rouge autour d'elle.
|
||||
- Une autre case à cocher **"Mot de passe à saisir à la prochaine connexion"** est située en dessous.
|
||||
- Une case à cocher est visible avec le libellé **"Utilisateur valide"**, entourée en rouge.
|
||||
- Une autre case à cocher est présente avec le texte **"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 présent en bas de l'interface.
|
||||
- Un bouton bleu en bas de l'écran indique **"OBTENIR L'APPLICATION BRG-LAB MOBILE"**.
|
||||
|
||||
#### 2. Éléments techniques clés
|
||||
- **Paramètres configurables** :
|
||||
- Case à cocher **"Utilisateur valide"** (coché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.
|
||||
- Bouton **"Modifier la photo"** et lien **"SUPPRIMER PHOTO"**.
|
||||
- Champs de texte **"Login"** et **"Mot de passe"** (valeurs masquées).
|
||||
|
||||
- **Éléments désactivés ou grisés** :
|
||||
- Aucun élément n'est visiblement grisé ou désactivé dans cette capture.
|
||||
- Aucun élément n'est visiblement grisé ou désactivé.
|
||||
|
||||
- **Boutons actifs/inactifs** :
|
||||
- Le bouton **"OBTENIR L'APPLICATION BRG-LAB MOBILE"** est actif et cliquable.
|
||||
|
||||
- **Autres éléments** :
|
||||
- Les champs **"Login"** et **"Mot de passe"** sont présents mais masqués.
|
||||
- Bouton **"FERMER"** (actif, en haut à gauche).
|
||||
- Bouton **"ENREGISTRER"** (actif, en haut à droite).
|
||||
- Bouton **"OBTENIR L'APPLICATION BRG-LAB MOBILE"** (actif, en bas).
|
||||
|
||||
#### 3. Éléments mis en évidence
|
||||
- La case à cocher **"Utilisateur valide"** est entourée d'une bordure rouge.
|
||||
- Le lien **"SUPPRIMER PHOTO"** est en texte rouge, ce qui le distingue des autres éléments.
|
||||
- La case à cocher **"Utilisateur valide"** est entourée en rouge.
|
||||
- Le texte **"SUPPRIMER PHOTO"** est en rouge, indiquant une action importante ou critique.
|
||||
|
||||
#### 4. Relation avec le problème
|
||||
L'image montre une interface liée à la gestion des utilisateurs, avec une mise en évidence de la case **"Utilisateur valide"**. Cet élément est directement lié au problème décrit dans le ticket, où il est question de la validité des utilisateurs et de leur affichage dans la liste.
|
||||
- L'image montre une interface de gestion des utilisateurs, ce qui correspond au contexte du ticket.
|
||||
- La case à cocher **"Utilisateur valide"** est directement liée à la problématique des utilisateurs non visibles, car elle permet de définir si un utilisateur est valide ou non.
|
||||
- L'absence d'autres utilisateurs dans cette capture ne permet pas de vérifier si tous les utilisateurs sont affichés.
|
||||
|
||||
#### 5. Réponses potentielles
|
||||
L'image apporte des éléments de réponse à la question **"Pourquoi certains utilisateurs n'apparaissent-ils pas dans la liste ?"** en montrant l'option **"Utilisateur valide"**, qui pourrait être liée à l'affichage ou non des utilisateurs dans la liste.
|
||||
- L'image montre que l'option **"Utilisateur valide"** est cochée, ce qui pourrait indiquer que l'utilisateur affiché est valide.
|
||||
- Elle ne répond pas directement à la question de savoir pourquoi tous les utilisateurs n'apparaissent pas, mais elle met en évidence un paramètre clé (validation de l'utilisateur).
|
||||
|
||||
#### 6. Lien avec la discussion
|
||||
L'image fait écho à la discussion dans le fil de support, notamment à l'étape où il est mentionné de cocher la case **"Utilisateur valide"** pour rendre un utilisateur visible dans la liste. La mise en évidence de cette case correspond à une étape décrite dans le message du support.
|
||||
- L'image correspond à l'interface **"Mes paramètres - Gestion des utilisateurs"** mentionnée dans le fil de discussion.
|
||||
- La case à cocher **"Utilisateur valide"** est directement liée à l'instruction du support : "Cochez la case 'Affiche les utilisateurs non valides' pour le voir (en grisé)."
|
||||
- L'image ne montre pas les options **"Affiche les laboratoires secondaires"** ou **"Affiche les utilisateurs non valides"**, mais elle met en évidence un paramètre lié à la validation des utilisateurs.
|
||||
|
||||
### Image 2: image_2.png
|
||||
|
||||
@ -168,36 +153,46 @@ L'image montre une interface logicielle intitulée **"Mes paramètres - Gestion
|
||||
- **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 comme "Formulation de béton, ingénieur, Responsable national, Opérateur".
|
||||
|
||||
Au-dessus de la liste, trois boutons sont visibles :
|
||||
- **NOUVEAU**
|
||||
- **MODIFIER**
|
||||
- **SUPPRIMER**
|
||||
Au-dessus de la liste, il y a trois boutons :
|
||||
- **NOUVEAU** (bleu)
|
||||
- **MODIFIER** (bleu)
|
||||
- **SUPPRIMER** (bleu)
|
||||
|
||||
Deux cases à cocher sont présentes en haut à droite de l'interface :
|
||||
À droite des boutons, deux cases à cocher sont visibles :
|
||||
- **"Affiche les laboratoires secondaires"** (cochée et entourée en rouge)
|
||||
- **"Affiche les utilisateurs non valides"** (non cochée)
|
||||
|
||||
La liste des utilisateurs affiche les informations suivantes :
|
||||
1. **CHAUSSON MATERIAUX : CAMBOUNET SUR LE SOR**
|
||||
- Login : russoloa
|
||||
- Nom : RUSSOLO Arnaud
|
||||
- Description : Formulation de béton, ingénieur, Responsable national, Opérateur
|
||||
2. **CHAUSSON MATERIAUX : CAVAILLON**
|
||||
- Login : sabatiep
|
||||
- Nom : SABATIE Peter
|
||||
- Description : Formulation de béton, ingénieur, Responsable national, Opérateur
|
||||
3. **CHAUSSON MATERIAUX : CAZERES SUR GARONNE**
|
||||
- Login : Non visible (tronqué)
|
||||
- Nom : Non visible (tronqué)
|
||||
- Description : Administrateur, Formulateur de béton
|
||||
|
||||
#### 2. Éléments techniques clés
|
||||
- **Modules ou versions logicielles** : Aucune version logicielle n'est visible dans l'image.
|
||||
- **Codes d'erreur** : Aucun code d'erreur n'est visible.
|
||||
- **Boutons actifs** :
|
||||
- **NOUVEAU**
|
||||
- **MODIFIER**
|
||||
- **SUPPRIMER**
|
||||
|
||||
- **Paramètres configurables** :
|
||||
- Deux cases à cocher :
|
||||
- **"Affiche les laboratoires secondaires"** (cochée)
|
||||
- **"Affiche les utilisateurs non valides"** (non cochée)
|
||||
- Les colonnes de la liste semblent triables ou filtrables (flèches visibles en haut des colonnes).
|
||||
- Case à cocher **"Affiche les laboratoires secondaires"** (cochée)
|
||||
- Case à cocher **"Affiche les utilisateurs non valides"** (non cochée)
|
||||
|
||||
- **Éléments désactivés ou grisés** :
|
||||
- Aucun élément grisé ou désactivé n'est visible dans l'image.
|
||||
|
||||
- **Valeurs affichées** :
|
||||
- Les utilisateurs listés sont :
|
||||
- **RUSSOLOA Arnaud** (Login : russoloa)
|
||||
- **SABATIE Peter** (Login : sabatiep)
|
||||
- Les laboratoires associés sont :
|
||||
- **CHAUSSON MATERIAUX : CAMBOUNET SUR LE SOR**
|
||||
- **CHAUSSON MATERIAUX : CAVAILLON**
|
||||
- **CHAUSSON MATERIAUX : CAZERES SUR GARONNE**
|
||||
- **Éléments désactivés ou grisés** : Aucun élément grisé ou désactivé n'est visible.
|
||||
- **Boutons actifs/inactifs** :
|
||||
- Les boutons **NOUVEAU**, **MODIFIER** et **SUPPRIMER** sont actifs.
|
||||
- Les utilisateurs sont listés avec leurs laboratoires, logins, noms et descriptions.
|
||||
- Les descriptions des utilisateurs incluent des rôles comme "Formulation de béton", "Ingénieur", "Responsable national", "Opérateur", et "Administrateur".
|
||||
|
||||
#### 3. Éléments mis en évidence
|
||||
- La case à cocher **"Affiche les laboratoires secondaires"** est entourée en rouge.
|
||||
@ -206,102 +201,121 @@ Deux cases à cocher sont présentes en haut à droite de l'interface :
|
||||
#### 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 cochée, ce qui pourrait influencer l'affichage des utilisateurs.
|
||||
- La case à cocher **"Affiche les utilisateurs non valides"** est non cochée, ce qui pourrait expliquer pourquoi certains utilisateurs n'apparaissent pas.
|
||||
- La liste des utilisateurs affiche des informations sur les laboratoires principaux et secondaires.
|
||||
- La case à cocher **"Affiche les utilisateurs non valides"** n'est pas cochée, ce qui pourrait expliquer pourquoi certains utilisateurs ne s'affichent pas.
|
||||
- La liste des utilisateurs est partiellement visible, mais certains champs sont tronqués, ce qui pourrait indiquer un problème d'affichage ou de filtrage.
|
||||
|
||||
#### 5. Réponses potentielles
|
||||
L'image apporte des éléments de réponse aux questions posées dans le ticket :
|
||||
- Elle montre l'interface où les utilisateurs sont listés.
|
||||
- Elle met en évidence les options **"Affiche les laboratoires secondaires"** et **"Affiche les utilisateurs non valides"**, qui sont directement liées à l'affichage des utilisateurs.
|
||||
- Elle confirme que la case **"Affiche les laboratoires secondaires"** est cochée, ce qui pourrait expliquer pourquoi certains utilisateurs apparaissent.
|
||||
L'image apporte des éléments de réponse à la question posée dans le ticket :
|
||||
- Elle montre que l'option **"Affiche les laboratoires secondaires"** est activée, ce qui pourrait être une réponse partielle au problème d'affichage des utilisateurs.
|
||||
- Elle indique que l'option **"Affiche les utilisateurs non valides"** n'est pas activée, ce qui pourrait expliquer pourquoi certains utilisateurs ne s'affichent pas.
|
||||
|
||||
#### 6. Lien avec la discussion
|
||||
L'image fait écho aux éléments mentionnés dans le fil de discussion :
|
||||
- Elle montre l'interface **"Mes paramètres - Gestion des utilisateurs"**, comme décrit dans le ticket.
|
||||
- Elle met en évidence la case à cocher **"Affiche les laboratoires secondaires"**, qui est mentionnée dans le message du support.
|
||||
- Elle montre également la case à cocher **"Affiche les utilisateurs non valides"**, qui est également évoquée dans le fil de discussion.
|
||||
|
||||
### Conclusion
|
||||
L'image fournit une vue détaillée de l'interface **"Mes paramètres - Gestion des utilisateurs"**, mettant en évidence des éléments clés liés à l'affichage des utilisateurs. Elle montre les options permettant d'afficher les laboratoires secondaires et les utilisateurs non valides, ce qui est directement pertinent pour le problème décrit dans le ticket.
|
||||
- La case à cocher **"Affiche les laboratoires secondaires"** est visible et cochée, comme suggéré dans la réponse du support.
|
||||
- La case à cocher **"Affiche les utilisateurs non valides"** est visible mais non cochée, ce qui correspond à une des suggestions du support pour résoudre le problème.
|
||||
- La liste des utilisateurs est affichée, mais certains champs sont tronqués, ce qui pourrait être lié à un problème de filtrage ou d'affichage.
|
||||
|
||||
### Image 3: image_1.png
|
||||
|
||||
### 1. Description objective
|
||||
L'image montre une interface logicielle intitulée **"Affectation de l'utilisateur"**. Elle présente les éléments suivants :
|
||||
- Une section **"Laboratoire principal"** avec un champ de texte affichant **"CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR"**. Ce champ est accompagné d'une flèche déroulante (dropdown) à droite, indiquant qu'il est modifiable.
|
||||
- Une section **"Laboratoire(s) affilié(s)"** avec une liste intitulée **"Laboratoires de l'utilisateur"**. Cette liste contient deux éléments :
|
||||
- **CHAUSSON MATÉRIAUX**
|
||||
### 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 sélection déroulant.
|
||||
- Une section intitulée **"Laboratoire(s) affilié(s)"** contenant une liste de laboratoires.
|
||||
- Le champ de sélection déroulant du **"Laboratoire principal"** affiche le texte **"CHAUSSON MATERIAUX - CAMBOUNET SUR LE SOR"**.
|
||||
- La liste des **"Laboratoire(s) affilié(s)"** contient deux laboratoires :
|
||||
- **CHAUSSON MATERIAUX**
|
||||
- **CAMBOUNET SUR LE SOR**
|
||||
- À droite de la liste, un bouton bleu avec le texte **"Supprimer"** est visible.
|
||||
- Le champ **"Laboratoire principal"** et le nom **"CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR"** sont entourés d'un cadre rouge.
|
||||
- Un bouton intitulé **"Supprimer"** est visible à droite de la liste des laboratoires affiliés.
|
||||
|
||||
### 2. Éléments techniques clés
|
||||
- **Modules ou sections visibles** :
|
||||
- "Affectation de l'utilisateur"
|
||||
- "Laboratoire principal"
|
||||
- "Laboratoire(s) affilié(s)"
|
||||
- **Paramètres configurables** :
|
||||
- Champ de texte **"Laboratoire principal"** avec une flèche déroulante (dropdown) pour sélectionner un laboratoire.
|
||||
- Liste **"Laboratoires de l'utilisateur"** avec des éléments modifiables (ajout ou suppression possible).
|
||||
- **Boutons actifs** :
|
||||
- Bouton **"Supprimer"** à droite de la liste des laboratoires affiliés.
|
||||
- **Éléments mis en évidence** :
|
||||
- Le champ **"Laboratoire principal"** et son contenu **"CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR"** sont entourés d'un cadre rouge.
|
||||
#### 2. Éléments techniques clés
|
||||
- **Champ de sélection déroulant** : Le champ **"Laboratoire principal"** est un menu déroulant actif, permettant de sélectionner un laboratoire parmi une liste.
|
||||
- **Liste des laboratoires affiliés** : Les laboratoires **"CHAUSSON MATERIAUX"** et **"CAMBOUNET SUR LE SOR"** sont affichés sous forme de liste. Chaque laboratoire est accompagné d'une icône (probablement pour réorganiser ou supprimer).
|
||||
- **Bouton "Supprimer"** : Ce bouton est actif et situé à droite de la liste des laboratoires affiliés.
|
||||
- **Éléments interactifs** : Le champ déroulant et le bouton "Supprimer" sont interactifs.
|
||||
- **Éléments non modifiables** : Aucun élément grisé ou désactivé n'est visible dans cette image.
|
||||
|
||||
### 3. Éléments mis en évidence
|
||||
- Le champ **"Laboratoire principal"** et son contenu **"CHAUSSON MATÉRIAUX - CAMBOUNET SUR LE SOR"** sont entourés d'un cadre rouge épais.
|
||||
- Le cadre rouge attire l'attention sur cette zone spécifique de l'interface.
|
||||
#### 3. Éléments mis en évidence
|
||||
- Le champ de sélection déroulant **"Laboratoire principal"** est entouré d'un cadre rouge épais.
|
||||
- Le texte **"CHAUSSON MATERIAUX - CAMBOUNET SUR LE SOR"** est mis en évidence à l'intérieur de ce cadre.
|
||||
- La liste des **"Laboratoire(s) affilié(s)"** n'est pas mise en évidence, mais elle est clairement visible.
|
||||
|
||||
### 4. Relation avec le problème
|
||||
#### 4. Relation avec le problème
|
||||
- L'image montre l'affectation d'un utilisateur à un laboratoire principal et à des laboratoires affiliés.
|
||||
- Le champ **"Laboratoire principal"** est mis en évidence, ce qui pourrait être lié à la problématique d'affichage des utilisateurs en fonction de leur laboratoire principal ou secondaire.
|
||||
- La présence de la liste **"Laboratoires de l'utilisateur"** et du bouton **"Supprimer"** indique que les laboratoires affiliés peuvent être modifiés.
|
||||
- Le problème décrit dans le ticket concerne l'affichage des utilisateurs dans l'interface de gestion. L'image semble montrer une configuration liée à l'assignation des laboratoires, ce qui pourrait être lié à l'affichage des utilisateurs.
|
||||
- Aucun message d'erreur ou indication de problème n'est visible dans l'image.
|
||||
|
||||
### 5. Réponses potentielles
|
||||
- L'image montre comment un utilisateur est affecté à un laboratoire principal et à des laboratoires secondaires.
|
||||
- Elle pourrait apporter des éléments de réponse à la question **"Pourquoi certains utilisateurs n'apparaissent-ils pas dans la liste ?"** en illustrant l'importance de l'affectation des laboratoires.
|
||||
- Elle ne répond pas directement à la question **"Comment faire apparaître tous les utilisateurs dans le menu 'Mes paramètres - Gestion des utilisateurs' ?"**, mais elle montre un aspect technique lié à l'affectation des utilisateurs.
|
||||
#### 5. Réponses potentielles
|
||||
- L'image ne fournit pas directement de réponse au problème d'affichage des utilisateurs.
|
||||
- Elle montre cependant la configuration des laboratoires principaux et affiliés, ce qui pourrait être lié à la visibilité des utilisateurs dans l'interface de gestion.
|
||||
|
||||
### 6. Lien avec la discussion
|
||||
- L'image fait écho à la discussion sur l'affectation des laboratoires principaux et secondaires, mentionnée dans le fil de discussion (Message 1).
|
||||
- Elle illustre visuellement la possibilité de modifier l'affectation des laboratoires, ce qui est en lien avec les instructions fournies pour retrouver et éditer un utilisateur.
|
||||
- Le cadre rouge autour du champ **"Laboratoire principal"** pourrait indiquer une importance particulière de ce paramètre dans le contexte du problème.
|
||||
#### 6. Lien avec la discussion
|
||||
- L'image correspond à une étape de configuration des laboratoires, mentionnée dans le fil de discussion.
|
||||
- Le support a indiqué que l'absence de laboratoire principal pouvait expliquer l'absence d'un utilisateur dans la liste. L'image montre qu'un laboratoire principal est bien assigné dans ce cas.
|
||||
- La discussion mentionne également l'option **"Affiche les laboratoires secondaires"**, mais cette option n'est pas visible dans l'image.
|
||||
|
||||
## 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.
|
||||
- Le texte **"SUPPRIMER PHOTO"** est en rouge, indiquant une action importante ou critique.
|
||||
- Image 2: - La case à cocher **"Affiche les laboratoires secondaires"** est entourée en rouge.
|
||||
- Aucun autre élément n'est surligné, encadré ou fléché.
|
||||
- Image 3: - Le champ de sélection déroulant **"Laboratoire principal"** est entouré d'un cadre rouge épais.
|
||||
- Le texte **"CHAUSSON MATERIAUX - CAMBOUNET SUR LE SOR"** est mis en évidence à l'intérieur de ce cadre.
|
||||
- La liste des **"Laboratoire(s) affilié(s)"** n'est pas mise en évidence, mais elle est clairement visible.
|
||||
|
||||
#### Relations avec le problème
|
||||
|
||||
- Image 1: - L'image montre une interface de gestion des utilisateurs, ce qui correspond au contexte du ticket.
|
||||
- La case à cocher **"Utilisateur valide"** est directement liée à la problématique des utilisateurs non visibles, car elle permet de définir si un utilisateur est valide ou non.
|
||||
- L'absence d'autres utilisateurs dans cette capture ne permet pas de vérifier si tous les utilisateurs sont affichés.
|
||||
- Image 2: 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 cochée, ce qui pourrait influencer l'affichage des utilisateurs.
|
||||
- La case à cocher **"Affiche les utilisateurs non valides"** n'est pas cochée, ce qui pourrait expliquer pourquoi certains utilisateurs ne s'affichent pas.
|
||||
- La liste des utilisateurs est partiellement visible, mais certains champs sont tronqués, ce qui pourrait indiquer un problème d'affichage ou de filtrage.
|
||||
- Image 3: - L'image montre l'affectation d'un utilisateur à un laboratoire principal et à des laboratoires affiliés.
|
||||
- Le problème décrit dans le ticket concerne l'affichage des utilisateurs dans l'interface de gestion. L'image semble montrer une configuration liée à l'assignation des laboratoires, ce qui pourrait être lié à l'affichage des utilisateurs.
|
||||
- Aucun message d'erreur ou indication de problème n'est visible dans l'image.
|
||||
|
||||
#### Liens avec la discussion
|
||||
|
||||
- Image 1: - L'image correspond à l'interface **"Mes paramètres - Gestion des utilisateurs"** mentionnée dans le fil de discussion.
|
||||
- La case à cocher **"Utilisateur valide"** est directement liée à l'instruction du support : "Cochez la case 'Affiche les utilisateurs non valides' pour le voir (en grisé)."
|
||||
- L'image ne montre pas les options **"Affiche les laboratoires secondaires"** ou **"Affiche les utilisateurs non valides"**, mais elle met en évidence un paramètre lié à la validation des utilisateurs.
|
||||
- Image 2: L'image fait écho aux éléments mentionnés dans le fil de discussion :
|
||||
- La case à cocher **"Affiche les laboratoires secondaires"** est visible et cochée, comme suggéré dans la réponse du support.
|
||||
- La case à cocher **"Affiche les utilisateurs non valides"** est visible mais non cochée, ce qui correspond à une des suggestions du support pour résoudre le problème.
|
||||
- La liste des utilisateurs est affichée, mais certains champs sont tronqués, ce qui pourrait être lié à un problème de filtrage ou d'affichage.
|
||||
- Image 3: - L'image correspond à une étape de configuration des laboratoires, mentionnée dans le fil de discussion.
|
||||
- Le support a indiqué que l'absence de laboratoire principal pouvait expliquer l'absence d'un utilisateur dans la liste. L'image montre qu'un laboratoire principal est bien assigné dans ce cas.
|
||||
- La discussion mentionne également l'option **"Affiche les laboratoires secondaires"**, mais cette option n'est pas visible dans l'image.
|
||||
|
||||
## 4. Synthèse finale
|
||||
|
||||
_Agent utilisé: `AgentReportGenerator` - Synthèse et conclusions_
|
||||
|
||||
### 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'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'. 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) configuration de la validité des utilisateurs, (2) filtrage des utilisateurs en fonction de leur laboratoire et de leur validité, (3) affectation des utilisateurs à des laboratoires principaux et secondaires. Ces interfaces complémentaires illustrent le cycle complet de gestion des utilisateurs. |
|
||||
|
||||
### 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 le menu "Mes paramètres - Gestion des utilisateurs"
|
||||
Description du Ticket
|
||||
**Titre :** Problème de configuration de l'utilisateur dans le système ERP
|
||||
**Description :** Le client rencontre des difficultés pour configurer correctement un utilisateur dans le système ERP. Les erreurs signalées incluent des problèmes de permissions et d'accès aux modules spécifiques.
|
||||
|
||||
## Métadonnées
|
||||
|
||||
- **Date de génération**: 2025-04-10 14:59:26
|
||||
- **Modèle principal utilisé**: mistral-large-latest
|
||||
- **Date de génération**: 2025-04-10 15:39:41
|
||||
- **Modèle principal utilisé**: qwen2.5:72b-instruct-q8_0
|
||||
|
||||
## Détails des analyses
|
||||
|
||||
@ -498,8 +512,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**: 6000
|
||||
- **Max_tokens**: 8000
|
||||
- **Version du prompt**: v2.7
|
||||
|
||||
201
test_orchestrator_deepseek.py
Normal file
201
test_orchestrator_deepseek.py
Normal file
@ -0,0 +1,201 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- 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
|
||||
"""
|
||||
|
||||
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 import AgentReportGenerator
|
||||
|
||||
# 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.log', filemode='w')
|
||||
logger = logging.getLogger("TestOrchestratorDeepSeek")
|
||||
|
||||
def test_orchestrator(ticket_id=None):
|
||||
"""
|
||||
Exécute l'orchestrateur avec les agents définis utilisant DeepSeek
|
||||
|
||||
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 = AgentReportGenerator(report_generator_llm)
|
||||
|
||||
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")
|
||||
|
||||
# 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_dir,
|
||||
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
|
||||
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}")
|
||||
|
||||
# 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")
|
||||
|
||||
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
|
||||
|
||||
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 = "## 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}")
|
||||
|
||||
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")
|
||||
|
||||
# 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é")
|
||||
Loading…
x
Reference in New Issue
Block a user