This commit is contained in:
Ladebeze66 2025-04-10 15:42:26 +02:00
parent 3a44ab0f53
commit dd8d4cc640
24 changed files with 3744 additions and 603 deletions

View File

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

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

View File

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

View File

@ -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 den avertir immédiatement lexpé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 daprè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 den avertir immédiatement lexpé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"
}

View File

@ -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 den avertir immédiatement lexpé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 daprè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 den avertir immédiatement lexpé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

File diff suppressed because one or more lines are too long

View 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 den avertir immédiatement lexpé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 daprè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 den avertir immédiatement lexpé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

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View File

@ -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": ""
}
]

View File

@ -0,0 +1,9 @@
[
{
"id": 45066,
"partner_id": [
6220,
"CONSEIL DEPARTEMENTAL DU VAUCLUSE (84), Frédéric MORALES"
]
}
]

File diff suppressed because one or more lines are too long

View 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
}
}

View 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"
]
}

View File

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

View File

@ -0,0 +1 @@
,PC-DEV/PCDEV,PC-DEV,10.04.2025 15:38,file:///C:/Users/PCDEV/AppData/Roaming/LibreOffice/4;

View File

@ -0,0 +1 @@
,PC-DEV/PCDEV,PC-DEV,10.04.2025 15:37,file:///C:/Users/PCDEV/AppData/Roaming/LibreOffice/4;

View File

@ -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."
1 Question Réponse
2 Comment faire apparaître tous les utilisateurs dans le menu 'Mes paramètres - Gestion des utilisateurs' ? Pas de réponse
3 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.

View File

@ -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."
1 Question Réponse
2 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

View File

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

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