§
    šŠtjò)  ã                  ó,  — d Z ddlmZ ddlZddlmZmZmZmZm	Z	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 dd	lmZmZmZmZmZ dd
lmZ ddl m!Z!  ej"        e#¦  «        Z$d#d„Z%d$d„Z& G d„ de!e¦  «        Z'd%d„Z(d%d„Z)d&d„Z*d'd!„Z+d'd"„Z,dS )(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)Ú_BaseYandexGPTÚroleÚstrÚtextÚreturnr   c                ó   — | |dœS )N©r   r   © r   s     úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/chat_models/yandex.pyÚ_parse_messager"   "   s   € Ø $Ð'Ð'Ð'ó    ÚhistoryúList[BaseMessage]úList[Dict[str, str]]c                ó˜  — g }| D ]Ä}t          t          |j        ¦  «        }t          |t          ¦  «        r#|                     t          d|¦  «        ¦  «         t          |t          ¦  «        r#|                     t          d|¦  «        ¦  «         t          |t          ¦  «        r#|                     t          d|¦  «        ¦  «         ŒÅ|S )z`Parse a sequence of messages into history.

    Returns:
        A list of parsed messages.
    ÚuserÚ	assistantÚsystem)	r	   r   ÚcontentÚ
isinstancer   Úappendr"   r   r   )r$   Úchat_historyÚmessager+   s       r!   Ú_parse_chat_historyr0   &   sÅ   € ð €LØð Cð CˆÝ•s˜GœOÑ,Ô,ˆÝ�g�|Ñ,Ô,ð 	AØ×Ò¥¨v°wÑ ?Ô ?Ñ@Ô@Ð@Ý�g�yÑ)Ô)ð 	FØ×Ò¥¨{¸GÑ DÔ DÑEÔEÐEÝ�g�}Ñ-Ô-ð 	CØ×Ò¥¨x¸Ñ AÔ AÑBÔBÐBøØÐr#   c                  ó.   — e Zd ZdZ	 	 ddd„Z	 	 ddd„ZdS )ÚChatYandexGPTaD  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...")

    NÚmessagesr%   ÚstopúOptional[List[str]]Úrun_managerú"Optional[CallbackManagerForLLMRun]Úkwargsr   r   r   c                óª   — t          | |¬¦  «        }|€|nt          ||¦  «        }t          |¬¦  «        }t          t	          |¬¦  «        g¬¦  «        S )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.
        ©r3   N©r+   ©r/   ©Úgenerations)Úcompletion_with_retryr   r   r   r   ©Úselfr3   r4   r6   r8   r   r/   s          r!   Ú	_generatezChatYandexGPT._generateJ   s]   € õ& % T°HÐ=Ñ=Ô=ˆØ�|ˆtˆtÕ)<¸TÀ4Ñ)HÔ)HˆÝ DÐ)Ñ)Ô)ˆÝ¥~¸gÐ'FÑ'FÔ'FÐ&GÐHÑHÔHÐHr#   ú'Optional[AsyncCallbackManagerForLLMRun]c              ‹  óº   K  — t          | |¬¦  «        ƒ d{V —†}|€|nt          ||¦  «        }t          |¬¦  «        }t          t	          |¬¦  «        g¬¦  «        S )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.
        r:   Nr;   r<   r=   )Úacompletion_with_retryr   r   r   r   r@   s          r!   Ú
