o
    Zh*                      @   s   d dl Z 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mZmZmZmZ d dlmZ dZdZe eZd	ejd
dfddZd	ejd
dfddZG dd dee	ZdS )    N)AnyDictListOptionalcast)
Embeddings)convert_to_secret_strget_from_env)AliasChoices	BaseModel
ConfigDictField	SecretStrmodel_validator)Selfz$https://clovastudio.apigw.ntruss.comz%https://clovastudio.stream.ntruss.comresponsereturnc                 C   sH   t j| jr"|  d}t jd| j d| j d| | j| ddS )+Raise an error if the response is an error.utf-8Error response  while fetching : requestr   N)	httpxcodesis_errorstatus_codereaddecodeHTTPStatusErrorurlr   r   error_message r$   [/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/embeddings/naver.py_raise_on_error   s   
r&   c                    sP   t j| jr&|  I dH d}t jd| j d| j d| | j| ddS )r   Nr   r   r   r   r   )	r   r   r   r   Zareadr   r    r!   r   r"   r$   r$   r%   _araise_on_error#   s   
r'   c                   @   s  e Zd ZU dZeddZeej e	d< eddZ
eej e	d< edddZee e	d< 	 edd	dZee e	d
< 	 edddZee e	d< 	 eddZee e	d< edddZee	d< ededdddZee	d< edddZee	d< edddZedeeef fddZedefd d!Zed"d#defd$d%Z defd&d'Z!d<d(d)Z"d<d*d+Z#deee$f fd,d-Z%d.ede&e' fd/d0Z(d.ede&e' fd1d2Z)d3e&e de&e&e'  fd4d5Z*d.ede&e' fd6d7Z+d3e&e de&e&e'  fd8d9Z,d.ede&e' fd:d;Z-dS )=ClovaXEmbeddingsa  `NCP ClovaStudio` Embedding API.

    following environment variables set or passed in constructor in lower case:
    - ``NCP_CLOVASTUDIO_API_KEY``
    - ``NCP_APIGW_API_KEY``
    - ``NCP_CLOVASTUDIO_APP_ID``

    Example:
        .. code-block:: python

            from langchain_community import ClovaXEmbeddings

            model = ClovaXEmbeddings(model="clir-emb-dolphin")
            output = embedding.embed_documents(documents)
    N)defaultclientasync_clientZapi_key)r)   aliasncp_clovastudio_api_keyapigw_api_keyncp_apigw_api_keybase_urlapp_idFz=false: use testapp, true: use service app on NCP Clova Studio)r)   descriptionservice_appzclir-emb-dolphin
model_namemodelz$NCP ClovaStudio embedding model name)r)   Zvalidation_aliasr2   r   <   )gtr)   timeoutTr$   )Zarbitrary_types_allowedZprotected_namespacesr   c                 C   s   |   sddiS dddS )Nr-   NCP_CLOVASTUDIO_API_KEYNCP_APIGW_API_KEY)r-   r/   )_is_new_api_keyselfr$   r$   r%   
lc_secrets]   s   zClovaXEmbeddings.lc_secretsc                 C   s^   | j rdnd}| jdkr| jnd}|  r | j d| d| S | j d| d| d| j S )zGET embedding api urlZ
serviceappZtestappzbge-m3v2/z/v1/api-tools/embedding/)r3   r4   r;   r0   r1   )r=   Zapp_typer4   r$   r$   r%   _api_urli   s   zClovaXEmbeddings._api_urlafter)modec                 C   s   | j sttdd| _ |  r|   n|   | jstd| js/t	j
| j|  | jd| _| jsB| jrBt	j| j|  | jd| _| S )Nr-   r9   zbase_url dose not exist.)r0   headersr8   )r-   r   r	   r;   _init_fields_on_new_api_key_init_fields_on_old_api_keyr0   
ValueErrorr*   r   Clientdefault_headersr8   r+   AsyncClientr<   r$   r$   r%   validate_model_afterv   s,   
z%ClovaXEmbeddings.validate_model_afterc                 C   s   | j r| j  dS dS )Nznv-F)r-   get_secret_value
startswithr<   r$   r$   r%   r;      s   z ClovaXEmbeddings._is_new_api_keyc                 C   s   | j stddt| _ d S d S )Nr0   NCP_CLOVASTUDIO_API_BASE_URL)r0   r	    _DEFAULT_BASE_URL_ON_NEW_API_KEYr<   r$   r$   r%   rE      s   
z,ClovaXEmbeddings._init_fields_on_new_api_keyc                 C   sF   | j sttddd| _ | jstddt| _| js!tdd| _d S d S )Nr/   r:    r0   rN   r1   ZNCP_CLOVASTUDIO_APP_ID)r/   r   r	   r0   _DEFAULT_BASE_URLr1   r<   r$   r$   r%   rF      s   
z,ClovaXEmbeddings._init_fields_on_old_api_keyc                 C   sh   ddd}| j r| j  nd }|  rd| |d< |S |r"||d< | jr*| j nd }|r2||d< |S )Nzapplication/json)zContent-TypeAcceptzBearer AuthorizationzX-NCP-CLOVASTUDIO-API-KEYzX-NCP-APIGW-API-KEY)r-   rL   r;   r/   )r=   rD   Zclovastudio_api_keyr.   r$   r$   r%   rI      s&   z ClovaXEmbeddings.default_headerstextc                 C   s>   d|i}t tj| j}|j| j|d}t| | d d S NrT   )r!   jsonresult	embedding)r   r   rH   r*   postrA   r&   rV   )r=   rT   payloadr*   r   r$   r$   r%   _embed_text   s
   zClovaXEmbeddings._embed_textc                    sL   d|i}t tj| j}|j| j|dI d H }t|I d H  | d d S rU   )r   r   rJ   r+   rY   rA   r'   rV   )r=   rT   rZ   r+   r   r$   r$   r%   _aembed_text   s   zClovaXEmbeddings._aembed_texttextsc                 C   s"   g }|D ]
}| | | q|S N)appendr[   )r=   r]   
embeddingsrT   r$   r$   r%   embed_documents   s   z ClovaXEmbeddings.embed_documentsc                 C   s
   |  |S r^   )r[   r=   rT   r$   r$   r%   embed_query   s   
zClovaXEmbeddings.embed_queryc                    s.   g }|D ]}|  |I d H }|| q|S r^   )r\   r_   )r=   r]   r`   rT   rX   r$   r$   r%   aembed_documents   s   z!ClovaXEmbeddings.aembed_documentsc                    s   |  |I d H S r^   )r\   rb   r$   r$   r%   aembed_query   s   zClovaXEmbeddings.aembed_query)r   N).__name__
__module____qualname____doc__r   r*   r   r   rH   __annotations__r+   rJ   r-   r   r/   r0   strr1   r3   boolr
   r4   r8   intr   Zmodel_configpropertyr   r>   rA   r   r   rK   r;   rE   rF   r   rI   r   floatr[   r\   ra   rc   rd   re   r$   r$   r$   r%   r(   /   sL   
 

r(   )loggingtypingr   r   r   r   r   r   Zlangchain_core.embeddingsr   Zlangchain_core.utilsr   r	   Zpydanticr
   r   r   r   r   r   Ztyping_extensionsr   rQ   rO   	getLoggerrf   loggerResponser&   r'   r(   r$   r$   r$   r%   <module>   s     
