
    Ng'                         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     c/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/embeddings/infinity.pyvalidate_environmentz'InfinityEmbeddings.validate_environment3   sN    
 &:&(:&
 &
!" B*+
 
 
x     textsc                 H    | j                             | j        |          }|S )zCall 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 )zAsync 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 )zCall 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     ##TF++A..r!   c                 N   K   |                      |g           d{V }|d         S )zAsync 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`         & JJJ#3c333FC :  L _(###
$ 
3 
 
 
 [ $#
T#Y 4U3D    DI $tE{:K    	/ 	/U 	/ 	/ 	/ 	/
s 
tE{ 
 
 
 
 
 
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DI 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
;L0M0M:
 :
 :
 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::??7N CJJ0@AA 	P 	PKNN5{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    ~!##N1,=(>(>!(C(C!!$$% 	" 	"GLL!!!!r!   r   c                 X    t          | j         dddit          ||                    S )zBuild 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 )zcall 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 $Gc,---

 !""a''$(h$8$8!!#B'' ?1(,UQUH-=(>(>%? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --(=>>#^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6qAkN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 	7X#%%:: :*2-: :    (}}......7I66I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 )zcall 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8uA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
 
Cy
"*
	tCy("	#
 
 
 \
BDI $tCy/    ( d3i T#Y    \
# 
d3i 
DcN 
 
 
 
,AA'+CyA	d5k	A A A A3 tCy T$u+5F    :
7,
76:38n
7	d5k	
7 
7 
7 
7# d3i 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!   