_ageneratezChatYandexGPT._agenerateb   ss   è è € õ( ,¨D¸8ÐDÑDÔDÐDÐDÐDÐDÐDÐDˆØ�|ˆtˆtÕ)<¸TÀ4Ñ)HÔ)HˆÝ DÐ)Ñ)Ô)ˆÝ¥~¸gÐ'FÑ'FÔ'FÐ&GÐHÑHÔHÐHr#   )NN)
r3   r%   r4   r5   r6   r7   r8   r   r   r   )
r3   r%   r4   r5   r6   rC   r8   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rB   rF   r    r#   r!   r2   r2   8   sl   € € € € € ðð ð( %)Ø:>ð	Ið Ið Ið Ið Ið6 %)Ø?Cð	Ið Ið Ið Ið Ið Ið Ir#   r2   rA   r3   c           	     ó¨  ‡— 	 dd l }ddlm}m} 	 ddlm}mŠ ddlm} ddl	m
} n$# t          $ r ddlm}mŠ 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|st!          d¦  «        ‚t#          |¦  «        }	|                     ¦   «         }
|                     | j        |
¦  «        } || j         | || j        ¬¦  «         || j        ¬¦  «        ¬	¦  «        ˆfd
„|	D ¦   «         ¬¦  «        } ||¦  «        }|                     || j        ¬¦  «        }t5          |¦  «        d         j        d         j        j        S )Nr   ©ÚDoubleValueÚ
Int64Value©ÚCompletionOptionsÚMessage)ÚCompletionRequest)ÚTextGenerationServiceStubúkPlease 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_tokensc                ó    •— g | ]
} ‰d i |¤Ž‘ŒS ©r    r    ©Ú.0r/   rQ   s     €r!   ú
<listcomp>z!_make_request.<locals>.<listcomp>ª   s)   ø€ ÐDÐDÐD¨�'�'Ð$Ð$˜GÐ$Ð$ÐDÐDÐDr#   ©Ú	model_uriÚcompletion_optionsr3   ©Úmetadata)ÚgrpcÚgoogle.protobuf.wrappers_pb2rM   rN   Ú4yandex.cloud.ai.foundation_models.v1.text_common_pb2rP   rQ   ÚPyandex.cloud.ai.foundation_models.v1.text_generation.text_generation_service_pb2rR   ÚUyandex.cloud.ai.foundation_models.v1.text_generation.text_generation_service_pb2_grpcrS   ÚModuleNotFoundErrorÚ:yandex.cloud.ai.foundation_models.v1.foundation_models_pb2ÚByandex.cloud.ai.foundation_models.v1.foundation_models_service_pb2ÚGyandex.cloud.ai.foundation_models.v1.foundation_models_service_pb2_grpcÚImportErrorÚ
ValueErrorr0   Ússl_channel_credentialsÚsecure_channelÚurlra   rY   rZ   Ú
CompletionÚgrpc_metadataÚlistÚalternativesr/   r   )rA   r3   re   rM   rN   rP   rR   rS   ÚeÚmessage_historyÚchannel_credentialsÚchannelÚrequestÚstubÚresrQ   s                  @r!   Ú_make_requestr~   |   si  ø€ ðØˆˆˆØHÐHÐHÐHÐHÐHÐHÐHð	ðð ð ð ð ð ð ð ðð ð ð ð ð ðð ð ð ð ð ð øõ #ð 
	ð 
	ð 
	ðð ð ð ð ð ð ð ðð ð ð ð ð ðð ð ð ð ð ð ð ð
	øøøøøõ ð ð ð Ýð.ñ
