llm_ticket3/loaders/ticket_data_loader.py

67 lines
2.2 KiB
Python

import os
import json
import logging
from typing import Dict, Any, Optional
logger = logging.getLogger("TicketDataLoader")
class TicketDataLoader:
"""
Charge uniquement les tickets au format JSON pour le pipeline.
"""
def charger(self, chemin_fichier: str) -> Dict[str, Any]:
"""
Charge un ticket JSON depuis un chemin de fichier.
Args:
chemin_fichier: str - chemin complet vers le fichier JSON
Returns:
dict - contenu JSON enrichi de métadonnées
"""
if not os.path.exists(chemin_fichier):
raise FileNotFoundError(f"Fichier introuvable : {chemin_fichier}")
try:
with open(chemin_fichier, "r", encoding="utf-8") as f:
donnees = json.load(f)
# Ajout de métadonnées utiles
if "metadata" not in donnees:
donnees["metadata"] = {}
donnees["metadata"]["source_file"] = chemin_fichier
donnees["metadata"]["format"] = "json"
return donnees
except Exception as e:
logger.error(f"Erreur lors du chargement du ticket : {e}")
raise
def trouver_ticket(self, ticket_dir: str, ticket_id: str) -> Optional[str]:
"""
Tente de retrouver le chemin du rapport JSON d'analyse d'un ticket.
Args:
ticket_dir: str - chemin du répertoire d'extraction du ticket
ticket_id: str - code du ticket (ex: T1234)
Returns:
str | None - chemin du fichier JSON ou None si non trouvé
"""
rapport_dir = os.path.join(ticket_dir, f"{ticket_id}_rapports")
if os.path.isdir(rapport_dir):
for fichier in os.listdir(rapport_dir):
if fichier.endswith(".json") and ticket_id in fichier:
return os.path.join(rapport_dir, fichier)
# fallback : recherche directe dans l'extraction si besoin
for fichier in os.listdir(ticket_dir):
if fichier.endswith(".json") and ticket_id in fichier and not fichier.startswith("ticket_"):
return os.path.join(ticket_dir, fichier)
logger.warning(f"Aucun rapport JSON trouvé pour {ticket_id} dans {ticket_dir}")
return None