
    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
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    d/var/www/html/ai-engine/env/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 )zCall 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 )zAsync 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 )zCall 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     ##TF++A..r+   c                 N   K   |                      |g           d{V }|d         S )zAsync 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         . JJJ(5 )C
 
 
  GS   
 ?R/S/STTTGYTTT$FC:  L _'"""d    #"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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DI 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
;L0M0M:
 :
 :
 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::??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 )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     ~!##N1,=(>(>!(C(C!!$$% 	" 	"GLL!!!!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!94<!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 $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 )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6qAkN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 	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        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:	  sDy! W23	
 
    -0
 
Cy
"*
	tCy("	#
 
 
 \
,DI $tCy/    " d3i T#Y    \"
# 
d3i 
DcN 
 
 
 
0AA'+CyA	d5k	A A A A43 tCy T$u+5F    <7,78<S#X7	d5k	7 7 7 72# d3i 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+   