
    ^Nj                         d dl mZmZmZmZ d dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZ  G d d	e      Zy
)    )AnyIterableSequenceType)asdict)
NumpyArrayDevice)
ImageInputOnnxProvider)ImageEmbeddingBase)OnnxImageEmbedding)DenseModelDescriptionc                   V    e Zd ZU 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dddej"                  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 xZS )ImageEmbeddingEMBEDDINGS_REGISTRYreturnc                 Z    | j                         D cg c]  }t        |       c}S c c}w )a  
        Lists the supported models.

        Returns:
            list[dict[str, Any]]: A list of dictionaries containing the model information.

            Example:
                ```
                [
                    {
                        "model": "Qdrant/clip-ViT-B-32-vision",
                        "dim": 512,
                        "description": "CLIP vision encoder based on ViT-B/32",
                        "license": "mit",
                        "size_in_GB": 0.33,
                        "sources": {
                            "hf": "Qdrant/clip-ViT-B-32-vision",
                        },
                        "model_file": "model.onnx",
                    }
                ]
                ```
        )_list_supported_modelsr   )clsmodels     p/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastembed/image/image_embedding.pylist_supported_modelsz$ImageEmbedding.list_supported_models   s+    2 ,/+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%ImageEmbedding._list_supported_models)   s1    .000IMM)::<= 1    NF
model_name	cache_dirthreads	providerscuda
device_ids	lazy_loadkwargsc           
          t        |   ||fi | | j                  D ]=  }	|	j                         }
t	        fd|
D              s( |	|f|||||d|| _         y  t        d d      )Nc              3   t   K   | ]/  }j                         |j                  j                         k(   1 y wr   )lowerr   ).0r   r   s     r   	<genexpr>z*ImageEmbedding.__init__.<locals>.<genexpr>>   s/     [JZ:##%):):)<<JZs   58)r!   r"   r#   r$   r%   zModel zt is not supported in ImageEmbedding.Please check the supported models using `ImageEmbedding.list_supported_models()`)super__init__r   r   anyr   
ValueError)selfr   r    r!   r"   r#   r$   r%   r&   EMBEDDING_MODEL_TYPEsupported_models	__class__s    `         r   r-   zImageEmbedding.__init__0   s     	YB6B$($<$< 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_sizer   )r0   s    r   embedding_sizezImageEmbedding.embedding_sizeP   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   r)   dimr/   )r   r   descriptionsr7   descriptionmodel_namess         r   r6   z!ImageEmbedding.get_embedding_sizeW   s     113%)'K  &&(J,<,<,>>!, ( !@LM;,,KM+J< 8**58   Ns   Bimages
batch_sizeparallelc              +   ^   K    | j                   j                  |||fi |E d{    y7 w)aa  
        Encode a list of images into list of embeddings.

        Args:
            images: Iterator of image paths or single image path 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)r0   r=   r>   r?   r&   s        r   rA   zImageEmbedding.embedr   s+     * $4::##FJKFKKKs   #-+-)   N)__name__
__module____qualname__r   r   listr   r   __annotations__classmethoddictstrr   r   r   r   r	   AUTOintr   r   boolr-   propertyr7   r6   r
   r   r   rA   __classcell__)r3   s   @r   r   r      s   ;M:Nd#567NId4S>&: I I4 t,A'B   !%"37$kk'+

 :
 t	

 L)D0
 Vm
 I$
 
 
@ $ $ $ C C  : #	LXj11L L *	L
 L 
*	Lr   r   N)typingr   r   r   r   dataclassesr   fastembed.common.typesr   r	   fastembed.commonr
   r   $fastembed.image.image_embedding_baser   fastembed.image.onnx_embeddingr   "fastembed.common.model_descriptionr   r    r   r   <module>rX      s.    0 0  5 5 C = D|L' |Lr   