
    dh'                         S r SSKrSSKJr  SSKJrJrJrJrJ	r	J
r
  SSKrSSKrSSKrSSKJr  SSKJr  SSKJrJrJr  S/r " S	 S\\5      r " S
 S5      rg)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                       \ rS rSr% Sr\\S'    Sr\\S'    Sr\	\S'    \
" SS	9r\" S
S9\S\S\	4S j5       5       rS\\   S\\\      4S jrS\\   S\\\      4S jrS\S\\   4S jrS\S\\   4S jrSrg)r      a  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                 D    [        USS5      US'   [        US   S9US'   U$ )z?Validate that api key and python package exists in environment.r   INFINITY_API_URL)hostr   )r   &TinyAsyncOpenAIInfinityEmbeddingClient)clsr   s     _/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/embeddings/infinity.pyvalidate_environment'InfinityEmbeddings.validate_environment3   s?    
 &:&(:&
!" B*+
x     textsc                 N    U R                   R                  U R                  US9nU$ )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_documents"InfinityEmbeddings.embed_documentsA   s/     [[&&** ' 

 r#   c                 j   #    U R                   R                  U R                  US9I Sh  vN nU$  N7f)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_documents#InfinityEmbeddings.aembed_documentsP   s<       ;;--** . 
 

 	
s   (313textc                 ,    U R                  U/5      S   $ )zvCall out to Infinity's embedding endpoint.

Args:
    text: The text to embed.

Returns:
    Embeddings for the text.
r   )r+   )r)   r1   s     r    embed_queryInfinityEmbeddings.embed_query_   s     ##TF+A..r#   c                 L   #    U R                  U/5      I Sh  vN nUS   $  N	7f)z|Async call out to Infinity's embedding endpoint.

Args:
    text: The text to embed.

Returns:
    Embeddings for the text.
Nr   )r/   )r)   r1   r*   s      r    aembed_queryInfinityEmbeddings.aembed_queryj   s+       00$88
!} 9s   $"
$ )__name__
__module____qualname____firstlineno____doc__str__annotations__r   r   r   r   model_configr   classmethodr   r!   r   floatr+   r/   r3   r6   __static_attributes__r8   r#   r    r   r      s    & J#3c3FC L (#
$ 
3 
  $
T#Y 4U3D DI $tE{:K 	/ 	/U 	/
s 
tE{ 
r#   c            
          \ rS rSrSr  SS\S\\R                     SS4S jjr	\
\4S\\   S	\S\\\   \4   4S
 jj5       rS\\   S\\\      4S jr\
S\\\      S\\   4S j5       rS\S\\   S\\\4   4S jrS\S\\   S\\\      4S jrS\S\\   S\\\      4S jrS\R                  S\\\4   S\\\      4S jrS\S\\   S\\\      4S jrSrg)r   w   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                     Xl         X l        U R                   b  [        U R                   5      S:  a  [        S5      eSU l        g )N   z( param `host` must be set to a valid url   )r   rF   len
ValueError_batch_size)r)   r   rF   s      r    __init__/TinyAsyncOpenAIInfinityEmbeddingClient.__init__   s;    
 	$99DII 2GHHr#   r$   sorterc                    ^ [        U 5      S:X  a  U S 4$ [        R                  " U  Vs/ sH  o!" U5      * PM     sn5      mT Vs/ sH  o0U   PM	     nnUU4S j4$ s  snf s  snf )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                     U $ Nr8   )ts    r    <lambda>ATinyAsyncOpenAIInfinityEmbeddingClient._permute.<locals>.<lambda>   s    Ar#   c                 ^   > [         R                  " T5       Vs/ sH  oU   PM	     sn$ s  snf rS   )npargsort)unsorted_embeddingsidxlength_sorted_idxs     r    rU   rV      s-    02

;L0M:
0M$0M:
 :
