§
    šŠtj.-  ã                   óÜ   — d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
mZ ddlZddlZddlZddlmZ ddlmZmZ ddlmZmZmZmZmZ ddlmZ d	gZ G d
„ d	ee¦  «        Z G d„ d¦  «        ZdS )a�  
TextEmbed: Embedding Inference Server

TextEmbed provides a high-throughput, low-latency solution for serving embeddings.
It supports various sentence-transformer models.
Now, it includes the ability to deploy image embedding models.
TextEmbed offers flexibility and scalability for diverse applications.

TextEmbed is maintained by Keval Dekivadiya and is licensed under the Apache-2.0 license.
é    N)ÚThreadPoolExecutor)ÚAnyÚCallableÚDictÚListÚOptionalÚTupleÚUnion)Ú
Embeddings)Úfrom_envÚsecret_from_env)Ú	BaseModelÚ
ConfigDictÚFieldÚ	SecretStrÚmodel_validator)ÚSelfÚTextEmbedEmbeddingsc                   óˆ  — e Zd ZU dZeed<   	  e edd¬¦  «        ¬¦  «        Zeed<   	  e e	d¦  «        ¬¦  «        Z
eed	<   	 d
Zeed<   	  ed¬¦  «        Z ed¬¦  «        defd„¦   «         Zdee         deee                  fd„Zdee         deee                  fd„Zdedee         fd„Zdedee         fd„Zd
S )r   añ  
    A class to handle embedding requests to the TextEmbed API.

    Attributes:
        model : The TextEmbed model ID to use for embeddings.
        api_url : The base URL for the TextEmbed API.
        api_key : The API key for authenticating with the TextEmbed API.
        client : The TextEmbed client instance.

    Example:
        .. code-block:: python

            from langchain_community.embeddings import TextEmbedEmbeddings

            embeddings = TextEmbedEmbeddings(
                model="sentence-transformers/clip-ViT-B-32",
                api_url="http://localhost:8000/v1",
                api_key="<API_KEY>"
            )

    For more information: https://github.com/kevaldekivadiya2415/textembed/blob/main/docs/setup.md
    ÚmodelÚTEXTEMBED_API_URLúhttp://localhost:8000/v1)Údefault)Údefault_factoryÚapi_urlÚTEXTEMBED_API_KEYÚapi_keyNÚclientÚforbid)ÚextraÚafter)ÚmodeÚreturnc                 ój   — t          | j        | j                             ¦   «         ¬¦  «        | _        | S )z7Validate that api key and URL exist in the environment.)Úhostr   )Ú#AsyncOpenAITextEmbedEmbeddingClientr   r   Úget_secret_valuer   )Úselfs    úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/embeddings/textembed.pyÚvalidate_environmentz(TextEmbedEmbeddings.validate_environmentG   s6   € õ :Ø” t¤|×'DÒ'DÑ'FÔ'Fð
ñ 
ô 
ˆŒð ˆó    Útextsc                 óH   — | j                              | j        |¬¦  «        }|S )zÖCall out to TextEmbed's embedding endpoint.

        Args:
            texts (List[str]): The list of texts to embed.

        Returns:
            List[List[float]]: List of embeddings, one for each text.
        ©r   r,   )r   Úembedr   ©r(   r,   Ú
embeddingss      r)   Úembed_documentsz#TextEmbedEmbeddings.embed_documentsO   s0   € ð ”[×&Ò&Ø”*Øð 'ñ 
ô 
ˆ
ð Ðr+   c              ƒ   óX   K  — | j                              | j        |¬¦  «        ƒ d{V —†}|S )zÜAsync call out to TextEmbed's embedding endpoint.

        Args:
            texts (List[str]): The list of texts to embed.

        Returns:
            List[List[float]]: List of embeddings, one for each text.
        r.   N)r   Úaembedr   r0   s      r)   Úaembed_documentsz$TextEmbedEmbeddings.aembed_documents^   sR   è è € ð  œ;×-Ò-Ø”*Øð .ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆ
ð Ðr+   Útextc                 ó:   — |                       |g¦  «        d         S )zÅCall out to TextEmbed's embedding endpoint for a single query.

        Args:
            text (str): The text to embed.

        Returns:
            List[float]: Embeddings for the text.
        r   )r2   )r(   r6   s     r)   Úembed_queryzTextEmbedEmbeddings.embed_querym   s   € ð ×#Ò# T FÑ+Ô+¨AÔ.Ð.r+   c              ƒ   óN   K  — |                       |g¦  «        ƒ d{V —†}|d         S )zËAsync call out to TextEmbed's embedding endpoint for a single query.

        Args:
            text (str): The text to embed.

        Returns:
            List[float]: Embeddings for the text.
        Nr   )r5   )r(   r6   r1   s      r)   Úaembed_queryz TextEmbedEmbeddings.aembed_queryx   s9   è è € ð  ×0Ò0°$°Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8ˆ
Ø˜!Œ}Ðr+   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r   r   r   r   r   r   r   r   r   Úmodel_configr   r   r*   r   Úfloatr2   r5   r8   r:   © r+   r)   r   r      sª  € € € € € € ðð ð. €J€J�JØ(à�5Ø ˜ØÐ)Cð
ñ 
ô 
ðñ ô €GˆSð ð ñ ð
 à˜¨¨Ð?RÑ/SÔ/SÐTÑTÔT€GˆYÐTÐTÑTØ$à€FˆCÐÐÑØà�:Øðñ ô €Lð €_˜'Ð"Ñ"Ô"ð dð ð ð ñ #Ô"ðð T¨#¤Yð °4¸¸U¼Ô3Dð ð ð ð ð¨D°¬Ið ¸$¸tÀE¼{Ô:Kð ð ð ð ð	/ ð 	/¨¨U¬ð 	/ð 	/ð 	/ð 	/ð
 sð 
¨t°E¬{ð 
ð 
ð 
ð 
ð 
ð 
r+   c            
       ó>  — e Zd ZdZ	 	 	 ddedeedf         deej                 ddfd„Z	e
efd	ee         d
edeee         ef         fd„¦   «         Zd	ee         deee                  fd„Ze
deee                  dee         fd„¦   «         Zded	ee         deeef         fd„Zdedee         deee                  fd„Zded	ee         deee                  fd„Zdej        deeef         deee                  fd„Zded	ee         deee                  fd„ZdS )r&   a‘  
    A client to handle synchronous and asynchronous requests to the TextEmbed API.

    Attributes:
        host (str): The base URL for the TextEmbed API.
        api_key (str): The API key for authenticating with the TextEmbed API.
        aiosession (Optional[aiohttp.ClientSession]): The aiohttp session for async requests.
        _batch_size (int): Maximum batch size for a single request.
    r   Nr%   r   Ú
aiosessionr#   c                 óš   — || _         || _        || _        | j         �t          | j         ¦  «        dk     rt	          d¦  «        ‚d| _        d S )Né   z+Parameter `host` must be set to a valid URLé   )r%   r   rE   ÚlenÚ
ValueErrorÚ_batch_size)r(   r%   r   rE   s       r)   Ú__init__z,AsyncOpenAITextEmbedEmbeddingClient.__init__�   sP   € ð ˆŒ	ØˆŒØ$ˆŒàŒ9Ð¥ D¤I¡¤°Ò 2Ð 2ÝÐJÑKÔKÐKØˆÔÐÐr+   r,   Úsorterc                 ó¢   ‡ ‡‡— t          ‰ ¦  «        dk    r‰ d„ fS t          j        ˆfd„‰ D ¦   «         ¦  «        Šˆ fd„‰D ¦   «         }|ˆfd„fS )al  
        Sorts texts in ascending order and provides a function to restore the original order.

        Args:
            texts (List[str]): List of texts to sort.
            sorter (Callable, optional): Sorting function, defaults to length.

        Returns:
            Tuple[List[str], Callable]: Sorted texts and a function to restore original order.
        é   c                 ó   — | S )NrC   )Úts    r)   ú<lambda>z>AsyncOpenAITextEmbedEmbeddingClient._permute.<locals>.<lambda>­   s   €  A€ r+   c                 ó(   •— g | ]} ‰|¦  «         ‘ŒS rC   rC   )Ú.0ÚsenrM   s     €r)   ú
