
    7|h                        d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	m
Z
mZmZ d dlZd dlmZ d dlmZ d dlmZmZ d dlmZmZmZmZ d dlmZmZmZmZ  ej>                  e       Z!dd
Z"ddZ#ddZ$ eddd       G d d	ee             Z%y)    )annotationsN)AnyCallableDictListOptionalTupleUnioncast)
deprecated)
Embeddings)convert_to_secret_strget_from_dict_or_env)	BaseModel
ConfigDict	SecretStrmodel_validator)before_sleep_logretrystop_after_attemptwait_exponentialVoyageEmbeddingsc           	         d}d}t        dt        | j                        t        d||      t	        t
        t        j                              S )N   
   T   )
multiplierminmax)reraisestopwaitbefore_sleep)r   r   max_retriesr   r   loggerloggingWARNING)
embeddingsmin_secondsmax_secondss      f/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/embeddings/voyageai.py_create_retry_decoratorr,      sF    KK 
 6 67M%fgoo>	     c                P    d| vr!t        dt        j                  |              | S )NdatazVoyage API Error. Message: )RuntimeErrorjsondumps)responses    r+   _check_responser4   ,   s,    X8H9M8NOPPOr-   c                :    t        |       }|dd       } |di |S )z)Use tenacity to retry the embedding call.c                 ^    t        j                  di | }t        |j                               S )N )requestspostr4   r1   )kwargsr3   s     r+   _embed_with_retryz+embed_with_retry.<locals>._embed_with_retry6   s$    ==*6*x}}//r-   )r:   r   returnr   r7   )r,   )r(   r:   retry_decoratorr;   s       r+   embed_with_retryr>   2   s.    -j9O0 0 &v&&r-   z0.0.29z1.0z%langchain_voyageai.VoyageAIEmbeddings)sinceremovalalternative_importc                     e Zd ZU dZded<   dZded<   dZded<   d	ed
<   	 dZd	ed<   	 dZded<   	 dZ	ded<   	 dZ
ded<   	  ed      Z ed      edd              Z	 d 	 	 	 	 	 d!dZ	 	 d"	 	 	 	 	 	 	 d#dZd$dZd%dZdd	 	 	 	 	 d&dZy)'r   a  Voyage embedding models.

    To use, you should have the environment variable ``VOYAGE_API_KEY`` set with
    your API key or pass it as a named parameter to the constructor.

    Example:
        .. code-block:: python

            from langchain_community.embeddings import VoyageEmbeddings

            voyage = VoyageEmbeddings(voyage_api_key="your-api-key", model="voyage-2")
            text = "This is a test query."
            query_result = voyage.embed_query(text)
    strmodelz&https://api.voyageai.com/v1/embeddingsvoyage_api_baseNzOptional[SecretStr]voyage_api_keyint
batch_size   r$   z+Optional[Union[float, Tuple[float, float]]]request_timeoutFboolshow_progress_barT
truncationforbid)extrabefore)modec                    t        t        |dd            |d<   d|vrd|d<   t        j                  d       d|vrd|v r	|d   dv rdnd	|d<   |S )
z?Validate that api key and python package exists in environment.rF   VOYAGE_API_KEYrD   z	voyage-01zmodel will become a required arg for VoyageAIEmbeddings, we recommend to specify it when using this class. Currently the default is set to voyage-01.rH   )zvoyage-2z	voyage-02H      )r   r   r%   warning)clsvaluess     r+   validate_environmentz%VoyageEmbeddings.validate_environmentj   s     $9 )9;KL$
  & )F7ONN= v% f$&/=V*V  <  r-   c                    t        t        | j                        j                         }| j                  dd| i| j
                  ||| j                  d| j                  d}|S )NAuthorizationzBearer )rD   input
input_typerM   )urlheadersr1   timeout)r   r   rF   get_secret_valuerE   rD   rM   rJ   )selfr\   r]   api_keyparamss        r+   _invocation_paramsz#VoyageEmbeddings._invocation_params   si     y$"5"56GGI'''77))<=("oo	 ++

 r-   c                   g }|| j                   }| j                  r$	 ddlm}  |t        dt        |      |            }nt        dt        |      |      }|r|dvrt        d| d      |D ]@  }t        | fi | j                  ||||z    |      }	|j                  d |	d	   D               B |S # t        $ r}t	        d      |d }~ww xY w)
Nr   )tqdmzgMust have tqdm installed if `show_progress_bar` is set to True. Please install with `pip install tqdm`.)querydocumentzinput_type z0 is invalid. Options: None, 'query', 'document'.)r\   r]   c              3  &   K   | ]	  }|d      yw)	embeddingNr7   ).0rs     r+   	<genexpr>z3VoyageEmbeddings._get_embeddings.<locals>.<genexpr>   s     GanGs   r/   )rH   rL   	tqdm.autorg   ImportErrorrangelen
ValueErrorr>   re   extend)
rb   textsrH   r]   r(   rg   e_iterir3   s
             r+   _get_embeddingsz VoyageEmbeddings._get_embeddings   s    )+
J!!* q#e*j9:E!SZ4E*,AAj\ *  
  	HA'))A
N3
 * H Ghv6FGG	H 3  !> s   B3 3	C<CCc                >    | j                  || j                  d      S )zCall out to Voyage Embedding endpoint for embedding search docs.

        Args:
            texts: The list of texts to embed.

        Returns:
            List of embeddings, one for each text.
        ri   rH   r]   ry   rH   )rb   ru   s     r+   embed_documentsz VoyageEmbeddings.embed_documents   s'     ##doo* $ 
 	
r-   c                F    | j                  |g| j                  d      d   S )zCall out to Voyage Embedding endpoint for embedding query text.

        Args:
            text: The text to embed.

        Returns:
            Embedding for the text.
        rh   r{   r   r|   )rb   texts     r+   embed_queryzVoyageEmbeddings.embed_query   s1     ##Ft7 $ 

 	r-   )r]   c               >    | j                  || j                  |      S )aP  Call out to Voyage Embedding endpoint for embedding general text.

        Args:
            texts: The list of texts to embed.
            input_type: Type of the input text. Default to None, meaning the type is
                unspecified. Other options: query, document.

        Returns:
            Embedding for the text.
        r{   r|   )rb   ru   r]   s      r+   embed_general_textsz$VoyageEmbeddings.embed_general_texts   s'     ##doo* $ 
 	
r-   )rX   r   r<   r   )N)r\   	List[str]r]   Optional[str]r<   r   )NN)ru   r   rH   zOptional[int]r]   r   r<   List[List[float]])ru   r   r<   r   )r   rC   r<   zList[float])ru   r   r]   r   r<   r   )__name__
__module____qualname____doc____annotations__rE   rF   r$   rJ   rL   rM   r   model_configr   classmethodrY   re   ry   r}   r   r   r7   r-   r+   r   r   >   s    JCOSC*.N'.O?K<CGO@G1#t#J@ L (#  $0 =A,9	( %)$(	'' "' "	'
 
'R
 @D

/<
	
r-   )r(   r   r<   zCallable[[Any], Any])r3   dictr<   r   )r(   r   r:   r   r<   r   )&
__future__r   r1   r&   typingr   r   r   r   r   r	   r
   r   r8   langchain_core._api.deprecationr   langchain_core.embeddingsr   langchain_core.utilsr   r   pydanticr   r   r   r   tenacityr   r   r   r   	getLoggerr   r%   r,   r4   r>   r   r7   r-   r+   <module>r      s    "  	 	 	  6 0 L F F  
		8	$
	' 
>
c
y* c

c
r-   