
    _j'                         d dl mZmZmZmZmZmZ d dlmZ d dl	m
Z
mZmZmZmZmZ d dlZd dlZd dlZd dlZd dlZd dlZ G d de          Z G d dee                   ZdS )	    )
EmbeddingsEmbeddingFunctionSpace
Embeddableis_imageis_documentvalidate_config_schema)ListDictAnyUnionOptional	TypedDictNc                       e Zd ZU eed<   dS )JinaQueryConfigtaskN)__name__
__module____qualname__str__annotations__     w/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/chromadb/utils/embedding_functions/jina_embedding_function.pyr   r      s         
IIIIIr   r   c                      e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d$dee         dededee         d	ee         d
ee         dee         dee         dee         dee         fdZ	de
dedeeef         fdZd%dededefdZde
defdZde
defdZedefd            ZdefdZdee         fdZedeeef         ddfd            Zdeeef         fdZd eeef         d!eeef         ddfd"Zedeeef         ddfd#            ZdS )&JinaEmbeddingFunctionz
    This class is used to get embeddings for a list of texts using the Jina AI API.
    It requires an API key and a model name. The default model name is "jina-embeddings-v2-base-en".
    Njina-embeddings-v2-base-enCHROMA_JINA_API_KEYapi_key
model_nameapi_key_env_varr   late_chunkingtruncate
dimensionsembedding_type
normalizedquery_configc                    	 ddl }n# t          $ r t          d          w xY w	 t          j        d          | _        n# t          $ r t          d          w xY w|t          j        dt                     t          j
        d          d| _        n|| _        |pt          j
        | j                  | _        | j        st          d| j         d	          || _        || _        || _        || _        || _        || _        |	| _        |
| _        d
| _        |                                | _        | j        j                            d| j         dd           dS )aL  
        Initialize the JinaEmbeddingFunction.

        Args:
            api_key_env_var (str, optional): Environment variable name that contains your API key for the Jina AI API.
                Defaults to "CHROMA_JINA_API_KEY".
            model_name (str, optional): The name of the model to use for text embeddings.
                Defaults to "jina-embeddings-v2-base-en".
            task (str, optional): The task to use for the Jina AI API.
                Defaults to None.
            late_chunking (bool, optional): Whether to use late chunking for the Jina AI API.
                Defaults to None.
            truncate (bool, optional): Whether to truncate the Jina AI API.
                Defaults to None.
            dimensions (int, optional): The number of dimensions to use for the Jina AI API.
                Defaults to None.
            embedding_type (str, optional): The type of embedding to use for the Jina AI API.
                Defaults to None.
            normalized (bool, optional): Whether to normalize the Jina AI API.
                Defaults to None.

        r   NzUThe httpx python package is not installed. Please install it with `pip install httpx`z	PIL.ImagezTThe PIL python package is not installed. Please install it with `pip install pillow`zDirect api_key configuration will not be persisted. Please use environment variables via api_key_env_var for persistent storage.JINA_API_KEYzThe z! environment variable is not set.z!https://api.jina.ai/v1/embeddingszBearer identity)AuthorizationzAccept-Encoding)httpxImportError
ValueError	importlibimport_module	_PILImagewarningswarnDeprecationWarningosgetenvr"   r    r!   r   r#   r$   r%   r&   r'   r(   _api_urlClient_sessionheadersupdate)selfr    r!   r"   r   r#   r$   r%   r&   r'   r(   r-   s               r   __init__zJinaEmbeddingFunction.__init__   s   F	LLLL 	 	 	g  		&4[AADNN 	 	 	f  	
 M_"   9^$$0#1D  #2D A")D,@"A"A| 	Nt+NNN   % 	* $,$(;$$666:VV	
 	
 	
 	
 	
s    !? Ainputis_queryreturnc                    g | j         d}t          d |D                       r||d<   n|D ]}t          |          r|d                             d|i           0t	          |          r	 | j                            |          }t          j                    }|	                    |d           |
                                }t          j        |                              d          }n%# t          $ r}	t          d|	           |	d }	~	ww xY w|d                             d	|i           | j        
| j        |d
<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   |r+| j        $| j                                        D ]
\  }
}|||
<   |S )N)r?   modelc              3   4   K   | ]}t          |          V  d S )N)r   ).0items     r   	<genexpr>z7JinaEmbeddingFunction._build_payload.<locals>.<genexpr>u   s*      33T{4  333333r   r?   textPNG)formatzutf-8z8Failed to convert image numpy array to base64 data URI: imager   r#   r$   r%   r&   r'   )r!   allr   appendr   r2   	fromarrayioBytesIOsavegetvaluebase64	b64encodedecode	Exceptionr/   r   r#   r$   r%   r&   r'   r(   items)r=   r?   r@   payloadrF   	pil_imagebuffer	img_bytesbase64_stringekeyvalues               r   _build_payloadz$JinaEmbeddingFunction._build_payloadp   s#   _#
 #
 33U33333 	F$GG F Ft$$ FG$++VTN;;;;d^^ F!$(N$<$<T$B$B	!#!ve<<<$*OO$5$5	 )/(8(C(C(J(J7(S(S$ ! ! !(ZWXZZ  !! G$++Wm,DEEE9 "iGFO)'+'9GO$=$"&-GJ?&$(OGL!*(,(;G$%?&$(OGL!  	%)5"/5577 % %
U$s   -A?C--
D7D

DFrespc                     d|vr#t          |                    dd                    |d         }t          |d           }d |D             S )z
        Convert the response from the Jina AI API to a list of numpy arrays.

        Args:
            resp (Any): The response from the Jina AI API.

        Returns:
            Embeddings: A list of numpy arrays representing the embeddings.
        datadetailzUnknown errorc                     | d         S )Nindexr   )r]   s    r   <lambda>z5JinaEmbeddingFunction._convert_resp.<locals>.<lambda>   s
    !G* r   )r^   c                 Z    g | ](}t          j        |d          t           j                  )S )	embedding)dtype)nparrayfloat32)rE   results     r   
