o
    }!g@                     @   s  d Z ddlm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 ddlmZmZmZmZ dd	lmZmZ G d
d deeZG dd deeZG dd deeZeZeZeZdZ ej!dfej"ej!dfej#ej!dfej$ej!dfej%ej!dfej&ej!dfej'ej!dfej(ej)dfej*ej)dfej+ej)dfej,ej)dfej-ej)dfej&ej)dfej(ej)dfej'iZ.ej!dfej"ej!dfej#ej!dfej$ej!dfej%ej!dfej&ej!dfej'ej!dfej(ej)dfej/ej)dfej0ej)dfej1ej)dfej2ej)dfej&ej)dfej(ej)dfej'iZ3dededededee4 f
ddZ5dededededee4 f
d d!Z6ded"ee dededeee4  f
d#d$Z7ded"ee dededeee4  f
d%d&Z8d'ed(ed)eeeef ef defd*d+Z9G d,d- d-eZ:dS ).zOpenAI embeddings file.    )Enum)AnyDictListOptionalTupleN)BaseEmbedding)FieldPrivateAttr)CallbackManager)DEFAULT_OPENAI_API_BASEDEFAULT_OPENAI_API_VERSIONcreate_retry_decoratorresolve_openai_credentials)AsyncOpenAIOpenAIc                   @   s   e Zd ZdZdZdZdS )OpenAIEmbeddingModezOpenAI embedding mode.
similaritytext_searchN)__name__
__module____qualname____doc__SIMILARITY_MODETEXT_SEARCH_MODE r   r   d/mnt/skqttb/ctump_chatbot/chatbot/lib/python3.10/site-packages/llama_index/embeddings/openai/base.pyr      s    r   c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
OpenAIEmbeddingModelTypezOpenAI embedding model type.davincicuriebabbageadatext-embedding-ada-002text-embedding-3-largetext-embedding-3-smallN)r   r   r   r   DAVINCICURIEBABBAGEADATEXT_EMBED_ADA_002TEXT_EMBED_3_LARGETEXT_EMBED_3_SMALLr   r   r   r   r      s    r   c                   @   sL   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdS )OpenAIEmbeddingModeModelzOpenAI embedding mode model.ztext-similarity-davinci-001ztext-search-davinci-query-001ztext-search-davinci-doc-001ztext-similarity-curie-001ztext-search-curie-query-001ztext-search-curie-doc-001ztext-similarity-babbage-001ztext-search-babbage-query-001ztext-search-babbage-doc-001ztext-similarity-ada-001ztext-search-ada-query-001ztext-search-ada-doc-001r"   r#   r$   N)r   r   r   r   TEXT_SIMILARITY_DAVINCITEXT_SEARCH_DAVINCI_QUERYTEXT_SEARCH_DAVINCI_DOCTEXT_SIMILARITY_CURIETEXT_SEARCH_CURIE_QUERYTEXT_SEARCH_CURIE_DOCTEXT_SIMILARITY_BABBAGETEXT_SEARCH_BABBAGE_QUERYTEXT_SEARCH_BABBAGE_DOCTEXT_SIMILARITY_ADATEXT_SEARCH_ADA_QUERYTEXT_SEARCH_ADA_DOCr)   r*   r+   r   r   r   r   r,   '   s"    r,      r   r   r    r!   r"   r$   r#   clienttextenginekwargsreturnc                 K   s.   | dd}| jjd|g|d|jd jS )a   Get embedding.

    NOTE: Copied from OpenAI's embedding utils:
    https://github.com/openai/openai-python/blob/main/openai/embeddings_utils.py

    Copied here to avoid importing unnecessary dependencies
    like matplotlib, plotly, scipy, sklearn.

    
 inputmodelr   Nr   replace
embeddingscreatedata	embedding)r:   r;   r<   r=   r   r   r   get_embeddings   s   
 rJ   aclientc                    s6   | dd}| jjd|g|d|I dH jd jS )a  Asynchronously get embedding.

    NOTE: Copied from OpenAI's embedding utils:
    https://github.com/openai/openai-python/blob/main/openai/embeddings_utils.py

    Copied here to avoid importing unnecessary dependencies
    like matplotlib, plotly, scipy, sklearn.

    r?   r@   rA   Nr   r   rD   )rK   r;   r<   r=   r   r   r   aget_embedding   s   rL   list_of_textc                 K   sJ   t |dks
J ddd |D }| jjd||d|j}dd |D S )	a  Get embeddings.

    NOTE: Copied from OpenAI's embedding utils:
    https://github.com/openai/openai-python/blob/main/openai/embeddings_utils.py

    Copied here to avoid importing unnecessary dependencies
    like matplotlib, plotly, scipy, sklearn.

    r9   .The batch size should not be larger than 2048.c                 S      g | ]}| d dqS r?   r@   rE   .0r;   r   r   r   
