§
    æ˜ºh°$  ã                  ó,  — 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     ún/var/www/html/services/rag-service/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 )ÚChatYandexGPTaS  Wrapper around 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._generateI   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._ageneratea   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   7   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}t          d¦  «        |‚d }~ww xY w|st          d¦  «        ‚t          |¦  «        }	|                     ¦   «         }
|                     | j        |
¦  «        } || j         | || j        ¬¦  «         || j        ¬¦  «        ¬	¦  «        ˆfd
„|	D ¦   «         ¬¦  «        } ||¦  «        }|                     || j        ¬¦  «        }t-          |¦  «        d         j        d         j        j        S )Nr   ©ÚDoubleValueÚ
Int64Value©ÚCompletionOptionsÚMessage)ÚCompletionRequest)ÚTextGenerationServiceStubú>Please install YandexCloud SDK with `pip install yandexcloud`.ú: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   Ú:yandex.cloud.ai.foundation_models.v1.foundation_models_pb2rP   rQ   ÚByandex.cloud.ai.foundation_models.v1.foundation_models_service_pb2rR   ÚGyandex.cloud.ai.foundation_models.v1.foundation_models_service_pb2_grpcrS   Ú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_requestrz   {   sÔ  ø€ ðØˆˆˆØHÐHÐHÐHÐHÐHÐHÐHð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øõ ð ð ð ÝØOñ
ô 
àð	øøøøðøøøð ð 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Ð4s   ƒ $ ¤
A®>¾Ac           
   ƒ  ót  ‡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}	 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}   Ú,yandex.cloud.operation.operation_service_pb2r~   Ú1yandex.cloud.operation.operation_service_pb2_grpcr   rj   rk   r0   rl   Úaiorm   rn   ra   rY   rZ   ro   rp   ÚdoneÚsleepÚidÚGetÚresponseÚUnpackrr   r/   r   )rA   r3   rƒ   re   rM   rN   rP   rR   r|   r}   r~   r   rs   rt   Úoperation_api_urlru   rv   rw   rx   Ú	operationÚoperation_channelÚoperation_stubÚoperation_requestÚcompletion_responserQ   s                           @r!   Ú_amake_requestr“   ¢   s«  øè è € ðØˆˆˆàˆˆˆØHÐHÐHÐHÐHÐHÐHÐHð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	UÐTÐTÐTÐTÐTð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øõ ð ð ð ÝØOñ
ô 
àð	øøøøðøøøð ð 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Ô<O˜/ÑPÔPÐPÐPÐPÐPÐPÐPˆ	Ø”8×*Ò*ØÐ2ñ
ô 
ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		àØ1Ð1Ð2CÑDÔDˆNØ”nð Ø—m’m AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø$7Ð$7ÀYÄ\Ð$RÑ$RÔ$RÐ!Ø"0×"4Ò"4Ø%°Ô0Cð #5ñ #ô #ð ð ð ð ð ð �	ð  ”nð ð ð			ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 1Ð0Ñ2Ô2ÐØÔ×!Ò!Ð"5Ñ6Ô6Ð6Ø"Ô/°Ô2Ô:Ô?ð1@ð @ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @ð @ð @sM   …28 ¸
AÁAÁAÂ6BH'ÅA(G	Æ7H'Ç	
G	ÇH'ÇG	Ç=H'È'
H1È4H1ÚllmúCallable[[Any], Any]c           
     óÖ   — ddl m} d}d}t          dt          | j        ¦  «        t          d||¬¦  «        t          |¦  «        t          t          t          j
        ¦  «        ¬¦  «        S )Nr   )ÚRpcErrorr�   é<   T)Ú
multiplierÚminÚmax)Úreraiser4   Úwaitr   Úbefore_sleep)re   r—   r   r   Úmax_retriesr   r   r   ÚloggerÚloggingÚWARNING)r”   r—   Úmin_secondsÚmax_secondss       r!   Ú_create_retry_decoratorr¥   Û   sq   € ØÐÐÐÐÐà€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)rz   ©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   rz   r“   r¥   r?   rE   r    r#   r!   ú<module>r¼      s@  ðØ +Ð +Ø "Ð "Ð "Ð "Ð "Ð "à €€€Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <ðð ð ð ð ð ð ð ð 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$5ð $5ð $5ð $5ðN6@ð 6@ð 6@ð 6@ðrð ð ð ð,ð ,ð ,ð ,ð2ð 2ð 2ð 2ð 2ð 2r#   