§
    æ˜ºh(  ã                   óÀ   — 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mZmZ ddl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)Ú	BaseModelÚExtraÚroot_validator)Úget_from_dict_or_envÚInfinityEmbeddingsc                   ó.  — e Zd ZU dZeed<   	 dZeed<   	 dZeed<   	  G d„ d¦  «        Z	 e
d	¬
¦  «        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   a,  Embedding models for self-hosted https://github.com/michaelfeil/infinity
    This should also work for text-embeddings-inference and other
    self-hosted openai-compatible servers.

    Infinity is a class 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:7797/v1",
            )
    Úmodelúhttp://localhost:7797/v1Úinfinity_api_urlNÚclientc                   ó    — e Zd ZdZej        ZdS )úInfinityEmbeddings.Configz'Configuration for this pydantic object.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚforbidÚextra© ó    úo/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/embeddings/infinity.pyÚConfigr   -   s   € € € € € Ø5Ð5à”ˆˆˆr   r    T)Úallow_reuseÚ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     r   Úvalidate_environmentz'InfinityEmbeddings.validate_environment2   sN   € õ &:ØÐ&Ð(:ñ&
ô &
ˆÐ!Ñ"õ BØÐ*Ô+ð
ñ 
ô 
ˆˆxÑð ˆr   Ú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_documents?   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_documentsN   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   )r1   )r/   r5   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   )r4   )r/   r5   r0   s      r   Úaembed_queryzInfinityEmbeddings.aembed_queryh   s9   è è € ð  ×0Ò0°$°Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8ˆ
Ø˜!Œ}Ðr   )r   r   r   r   ÚstrÚ__annotations__r   r   r   r    r   r   r)   r   Úfloatr1   r4   r7   r9   r   r   r   r   r      sc  € € € € € € ðð ð" €J€J�JØ#à6Ð�cÐ6Ð6Ñ6Øà€FˆCÐÐÑØðð ð ð ð ñ ô ð ð
 €^ Ð%Ñ%Ô%ð
¨$ð 
°4ð 
ð 
ð 
ñ &Ô%ð
ð 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ÿ  A helper tool to embed Infinity. Not 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"]
            )

    r   Nr&   Ú
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Ú	Exceptionr5   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_permr0   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   r0   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   r5   ri   )r/   rˆ   r‰   r{   rs   s        r   Ú_async_requestz5TinyAsyncOpenAIInfinityEmbeddingClient._async_request  sT  è è € ð  �7”<Ð)Ð) &Ð)Ð)ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7¨XØŒ #Ò%Ð%Ýð:Ø”ð:ð :Ø*2¬-ð:ð :ñô ð ð  (Ÿ}š}™œÐ.Ð.Ð.Ð.Ð.Ð.°Ô=ˆ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  — ‰                       |¦  «        \  }}‰                      |¦  «        }‰ j        €.t          j        dt          j        d¬¦  «        ¬¦  «        ‰ _        ‰ j        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
        NTr~   )Úlimit)Ú	trust_envÚ	connectorc           
      óX   •— g | ]&} ‰j         dd ‰i‰                     ‰|¬¦  «        ¤Ž‘Œ'S )rˆ   r,   r   )r�   rk   )rM   rJ   r   r/   rˆ   s     €€€r   rO   zATinyAsyncOpenAIInfinityEmbeddingClient.aembed.<locals>.<listcomp>7  sb   ø€ ð ð ð ð
 ð	 (�DÔ'ð ð Ø 'ðà×3Ò3¸%ÀqÐ3ÑIÔIðð ðð ð r   )	rY   r_   r>   ÚaiohttpÚClientSessionÚTCPConnectorÚasyncioÚgatherrd   )
r/   r   r*   r�   r‚   rƒ   r…   r‡   r0   rˆ   s
   ``       @r   r3   z-TinyAsyncOpenAIInfinityEmbeddingClient.aembed#  s¥  øøøè è € ð &*§]¢]°5Ñ%9Ô%9Ñ"ˆ
�NØ!Ÿ[š[¨Ñ4Ô4Ðð Œ?Ð"Ý%Ô3Ø­'Ô*>ÀRÐ*HÑ*HÔ*Hðñ ô ˆDŒOð ”?ð 		ð 		ð 		ð 		ð 		ð 		ð 		 gÝ*1¬.ðð ð ð ð ð ð
 0ðñ ô ð+ð %ð %ð %ð %ð %ð %Ð!ð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð Ÿ-š-Ð(=Ñ>Ô>ˆØ#�^ OÑ4Ô4ˆ
ØÐs   Á5#B*Â*
B4Â7B4)r   N)r   r   r   r   r:   r   r“   r”   rE   ÚstaticmethodrB   r   r   r	   rY   r_   r   rd   r   rk   r<   r|   r-   r�   r3   r   r   r   r'   r'   u   s?  € € € € € ðð ð. /Ø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'   )r   r–   Úconcurrent.futuresr   Útypingr   r   r   r   r   r	   r“   ÚnumpyrU   rw   Úlangchain_core.embeddingsr
   Úlangchain_core.pydantic_v1r   r   r   Úlangchain_core.utilsr   Ú__all__r   r'   r   r   r   ú<module>r       s/  ðØ 3Ð 3à €€€Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =à €€€Ø Ð Ð Ð Ø €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ 5Ð 5Ð 5Ð 5Ð 5Ð 5àÐ
 €ðað að að að a˜ Jñ aô að aðHMð Mð Mð Mð Mñ Mô Mð Mð Mð Mr   