U
    h                     @   s   U d dl Z d dlmZ d dlmZmZmZmZ d dl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 dZeed	< eed
ddZeedddZG dd deeZdS )    N)exists)AnyDictListOptional)urlparse)
Embeddings)	BaseModel	SecretStrroot_validator)convert_to_secret_strget_from_dict_or_envz!https://api.jina.ai/v1/embeddingsJINA_API_URL)urlreturnc                 C   s    t | }|jdkrt|jS dS )zCheck if a URL is a local file.

    Args:
        url (str): The URL to check.

    Returns:
        bool: True if the URL is a local file, False otherwise.
    )file F)r   schemer   path)r   Z
url_parsed r   G/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/embeddings/jina.pyis_local   s    	

r   )	file_pathr   c              
   C   s6   t | d"}t| dW  5 Q R  S Q R X dS )zGet the bytes string of a file.

    Args:
        file_path (str): The path to the file.

    Returns:
        str: The bytes string of the file.
    rbzutf-8N)openbase64	b64encodereaddecode)r   Z
image_filer   r   r   get_bytes_str   s    	r   c                   @   s   e Zd ZU dZeed< dZeed< dZe	e
 ed< eddeed	d
dZeeee  dddZee eee  dddZeee dddZee eee  dddZdS )JinaEmbeddingszJina embedding models.sessionzjina-embeddings-v2-base-en
model_nameNjina_api_keyT)pre)valuesr   c                 C   s   zt t|dd}W nP tk
rd } z2zt t|dd}W n tk
rR   |Y nX W 5 d}~X Y nX t }|jd|  ddd	 ||d
< |S )z/Validate that auth token exists in environment.r#   ZJINA_API_KEYZjina_auth_tokenZJINA_AUTH_TOKENNzBearer identityzapplication/json)AuthorizationzAccept-EncodingzContent-typer!   )r   r   
ValueErrorrequestsSessionheadersupdateZget_secret_value)clsr%   r#   Zoriginal_excr!   r   r   r   validate_environment1   s(    

z#JinaEmbeddings.validate_environment)inputr   c                 C   sV   | j jt|| jdd }d|kr0t|d |d }t|dd d}dd	 |D S )
N)r/   model)jsondataZdetailc                 S   s   | d S )Nindexr   )er   r   r   <lambda>U       z'JinaEmbeddings._embed.<locals>.<lambda>)keyc                 S   s   g | ]}|d  qS )Z	embeddingr   ).0resultr   r   r   
<listcomp>X   s     z)JinaEmbeddings._embed.<locals>.<listcomp>)r!   postr   r"   r1   RuntimeErrorsorted)selfr/   respZ
embeddingsZsorted_embeddingsr   r   r   _embedJ   s     

zJinaEmbeddings._embed)textsr   c                 C   s
   |  |S )zCall out to Jina's embedding endpoint.
        Args:
            texts: The list of texts to embed.
        Returns:
            List of embeddings, one for each text.
        r@   )r>   rA   r   r   r   embed_documentsZ   s    zJinaEmbeddings.embed_documents)textr   c                 C   s   |  |gd S )zCall out to Jina's embedding endpoint.
        Args:
            text: The text to embed.
        Returns:
            Embeddings for the text.
        r   rB   )r>   rD   r   r   r   embed_queryc   s    zJinaEmbeddings.embed_query)urisr   c                 C   sB   g }|D ].}t |r(|dt|i q|d|i q| |S )zCall out to Jina's image embedding endpoint.
        Args:
            uris: The list of uris to embed.
        Returns:
            List of embeddings, one for each text.
        bytesr   )r   appendr   r@   )r>   rF   r/   urir   r   r   embed_imagesl   s    zJinaEmbeddings.embed_images)__name__
__module____qualname____doc__r   __annotations__r"   strr#   r   r
   r   r   r.   r   floatr@   rC   rE   rJ   r   r   r   r   r    *   s   
		r    )r   os.pathr   typingr   r   r   r   urllib.parser   r)   Zlangchain_core.embeddingsr   Zlangchain_core.pydantic_v1r	   r
   r   Zlangchain_core.utilsr   r   r   rP   rO   boolr   r   r    r   r   r   r   <module>   s    