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