Ë
    µŒj«'  ã                   ó²   — 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y)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y)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                 óJ   — 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     úq/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/embeddings/infinity.pyÚvalidate_environmentz'InfinityEmbeddings.validate_environment3   s?   € ô
 &:ØÐ&Ð(:ó&
ˆÐ!Ñ"ô BØÐ*Ñ+ô
ˆˆxÑð ˆó    Útextsc                 óT   — | j                   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   s/   € ð —[‘[×&Ñ&Ø—*‘*Øð 'ó 
ˆ
ð Ðr!   c              ƒ   óp   K  — | j                   j                  | j                  |¬«      ƒ d{  –—† }|S 7 Œ­w)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   s=   è ø€ ð  Ÿ;™;×-Ñ-Ø—*‘*Øð .ó 
÷ 
ˆ
ð Ðð	
ús   ‚+6­4®6Útextc                 ó,   — | j                  |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              ƒ   óL   K  — | j                  |g«      ƒ d{  –—† }|d   S 7 Œ	­w)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   s,   è ø€ ð  ×0Ñ0°$°Ó8×8ˆ
Ø˜!‰}Ðð 9ús   ‚$˜"™
$)Ú__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Ø#à3Ð�cÓ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y)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"]
            )

    Nr   Ú
aiosessionr   c                 óŒ   — || _         || _        | j                   �t        | j                   «      dk  rt        d«      ‚d| _        y )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__�   s?   € ð
 ˆŒ	Ø$ˆŒà�9‰9Ð¤ D§I¡I£°Ò 2ÜÐGÓHÐHØˆÕr!   r"   Úsorterc                 óÄ   ‡— t        | «      dk(  r| d„ fS t        j                  | D �cg c]  } ||«       ‘Œ c}«      Š‰D �cg c]  }| |   ‘Œ	 }}|ˆfd„fS c c}w c c}w )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   € ¡Ar!   c                 óZ   •— t        j                  ‰«      D �cg c]  }| |   ‘Œ	 c}S c c}w rI   )ÚnpÚargsort)Úunsorted_embeddingsÚidxÚlength_sorted_idxs     €r   rK   zATinyAsyncOpenAIInfinityEmbeddingClient._permute.<locals>.<lambda>¹   s0   ø€ Ü02·
±
Ð;LÔ0Mó:
Ù0M¨Ð Ó$Ð0Mò:
ùò :
s   ™()rA   rM   rN   )r"   rE   ÚsenrP   Útexts_sortedrQ   s        @r   Ú_permutez/TinyAsyncOpenAIInfinityEmbeddingClient._permute›   st   ø€ ô0 ˆu‹:˜Š?à™+Ð%Ð%ÜŸJ™JÁÓ'FÁ¸©°«ªÀÑ'FÓGÐÙ.?Ó@Ñ.? s˜˜c›
Ð.?ˆÐ@àó 
ð 
ð 	
ùò (GùÚ@s   ¨AÁAc                 ó¸   — t        |«      dk(  r|gS g }t        dt        |«      | j                  «      D ]#  }|j                  |||| 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
        rG   r   )rA   ÚrangerC   Úappend)r'   r"   ÚbatchesÚstart_indexs       r   Ú_batchz-TinyAsyncOpenAIInfinityEmbeddingClient._batch½   s\   € ô ˆu‹:˜Š?à�7ˆNØˆÜ  ¤C¨£J°×0@Ñ0@ÖAˆKØ�N‰N˜5 ¨{¸T×=MÑ=MÑ/MÐNÕOð Bàˆr!   Úbatch_of_textsc                 ó‚   — t        | «      dk(  rt        | d   «      dk(  r| d   S g }| D ]  }|j                  |«       Œ |S )NrG   r   )rA   Úextend)r[   r"   Úsublists      r   Ú_unbatchz/TinyAsyncOpenAIInfinityEmbeddingClient._unbatchÑ   sK   € äˆ~Ó !Ò#¬¨N¸1Ñ,=Ó(>À!Ò(Cà! !Ñ$Ð$ØˆÛ%ˆGØ�L‰L˜Õ!ð &àˆr!   r   c                 óR   — 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Û   s<   € ô Ø—9‘9�+˜[Ð)ð Ð 2ðô ØØôô

ð 
	
r!   Úbatch_textsc                 ó  — t        j                  di | j                  ||¬«      ¤Ž}|j                  dk7  r%t	        d|j                  › d|j
                  › �«      ‚|j                  «       d   D �cg c]  }|d   ‘Œ	 c}S c c}w )Nr$   éÈ   ú5Infinity returned an unexpected response with status ú: ÚdataÚ	embeddingr;   )ÚrequestsÚpostrf   Ústatus_codeÚ	Exceptionr-   rd   )r'   r   rg   ÚresponseÚes        r   Ú_sync_request_embedz:TinyAsyncOpenAIInfinityEmbeddingClient._sync_request_embedñ   s�   € ô —=‘=ñ 
Ø×'Ñ'¨e¸;Ð'ÓGñ
ˆð ×Ñ 3Ò&ÜØGØ×'Ñ'Ð(¨¨8¯=©=¨/ð;óð ð )1¯©«¸Ò(?Ó@Ñ(? 1��+“Ð(?Ñ@Ð@ùÒ@s   Á0A?c                 ój  — | j                  |«      \  }}| j                  |«      }| j                  |gt        |«      z  |f}t        |«      dk(  rt	        t        |Ž «      }n,t        d«      5 }t	         |j
                  |Ž «      }ddd«       | j                  «      }	 ||	«      }
