
    ^Nj"                         d dl Z d dlmZmZmZmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZmZ  G d de      Zy)    N)AnyIterableSequenceType)asdict)
NumpyArrayOnnxProviderDevice)CLIPOnnxEmbedding)CustomTextEmbedding)PooledNormalizedEmbedding)PooledEmbedding)JinaEmbeddingV3)OnnxTextEmbedding)TextEmbeddingBase)DenseModelDescriptionModelSourcePoolingTypec                   &    e Zd ZU eeeeeegZ	e
ee      ed<   ede
eeef      fd       Zede
e   fd       Ze	 	 	 	 	 d'dededed	ed
ededededede
e   dz  ddfd       Zddddej8                  ddfdededz  dedz  dee   dz  deez  de
e   dz  dedef fdZe defd       Z!ededefd       Z"	 	 d(dee#e   z  ded edz  dede#e$   f
d!Z%d"ee#e   z  dede#e$   fd#Z&d$e#e   dede#e$   fd%Z'	 d)d$ee#e   z  dededefd&Z( xZ)S )*TextEmbeddingEMBEDDINGS_REGISTRYreturnc                 Z    | j                         D cg c]  }t        |       c}S c c}w )zLists the supported models.

        Returns:
            list[dict[str, Any]]: A list of dictionaries containing the model information.
        )_list_supported_modelsr   )clsmodels     n/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastembed/text/text_embedding.pylist_supported_modelsz#TextEmbedding.list_supported_models   s+     ,/+E+E+GH+G%u+GHHHs   (c                 j    g }| j                   D ]!  }|j                  |j                                # |S N)r   extendr   )r   result	embeddings      r   r   z$TextEmbedding._list_supported_models#   s1    .000IMM)::<= 1    Nr   poolingnormalizationsourcesdim
model_filedescriptionlicense
size_in_gbadditional_filesc                     | j                         }|D ]<  }|j                         |j                  j                         k(  s/t        d| d       t	        j
                  t        |||||||	|
xs g       ||       y )NModel zk is already registered in TextEmbedding, if you still want to add this model, please use another model name)r   r'   r(   r)   r*   r+   
size_in_GBr-   )r%   r&   )r   lowerr   
ValueErrorr   	add_modelr   )r   r   r%   r&   r'   r(   r)   r*   r+   r,   r-   registered_modelsregistered_models                r   add_custom_modelzTextEmbedding.add_custom_model*   s      668 1{{} 0 6 6 < < >> UG $4 5  !2 	%%!%'%!1!7R	 '	
r$   zBAAI/bge-small-en-v1.5F
model_name	cache_dirthreads	providerscuda
device_ids	lazy_loadkwargsc                 6   t        |   ||fi | j                         dj                         k(  rt        j                  dt
        d       j                         dj                         dj                         dj                         dj                         hv r t        j                  d	 d
t
        d       | j                  D ]=  }	|	j                         }
t        fd|
D              s( |	d||||||d|| _	         y  t        d d      )Nz nomic-ai/nomic-embed-text-v1.5-QzThe model 'nomic-ai/nomic-embed-text-v1.5-Q' has been updated on HuggingFace. Please review the latest documentation on HF and release notes to ensure compatibility with your workflow.    )
stacklevelz;sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2zthenlper/gte-largezintfloat/multilingual-e5-largez;sentence-transformers/paraphrase-multilingual-mpnet-base-v2z
The model z now uses mean pooling instead of CLS embedding. In order to preserve the previous behaviour, consider either pinning fastembed version to 0.5.1 or using `add_custom_model` functionality.c              3   t   K   | ]/  }j                         |j                  j                         k(   1 y wr    )r1   r   ).0r   r7   s     r   	<genexpr>z)TextEmbedding.__init__.<locals>.<genexpr>q   s/     [JZ:##%):):)<<JZs   58)r7   r8   r9   r:   r;   r<   r=   r/   zs is not supported in TextEmbedding. Please check the supported models using `TextEmbedding.list_supported_models()` )super__init__r1   warningswarnUserWarningr   r   anyr   r2   )selfr7   r8   r9   r:   r;   r<   r=   r>   EMBEDDING_MODEL_TYPEsupported_models	__class__s    `         r   rG   zTextEmbedding.__init__O   sE    	YB6B!C!I!I!KKMMp	 IOOQ &&(,224IOOQ	"
 
 MMZL ): :  %)$<$< 3JJL[JZ[[1 	)'#')'	 	
  %= ZL !^ ^
 	
r$   c                 r    | j                    | j                  | j                        | _         | j                   S )z+Get the embedding size of the current model)_embedding_sizeget_embedding_sizer7   )rL   s    r   embedding_sizezTextEmbedding.embedding_size   s3     '#'#:#:4??#KD ###r$   c                    | j                         }d}|D ];  }|j                  j                         |j                         k(  s/|j                  } n |*|D cg c]  }|j                   }}t	        d| d|       |S c c}w )a0  Get the embedding size of the passed model

        Args:
            model_name (str): The name of the model to get embedding size for.

        Returns:
            int: The size of the embedding.

        Raises:
            ValueError: If the model name is not found in the supported models.
        NzEmbedding size for model z" was None. Available model names: )r   r   r1   r(   r2   )r   r7   descriptionsrS   r*   model_namess         r   rR   z TextEmbedding.get_embedding_size   s     113%)'K  &&(J,<,<,>>!, ( !@LM;,,KM+J< 8**58   Ns   B	documents
