
    Ng                        d Z 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
 ddlmZ ddlmZ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mZ  ej        e          Z G d	 d
ee          ZddZ ddZ!ddZ"dS )z*Wrapper around YandexGPT embedding models.    )annotationsN)AnyCallableDictListSequence)
Embeddings)convert_to_secret_strget_from_dict_or_envpre_init)	BaseModel
ConfigDictField	SecretStr)before_sleep_logretryretry_if_exception_typestop_after_attemptwait_exponentialc                  L   e Zd ZU dZdZded<   	 dZde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d          Zded<   	 dZded<   	 dZded<   	 dZded<   	 dZded<   	 dZded<   	 ded<    ed d!"          Zed/d&            Zd0d*Zd1d-Zd.S )2YandexGPTEmbeddingsa4  YandexGPT Embeddings models.

    To use, you should have the ``yandexcloud`` python package installed.

    There are two authentication options for the service account
    with the ``ai.languageModels.user`` role:
        - You can specify the token in a constructor parameter `iam_token`
        or in an environment variable `YC_IAM_TOKEN`.
        - You can specify the key in a constructor parameter `api_key`
        or in an environment variable `YC_API_KEY`.

    To use the default model specify the folder ID in a parameter `folder_id`
    or in an environment variable `YC_FOLDER_ID`.

    Example:
        .. code-block:: python

            from langchain_community.embeddings.yandex import YandexGPTEmbeddings
            embeddings = YandexGPTEmbeddings(iam_token="t1.9eu...", folder_id=<folder-id>)
     r   	iam_tokenapi_keyquery_model_uri)defaultaliasstr	model_uridoc_model_uri	folder_idztext-search-docdoc_model_nameztext-search-queryquery_model_name
model_namelatestmodel_versionzllm.api.cloud.yandex.net:443url   intmax_retriesg        floatsleep_intervalFbooldisable_request_loggingr   grpc_metadataT )populate_by_nameprotected_namespacesvaluesr   returnc                   t          t          |ddd                    }||d<   t          t          |ddd                    }||d<   t          |ddd          }||d<   |                                dk    r'|                                dk    rt          d          |d         rOd	d
|d                                          fg|d<   |d         r#|d                             d|d         f           n#d	d|d                                          fg|d<   |                    d          s;|d         dk    rt          d          d|d          d|d          d|d          |d<   |                    d          s;|d         dk    rt          d          d|d          d|d          d|d          |d<   |d         r|d                             d           |S )z.Validate that iam token exists in environment.r   YC_IAM_TOKENr   r   
YC_API_KEYr!   YC_FOLDER_IDz7Either 'YC_API_KEY' or 'YC_IAM_TOKEN' must be provided.authorizationzBearer r/   zx-folder-idzApi-Key r    z0'doc_model_uri' or 'folder_id' must be provided.zemb:///r"   r&   r   z,'model_uri' or 'folder_id' must be provided.r$   r.   )zx-data-logging-enabledfalse)r
   r   get_secret_value
ValueErrorappendget)clsr3   r   r   r!   s        a/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/embeddings/yandex.pyvalidate_environmentz(YandexGPTEmbeddings.validate_environmentL   sb    * nbII
 
	 ({' L"EE
 
 $y(nbQQ	'{##%%++	0J0J0L0LPR0R0RVWWW+ 		 "TF;,?,P,P,R,R"T"TU'F?# k" U'..vk?R/STTT !"SVI->-O-O-Q-Q"S"ST'F?# zz/** 	k"b(( !STTTc,ccv6F/Gcc&Q`Jacc ?# zz+&& 	k"b(( !OPPP_,__vl/C__f_F]__ ; +, 	?#**       texts	List[str]List[List[float]]c                $    t          | |          S )zEmbed documents using a YandexGPT embeddings models.

        Args:
            texts: The list of texts to embed.

        Returns:
            List of embeddings, one for each text.
        )rD   _embed_with_retry)selfrD   s     rA   embed_documentsz#YandexGPTEmbeddings.embed_documents|   s     !U3333rC   textList[float]c                4    t          | |gd          d         S )zEmbed a query using a YandexGPT embeddings models.

        Args:
            text: The text to embed.

        Returns:
            Embeddings for the text.
        T)rD   embed_queryr   rH   )rJ   rL   s     rA   rO   zYandexGPTEmbeddings.embed_query   s      !dVFFFqIIrC   N)r3   r   r4   r   )rD   rE   r4   rF   )rL   r   r4   rM   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r    r!   r"   r$   r&   r'   r*   r,   r.   r   model_configr   rB   rK   rO   r0   rC   rA   r   r      s         * I.G.U2->???I????!MI +N++++ e$7?QRRRJRRRR"!M!!!!-C----K<N$$)))))P:t"MMML- - - X-^
