AIagent/llm_classes/pixtral.py
2025-03-31 09:52:22 +02:00

109 lines
3.8 KiB
Python

import json
from typing import Dict, List, Any, Optional
from .llm import LLM
class Pixtral(LLM):
"""
Classe pour l'intégration avec l'API Mistral AI spécifiquement pour le modèle Pixtral
Cette classe hérite de la classe de base LLM et est spécialisée pour le modèle pixtral-12b-latest
"""
def __init__(self):
"""
Initialisation des attributs spécifiques à Pixtral
"""
super().__init__()
# Attributs spécifiques à Pixtral
self.maxToken: int = 1000
self.seed: int = 0
self.presence_penalty: float = 0
self.frequency_penalty: float = 0
self.n: int = 1
self.prediction: Dict[str, str] = {"type": "content", "content": ""}
self.safe_prompt: bool = False
self.o_stop: str = "string"
self._m_tabModels: List[str] = ["pixtral-12b-latest"]
# Initialisation par défaut avec le modèle Pixtral
self.Modele = "pixtral-12b-latest" # Modèle fixé à pixtral-12b-latest
self.o_temperature = 0.2
self.o_top_p = 1
self.maxToken = 1000
self.presence_penalty = 0
self.frequency_penalty = 0
self.n = 1
self.prediction["type"] = "content"
self.prediction["content"] = ""
self.safe_prompt = False
self.o_stop = "string"
# Définir l'URL de fonction
self.urlFonction = "chat/completions"
def urlBase(self) -> str:
"""
Retourne l'URL de base de l'API Mistral
"""
return "https://api.mistral.ai/v1/"
def cleAPI(self) -> str:
"""
Retourne la clé API Mistral
"""
return "2iGzTzE9csRQ9IoASoUjplHwEjA200Vh"
def model_list(self) -> List[str]:
"""
Retourne uniquement le modèle Pixtral
Cette classe étant spécialisée pour un modèle spécifique
"""
return self._m_tabModels
def _even_LLM_POST(self, question: str) -> None:
"""
Préparation du contenu de la requête pour Pixtral
"""
# S'assurer que le modèle est défini
self._Contenu["model"] = self.Modele # Toujours défini sur pixtral-12b-latest
self._Contenu["messages"] = [
{"role": "system", "content": self.prompt_system},
{"role": "user", "content": question}
]
self._Contenu["temperature"] = self.o_temperature
self._Contenu["top_p"] = self.o_top_p
if self.maxToken != 0:
self._Contenu["max_tokens"] = self.maxToken
if self.seed != 0:
self._Contenu["random_seed"] = self.seed
if self.format != "":
self._Contenu["response_format"] = self.format
# Paramètres supplémentaires
self._Contenu["presence_penalty"] = self.presence_penalty
self._Contenu["frequency_penalty"] = self.frequency_penalty
self._Contenu["n"] = 1
# Correction: s'assurer que prediction est correctement affecté
if isinstance(self.prediction, dict):
self._Contenu["prediction"] = self.prediction
else:
self._Contenu["prediction"] = {"type": "content", "content": ""}
# S'assurer que o_stop est une chaîne de caractères ou une liste
if isinstance(self.o_stop, str) and self.o_stop != "string":
self._Contenu["stop"] = self.o_stop
elif isinstance(self.o_stop, list):
self._Contenu["stop"] = self.o_stop
def _interrogerRetourneReponse(self, reponse: str) -> str:
"""
Extraction de la réponse à partir du JSON retourné par Mistral
"""
data = json.loads(reponse)
return data["choices"][0]["message"]["content"]