<listcomp>       z"get_embeddings.<locals>.<listcomp>rA   c                 S      g | ]}|j qS r   rI   rS   dr   r   r   rT          Nr   lenrF   rG   rH   )r:   rM   r<   r=   rH   r   r   r   get_embeddings   s   r]   c                    sR   t |dksJ ddd |D }| jjd||d|I dH j}dd |D S )	a  Asynchronously get embeddings.

    NOTE: Copied from OpenAI's embedding utils:
    https://github.com/openai/openai-python/blob/main/openai/embeddings_utils.py

    Copied here to avoid importing unnecessary dependencies
    like matplotlib, plotly, scipy, sklearn.

    r9   rN   c                 S   rO   rP   rQ   rR   r   r   r   rT      rU   z#aget_embeddings.<locals>.<listcomp>rA   Nc                 S   rV   r   rW   rX   r   r   r   rT      rZ   r   r[   )rK   rM   r<   r=   rH   r   r   r   aget_embeddings   s   r^   moderC   mode_model_dictc                 C   s0   t | t|f}||vrtd| || jS )zGet engine.z!Invalid mode, model combination: )r   r   
ValueErrorvalue)r_   rC   r`   keyr   r   r   
get_engine   s   
rd   c                %       s.  e Zd ZU dZeeddZeee	f e
d< eddZee
d< eedd	Zee e
d
< eedd	Zee e
d< eddddZee
d< eddddZee
d< eddd	Zeeeef  e
d< eddd	Zee
d< eddd	Zee e
d< e Zee
d< e Zee
d< e Zee e
d< e Zee e
d < e Z ee!j" e
d!< e Z#ee!j$ e
d"< e%j&e'j(d#dddddddddddddfd$ed%ed&edee deeee	f  dee d
ee dee dededed'ee) deeeef  d(ee!j" d)ee!j$ d*ee d+e	d,df$ fd-d.Z*			dLdee d
ee dee d,e+ee eef fd/d0Z,d,efd1d2Z-d,efd3d4Z.d5d6 Z/e0d,efd7d8Z1dMd:ed,eee	f fd;d<Z2d=ed,e3e fd>d?Z4d=ed,e3e fd@dAZ5dBed,e3e fdCdDZ6dBed,e3e fdEdFZ7dGe3e d,e3e3e  fdHdIZ8dGe3e d,e3e3e  fdJdKZ9  Z:S )NOpenAIEmbeddinga  OpenAI class for embeddings.

    Args:
        mode (str): Mode for embedding.
            Defaults to OpenAIEmbeddingMode.TEXT_SEARCH_MODE.
            Options are:

            - OpenAIEmbeddingMode.SIMILARITY_MODE
            - OpenAIEmbeddingMode.TEXT_SEARCH_MODE

        model (str): Model for embedding.
            Defaults to OpenAIEmbeddingModelType.TEXT_EMBED_ADA_002.
            Options are:

            - OpenAIEmbeddingModelType.DAVINCI
            - OpenAIEmbeddingModelType.CURIE
            - OpenAIEmbeddingModelType.BABBAGE
            - OpenAIEmbeddingModelType.ADA
            - OpenAIEmbeddingModelType.TEXT_EMBED_ADA_002
    z%Additional kwargs for the OpenAI API.)default_factorydescriptionadditional_kwargszThe OpenAI API key.)rg   api_keyzThe base URL for OpenAI API.)defaultrg   api_basezThe version for OpenAI API.api_version
   zMaximum number of retries.r   )rj   rg   gemax_retriesg      N@zTimeout for each request.timeoutNz%The default headers for API requests.default_headersTzReuse the OpenAI client between requests. When doing anything with large volumes of async API calls, setting this to false can improve stability.reuse_clientz^The number of dimensions on the output embedding vectors. Works only with v3 embedding models.
dimensions_query_engine_text_engine_client_aclient_http_client_async_http_clientd   r_   rC   embed_batch_sizecallback_managerhttp_clientasync_http_clientnum_workersr=   r>   c                    s   |pi }|d ur||d< | j |||d\}}}t||t}t||t}d|v r1|d}| }}n|}t jd|||||||||	||
||d| || _|| _d | _	d | _
|| _|| _d S )Nrs   )ri   rk   rl   
model_name)r{   rs   r|   r   rh   ri   rk   rl   ro   rr   rp   rq   r   r   )_resolve_credentialsrd   _QUERY_MODE_MODEL_DICT_TEXT_MODE_MODEL_DICTpopsuper__init__rt   ru   rv   rw   rx   ry   )selfr_   rC   r{   rs   rh   ri   rk   rl   ro   rp   rr   r|   rq   r}   r~   r   r=   query_enginetext_enginer   	__class__r   r   r     sJ   


zOpenAIEmbedding.__init__c                 C   s   t |||S )N)r   )r   ri   rk   rl   r   r   r   r   N  s   z$OpenAIEmbedding._resolve_credentialsc                 C   s<   | j stdi |  S | jd u rtdi |  | _| jS )Nr   )rr   r   _get_credential_kwargsrv   r   r   r   r   _get_clientV  s
   
zOpenAIEmbedding._get_clientc                 C   sD   | j stdi | jddS | jd u rtdi | jdd| _| jS )NT)is_asyncr   )rr   r   r   rw   r   r   r   r   _get_aclient^  s
   
zOpenAIEmbedding._get_aclientc                 C   s   t | jdddddS )z:Create a retry decorator using the instance's max_retries.T<         )ro   random_exponentialstop_after_delay_secondsmin_secondsmax_seconds)r   ro   r   r   r   r   _create_retry_decoratorf  s   z'OpenAIEmbedding._create_retry_decoratorc                 C   s   dS )Nre   r   )clsr   r   r   
class_namep  s   zOpenAIEmbedding.class_nameFr   c                 C   s,   | j | j| j| j| j|r| jdS | jdS )N)ri   base_urlro   rp   rq   r}   )ri   rk   ro   rp   rq   ry   rx   )r   r   r   r   r   r   t  s   z&OpenAIEmbedding._get_credential_kwargsqueryc                    s*       }| fdd}| S )zGet query embedding.c                      s   t  fdjijS Nr<   )rJ   rt   rh   r   r:   r   r   r   r   _retryable_get_embedding     zFOpenAIEmbedding._get_query_embedding.<locals>._retryable_get_embeddingr   r   )r   r   retry_decoratorr   r   r   r   _get_query_embedding~  
   z$OpenAIEmbedding._get_query_embeddingc                    s2       }| fdd}| I dH S )z1The asynchronous version of _get_query_embedding.c                      s"   t  fdjijI d H S r   )rL   rt   rh   r   rK   r   r   r   r   _retryable_aget_embedding     zHOpenAIEmbedding._aget_query_embedding.<locals>._retryable_aget_embeddingNr   r   )r   r   r   r   r   r   r   _aget_query_embedding     z%OpenAIEmbedding._aget_query_embeddingr;   c                    *       }| fdd}| S )zGet text embedding.c                         t  fdjijS r   )rJ   ru   rh   r   r:   r   r;   r   r   r     r   zEOpenAIEmbedding._get_text_embedding.<locals>._retryable_get_embeddingr   )r   r;   r   r   r   r   r   _get_text_embedding  r   z#OpenAIEmbedding._get_text_embeddingc                    2       }| fdd}| I dH S )z"Asynchronously get text embedding.c                      "   t  fdjijI d H S r   )rL   ru   rh   r   rK   r   r;   r   r   r     r   zGOpenAIEmbedding._aget_text_embedding.<locals>._retryable_aget_embeddingNr   )r   r;   r   r   r   r   r   _aget_text_embedding  r   z$OpenAIEmbedding._aget_text_embeddingtextsc                    r   )zGet text embeddings.

        By default, this is a wrapper around _get_text_embedding.
        Can be overridden for batch queries.

        c                      r   r   )r]   ru   rh   r   r:   r   r   r   r   _retryable_get_embeddings  r   zGOpenAIEmbedding._get_text_embeddings.<locals>._retryable_get_embeddingsr   )r   r   r   r   r   r   r   _get_text_embeddings  s
   z$OpenAIEmbedding._get_text_embeddingsc                    r   )z#Asynchronously get text embeddings.c                      r   r   )r^   ru   rh   r   rK   r   r   r   r   _retryable_aget_embeddings  r   zIOpenAIEmbedding._aget_text_embeddings.<locals>._retryable_aget_embeddingsNr   )r   r   r   r   r   r   r   _aget_text_embeddings  r   z%OpenAIEmbedding._aget_text_embeddings)NNN)F);r   r   r   r   r	   dictrh   r   strr   __annotations__ri   r   rk   r   r   rl   ro   intrp   floatrq   rr   boolrs   r
   rt   ru   rv   r   rw   r   rx   httpxClientry   AsyncClientr   r   r   r)   r   r   r   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   re      s   
 	
A


&re   );r   enumr   typingr   r   r   r   r   r   %llama_index.core.base.embeddings.baser    llama_index.core.bridge.pydanticr	   r
   llama_index.core.callbacks.baser   #llama_index.embeddings.openai.utilsr   r   r   r   openair   r   r   r   r   r,   OAEMOAEMTOAEMMEMBED_MAX_TOKEN_LIMITr   r-   r0   r3   r6   r)   r+   r*   r   r.   r1   r4   r7   r   r/   r2   r5   r8   r   r   rJ   rL   r]   r^   rd   re   r   r   r   r   <module>   s    ""