|
S # 1 sw Y   Œ$xY w)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
        rG   é    N)rT   rZ   rt   rA   ÚlistÚmapr   r_   )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Ñ"ˆ
�NØ!Ÿ[™[¨Ó4Ðð ×$Ñ$ØˆG”cÐ,Ó-Ñ-Øð
ˆô
 Ð!Ó" aÒ'Ü$(¬¨h¨Ó$8Ñ!ä# BÔ'¨1Ü(,¨U¨Q¯U©U°HÐ-=Ó(>Ð%÷ (ð Ÿ-™-Ð(=Ó>ˆÙ# OÓ4ˆ
ØÐ÷ (Ð'ús   Á-B)Â)B2ÚsessionÚkwargsc              ƒ   óf  K  —  |j                   di |¤Ž4 ƒd {  –—† }|j                  dk7  r%t        d|j                  › d|j                  › �«      ‚|j	                  «       ƒ d {  –—† d   }|D �cg c]  }|d   ‘Œ	 c}cd d d «      ƒd {  –—†  S 7 Œw7 Œ-c c}w 7 Œ# 1 ƒd {  –—†7  sw Y   y xY w­w)Nri   rj   rk   rl   rm   r;   )ro   Ústatusrq   r-   rd   )r'   r€   r�   rr   rm   rs   s         r   Ú_async_requestz5TinyAsyncOpenAIInfinityEmbeddingClient._async_request  s¡   è ø€ ð  �7—<‘<Ñ) &×)Ò)¨XØ�‰ #Ò%ÜØKØ—‘Ð' r¨(¯-©-¨ð:óð ð  (Ÿ}™}›×.°Ñ7ˆIÙ,5Ó6©I q�A�k“N¨IÑ6÷ *×)Ò)øð /úÚ6ð *ø×)×)Ñ)üsi   ‚B1™BšB1�ABÁ%BÁ&BÁ1BÁ=BÁ?B1ÂBÂB1ÂBÂBÂB1ÂB.Â"B%Â#B.Â*B1c              ƒ   óæ  K  — | j                  |«      \  }}| j                  |«      }t        j                  dt        j                  d¬«      ¬«      4 ƒd{  –—† }t        j                  |D �cg c]&  }| j                  || j                  ||¬«      ¬«      ‘Œ( c}Ž ƒ d{  –—† }ddd«      ƒd{  –—†  | j                  «      }	 ||	«      }
|
S 7 Œyc c}w 7 Œ67 Œ(# 1 ƒd{  –—†7  sw Y   Œ8xY w­w)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
        Trv   )Úlimit)Ú	trust_envÚ	connectorNr$   )r€   r�   )
rT   rZ   ÚaiohttpÚClientSessionÚTCPConnectorÚasyncioÚgatherr„   rf   r_   )r'   r   r"   ry   rz   r{   r€   rJ   r}   r   r(   s              r   r+   z-TinyAsyncOpenAIInfinityEmbeddingClient.aembed'  sý   è ø€ ð &*§]¡]°5Ó%9Ñ"ˆ
�NØ!Ÿ[™[¨Ó4Ðô ×(Ñ(Ø¤g×&:Ñ&:ÀÔ&D÷
õ 
àÜ*1¯.©.ñ 0óñ
 0˜ð	 ×'Ñ'Ø 'Ø#×8Ñ8¸uÈAÐ8ÓNð (õ ð 0ñð+÷ %Ð!÷
÷ 
ð Ÿ-™-Ð(=Ó>ˆÙ# OÓ4ˆ
ØÐð
úòð%øð
ø÷ 
÷ 
ñ 
üsf   ‚AC1ÁCÁC1ÁCÁ/+C
ÂCÂ!CÂ"CÂ&C1Â1CÂ2 C1ÃCÃC1ÃC.Ã"C%Ã#C.Ã*C1)zhttp://localhost:7797/v1N)r2   r3   r4   r5   r6   r   r‰   rŠ   rD   ÚstaticmethodrA   r   r   r	   rT   rZ   r   r_   r   rf   r:   rt   r%   r„   r+   r;   r!   r   r   r   w   s   „ ñð2 /Ø6:ñ
àð
ð ˜W×2Ñ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ð˜3ð  t¨C¡yð °T¸$¸u¹+Ñ5Fó ð:
7Ø×,Ñ,ð
7Ø6:¸3À¸8±nð
7à	ˆd�5‰kÑ	ó
7ð #ð ¨d°3©ið ¸DÀÀeÁÑ<Mô r!   r   )r5   rŒ   Úconcurrent.futuresr   Útypingr   r   r   r   r   r	   r‰   ÚnumpyrM   rn   Úlangchain_core.embeddingsr
   Úlangchain_core.utilsr   Úpydanticr   r   r   Ú__all__r   r   r;   r!   r   Ú<module>r–      sN   ðÙ 3ã Ý 1ß =× =ã Û Û Ý 0Ý 5ß ;Ñ ;àÐ
 €ôc˜ Jô c÷LMò Mr!   