<listcomp>z7JinaEmbeddingFunction._convert_resp.<locals>.<listcomp>   s>     
 
 
 HVK(
;;;
 
 
r   )RuntimeErrorgetsorted)r=   ra   r@   embeddings_datasorted_embeddingss        r   _convert_respz#JinaEmbeddingFunction._convert_resp   sn     txx/BBCCCDHL #?8L8LMMM
 
+
 
 
 	
r   c                     |                      |d          }| j                            | j        |d                                          }|                     |          S )a  
        Get the embeddings for a list of texts.

        Args:
            input (Embeddable): A list of texts and/or images to get embeddings for.

        Returns:
            Embeddings: The embeddings for the texts.

        Example:
            >>> jina_ai_fn = JinaEmbeddingFunction(api_key_env_var="CHROMA_JINA_API_KEY")
            >>> input = ["Hello, world!", "How are you?"]
        Fr@   <   jsontimeoutr`   r:   postr8   rz   ru   r=   r?   rX   ra   s       r   __call__zJinaEmbeddingFunction.__call__   s\     %%ee%<< }!!$-gr!JJOOQQ!!$'''r   c                     |                      |d          }| j                            | j        |d                                          }|                     |d          S )NTrw   rx   ry   r|   r~   s       r   embed_queryz!JinaEmbeddingFunction.embed_query   s_    %%ed%;; }!!$-gr!JJOOQQ!!$!666r   c                      dS )Njinar   r   r   r   namezJinaEmbeddingFunction.name   s    vr   c                     dS )Ncosiner   r=   s    r   default_spacez#JinaEmbeddingFunction.default_space   s    xr   c                 
    g dS )N)r   l2ipr   r   s    r   supported_spacesz&JinaEmbeddingFunction.supported_spaces   s    %%%%r   configzEmbeddingFunction[Embeddable]c                    |                      d          }|                      d          }|                      d          }|                      d          }|                      d          }|                      d          }|                      d          }|                      d          }|                      d	          }	||
J d            t          |||||||||		  	        S )Nr"   r!   r   r#   r$   r%   r&   r'   r(   FzThis code should not be reached	r"   r!   r   r#   r$   r%   r&   r'   r(   )rq   r   )
r   r"   r!   r   r#   r$   r%   r&   r'   r(   s
             r   build_from_configz'JinaEmbeddingFunction.build_from_config   s     **%677ZZ--
zz&!!

?33::j))ZZ--
$455ZZ--
zz.11"j&8;;;;;$+!'!)!%

 

 

 
	
r   c           
      t    | j         | j        | j        | j        | j        | j        | j        | j        | j        d	S )Nr   r   r   s    r   
get_configz JinaEmbeddingFunction.get_config   sB    #3/I!//"1/ -

 

 
	
r   
old_config
new_configc                 ,    d|v rt          d          d S )Nr!   zSThe model name cannot be changed after the embedding function has been initialized.)r/   )r=   r   r   s      r   validate_config_updatez,JinaEmbeddingFunction.validate_config_update  s,     :%%e   &%r   c                 &    t          | d           dS )z
        Validate the configuration using the JSON schema.

        Args:
            config: Configuration to validate

        Raises:
            ValidationError: If the configuration does not match the schema
        r   Nr	   )r   s    r   validate_configz%JinaEmbeddingFunction.validate_config  s     	vv.....r   )
Nr   r   NNNNNNN)F)r   r   r   __doc__r   r   boolintr   r>   r   r   r   r`   r   ru   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r      s         "&64"(,#'$((,%)26Q
 Q
#Q
 Q
 	Q

 smQ
  ~Q
 4.Q
 SMQ
 !Q
 TNQ
 /Q
 Q
 Q
 Q
f.J .$ .4S> . . . .`
 
# 
 
* 
 
 
 
0(j (Z ( ( ( (,7 7
 7 7 7 7 #    \u    &$u+ & & & & 
$sCx. 
5T 
 
 
 \
4
DcN 
 
 
 
sCx.6:38n	    
/S#X 
/4 
/ 
/ 
/ \
/ 
/ 
/r   r   )chromadb.api.typesr   r   r   r   r   r   *chromadb.utils.embedding_functions.schemasr
   typingr   r   r   r   r   r   r6   numpyrk   r3   r0   rS   rO   r   r   r   r   r   <module>r      sD                  N M M M M M > > > > > > > > > > > > > > > > 				           				    i   D/ D/ D/ D/ D/-j9 D/ D/ D/ D/ D/r   