<listcomp>z@AsyncOpenAITextEmbedEmbeddingClient._permute.<locals>.<listcomp>®   s#   ø€ Ð'FÐ'FÐ'F¸¨¨°©¬¨Ð'FÐ'FÐ'Fr+   c                 ó    •— g | ]
}‰|         ‘ŒS rC   rC   )rT   Úidxr,   s     €r)   rV   z@AsyncOpenAITextEmbedEmbeddingClient._permute.<locals>.<listcomp>¯   s   ø€ Ð@Ð@Ð@ s˜˜cœ
Ð@Ð@Ð@r+   c                 óF   •‡ — ˆ fd„t          j        ‰¦  «        D ¦   «         S )Nc                 ó    •— g | ]
}‰|         ‘ŒS rC   rC   )rT   rX   Úunsorted_embeddingss     €r)   rV   zRAsyncOpenAITextEmbedEmbeddingClient._permute.<locals>.<lambda>.<locals>.<listcomp>±   s,   ø€ ð :
ð :
ð :
Ø),Ð Ô$ð:
ð :
ð :
r+   )ÚnpÚargsort)r[   Úlength_sorted_idxs   `€r)   rR   z>AsyncOpenAITextEmbedEmbeddingClient._permute.<locals>.<lambda>±   s7   øø€ ð :
ð :
ð :
ð :
Ý02´
Ð;LÑ0MÔ0Mð:
ñ :
ô :
€ r+   )rI   r\   r]   )r,   rM   Útexts_sortedr^   s   `` @r)   Ú_permutez,AsyncOpenAITextEmbedEmbeddingClient._permutež   sƒ   øøø€ õ ˆu‰:Œ:˜Š?ˆ?Ø˜+˜+Ð%Ð%ÝœJÐ'FÐ'FÐ'FÐ'FÀÐ'FÑ'FÔ'FÑGÔGÐØ@Ð@Ð@Ð@Ð.?Ð@Ñ@Ô@ˆàð 
ð 
ð 
ð 
ð 
ð 	
r+   c                 óÌ   — t          |¦  «        dk    r|gS g }t          dt          |¦  «        | j        ¦  «        D ]'}|                     |||| j        z   …         ¦  «         Œ(|S )zä
        Splits a list of texts into batches of size max `self._batch_size`.

        Args:
            texts (List[str]): List of texts to split.

        Returns:
            List[List[str]]: List of batches of texts.
        rO   r   )rI   ÚrangerK   Úappend)r(   r,   ÚbatchesÚstart_indexs       r)   Ú_batchz*AsyncOpenAITextEmbedEmbeddingClient._batchµ   sq   € õ ˆu‰:Œ:˜Š?ˆ?Ø�7ˆNØˆÝ  ¥C¨¡J¤J°Ô0@ÑAÔAð 	Pð 	PˆKØ�NŠN˜5 ¨{¸TÔ=MÑ/MÐ!MÔNÑOÔOÐOÐOØˆr+   Úbatch_of_textsc                 ó¦   — t          | ¦  «        dk    r!t          | d         ¦  «        dk    r| d         S g }| D ]}|                     |¦  «         Œ|S )zÓ
        Merges batches of texts into a single list.

        Args:
            batch_of_texts (List[List[Any]]): List of batches of texts.

        Returns:
            List[Any]: Merged list of texts.
        rO   r   )rI   Úextend)rg   r,   Úsublists      r)   Ú_unbatchz,AsyncOpenAITextEmbedEmbeddingClient._unbatchÆ   sg   € õ ˆ~ÑÔ !Ò#Ð#­¨N¸1Ô,=Ñ(>Ô(>À!Ò(CÐ(CØ! !Ô$Ð$ØˆØ%ð 	"ð 	"ˆGØ�LŠL˜Ñ!Ô!Ð!Ð!Øˆr+   r   c                 ól   — t          | j        › d�ddd| j        › �dœt          ||¬¦  «        ¬¦  «        S )a"  
        Builds the kwargs for the POST request, used by sync method.

        Args:
            model (str): The model to use for embedding.
            texts (List[str]): List of texts to embed.

        Returns:
            Dict[str, Any]: Dictionary of POST request parameters.
        z
/embeddingzapplication/jsonzBearer )Úacceptzcontent-typeÚAuthorization)Úinputr   )ÚurlÚheadersÚjson)Údictr%   r   )r(   r   r,   s      r)   Ú_kwargs_post_requestz8AsyncOpenAITextEmbedEmbeddingClient._kwargs_post_requestØ   s`   € õ Ø”9Ð(Ð(Ð(à,Ø 2Ø!9¨4¬<Ð!9Ð!9ðð õ
 ØØðñ ô ð
ñ 
ô 
ð 	
r+   Úbatch_textsc                 óê   — t          j        di |                      ||¬¦  «        ¤Ž}|j        dk    rt	          d|j        › d|j        › �¦  «        ‚d„ |                     ¦   «         d         D ¦   «         S )al  
        Sends a synchronous request to the embedding endpoint.

        Args:
            model (str): The model to use for embedding.
            batch_texts (List[str]): Batch of texts to embed.

        Returns:
            List[List[float]]: List of embeddings for the batch.

        Raises:
            Exception: If the response status is not 200.
        r.   éÈ   ú6TextEmbed responded with an unexpected status message ú: c                 ó   — g | ]
}|d          ‘ŒS ©Ú	embeddingrC   ©rT   Úes     r)   rV   zKAsyncOpenAITextEmbedEmbeddingClient._sync_request_embed.<locals>.<listcomp>  s   € Ð@Ð@Ð@ 1��+”Ð@Ð@Ð@r+   ÚdatarC   )ÚrequestsÚpostrt   Ústatus_codeÚ	Exceptionr6   rr   )r(   r   ru   Úresponses       r)   Ú_sync_request_embedz7AsyncOpenAITextEmbedEmbeddingClient._sync_request_embedð   sŸ   € õ  ”=ð 
ð 
Ø×'Ò'¨e¸;Ð'ÑGÔGð
ð 
ˆð Ô 3Ò&Ð&Ýð;ØÔ'ð;ð ;Ø+3¬=ð;ð ;ñô ð ð AÐ@¨¯ª©¬¸Ô(?Ð@Ñ@Ô@Ð@r+   c                 ó¦  — |                       |¦  «        \  }}|                      |¦  «        }| j        |gt          |¦  «        z  |f}t          |¦  «        dk    rt	          t          |Ž ¦  «        }n>t          d¦  «        5 }t	           |j        |Ž ¦  «        }ddd¦  «         n# 1 swxY w Y   |                      |¦  «        }	 ||	¦  «        }
|
S )a	  
        Embeds a list of texts synchronously.

        Args:
            model (str): The model to use for embedding.
            texts (List[str]): List of texts to embed.

        Returns:
            List[List[float]]: List of embeddings for the texts.
        rO   é    N)r`   rf   r…   rI   ÚlistÚmapr   rk   )r(   r   r,   Ú
perm_textsÚunpermute_funcÚperm_texts_batchedÚmap_argsÚembeddings_batch_permÚpÚembeddings_permr1   s              r)   r/   z)AsyncOpenAITextEmbedEmbeddingClient.embed
  s  € ð &*§]¢]°5Ñ%9Ô%9Ñ"ˆ
�NØ!Ÿ[š[¨Ñ4Ô4Ðð Ô$ØˆG•cÐ,Ñ-Ô-Ñ-Øð
ˆõ
 Ð!Ñ"Ô" aÒ'Ð'Ý$(­¨h¨Ñ$8Ô$8Ð!Ð!å# BÑ'Ô'ð ?¨1Ý(,¨U¨Q¬U°HÐ-=Ñ(>Ô(>Ð%ð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?ð Ÿ-š-Ð(=Ñ>Ô>ˆØ#�^ OÑ4Ô4ˆ
ØÐs   ÂB&Â&B*Â-B*ÚsessionÚkwargsc              ‹   ó$  K  —  |j         di |¤Ž4 ƒd{V —†}|j        dk    rt          d|j        › d|j        › �¦  «        ‚|                     ¦   «         ƒ d{V —†d         }d„ |D ¦   «         cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS )a—  
        Sends an asynchronous request to the embedding endpoint.

        Args:
            session (aiohttp.ClientSession): The aiohttp session for the request.
            kwargs (Dict[str, Any]): Dictionary of POST request parameters.

        Returns:
            List[List[float]]: List of embeddings for the request.

        Raises:
            Exception: If the response status is not 200.
        Nrw   rx   ry   r   c                 ó   — g | ]
}|d          ‘ŒS r{   rC   r}   s     r)   rV   zFAsyncOpenAITextEmbedEmbeddingClient._async_request.<locals>.<listcomp>?  s   € Ð6Ð6Ð6 q�A�k”NÐ6Ð6Ð6r+   rC   )r�   Ústatusrƒ   r6   rr   )r(   r‘   r’   r„   r|   s        r)   Ú_async_requestz2AsyncOpenAITextEmbedEmbeddingClient._async_request(  sT  è è € ð   �7”<Ð)Ð) &Ð)Ð)ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7¨XØŒ #Ò%Ð%Ýð:Ø”ð:ð :Ø*2¬-ð:ð :ñô ð ð  (Ÿ}š}™œÐ.Ð.Ð.Ð.Ð.Ð.°Ô7ˆIØ6Ð6¨IÐ6Ñ6Ô6ð	7ð 	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð 	7ð 	7s   –AA?Á?
B	ÂB	c              ƒ   ó”  ‡ ‡‡	K  — ‰                       |¦  «        \  }}‰                      |¦  «        }t          j        t          j        d¬¦  «        ¬¦  «        4 ƒd{V —†	 Š	t          j        ˆˆ ˆ	fd„|D ¦   «         Ž ƒ d{V —†}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ‰                      |¦  «        } ||¦  «        }|S )a
  
        Embeds a list of texts asynchronously.

        Args:
            model (str): The model to use for embedding.
            texts (List[str]): List of texts to embed.

        Returns:
            List[List[float]]: List of embeddings for the texts.
        r‡   )Úlimit)Ú	connectorNc           
      óX   •— g | ]&} ‰j         dd ‰i‰                     ‰|¬¦  «        ¤Ž‘Œ'S )r‘   r.   rC   )r–   rt   )rT   rQ   r   r(   r‘   s     €€€r)   rV   z>AsyncOpenAITextEmbedEmbeddingClient.aembed.<locals>.<listcomp>S  sb   ø€ ð ð ð ð
 ð	 (�DÔ'ð ð Ø 'ðà×3Ò3¸%ÀqÐ3ÑIÔIðð ðð ð r+   )r`   rf   ÚaiohttpÚClientSessionÚTCPConnectorÚasyncioÚgatherrk   )
