§
    šŠ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
 ddlZddlZddlZddlmZ ddlmZ ddlmZmZmZ dgZ G d	„ dee¦  «        Z G d
„ d¦  «        ZdS )z-written under MIT Licence, Michael Feil 2023.é    N)ÚThreadPoolExecutor)ÚAnyÚCallableÚDictÚListÚOptionalÚTuple)Ú
Embeddings)Úget_from_dict_or_env)Ú	BaseModelÚ
ConfigDictÚmodel_validatorÚInfinityEmbeddingsc                   ó<  — e Zd ZU dZeed<   	 dZeed<   	 dZeed<   	  e	d¬¦  «        Z
 ed	¬
¦  «        ede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   aB  Self-hosted embedding models for `infinity` package.

    See https://github.com/michaelfeil/infinity
    This also works for text-embeddings-inference and other
    self-hosted openai-compatible servers.

    Infinity is a package to interact with Embedding Models on https://github.com/michaelfeil/infinity


    Example:
        .. code-block:: python

            from langchain_community.embeddings import InfinityEmbeddings
            InfinityEmbeddings(
                model="BAAI/bge-small",
                infinity_api_url="http://localhost:7997",
            )
    Úmodelzhttp://localhost:7997Úinfinity_api_urlNÚclientÚforbid)ÚextraÚbefore)ÚmodeÚvaluesÚreturnc                 ó`   — t          |dd¦  «        |d<   t          |d         ¬¦  «        |d<   |S )z?Validate that api key and python package exists in environment.r   ÚINFINITY_API_URL)Úhostr   )r   Ú&TinyAsyncOpenAIInfinityEmbeddingClient)Úclsr   s     úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/embeddings/infinity.pyÚvalidate_environmentz'InfinityEmbeddings.validate_environment3   sN   € õ
 &:ØÐ&Ð(:ñ&
ô &
ˆÐ!Ñ"õ BØÐ*Ô+ð
ñ 
ô 
ˆˆxÑð ˆó    Útextsc                 óH   — | j                              | j        |¬¦  «        }|S )z¶Call out to Infinity's embedding endpoint.

        Args:
            texts: The list of texts to embed.

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

        Args:
            texts: The list of texts to embed.

        Returns:
            List of embeddings, one for each text.
        r$   N)r   Úaembedr   r&   s      r   Úaembed_documentsz#InfinityEmbeddings.aembed_documentsP   sR   è è € ð  œ;×-Ò-Ø”*Øð .ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆ
ð Ðr!   Útextc                 ó:   — |                       |g¦  «        d         S )zžCall out to Infinity's embedding endpoint.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        r   )r)   )r'   r-   s     r   Úembed_queryzInfinityEmbeddings.embed_query_   s   € ð ×#Ò# T FÑ+Ô+¨AÔ.Ð.r!   c              ƒ   óN   K  — |                       |g¦  «        ƒ d{V —†}|d         S )z¤Async call out to Infinity's embedding endpoint.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        Nr   )r,   )r'   r-   r(   s      r   Úaembed_queryzInfinityEmbeddings.aembed_queryj   s9   è è € ð  ×0Ò0°$°Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8ˆ
Ø˜!Œ}Ðr!   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r   r   r   r   Úmodel_configr   Úclassmethodr   r    r   Úfloatr)   r,   r/   r1   © r!   r   r   r      s`  € € € € € € ðð ð& €J€J�JØ#à3Ð�cÐ3Ð3Ñ3Øà€FˆCÐÐÑØð �:Øðñ ô €Lð €_˜(Ð#Ñ#Ô#Øð
¨$ð 
°3ð 
ð 
ð 
ñ „[ñ $Ô#ð
ð 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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
  Helper tool to embed Infinity.

    It is not a part of Langchain's stable API,
    direct use discouraged.

    Example:
        .. code-block:: python


            mini_client = TinyAsyncInfinityEmbeddingClient(
            )
            embeds = mini_client.embed(
                model="BAAI/bge-small",
                text=["doc1", "doc2"]
            )
            # or
            embeds = await mini_client.aembed(
                model="BAAI/bge-small",
                text=["doc1", "doc2"]
            )

    úhttp://localhost:7797/v1Nr   Ú
aiosessionr   c                 óŒ   — || _         || _        | j         �t          | j         ¦  «        dk     rt          d¦  «        ‚d| _        d S )Né   z( param `host` must be set to a valid urlé€   )r   r>   ÚlenÚ
ValueErrorÚ_batch_size)r'   r   r>   s      r   Ú__init__z/TinyAsyncOpenAIInfinityEmbeddingClient.__init__�   sI   € ð
 ˆŒ	Ø$ˆŒàŒ9Ð¥ D¤I¡¤°Ò 2Ð 2ÝÐGÑHÔHÐHØˆÔÐÐr!   r"   Úsorterc                 ó¢   ‡ ‡‡— t          ‰ ¦  «        dk    r‰ d„ fS t          j        ˆfd„‰ D ¦   «         ¦  «        Šˆ fd„‰D ¦   «         }|ˆfd„fS )a’  Sort texts in ascending order, and
        delivers a lambda expr, which can sort a same length list
        https://github.com/UKPLab/sentence-transformers/blob/
        c5f93f70eca933c78695c5bc686ceda59651ae3b/sentence_transformers/SentenceTransformer.py#L156

        Args:
            texts (List[str]): _description_
            sorter (Callable, optional): _description_. Defaults to len.

        Returns:
            Tuple[List[str], Callable]: _description_

        Example:
            ```
            texts = ["one","three","four"]
            perm_texts, undo = self._permute(texts)
            texts == undo(perm_texts)
            ```
        é   c                 ó   — | S )Nr;   )Úts    r   ú<lambda>zATinyAsyncOpenAIInfinityEmbeddingClient._permute.<locals>.<lambda>µ   s   €  A€ r!   c                 ó(   •— g | ]} ‰|¦  «         ‘ŒS r;   r;   )Ú.0ÚsenrF   s     €r   ú
<listcomp>zCTinyAsyncOpenAIInfinityEmbeddingClient._permute.<locals>.<listcomp>¶   s#   ø€ Ð'FÐ'FÐ'F¸¨¨°©¬¨Ð'FÐ'FÐ'Fr!   c                 ó    •— g | ]
}‰|         ‘ŒS r;   r;   )rM   Úidxr"   s     €r   rO   zCTinyAsyncOpenAIInfinityEmbeddingClient._permute.<locals>.<listcomp>·   s   ø€ Ð@Ð@Ð@ s˜˜cœ
Ð@Ð@Ð@r!   c                 óF   •‡ — ˆ fd„t          j        ‰¦  «        D ¦   «         S )Nc                 ó    •— g | ]
}‰|         ‘ŒS r;   r;   )rM   rQ   Úunsorted_embeddingss     €r   rO   zUTinyAsyncOpenAIInfinityEmbeddingClient._permute.<locals>.<lambda>.<locals>.<listcomp>¹   s,   ø€ ð :
ð :
ð :
Ø),Ð Ô$ð:
ð :
ð :
r!   )ÚnpÚargsort)rT   Úlength_sorted_idxs   `€r   rK   zATinyAsyncOpenAIInfinityEmbeddingClient._permute.<locals>.<lambda>¹   s7   øø€ ð :
ð :
ð :
ð :
Ý02´
Ð;LÑ0MÔ0Mð:
ñ :
ô :
€ r!   )rB   rU   rV   )r"   rF   Útexts_sortedrW   s   `` @r   Ú_permutez/TinyAsyncOpenAIInfinityEmbeddingClient._permute›   sƒ   øøø€ õ0 ˆ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 )aX  
        splits Lists of text parts into batches of size max `self._batch_size`
        When encoding vector database,

        Args:
            texts (List[str]): List of sentences
            self._batch_size (int, optional): max batch size of one request.

        Returns:
            List[List[str]]: Batches of List of sentences
        rH   r   )rB   ÚrangerD   Úappend)r'   r"   ÚbatchesÚstart_indexs       r   Ú_batchz-TinyAsyncOpenAIInfinityEmbeddingClient._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 )NrH   r   )rB   Úextend)r`   r"   Úsublists      r   Ú_unbatchz/TinyAsyncOpenAIInfinityEmbeddingClient._unbatchÑ   se   € åˆ~ÑÔ !Ò#Ð#­¨N¸1Ô,=Ñ(>Ô(>À!Ò(CÐ(Cà! !Ô$Ð$ØˆØ%ð 	"ð 	"ˆGØ�LŠL˜Ñ!Ô!Ð!Ð!Øˆr!   r   c                 óX   — t          | j        › d�ddit          ||¬¦  «        ¬¦  «        S )zçBuild the kwargs for the Post request, used by sync

        Args:
            model (str): _description_
            texts (List[str]): _description_

        Returns:
            Dict[str, Collection[str]]: _description_
        z/embeddingszcontent-typezapplication/json)Úinputr   )ÚurlÚheadersÚjson)Údictr   )r'   r   r"   s      r   Ú_kwargs_post_requestz;TinyAsyncOpenAIInfinityEmbeddingClient._kwargs_post_requestÛ   sP   € õ Ø”9Ð)Ð)Ð)ð Ð 2ðõ ØØðñ ô ð

ñ 

ô 

ð 
	
r!   Úbatch_textsc                 óê   — t          j        di |                      ||¬¦  «        ¤Ž}|j        dk    rt	          d|j        › d|j        › �¦  «        ‚d„ |                     ¦   «         d         D ¦   «         S )Nr$   éÈ   ú5Infinity returned an unexpected response with status ú: c                 ó   — g | ]
}|d          ‘ŒS ©Ú	embeddingr;   ©rM   Úes     r   rO   zNTinyAsyncOpenAIInfinityEmbeddingClient._sync_request_embed.<locals>.<listcomp>ü   s   € Ð@Ð@Ð@ 1��+”Ð@Ð@Ð@r!   Údatar;   )ÚrequestsÚpostrk   Ústatus_codeÚ	Exceptionr-   ri   )r'   r   rl   Úresponses       r   Ú_sync_request_embedz:TinyAsyncOpenAIInfinityEmbeddingClient._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 )zícall the embedding of model

        Args:
            model (str): to embedding model
            texts (List[str]): List of sentences to embed.

        Returns:
            List[List[float]]: List of vectors for each sentence
        rH   é    N)rY   r_   r|   rB   ÚlistÚmapr   rd   )r'   r   r"   Ú