4 
4 
4 
4	J 	J 	J 	J 	J 	JrC   r   llmr4   Callable[[Any], Any]c           
         ddl m} d}d}t          dt          | j                  t          d||          t          |          t          t          t          j
                            S )Nr   )RpcError   <   T)
multiplierminmax)reraisestopwaitr   before_sleep)grpcrY   r   r   r*   r   r   r   loggerloggingWARNING)rV   rY   min_secondsmax_secondss       rA   _create_retry_decoratorri      sq    KK00MMM&22%fgo>>   rC   kwargsr   c                N     t                     }|d fd            } |di |S )z)Use tenacity to retry the embedding call._kwargsr   r4   c                     t          fi | S )N)_make_request)rl   rV   s    rA   _completion_with_retryz1_embed_with_retry.<locals>._completion_with_retry   s    S,,G,,,rC   )rl   r   r4   r   r0   )ri   )rV   rj   retry_decoratorro   s   `   rA   rI   rI      sQ    -c22O- - - - - _- "!++F+++rC   rJ   rD   rE   c                F   	 dd l }	 ddlm} ddlm} n# t
          $ r ddlm} ddlm} Y nw xY wn"# t          $ r}t          d          |d }~ww xY wg }|	                                }|
                    | j        |          }	|                    d          r| j        }
n| j        }
|D ]v} ||
|          } ||	          }|                    || j                  }|                    t%          |j                             t)          j        | j                   w|S )Nr   )TextEmbeddingRequest)EmbeddingsServiceStubzkPlease install YandexCloud SDK  with `pip install yandexcloud`             or upgrade it to recent version.rO   )r   rL   )metadata)rc   Dyandex.cloud.ai.foundation_models.v1.embedding.embedding_service_pb2rr   Iyandex.cloud.ai.foundation_models.v1.embedding.embedding_service_pb2_grpcrs   ModuleNotFoundErrorByandex.cloud.ai.foundation_models.v1.foundation_models_service_pb2Gyandex.cloud.ai.foundation_models.v1.foundation_models_service_pb2_grpcImportErrorssl_channel_credentialssecure_channelr'   r?   r   r    TextEmbeddingr/   r>   list	embeddingtimesleepr,   )rJ   rD   rj   rc   rr   rs   eresultchannel_credentialschannelr   rL   requeststubress                  rA   rn   rn      s   	            # 	 	 	            		    .
 
 	
 F6688!!$(,?@@Gzz-   'N		&	 ( (&&FFF$$W--  43E FFd3=))***
4&''''Ms,   1  1 -1 -1 
AAA)rV   r   r4   rW   )rV   r   rj   r   r4   r   )rJ   r   rD   rE   )#rS   
__future__r   re   r   typingr   r   r   r   r   langchain_core.embeddingsr	   langchain_core.utilsr
   r   r   pydanticr   r   r   r   tenacityr   r   r   r   r   	getLoggerrP   rd   r   ri   rI   rn   r0   rC   rA   <module>r      s   0 0 " " " " " "   6 6 6 6 6 6 6 6 6 6 6 6 6 6 0 0 0 0 0 0 V V V V V V V V V V < < < < < < < < < < < <              
	8	$	$zJ zJ zJ zJ zJ)Z zJ zJ zJz   , , , ,' ' ' ' ' 'rC   