r(   r   r,   rŠ   r‹   rŒ   rŽ   r�   r1   r‘   s
   ``       @r)   r4   z*AsyncOpenAITextEmbedEmbeddingClient.aembedA  s”  øøøè è € ð &*§]¢]°5Ñ%9Ô%9Ñ"ˆ
�NØ!Ÿ[š[¨Ñ4Ô4ÐåÔ(ÝÔ*°Ð4Ñ4Ô4ð
ñ 
ô 
ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	àÝ*1¬.ðð ð ð ð ð ð
 0ðñ ô ð+ð %ð %ð %ð %ð %ð %Ð!ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð Ÿ-š-Ð(=Ñ>Ô>ˆØ#�^ OÑ4Ô4ˆ
ØÐs   Á"#BÂ
B!Â$B!)r   NN)r;   r<   r=   r>   r?   r
   r   r›   rœ   rL   ÚstaticmethodrI   r   r   r	   r`   rf   r   rk   r   rt   rB   r…   r/   r–   r4   rC   r+   r)   r&   r&   …   sT  € € € € € ðð ð /Ø$(Ø6:ð	ð àðð �s˜D�yÔ!ðð ˜WÔ2Ô3ð	ð
 
ðð ð ð ð à-0ð
ð 
Ø�CŒyð
Ø"*ð
à	ˆt�CŒy˜(Ð"Ô	#ð
ð 
ð 
ñ „\ð
ð,˜D œIð ¨$¨t°C¬y¬/ð ð ð ð ð" ð  d¨3¤i¤ð °T¸#´Yð ð ð ñ „\ðð"
¨#ð 
°d¸3´ið 
ÀDÈÈcÈÄNð 
ð 
ð 
ð 
ð0AØðAØ'+¨C¤yðAà	ˆd�5ŒkÔ	ðAð Að Að Að4˜3ð  t¨C¤yð °T¸$¸u¼+Ô5Fð ð ð ð ð<7ØÔ,ð7Ø8<¸SÀ#¸X¼ð7à	ˆd�5ŒkÔ	ð7ð 7ð 7ð 7ð2 #ð ¨d°3¬ið ¸DÀÀeÄÔ<Mð ð ð ð ð ð r+   r&   ) r>   rž   Úconcurrent.futuresr   Útypingr   r   r   r   r   r	   r
   r›   Únumpyr\   r€   Úlangchain_core.embeddingsr   Úlangchain_core.utilsr   r   Úpydanticr   r   r   r   r   Útyping_extensionsr   Ú__all__r   r&   rC   r+   r)   ú<module>r©      s_  ðð	ð 	ð €€€Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dà €€€Ø Ð Ð Ð Ø €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ "Ð "Ð "Ð "Ð "Ð "à Ð
!€ðgð gð gð gð g˜) Zñ gô gð gðTYð Yð Yð Yð Yñ Yô Yð Yð Yð Yr+   