s   *)rJ   rX   rY   )r$   rO   senr[   texts_sortedr\   s        @r    _permute/TinyAsyncOpenAIInfinityEmbeddingClient._permute   sr    0 u:?+%%JJ'F'FG.?@.?sc
.?@ 
 
 	
 (G@s   AA"c                     [        U5      S:X  a  U/$ / n[        S[        U5      U R                  5       H"  nUR                  XX0R                  -    5        M$     U$ )a  
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
rQ   r   )rJ   rangerL   append)r)   r$   batchesstart_indexs       r    _batch-TinyAsyncOpenAIInfinityEmbeddingClient._batch   sX     u:?7N CJ0@0@AKNN5{=M=M/MNO Br#   batch_of_textsc                     [        U 5      S:X  a  [        U S   5      S:X  a  U S   $ / nU  H  nUR                  U5        M     U$ )NrQ   r   )rJ   extend)rh   r$   sublists      r    _unbatch/TinyAsyncOpenAIInfinityEmbeddingClient._unbatch   sK    ~!#N1,=(>!(C!!$$%GLL! &r#   r   c           	      F    [        U R                   S3SS0[        UUS9S9$ )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_request;TinyAsyncOpenAIInfinityEmbeddingClient._kwargs_post_request   s<     99+[)  2 

 
	
r#   batch_textsc           	         [         R                  " S0 U R                  XS9D6nUR                  S:w  a%  [	        SUR                   SUR
                   35      eUR                  5       S    Vs/ sH  oDS   PM	     sn$ s  snf )Nr&      5Infinity returned an unexpected response with status : data	embeddingr8   )requestspostrt   status_code	Exceptionr1   rr   )r)   r   rv   responsees        r    _sync_request_embed:TinyAsyncOpenAIInfinityEmbeddingClient._sync_request_embed   s     == 
''e'G
 3&G''(8==/;  )1(?@(?1+(?@@@s   .A>c                 t   U R                  U5      u  p4U R                  U5      nU R                  U/[        U5      -  U4n[        U5      S:X  a  [	        [        U6 5      nO,[        S5       n[	        UR
                  " U6 5      nSSS5        U R                  W5      n	U" U	5      n
U
$ ! , (       d  f       N)= f)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
rQ       N)r_   rf   r   rJ   listmapr   rl   )r)   r   r$   
perm_textsunpermute_funcperm_texts_batchedmap_argsembeddings_batch_permpembeddings_permr*   s              r    r'   ,TinyAsyncOpenAIInfinityEmbeddingClient.embed   s     &*]]5%9"
![[4 $$Gc,--

 !"a'$(h$8!#B'1(,QUUH-=(>% ( --(=>#O4
 ('s   -B))
B7sessionkwargsc                 t  #    UR                   " S0 UD6 IS h  vN nUR                  S:w  a%  [        SUR                   SUR                   35      eUR	                  5       I S h  vN S   nU Vs/ sH  oUS   PM	     snsS S S 5      IS h  vN   $  Ny N.s  snf  N! , IS h  vN  (       d  f       g = f7f)Nrx   ry   rz   r{   r|   r8   )r~   statusr   r1   rr   )r)   r   r   r   r|   r   s         r    _async_request5TinyAsyncOpenAIInfinityEmbeddingClient._async_request  s      <<)&))X#%K'r(--:   (}}.7I,56IqkNI6 *)) /6 *)))si   B8BB8A	B&B'B2B?BB8BB8BBB8B5$B'%B51B8c                   #    U R                  U5      u  p4U R                  U5      n[        R                  " S[        R                  " SS9S9 ISh  vN n[
        R                  " U Vs/ sH   nU R                  UU R                  XS9S9PM"     sn6 I Sh  vN nSSS5      ISh  vN   U R                  W5      n	U" U	5      n
U
$  Nus  snf  N6 N(! , ISh  vN  (       d  f       N== f7f)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	connectorNr&   )r   r   )
r_   rf   aiohttpClientSessionTCPConnectorasynciogatherr   rt   rl   )r)   r   r$   r   r   r   r   rT   r   r   r*   s              r    r.   -TinyAsyncOpenAIInfinityEmbeddingClient.aembed'  s      &*]]5%9"
![[4 ((g&:&:&D
 
*1.. 0
 0	 '' '#88u8N (  0+ %!
 
 --(=>#O4

%
 
 
 
sf   AC-CC-C+&C

CCCC-(C) C-
CC-C*CC*&C-)rL   rF   r   )zhttp://localhost:7797/v1N)r9   r:   r;   r<   r=   r>   r   r   r   rM   staticmethodrJ   r   r   r	   r_   rf   r   rl   r   rt   rB   r   r'   r   r.   rC   r8   r#   r    r   r   w   s   2 /6:

 W223
 
	
 -0
Cy
"*
	tCy("	#
 
BDI $tCy/ ( d3i T#Y  
# 
d3i 
DcN 
,AA'+CyA	d5k	A3 tCy T$u+5F :
7,,
76:38n
7	d5k	
7# d3i De<M r#   r   )r=   r   concurrent.futuresr   typingr   r   r   r   r   r	   r   numpyrX   r}   langchain_core.embeddingsr
   langchain_core.utilsr   pydanticr   r   r   __all__r   r   r8   r#   r    <module>r      sN    3  1 = =    0 5 ; ;
 cJ cLM Mr#   