batch_sizeparallelc              +   ^   K    | j                   j                  |||fi |E d{    y7 w)a  
        Encode a list of documents into list of embeddings.
        We use mean pooling with attention so that the model can handle variable-length inputs.

        Args:
            documents: Iterator of documents or single document to embed
            batch_size: Batch size for encoding -- higher values will use more memory, but be faster
            parallel:
                If > 1, data-parallel encoding will be used, recommended for offline encoding of large datasets.
                If 0, use all available cores.
                If None, don't use data-parallel processing, use default onnxruntime threading instead.

        Returns:
            List of embeddings, one per document
        N)r   embed)rL   rW   rX   rY   r>   s        r   r[   zTextEmbedding.embed   s+     , $4::##Iz8NvNNNs   #-+-queryc              +   Z   K    | j                   j                  |fi |E d{    y7 w)z
        Embeds queries

        Args:
            query (Union[str, Iterable[str]]): The query to embed, or an iterable e.g. list of queries.

        Returns:
            Iterable[NumpyArray]: The embeddings.
        N)r   query_embed)rL   r\   r>   s      r   r^   zTextEmbedding.query_embed   s'      *4::))%:6:::   !+)+textsc              +   Z   K    | j                   j                  |fi |E d{    y7 w)a7  
        Embeds a list of text passages into a list of embeddings.

        Args:
            texts (Iterable[str]): The list of texts to embed.
            **kwargs: Additional keyword argument to pass to the embed method.

        Yields:
            Iterable[SparseEmbedding]: The sparse embeddings.
        N)r   passage_embed)rL   r`   r>   s      r   rb   zTextEmbedding.passage_embed   s'      ,4::++E<V<<<r_   c                 @     | j                   j                  |fd|i|S )a  Returns the number of tokens in the texts.

        Args:
            texts (str | Iterable[str]): The list of texts to embed.
            batch_size (int): Batch size for encoding

        Returns:
            int: Sum of number of tokens in the texts.
        rX   )r   token_count)rL   r`   rX   r>   s       r   rd   zTextEmbedding.token_count   s%     &tzz%%eM
MfMMr$   )zonnx/model.onnx re   g        N)   N)i   )*__name__
__module____qualname__r   r   r   r   r   r   r   listr   r   __annotations__classmethoddictstrr   r   r   r   r   boolr   intfloatr6   r
   AUTOr   r	   rG   propertyrS   rR   r   r   r[   r^   rb   rd   __classcell__)rO   s   @r   r   r      s   !:d#456  Id4S>&: I I t,A'B    ,-1"
"
 "
 	"

 "
 "
 "
 "
 "
 "
 s)d*"
 
"
 "
L 3 $"37$kk'+2
2
 :2
 t	2

 L)D02
 Vm2
 I$2
 2
 2
h $ $ $ C C  : #	O#&O O *	O
 O 
*	O0;x}!4 ; ;Q[H\ ;=8C= =C =HZDX = =AN8C=(N69NLON	Nr$   r   )rH   typingr   r   r   r   dataclassesr   fastembed.common.typesr   r	   r
   fastembed.text.clip_embeddingr   $fastembed.text.custom_text_embeddingr   *fastembed.text.pooled_normalized_embeddingr   fastembed.text.pooled_embeddingr   "fastembed.text.multitask_embeddingr   fastembed.text.onnx_embeddingr   "fastembed.text.text_embedding_baser   "fastembed.common.model_descriptionr   r   r   r   rE   r$   r   <module>r      sC     0 0  C C ; D P ; > ; @ ^ ^TN% TNr$   