import os
from .amodel import AModel
from huggingface_hub import InferenceClient
import numpy as np # feature_extraction renvoie un array numpy...


class HuggingFaceModel(AModel):
    
    def __init__(self, llm_name:str, feature_name:str, temperature:float=0.0):
        self.llm_name:str = llm_name
        self.feature_name:str = feature_name
        self.temperature = temperature
        api_token = os.getenv("HUGGINGFACEHUB_API_TOKEN")
        try:
            self.model = InferenceClient(api_key=api_token) 
        except:
            raise

    def ask_llm(self, question:str)->str:
        messages = [{"role": "user", "content": question}]
        try:
            resp = self.model.chat.completions.create(
                model=self.llm_name,                     
                messages=messages, 
                max_tokens=2048,
                temperature=self.temperature,
                # stream=True
            )
            return resp.choices[0].message.content
        except:
            raise

    def create_vector(self, chunk:str)->list[float]:
        try:
            resp = self.model.feature_extraction(
                text=chunk,
                # normalize=True, # Only available on server powered by Text-Embedding-Inference.
                model=self.feature_name, # normalisé ??
            )
            if isinstance(resp, np.ndarray):
                return resp
            else:
                raise Exception("Error with embedding !")
        except:
            raise
    
    def create_vectors(self, chunks:list[str])->list[list[float]]:
        '''
            Pas de batch pour la création de vectors sur HuggingFace, on les passe un par un
        '''
        vectors = []
        try:
            for chunk in chunks:
                v = self.create_vector(chunk)
                if not isinstance(v, np.ndarray): # l'api renvoie des array numpy....
                    raise
                vectors.append(v.tolist())
            return vectors
        except:
            raise