mirror of
https://github.com/Ladebeze66/llm_ticket3.git
synced 2025-12-16 03:47:49 +01:00
174 lines
6.2 KiB
Python
174 lines
6.2 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Module définissant la classe abstraite Agent qui servira de base pour tous les agents
|
|
spécialisés du système d'analyse de tickets.
|
|
"""
|
|
|
|
import os
|
|
import json
|
|
from abc import ABC, abstractmethod
|
|
from datetime import datetime
|
|
from typing import Dict, List, Any, Optional
|
|
|
|
class Agent(ABC):
|
|
"""
|
|
Classe abstraite définissant l'interface commune de tous les agents.
|
|
"""
|
|
def __init__(self, nom: str):
|
|
"""
|
|
Initialise un agent avec son nom et son historique d'actions.
|
|
|
|
Args:
|
|
nom: Nom de l'agent
|
|
"""
|
|
self.nom: str = nom
|
|
self.historique: List[Dict[str, Any]] = []
|
|
self.llm_params: Dict[str, Any] = {}
|
|
self.llm = None
|
|
|
|
def ajouter_historique(self, action: str, input_data: Any, output_data: Any) -> None:
|
|
"""
|
|
Ajoute une entrée dans l'historique de l'agent.
|
|
|
|
Args:
|
|
action: Type d'action réalisée
|
|
input_data: Données d'entrée (limitées pour économiser l'espace)
|
|
output_data: Données de sortie (limitées pour économiser l'espace)
|
|
"""
|
|
self.historique.append({
|
|
"timestamp": datetime.now().isoformat(),
|
|
"action": action,
|
|
"input": str(input_data)[:500], # Limitation pour éviter des historiques trop volumineux
|
|
"output": str(output_data)[:500] # Limitation pour éviter des historiques trop volumineux
|
|
})
|
|
|
|
def obtenir_historique(self) -> List[Dict[str, Any]]:
|
|
"""
|
|
Retourne l'historique complet de l'agent.
|
|
|
|
Returns:
|
|
Liste d'actions avec leurs timestamp et données
|
|
"""
|
|
return self.historique
|
|
|
|
def sauvegarder_historique(self, chemin_fichier: str) -> bool:
|
|
"""
|
|
Sauvegarde l'historique de l'agent dans un fichier JSON.
|
|
|
|
Args:
|
|
chemin_fichier: Chemin où sauvegarder le fichier JSON
|
|
|
|
Returns:
|
|
True si la sauvegarde a réussi, False sinon
|
|
"""
|
|
try:
|
|
# Créer le répertoire parent si nécessaire
|
|
os.makedirs(os.path.dirname(chemin_fichier), exist_ok=True)
|
|
|
|
with open(chemin_fichier, 'w', encoding='utf-8') as f:
|
|
json.dump(self.historique, f, ensure_ascii=False, indent=2)
|
|
return True
|
|
except Exception as e:
|
|
print(f"Erreur lors de la sauvegarde de l'historique: {e}")
|
|
return False
|
|
|
|
def configurer_llm(self, **parametres: Any) -> None:
|
|
"""
|
|
Configure les paramètres du LLM associé à l'agent.
|
|
|
|
Args:
|
|
**parametres: Paramètres à configurer (température, modèle, etc.)
|
|
"""
|
|
if self.llm is None:
|
|
raise ValueError("Aucun LLM associé à cet agent")
|
|
|
|
# Enregistrer les paramètres modifiés
|
|
self.llm_params.update(parametres)
|
|
|
|
# Appliquer les paramètres au LLM
|
|
for param, valeur in parametres.items():
|
|
if hasattr(self.llm, param):
|
|
setattr(self.llm, param, valeur)
|
|
else:
|
|
print(f"Avertissement: Le paramètre '{param}' n'existe pas dans le LLM")
|
|
|
|
# Ajouter à l'historique
|
|
self.ajouter_historique("configuration_llm",
|
|
f"Paramètres: {parametres}",
|
|
f"Paramètres actuels: {self.obtenir_parametres_llm()}")
|
|
|
|
def obtenir_parametres_llm(self) -> Dict[str, Any]:
|
|
"""
|
|
Obtient les paramètres actuels du LLM associé à l'agent.
|
|
|
|
Returns:
|
|
Dictionnaire des paramètres actuels du LLM
|
|
"""
|
|
if self.llm is None:
|
|
return {}
|
|
|
|
# Paramètres à récupérer (étendre selon vos besoins)
|
|
params_keys = [
|
|
"model", "temperature", "max_tokens", "top_p",
|
|
"frequency_penalty", "presence_penalty", "system_prompt"
|
|
]
|
|
|
|
# Extraire les valeurs des paramètres
|
|
params = {}
|
|
for key in params_keys:
|
|
if hasattr(self.llm, key):
|
|
params[key] = getattr(self.llm, key)
|
|
|
|
return params
|
|
|
|
def generer_rapport_parametres(self) -> Dict[str, Any]:
|
|
"""
|
|
Génère un rapport des paramètres utilisés par l'agent.
|
|
|
|
Returns:
|
|
Dictionnaire contenant les informations sur les paramètres
|
|
"""
|
|
return {
|
|
"agent": self.nom,
|
|
"llm_type": self.llm.__class__.__name__ if self.llm else "Aucun",
|
|
"parametres": self.obtenir_parametres_llm(),
|
|
"parametres_modifies": self.llm_params
|
|
}
|
|
|
|
def appliquer_parametres_globaux(self, params_globaux: Dict[str, Any]) -> None:
|
|
"""
|
|
Applique des paramètres globaux au LLM de l'agent.
|
|
Les paramètres spécifiques déjà définis ont priorité sur les globaux.
|
|
|
|
Args:
|
|
params_globaux: Dictionnaire de paramètres globaux à appliquer
|
|
"""
|
|
if self.llm is None:
|
|
return
|
|
|
|
# Filtrer les paramètres applicables
|
|
params_a_appliquer = {}
|
|
for param, valeur in params_globaux.items():
|
|
# Ne pas écraser les paramètres déjà définis spécifiquement pour cet agent
|
|
if param not in self.llm_params and hasattr(self.llm, param):
|
|
params_a_appliquer[param] = valeur
|
|
|
|
# Appliquer les paramètres filtrés
|
|
if params_a_appliquer:
|
|
self.configurer_llm(**params_a_appliquer)
|
|
self.ajouter_historique("application_params_globaux",
|
|
f"Paramètres globaux appliqués: {params_a_appliquer}",
|
|
f"Paramètres actuels: {self.obtenir_parametres_llm()}")
|
|
|
|
@abstractmethod
|
|
def executer(self, *args, **kwargs) -> Dict[str, Any]:
|
|
"""
|
|
Méthode abstraite que chaque agent concret doit implémenter.
|
|
Cette méthode exécute la fonction principale de l'agent.
|
|
|
|
Returns:
|
|
Dictionnaire contenant les résultats de l'exécution
|
|
"""
|
|
pass |