perm_textsÚunpermute_funcÚperm_texts_batchedÚmap_argsÚembeddings_batch_permÚpÚembeddings_permr(   s              r   r%   z,TinyAsyncOpenAIInfinityEmbeddingClient.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 )Nrn   ro   rp   rv   c                 ó   — g | ]
}|d          ‘ŒS rr   r;   rt   s     r   rO   zITinyAsyncOpenAIInfinityEmbeddingClient._async_request.<locals>.<listcomp>%  s   € Ð6Ð6Ð6 q�A�k”NÐ6Ð6Ð6r!   r;   )rx   Ústatusrz   r-   ri   )r'   rˆ   r‰   r{   rs   s        r   Ú_async_requestz5TinyAsyncOpenAIInfinityEmbeddingClient._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        d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 )zûcall the embedding of model, async method

        Args:
            model (str): to embedding model
            texts (List[str]): List of sentences to embed.

        Returns:
            List[List[float]]: List of vectors for each sentence
        Tr~   )Úlimit)Ú	trust_envÚ	connectorNc           	      óh   •— g | ].}‰                      ‰‰                     ‰|¬ ¦  «        ¬¦  «        ‘Œ/S )r$   )rˆ   r‰   )r�   rk   )rM   rJ   r   r'   rˆ   s     €€€r   rO   zATinyAsyncOpenAIInfinityEmbeddingClient.aembed.<locals>.<listcomp>9  sY   ø€ ð ð ð ð
 ð	 ×'Ò'Ø 'Ø#×8Ò8¸uÈAÐ8ÑNÔNð (ñ ô ðð ð r!   )rY   r_   ÚaiohttpÚClientSessionÚTCPConnectorÚasyncioÚgatherrd   )
r'   r   r"   r�   r‚   rƒ   r…   r‡   r(   rˆ   s
   ``       @r   r+   z-TinyAsyncOpenAIInfinityEmbeddingClient.aembed'  s˜  øøøè è € ð &*§]¢]°5Ñ%9Ô%9Ñ"ˆ
�NØ!Ÿ[š[¨Ñ4Ô4Ðõ Ô(Ø¥gÔ&:ÀÐ&DÑ&DÔ&Dð
ñ 
ô 
ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	àÝ*1¬.ðð ð ð ð ð ð
 0ðñ ô ð+ð %ð %ð %ð %ð %ð %Ð!ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð Ÿ-š-Ð(=Ñ>Ô>ˆØ#�^ OÑ4Ô4ˆ
ØÐs   Á##BÂ
B"Â%B")r=   N)r2   r3   r4   r5   r6   r   r“   r”   rE   ÚstaticmethodrB   r   r   r	   rY   r_   r   rd   r   rk   r:   r|   r%   r�   r+   r;   r!   r   r   r   w   s?  € € € € € ðð ð2 /Ø6:ð
ð 
àð
ð ˜WÔ2Ô3ð
ð 
ð	
ð 
ð 
ð 
ð à-0ð
ð 
Ø�CŒyð
Ø"*ð
à	ˆt�CŒy˜(Ð"Ô	#ð
ð 
ð 
ñ „\ð
ðB˜D œIð ¨$¨t°C¬y¬/ð ð ð ð ð( ð  d¨3¤i¤ð °T¸#´Yð ð ð ñ „\ðð
¨#ð 
°d¸3´ið 
ÀDÈÈcÈÄNð 
ð 
ð 
ð 
ð,AØðAØ'+¨C¤yðAà	ˆd�5ŒkÔ	ðAð Að Að Að˜3ð  t¨C¤yð °T¸$¸u¼+Ô5Fð ð ð ð ð:
7ØÔ,ð
7Ø6:¸3À¸8´nð
7à	ˆd�5ŒkÔ	ð
7ð 
7ð 
7ð 
7ð #ð ¨d°3¬ið ¸DÀÀeÄÔ<Mð ð ð ð ð ð r!   r   )r5   r–   Úconcurrent.futuresr   Útypingr   r   r   r   r   r	   r“   ÚnumpyrU   rw   Úlangchain_core.embeddingsr
   Úlangchain_core.utilsr   Úpydanticr   r   r   Ú__all__r   r   r;   r!   r   ú<module>r       s/  ðØ 3Ð 3à €€€Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =à €€€Ø Ð Ð Ð Ø €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;àÐ
 €ðcð cð cð cð c˜ Jñ cô cð cðLMð Mð Mð Mð Mñ Mô Mð Mð Mð Mr!   