
    7|hP                     t    d dl mZmZmZmZmZ d dlZd dlmZ d dl	m
Z
mZ d dlmZmZ dZdZ G d d	ee      Zy)
    )AnyDictListMappingOptionalN)
Embeddings)get_from_dict_or_envpre_init)	BaseModel
ConfigDictz#sentence-transformers/clip-ViT-B-32i   c                   6   e Zd ZU dZeZeed<   	 dZe	ed<   	 dZ
eed<   	 dZeed<   	 d	Zee   ed
<   	 d	Zee   ed<   	 eZeed<   	  edd      Zededefd       Zedeeef   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 y	)DeepInfraEmbeddingsa  Deep Infra's embedding inference service.

    To use, you should have the
    environment variable ``DEEPINFRA_API_TOKEN`` set with your API token, or pass
    it as a named parameter to the constructor.
    There are multiple embeddings models available,
    see https://deepinfra.com/models?type=embeddings.

    Example:
        .. code-block:: python

            from langchain_community.embeddings import DeepInfraEmbeddings
            deepinfra_emb = DeepInfraEmbeddings(
                model_id="sentence-transformers/clip-ViT-B-32",
                deepinfra_api_token="my-api-key"
            )
            r1 = deepinfra_emb.embed_documents(
                [
                    "Alpha is the first letter of Greek alphabet",
                    "Beta is the second letter of Greek alphabet",
                ]
            )
            r2 = deepinfra_emb.embed_query(
                "What is the second letter of Greek alphabet"
            )

    model_idF	normalizez	passage: embed_instructionzquery: query_instructionNmodel_kwargsdeepinfra_api_token
batch_sizeforbid )extraprotected_namespacesvaluesreturnc                 *    t        |dd      }||d<   |S )z?Validate that api key and python package exists in environment.r   DEEPINFRA_API_TOKEN)r	   )clsr   r   s      g/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/embeddings/deepinfra.pyvalidate_environmentz(DeepInfraEmbeddings.validate_environment;   s*     3)+@
 )<$%    c                     d| j                   iS )zGet the identifying parameters.r   )r   )selfs    r   _identifying_paramsz'DeepInfraEmbeddings._identifying_paramsD   s     DMM**r!   inputc                 .   | j                   xs i }d| j                   dd}	 t        j                  d| j                   ||| j
                  d|      }|j                  dk7  r%t        d	|j                  d
|j                        	 |j                         }|d   }|S # t        j                  j                  $ r}t        d|       d }~ww xY w# t        j                  j                  $ r }t        d| d|j                         d }~ww xY w)Nzbearer zapplication/json)AuthorizationzContent-Typez'https://api.deepinfra.com/v1/inference/)inputsr   )headersjsonz$Error raised by inference endpoint:    z)Error raised by inference API HTTP code: z, 
embeddingszError raised by inference API: z.
Response: )r   r   requestspostr   r   
exceptionsRequestException
ValueErrorstatus_codetextr*   JSONDecodeError)r#   r%   _model_kwargsr)   resetr,   s           r   _embedzDeepInfraEmbeddings._embedI   s$   ))/R  't'?'?&@A.

	I--9$--I %DNNTmTC ??c!??CHH. 	
A<J ! ""33 	ICA3GHH	I ""22 	1!M#((L 	s/   4B$ C $CCCD4DDtextsc                    g }|D cg c]  }| j                    |  }}t        dt        |      | j                        D cg c]  }|||| j                  z     }}|D ]  }|| j	                  |      z  } |S c c}w c c}w )aQ  Embed documents using a Deep Infra deployed embedding model.
        For larger batches, the input list of texts is chunked into smaller
        batches to avoid exceeding the maximum request size.

        Args:
            texts: The list of texts to embed.

        Returns:
            List of embeddings, one for each text.
        r   )r   rangelenr   r9   )r#   r:   r,   r3   instruction_pairsichunkschunks           r   embed_documentsz#DeepInfraEmbeddings.embed_documentsi   s     
KPQ4 6 67v>QQ 1c"34dooF
 a!doo"56
 
  	-E$++e,,J	-  R
s   A:A?r3   c                 P    | j                    | }| j                  |g      d   }|S )zEmbed a query using a Deep Infra deployed embedding model.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        r   )r   r9   )r#   r3   instruction_pair	embeddings       r   embed_queryzDeepInfraEmbeddings.embed_query   s7     #445dV<KK!1 23A6	r!   )!__name__
__module____qualname____doc__DEFAULT_MODEL_IDr   str__annotations__r   boolr   r   r   r   dictr   MAX_BATCH_SIZEr   intr   model_configr
   r   r    propertyr   r   r$   r   floatr9   rB   rF   r   r!   r   r   r      s   8 %Hc$"It6(s(.&s&.#'L(4.'")-#-D$J$,H2FL$ 4   +WS#X%6 + +DI $tE{*; @T#Y 4U3D 0 U r!   r   )typingr   r   r   r   r   r-   langchain_core.embeddingsr   langchain_core.utilsr	   r
   pydanticr   r   rK   rP   r   r   r!   r   <module>rY      s2    5 5  0 ? *8 @)Z @r!   