
    dh                        S r SSKJr  SSKrSSKrSSKJrJrJrJ	r	J
r
  SSKJr  SSKJrJrJr  SSKJrJrJrJr  SSKJrJrJrJrJr  \R8                  " \5      r " S	 S
\\5      rSS jr SS jr!        SS jr"g)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                  .   \ rS rSr% SrSrS\S'    SrS\S'    \" SSS9r	S	\S
'    Sr
S	\S'    SrS	\S'    SrS	\S'    \" SSS9rS	\S'    SrS	\S'    SrS	\S'    SrS\S'    SrS\S'    SrS\S'    S\S '   \" S!S"S#9r\S(S$ j5       rS)S% jrS*S& jrS"rg')+YandexGPTEmbeddings   a  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_namespacesc                   [        [        USSS5      5      nX!S'   [        [        USSS5      5      nX1S'   [        USSS5      nXAS'   UR                  5       S:X  a  UR                  5       S:X  a  [        S5      eUS   (       a@  S	S
US   R                  5        34/US'   US   (       a  US   R	                  SUS   45        OS	SUS   R                  5        34/US'   UR                  S5      (       d+  US   S:X  a  [        S5      eSUS    SUS    SUS    3US'   UR                  S5      (       d+  US   S:X  a  [        S5      eSUS    SUS    SUS    3US'   US   (       a  US   R	                  S5        U$ )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 r0   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)clsvaluesr   r   r"   s        ]/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/embeddings/yandex.pyvalidate_environment(YandexGPTEmbeddings.validate_environmentL   s    * nbI
	 ({' L"E
 $y(nbQ	'{##%+	0J0J0LPR0RVWW+ GF;,?,P,P,R+S"TU'F?# k"'..vk?R/ST !HVI->-O-O-Q,R"ST'F?# zz/**k"b( !STT,-Qv6F/G.H&Q`JaIbc ?# zz+&&k"b( !OPP,-Qvl/C.DAf_F]E^_ ; +,?#**     c                    [        XS9$ )zEmbed documents using a YandexGPT embeddings models.

Args:
    texts: The list of texts to embed.

Returns:
    List of embeddings, one for each text.
)texts_embed_with_retry)selfrF   s     rA   embed_documents#YandexGPTEmbeddings.embed_documents|   s     !33rD   c                    [        X/SS9S   $ )z~Embed a query using a YandexGPT embeddings models.

Args:
    text: The text to embed.

Returns:
    Embeddings for the text.
T)rF   embed_queryr   rG   )rI   texts     rA   rM   YandexGPTEmbeddings.embed_query   s     !VFqIIrD   N)r@   r   returnr   )rF   	List[str]rP   zList[List[float]])rN   r   rP   zList[float])__name__
__module____qualname____firstlineno____doc__r   __annotations__r   r   r    r!   r"   r#   r%   r'   r(   r+   r-   r/   r   model_configr   rB   rJ   rM   __static_attributes__r1   rD   rA   r   r      s    * Iy.GY.2->?Is?!M3Is +NC+ $7?QRJR"!M3!-C-K<NE$$)T)Pt"ML- -^
4	JrD   r   c           
         SSK Jn  SnSn[        S[        U R                  5      [        SX#S9[        U5      [        [        [        R                  5      S9$ )Nr   )RpcError   <   T)
multiplierminmax)reraisestopwaitr   before_sleep)grpcr[   r   r   r+   r   r   r   loggerloggingWARNING)llmr[   min_secondsmax_secondss       rA   _create_retry_decoratorrl      sK    KK0M&2%fgoo> rD   c                D   ^  [        T 5      nUSU 4S jj5       nU" S0 UD6$ )z)Use tenacity to retry the embedding call.c                    > [        T40 U D6$ )N)_make_request)_kwargsri   s    rA   _completion_with_retry1_embed_with_retry.<locals>._completion_with_retry   s    S,G,,rD   )rp   r   rP   list[list[float]]r1   )rl   )ri   kwargsretry_decoratorrq   s   `   rA   rH   rH      s/    -c2O- - "+F++rD   c                @    SS K n SSKJn  SSKJn  / nUR                  5       nUR                  U R                  U5      n	UR                  S5      (       a  U R                  n
OU R                  n
U Hn  nU" XS9nU" U	5      nUR                  XR                   S9nUR#                  [%        UR&                  5      5        [(        R*                  " U R,                  5        Mp     U$ ! [
         a    SSKJn  SSKJn   Nf = f! [         a  n[        S5      UeS nAff = f)Nr   )TextEmbeddingRequest)EmbeddingsServiceStubzkPlease install YandexCloud SDK  with `pip install yandexcloud`             or upgrade it to recent version.rM   )r    rN   )metadata)re   Dyandex.cloud.ai.foundation_models.v1.embedding.embedding_service_pb2rw   Iyandex.cloud.ai.foundation_models.v1.embedding.embedding_service_pb2_grpcrx   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!   TextEmbeddingr0   r=   list	embeddingtimesleepr-   )rI   rF   rt   re   rw   rx   eresultchannel_credentialschannelr    rN   requeststubress                  rA   ro   ro      s   	 F668!!$((,?@Gzz-  NN	&&	&F$W-  3E3E Fd3==)*

4&&'  M9 # 			  .
 	s4   D C& &C?<D >C??D 
DDD)ri   r   rP   zCallable[[Any], Any])ri   r   rt   r   rP   rs   )rI   r   rF   rQ   rt   r   rP   rs   )#rV   
__future__r   rg   r   typingr   r   r   r   r   langchain_core.embeddingsr	   langchain_core.utilsr
   r   r   pydanticr   r   r   r   tenacityr   r   r   r   r   	getLoggerrR   rf   r   rl   rH   ro   r1   rD   rA   <module>r      s    0 "   6 6 0 V V < <  
		8	$zJ)Z zJz,)
)&/);>))rD   