ô 
ð ð	øøøøðøøøð
 ð WÝÐUÑVÔVÐVÝ)¨(Ñ3Ô3€OØ×6Ò6Ñ8Ô8ÐØ×!Ò! $¤(Ð,?Ñ@Ô@€GØÐØ”.Ø,Ð,Ø#˜¨$Ô*:Ð;Ñ;Ô;Ø!�z¨¬Ð8Ñ8Ô8ð
ñ 
ô 
ð EÐDÐDÐD°OÐDÑDÔDðñ ô €Gð %Ð$ WÑ-Ô-€DØ
�/Š/˜'¨DÔ,>ˆ/Ñ
?Ô
?€CÝ�‰9Œ9�QŒ<Ô$ QÔ'Ô/Ô4Ð4s7   ƒA
 �% ¤A
 ¥AÁA
 ÁAÁA
 Á

A)ÁA$Á$A)c           
   ƒ  óÄ  ‡K  — 	 dd l }dd l}ddlm}m} 	 ddlm}mŠ ddlm	}m
} ddlm}	 n&# t          $ r ddlm}mŠ ddlm	}m
} ddlm}	 Y nw xY wddlm}
 ddlm} n"# t*          $ r}t+          d¦  «        |‚d }~ww xY w|st-          d	¦  «        ‚t/          |¦  «        }d
}|                     ¦   «         }|j                             | j        |¦  «        4 ƒd {V —†} || j         | || j        ¬¦  «         || j        ¬¦  «        ¬¦  «        ˆfd„|D ¦   «         ¬¦  «        } |	|¦  «        }|                     || j         ¬¦  «        ƒ d {V —†}|j                             ||¦  «        4 ƒd {V —†	 } ||¦  «        }|j!        sU| "                    d¦  «        ƒ d {V —†  |
|j#        ¬¦  «        }| $                    || j         ¬¦  «        ƒ d {V —†}|j!        ¯U	 d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y    |¦   «         }|j%         &                    |¦  «         |j'        d         j(        j)        cd d d ¦  «        ƒd {V —† S # 1 ƒd {V —†swxY w Y   d S )Nr   rL   rO   )rR   ÚCompletionResponse)ÚTextGenerationAsyncServiceStub)ÚGetOperationRequest)ÚOperationServiceStubrT   rU   z"operation.api.cloud.yandex.net:443rV   rX   c                ó    •— g | ]
} ‰d i |¤Ž‘ŒS r\   r    r]   s     €r!   r_   z"_amake_request.<locals>.<listcomp>å   s)   ø€ ÐHÐHÐH¨W�g�gÐ(Ð( Ð(Ð(ÐHÐHÐHr#   r`   rc   é   )Úoperation_id)*Úasynciore   rf   rM   rN   rg   rP   rQ   rh   rR   r€   ri   r�   rj   rk   rl   rm   Ú,yandex.cloud.operation.operation_service_pb2r‚   Ú1yandex.cloud.operation.operation_service_pb2_grpcrƒ   rn   ro   r0   rp   Úaiorq   rr   ra   rY   rZ   rs   rt   ÚdoneÚsleepÚidÚGetÚresponseÚUnpackrv   r/   r   )rA   r3   r‡   re   rM   rN   rP   rR   r€   r�   r‚   rƒ   rw   rx   Úoperation_api_urlry   rz   r{   r|   Ú	operationÚoperation_channelÚoperation_stubÚoperation_requestÚcompletion_responserQ   s                           @r!   Ú_amake_requestr—   ±   sO  øè è € ð&ØˆˆˆàˆˆˆØHÐHÐHÐHÐHÐHÐHÐHð	ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð øõ #ð 	ð 	ð 	ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð	øøøð 	UÐTÐTÐTÐTÐTð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øõ ð ð ð Ýð.ñ
ô 
ð ð	øøøøðøøøð
 ð WÝÐUÑVÔVÐVÝ)¨(Ñ3Ô3€OØ<ÐØ×6Ò6Ñ8Ô8ÐØŒx×&Ò& t¤xÐ1DÑEÔEð @ð @ð @ð @ð @ð @ð @ÈØ#Ð#Ø”nØ0Ð0Ø'˜K¨dÔ.>Ð?Ñ?Ô?Ø%˜:¨D¬OÐ<Ñ<Ô<ð ñ  ô  ð IÐHÐHÐH¸ÐHÑHÔHð
ñ 
ô 
ˆð .Ð-¨gÑ6Ô6ˆØŸ/š/¨'¸DÔ<N˜/ÑOÔOÐOÐOÐOÐOÐOÐOˆ	Ø”8×*Ò*ØÐ2ñ
ô 
ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	àØ1Ð1Ð2CÑDÔDˆNØ”nð Ø—m’m AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø$7Ð$7ÀYÄ\Ð$RÑ$RÔ$RÐ!Ø"0×"4Ò"4Ø%Ø!Ô/ð #5ñ #ô #ð ð ð ð ð ð �	ð  ”nð ð ð	
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð 1Ð0Ñ2Ô2ÐØÔ×!Ò!Ð"5Ñ6Ô6Ð6Ø"Ô/°Ô2Ô:Ô?ð3@ð @ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @ð @ð @so   …A  –- ¬A  ­ AÁA  ÁAÁA  Á 
A?Á*A:Á:A?ÃBIÅ6A(G1ÇIÇ1
G;	Ç;IÇ>G;	Ç?=IÉ
IÉIÚllmúCallable[[Any], Any]c           
     óà   — ddl m} | j        }d}t          dt	          | j        ¦  «        t          d||¬¦  «        t          |¦  «        t          t          t          j        ¦  «        ¬¦  «        S )Nr   )ÚRpcErroré<   Tr…   )Ú
