U
    h                     @  sr   d dl mZ d dlmZmZmZmZ d dlZd dlm	Z	 d dl
mZmZmZ d dlmZmZ G dd dee	ZdS )	    )annotations)DictListOptionalcastN)
Embeddings)	BaseModel	SecretStrroot_validatorconvert_to_secret_strget_from_dict_or_envc                   @  s   e Zd ZU dZdZded< dZded< dZded	< dZded
< dZ	ded< G dd dZ
edddddddZdddddZdddddZdddddZdS )ClovaEmbeddingsa  
    Clova's embedding service.

    To use this service,

    you should have the following environment variables
    set with your API tokens and application ID,
    or pass them as named parameters to the constructor:

    - ``CLOVA_EMB_API_KEY``: API key for accessing Clova's embedding service.
    - ``CLOVA_EMB_APIGW_API_KEY``: API gateway key for enhanced security.
    - ``CLOVA_EMB_APP_ID``: Application ID for identifying your application.

    Example:
        .. code-block:: python

            from langchain_community.embeddings import ClovaEmbeddings
            embeddings = ClovaEmbeddings(
                clova_emb_api_key='your_clova_emb_api_key',
                clova_emb_apigw_api_key='your_clova_emb_apigw_api_key',
                app_id='your_app_id'
            )

            query_text = "This is a test query."
            query_result = embeddings.embed_query(query_text)

            document_text = "This is a test document."
            document_result = embeddings.embed_documents([document_text])

    zChttps://clovastudio.apigw.ntruss.com/testapp/v1/api-tools/embeddingstrendpoint_urlzclir-emb-dolphinmodelNzOptional[SecretStr]clova_emb_api_keyclova_emb_apigw_api_keyapp_idc                   @  s   e Zd ZdZdS )zClovaEmbeddings.ConfigZforbidN)__name__
__module____qualname__extra r   r   H/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/embeddings/clova.pyConfig8   s   r   T)prer   )valuesreturnc                 C  s@   t t|dd|d< t t|dd|d< t t|dd|d< |S )z'Validate api key exists in environment.r   ZCLOVA_EMB_API_KEYr   ZCLOVA_EMB_APIGW_API_KEYr   ZCLOVA_EMB_APP_IDr   )clsr   r   r   r   validate_environment;   s    
  
z$ClovaEmbeddings.validate_environmentz	List[str]zList[List[float]])textsr   c                 C  s"   g }|D ]}| | | q|S )z
        Embed a list of texts and return their embeddings.

        Args:
            texts: The list of texts to embed.

        Returns:
            List of embeddings, one for each text.
        )append_embed_text)selfr!   Z
embeddingstextr   r   r   embed_documentsK   s    
zClovaEmbeddings.embed_documentszList[float])r%   r   c                 C  s
   |  |S )z
        Embed a single query text and return its embedding.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        )r#   )r$   r%   r   r   r   embed_queryZ   s    
zClovaEmbeddings.embed_queryc                 C  s   d|i}t t| j t t| j dd}t t| j }tj| j d| j	 d| ||d}|j
dkr| }d|krd|d kr|d d S td	|j
 d
|j dS )zT
        Internal method to call the embedding API and handle the response.
        r%   zapplication/json)zX-NCP-CLOVASTUDIO-API-KEYzX-NCP-APIGW-API-KEYzContent-Type/)headersjson   resultZ	embeddingzAPI request failed with status z: N)r   r	   r   Zget_secret_valuer   r   requestspostr   r   status_coder*   
ValueErrorr%   )r$   r%   payloadr)   r   responseZresponse_datar   r   r   r#   f   s0      
zClovaEmbeddings._embed_text)r   r   r   __doc__r   __annotations__r   r   r   r   r   r
   r    r&   r'   r#   r   r   r   r   r      s   
 
r   )
__future__r   typingr   r   r   r   r-   Zlangchain_core.embeddingsr   Zlangchain_core.pydantic_v1r   r	   r
   Zlangchain_core.utilsr   r   r   r   r   r   r   <module>   s   