mirror of
https://github.com/Ladebeze66/llm_ticket3.git
synced 2025-12-15 19:16:52 +01:00
116 lines
3.8 KiB
Python
116 lines
3.8 KiB
Python
from .base_llm import BaseLLM
|
|
import requests
|
|
from datetime import timedelta
|
|
from typing import Dict, Any
|
|
import os
|
|
|
|
class Ollama(BaseLLM):
|
|
"""
|
|
Classe optimisée pour interagir avec l'API Ollama.
|
|
"""
|
|
|
|
def __init__(self, modele: str = "qwen2.5:72b-instruct-q8_0"):
|
|
super().__init__(modele)
|
|
self.api_url = "http://217.182.105.173:11434/api/generate"
|
|
|
|
|
|
self.params: Dict[str, Any] = {
|
|
"temperature": 0.8,
|
|
"top_p": 0.9,
|
|
"top_k": 40,
|
|
"num_ctx": 2048,
|
|
"repeat_penalty": 1.1,
|
|
"repeat_last_n": 64,
|
|
"mirostat": 0,
|
|
"mirostat_eta": 0.1,
|
|
"mirostat_tau": 5,
|
|
"keep_alive": int(timedelta(minutes=5).total_seconds()),
|
|
"num_predict": -1,
|
|
"min_p": 0,
|
|
"seed": 0,
|
|
"stop": [],
|
|
"stream": False
|
|
}
|
|
|
|
def urlBase(self) -> str:
|
|
"""
|
|
Retourne l'URL de base de l'API Ollama.
|
|
"""
|
|
return "http://217.182.105.173:11434/"
|
|
|
|
def cleAPI(self) -> str:
|
|
"""
|
|
Ollama ne nécessite pas de clé API par défaut.
|
|
"""
|
|
return ""
|
|
|
|
def urlFonction(self) -> str:
|
|
"""
|
|
Retourne l'URL spécifique à Ollama pour générer une réponse.
|
|
"""
|
|
return "api/generate"
|
|
|
|
def _preparer_contenu(self, question: str) -> Dict[str, Any]:
|
|
"""
|
|
Prépare le contenu de la requête spécifique pour Ollama.
|
|
"""
|
|
contenu = {
|
|
"model": self.modele,
|
|
"prompt": question,
|
|
"options": {
|
|
"temperature": self.params["temperature"],
|
|
"top_p": self.params["top_p"],
|
|
"top_k": self.params["top_k"],
|
|
"num_ctx": self.params["num_ctx"],
|
|
"repeat_penalty": self.params["repeat_penalty"],
|
|
"repeat_last_n": self.params["repeat_last_n"],
|
|
"mirostat": self.params["mirostat"],
|
|
"mirostat_eta": self.params["mirostat_eta"],
|
|
"mirostat_tau": self.params["mirostat_tau"],
|
|
"keep_alive": self.params["keep_alive"],
|
|
"num_predict": self.params["num_predict"],
|
|
"min_p": self.params["min_p"],
|
|
"seed": self.params["seed"],
|
|
"stop": self.params["stop"],
|
|
},
|
|
"stream": self.params["stream"]
|
|
}
|
|
return contenu
|
|
|
|
def _traiter_reponse(self, reponse: requests.Response) -> str:
|
|
"""
|
|
Traite et retourne la réponse fournie par Ollama.
|
|
"""
|
|
data = reponse.json()
|
|
return data.get("response", "")
|
|
|
|
def configurer(self, **kwargs):
|
|
"""
|
|
Mise à jour facile des paramètres spécifiques à Ollama.
|
|
"""
|
|
for key, value in kwargs.items():
|
|
if key in self.params:
|
|
self.params[key] = value
|
|
|
|
def interroger_avec_image(self, image_path: str, question: str) -> str:
|
|
"""
|
|
Cette implémentation d'Ollama 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)
|