multiplierÚminÚmax)Úreraiser4   Úwaitr   Úbefore_sleep)re   r›   Úsleep_intervalr   r   Úmax_retriesr   r   r   ÚloggerÚloggingÚWARNING)r˜   r›   Úmin_secondsÚmax_secondss       r!   Ú_create_retry_decoratorrª   ú   st   € ØÐÐÐÐÐàÔ$€KØ€KÝØÝ ¤Ñ0Ô0Ý¨°ÀÐMÑMÔMÝ&¨Ñ2Ô2Ý%¥f­g¬oÑ>Ô>ðñ ô ð r#   r8   r   c                óN   ‡ — t          ‰ ¦  «        }|dˆ fd„¦   «         } |di |¤ŽS )z*Use tenacity to retry the completion call.Ú_kwargsr   r   c                 ó   •— t          ‰fi | ¤ŽS ©N)r~   ©r¬   r˜   s    €r!   Ú_completion_with_retryz5completion_with_retry.<locals>._completion_with_retry  s   ø€ å˜SÐ,Ð, GÐ,Ð,Ð,r#   ©r¬   r   r   r   r    ©rª   ©r˜   r8   Úretry_decoratorr°   s   `   r!   r?   r?     sQ   ø€ å-¨cÑ2Ô2€Oàð-ð -ð -ð -ð -ñ „_ð-ð "Ð!Ð+Ð+ FÐ+Ð+Ð+r#   c              ‹  ó^   ‡ K  — t          ‰ ¦  «        }|dˆ fd„¦   «         } |di |¤Žƒ d{V —†S )z0Use tenacity to retry the async completion call.r¬   r   r   c               ›  ó.   •K  — t          ‰fi | ¤Žƒ d {V —†S r®   )r—   r¯   s    €r!   r°   z6acompletion_with_retry.<locals>._completion_with_retry  s/   øè è € å# CÐ3Ð3¨7Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3r#   Nr±   r    r²   r³   s   `   r!   rE   rE     sg   øè è € å-¨cÑ2Ô2€Oàð4ð 4ð 4ð 4ð 4ñ „_ð4ð (Ð'Ð1Ð1¨&Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1r#   )r   r   r   r   r   r   )r$   r%   r   r&   )rA   r2   r3   r%   r   r   )r˜   r2   r   r™   )r˜   r2   r8   r   r   r   )-rJ   Ú
__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"   r0   r2   r~   r—   rª   r?   rE   r    r#   r!   ú<module>rÁ      sD  ðØ +Ð +à "Ð "Ð "Ð "Ð "Ð "à €€€Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <ðð ð ð ð ð ð ð ð EÐ DÐ DÐ DÐ DÐ Dðð ð ð ð ð ð ð ð ð ð ð ð >Ð =Ð =Ð =Ð =Ð =Ð =Ð =ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ?Ð >Ð >Ð >Ð >Ð >Ø :Ð :Ð :Ð :Ð :Ð :à	ˆÔ	˜8Ñ	$Ô	$€ð(ð (ð (ð (ðð ð ð ð$AIð AIð AIð AIð AI�N Mñ AIô AIð AIðH25ð 25ð 25ð 25ðjF@ð F@ð F@ð F@ðRð ð ð ð,ð ,ð ,ð ,ð2ð 2ð 2ð 2ð 2ð 2r#   