
    dh)                    B   S r SSKJr  SSKrSSKJrJrJrJrJ	r	J
r
  SSKJrJr  SSKJr  SSKJrJrJrJr  SSKJrJr  SS	KJrJrJrJrJr  SS
KJr  SSK J!r!  \RD                  " \#5      r$SS jr%SS jr& " S S\!\5      r'      SS jr(SS jr)SS jr*SS jr+SS jr,g)z%Wrapper around YandexGPT chat models.    )annotationsN)AnyCallableDictListOptionalcast)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModel)	AIMessageBaseMessageHumanMessageSystemMessage)ChatGeneration
ChatResult)before_sleep_logretryretry_if_exception_typestop_after_attemptwait_exponential)enforce_stop_tokens)_BaseYandexGPTc                
    XS.$ )Nroletext r   s     ^/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/yandex.py_parse_messager    "   s    ''    c                t   / nU  H  n[        [        UR                  5      n[        U[        5      (       a  UR                  [        SU5      5        [        U[        5      (       a  UR                  [        SU5      5        [        U[        5      (       d  M  UR                  [        SU5      5        M     U$ )zTParse a sequence of messages into history.

Returns:
    A list of parsed messages.
user	assistantsystem)	r	   strcontent
isinstancer   appendr    r   r   )historychat_historymessager'   s       r   _parse_chat_historyr-   &   s     LsGOO,g|,,vw ?@gy)){G DEg}--x AB  r!   c                  `    \ rS rSrSr  S         SS jjr  S         S	S jjrSrg)
ChatYandexGPT8   a  YandexGPT large language models.

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`.

Example:
    .. code-block:: python

        from langchain_community.chat_models import ChatYandexGPT
        chat_model = ChatYandexGPT(iam_token="t1.9eu...")

Nc                h    [        XS9nUc  UO
[        XR5      n[        US9n[        [	        US9/S9$ )a  Generate next turn in the conversation.
Args:
    messages: The history of the conversation as a list of messages.
    stop: The list of stop words (optional).
    run_manager: The CallbackManager for LLM run, it's not used at the moment.

Returns:
    The ChatResult that contains outputs generated by the model.

Raises:
    ValueError: if the last message in the list is not from human.
messagesr'   r,   generations)completion_with_retryr   r   r   r   selfr3   stoprun_managerkwargsr   r,   s          r   	_generateChatYandexGPT._generateJ   s<    & %T=|t)<T)HD)~g'F&GHHr!   c                   #    [        XS9I Sh  vN nUc  UO
[        XR5      n[        US9n[        [	        US9/S9$  N.7f)a  Async method to generate next turn in the conversation.

Args:
    messages: The history of the conversation as a list of messages.
    stop: The list of stop words (optional).
    run_manager: The CallbackManager for LLM run, it's not used at the moment.

Returns:
    The ChatResult that contains outputs generated by the model.

Raises:
    ValueError: if the last message in the list is not from human.
r2   Nr4   r5   r6   )acompletion_with_retryr   r   r   r   r9   s          r   
_agenerateChatYandexGPT._agenerateb   sH     ( ,DDD|t)<T)HD)~g'F&GHH Es   A >/A r   )NN)
r3   List[BaseMessage]r;   Optional[List[str]]r<   z"Optional[CallbackManagerForLLMRun]r=   r   returnr   )
r3   rD   r;   rE   r<   z'Optional[AsyncCallbackManagerForLLMRun]r=   r   rF   r   )__name__
__module____qualname____firstlineno____doc__r>   rB   __static_attributes__r   r!   r   r/   r/   8   s    ( %):>	I#I "I 8	I
 I 
I6 %)?C	I#I "I =	I
 I 
I Ir!   r/   c                    SS K nSSKJnJn   SSKJnJn  SSKJn  SSK	J
n  U(       d  [!        S5      e[#        U5      n
UR%                  5       nUR'                  U R(                  U5      nU" U R*                  U" U" U R,                  S9U" U R.                  S9S	9U
 Vs/ sH
  o" S0 UD6PM     snS
9nU" U5      nUR1                  XR2                  S9n[5        U5      S   R6                  S   R8                  R:                  $ ! [         a    SSKJnJn  SSKJn  SSKJ
n   GNf = f! [         a  n	[        S5      U	eS n	A	ff = fs  snf )Nr   DoubleValue
Int64ValueCompletionOptionsMessage)CompletionRequest)TextGenerationServiceStubkPlease install YandexCloud SDK  with `pip install yandexcloud`             or upgrade it to recent version.:You should provide at least one message to start the chat!valuetemperature
max_tokens	model_uricompletion_optionsr3   metadatar   )grpcgoogle.protobuf.wrappers_pb2rO   rP   4yandex.cloud.ai.foundation_models.v1.text_common_pb2rR   rS   Pyandex.cloud.ai.foundation_models.v1.text_generation.text_generation_service_pb2rT   Uyandex.cloud.ai.foundation_models.v1.text_generation.text_generation_service_pb2_grpcrU   ModuleNotFoundError:yandex.cloud.ai.foundation_models.v1.foundation_models_pb2Byandex.cloud.ai.foundation_models.v1.foundation_models_service_pb2Gyandex.cloud.ai.foundation_models.v1.foundation_models_service_pb2_grpcImportError
ValueErrorr-   ssl_channel_credentialssecure_channelurlr^   r[   r\   
Completiongrpc_metadatalistalternativesr,   r   )r:   r3   rb   rO   rP   rR   rS   rT   rU   emessage_historychannel_credentialschannelr,   requeststubress                    r   _make_requestr{   |   sK   H	& UVV)(3O668!!$((,?@G..,#$*:*:;!8
 5DDO'$G$ODG %W-D
//',>,>/
?C9Q<$$Q'//444? # 
	 
	  .
 	  Es:   D) D ED&"D) %D&&D) )
E3D??Ec                8  #     SS K nSS KnSSKJnJn   SSKJnJn  SSKJ	nJ
n	  SSKJn
  SSKJn  SSKJn  U(       d  [-        S	5      e[/        U5      nS
nUR1                  5       nUR2                  R5                  U R6                  U5       IS h  vN nU" U R8                  U" U" U R:                  S9U" U R<                  S9S9U Vs/ sH  nU" S0 UD6PM     snS9nU
" U5      nUR?                  UU R@                  S9I S h  vN nUR2                  R5                  UU5       IS h  vN nU" U5      nURB                  (       d^  URE                  S5      I S h  vN   U" URF                  S9nURI                  UU R@                  S9I S h  vN nURB                  (       d  M^  S S S 5      IS h  vN   U	" 5       nURJ                  RM                  U5        URN                  S   RP                  RR                  sS S S 5      IS h  vN   $ ! [         a    SSKJnJn  SSKJ	nJ
n	  SSKJn
   GNf = f! [*         a  n[+        S5      UeS nAff = f GNs  snf  GNT GN2 GN N N! , IS h  vN  (       d  f       N= f Ny! , IS h  vN  (       d  f       g = f7f)Nr   rN   rQ   )rT   CompletionResponse)TextGenerationAsyncServiceStub)GetOperationRequest)OperationServiceStubrV   rW   z"operation.api.cloud.yandex.net:443rX   rZ   r]   r`      )operation_idr   )*asynciorb   rc   rO   rP   rd   rR   rS   re   rT   r}   rf   r~   rg   rh   ri   rj   ,yandex.cloud.operation.operation_service_pb2r   1yandex.cloud.operation.operation_service_pb2_grpcr   rk   rl   r-   rm   aiorn   ro   r^   r[   r\   rp   rq   donesleepidGetresponseUnpackrs   r,   r   )r:   r3   r   rb   rO   rP   rR   rS   rT   r}   r~   r   r   rt   ru   operation_api_urlrv   rw   r,   rx   ry   	operationoperation_channeloperation_stuboperation_requestcompletion_responses                             r   _amake_requestr      s]    &H	 	U	
 UVV)(3O<668xx&&txx1DEE#nn0'd.>.>?%DOO<  9HHWg((H
 .g6//'D<N<N/OO	88**2
 
12CDNnnmmA&&&$7Y\\$R!"0"4"4%!// #5 # 	  nnn	
 
 12!!"56"//2::??3 FEE5 # 	 	   .
 	 F I P

 '
 
 
 
 FEEEs  JH1 H
 H1 AJIJ4J I*J I$J (I)J ,.I$I1I$I I$$J /I"0AJ 8JI>J
 H.*H1 -H..H1 1
I;IIJJ J I$ I$"J $I;	*I-+I;	7J >J JJ	JJc           
         SSK Jn  U R                  nSn[        S[	        U R
                  5      [        SX#S9[        U5      [        [        [        R                  5      S9$ )Nr   )RpcError<   Tr   )
multiplierminmax)reraiser;   waitr   before_sleep)rb   r   sleep_intervalr   r   max_retriesr   r   r   loggerloggingWARNING)llmr   min_secondsmax_secondss       r   _create_retry_decoratorr      sQ    $$KK0M&2%fgoo> r!   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 completion call.c                    > [        T40 U D6$ N)r{   _kwargsr   s    r   _completion_with_retry5completion_with_retry.<locals>._completion_with_retry  s    S,G,,r!   r   r   rF   r   r   r   r   r=   retry_decoratorr   s   `   r   r8   r8     s/    -c2O- - "+F++r!   c                `   ^ #    [        T 5      nUSU 4S jj5       nU" S0 UD6I Sh  vN $  N7f)z0Use tenacity to retry the async completion call.c                 8   >#    [        T40 U D6I S h  vN $  N7fr   )r   r   s    r   r   6acompletion_with_retry.<locals>._completion_with_retry  s     #C373333s   Nr   r   r   r   s   `   r   rA   rA     s8     -c2O4 4 (1&1111s   $.,.)r   r&   r   r&   rF   r   )r*   rD   rF   zList[Dict[str, str]])r:   r/   r3   rD   rF   r&   )r   r/   rF   zCallable[[Any], Any])r   r/   r=   r   rF   r   )-rK   
__future__r   r   typingr   r   r   r   r   r	   langchain_core.callbacksr
   r   *langchain_core.language_models.chat_modelsr   langchain_core.messagesr   r   r   r   langchain_core.outputsr   r   tenacityr   r   r   r   r   langchain_community.llms.utilsr   langchain_community.llms.yandexr   	getLoggerrG   r   r    r-   r/   r{   r   r   r8   rA   r   r!   r   <module>r      s    + "  < < E  >  ? :			8	$($AINM AIH25
2525 	25jF@R,2r!   