Ë
    µŒjÏ  ã                   óú   — d 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 ddlmZmZmZ ddlmZmZmZmZmZ ddlmZmZmZmZ ddlmZ dd	lmZ dd
lm Z  ddl!m"Z" ddl#m$Z$ dZ% eddd¬«       G d„ de«      «       Z&y)zHugging Face Chat Wrapper.é    )ÚAnyÚAsyncIteratorÚIteratorÚListÚOptional)Ú
deprecated)ÚAsyncCallbackManagerForLLMRunÚCallbackManagerForLLMRun)ÚBaseChatModelÚagenerate_from_streamÚgenerate_from_stream)Ú	AIMessageÚAIMessageChunkÚBaseMessageÚHumanMessageÚSystemMessage)ÚChatGenerationÚChatGenerationChunkÚ
ChatResultÚ	LLMResult)Úmodel_validator)ÚSelf)ÚHuggingFaceEndpoint)ÚHuggingFaceHub)ÚHuggingFaceTextGenInferencez4You are a helpful, respectful, and honest assistant.z0.0.37z1.0z%langchain_huggingface.ChatHuggingFace)ÚsinceÚremovalÚalternative_importc                   óø  ‡ — e Zd ZU dZeed<   	  ee¬«      Zeed<   dZ	eed<   dZ
ee   ed<   dZeed	<   d
efˆ fd„Z ed¬«      defd„«       Z	 	 ddee   deee      dee   d
edee   f
d„Z	 	 ddee   deee      dee   d
edee   f
d„Z	 	 ddee   deee      dee   d
edef
d„Z	 	 ddee   deee      dee   d
edef
d„Zdee   defd„Zdede fd„Z!e"de#defd„«       Z$dd„Z%e&defd„«       Z'ˆ xZ(S ) ÚChatHuggingFaceaž  
    Wrapper for using Hugging Face LLM's as ChatModels.

    Works with `HuggingFaceTextGenInference`, `HuggingFaceEndpoint`,
    and `HuggingFaceHub` LLMs.

    Upon instantiating this class, the model_id is resolved from the url
    provided to the LLM, and the appropriate tokenizer is loaded from
    the HuggingFace Hub.

    Adapted from: https://python.langchain.com/docs/integrations/chat/llama2_chat
    Úllm©ÚcontentÚsystem_messageNÚ	tokenizerÚmodel_idFÚ	streamingÚkwargsc                 óÌ   •— t        ‰| �  di |¤Ž ddlm} | j	                  «        | j
                  €!|j                  | j                  «      | _        y | j
                  | _        y )Nr   )ÚAutoTokenizer© )ÚsuperÚ__init__Útransformersr*   Ú_resolve_model_idr%   Úfrom_pretrainedr&   )Úselfr(   r*   Ú	__class__s      €úu/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/chat_models/huggingface.pyr-   zChatHuggingFace.__init__C   sY   ø€ Ü‰ÑÑ"˜6Ò"å.à×ÑÔ ð �~‰~Ð%ð ×)Ñ)¨$¯-©-Ó8ð 	�ð —‘ð 	�ó    Úafter)ÚmodeÚreturnc                 ó’   — t        | j                  t        t        t        f«      s!t        dt        | j                  «      › �«      ‚| S )NzeExpected llm to be one of HuggingFaceTextGenInference, HuggingFaceEndpoint, HuggingFaceHub, received )Ú
isinstancer!   r   r   r   Ú	TypeErrorÚtype©r1   s    r3   Úvalidate_llmzChatHuggingFace.validate_llmP   sL   € äØ�H‰HÜ(Ô*=¼~ÐNô
ô ðAÜAEÀdÇhÁhÃÐ@PðRóð ð ˆr4   ÚmessagesÚstopÚrun_managerc              +   óÔ   K  — | j                  |«      } | j                  j                  |fi |¤ŽD ]3  }|}t        t	        |¬«      ¬«      }|r|j                  ||¬«       |–— Œ5 y ­w©Nr"   )Úmessage)Úchunk)Ú_to_chat_promptr!   Ústreamr   r   Úon_llm_new_token©	r1   r>   r?   r@   r(   ÚrequestÚdataÚdeltarD   s	            r3   Ú_streamzChatHuggingFace._stream\   se   è ø€ ð ×&Ñ& xÓ0ˆà#�D—H‘H—O‘O GÑ6¨vÔ6ˆDØˆEÜ'´ÀuÔ0MÔNˆEÙØ×,Ñ,¨U¸%Ð,Ô@Ø‹Kñ 7ùs   ‚A&A(c                óú   K  — | j                  |«      } | j                  j                  |fi |¤Ž2 3 d {  –—† }|}t        t	        |¬«      ¬«      }|r|j                  ||¬«      ƒ d {  –—†  |­–— ŒD7 Œ?7 Œ6 y ­wrB   )rE   r!   Úastreamr   r   rG   rH   s	            r3   Ú_astreamzChatHuggingFace._astreaml   s   è ø€ ð ×&Ñ& xÓ0ˆØ*˜$Ÿ(™(×*Ñ*¨7Ñ=°fÒ=÷ 	�$ØˆEÜ'´ÀuÔ0MÔNˆEÙØ!×2Ñ2°5ÀÐ2ÓF×FÐFØŒKð	øð Gøñ	 >ùs7   ‚/A;±A9µA5¶A9¹1A;Á*A7Á+
A;Á5A9Á7A;Á9A;c                 óâ   — | j                   r! | j                  |f||dœ|¤Ž}t        |«      S | j                  |«      } | j                  j
                  d|g||dœ|¤Ž}| j                  |«      S ©N)r?   r@   )Úpromptsr?   r@   r+   )r'   rL   r   rE   r!   Ú	_generateÚ_to_chat_result©r1   r>   r?   r@   r(   Ústream_iterÚ	llm_inputÚ
llm_results           r3   rS   zChatHuggingFace._generate{   sŒ   € ð �>Š>Ø&˜$Ÿ,™,ØðØ#°ñØ@FñˆKô (¨Ó4Ð4à×(Ñ(¨Ó2ˆ	Ø'�T—X‘X×'Ñ'ð 
Ø�K d¸ñ
ØGMñ
ˆ
ð ×#Ñ# JÓ/Ð/r4   c              ‹   ó  K  — | j                   r) | j                  |f||dœ|¤Ž}t        |«      ƒ d {  –—† S | j                  |«      } | j                  j
                  d|g||dœ|¤Žƒ d {  –—† }| j                  |«      S 7 ŒO7 Œ­wrQ   )r'   rO   r   rE   r!   Ú
_ageneraterT   rU   s           r3   rZ   zChatHuggingFace._agenerateŽ   s£   è ø€ ð �>Š>Ø'˜$Ÿ-™-ØðØ#°ñØ@FñˆKô /¨{Ó;×;Ð;à×(Ñ(¨Ó2ˆ	Ø.˜4Ÿ8™8×.Ñ.ð 
Ø�K d¸ñ
ØGMñ
÷ 
ˆ
ð ×#Ñ# JÓ/Ð/ð <øð
ús!   ‚1B³B´9BÁ-BÁ.BÂBc                 óÚ   — |st        d«      ‚t        |d   t        «      st        d«      ‚|D �cg c]  }| j                  |«      ‘Œ }}| j                  j                  |dd¬«      S c c}w )zHConvert a list of messages into a prompt format expected by wrapped LLM.z+At least one HumanMessage must be provided!éÿÿÿÿz$Last message must be a HumanMessage!FT)ÚtokenizeÚadd_generation_prompt)Ú
ValueErrorr9   r   Ú_to_chatml_formatr%   Úapply_chat_template)r1   r>   ÚmÚmessages_dictss       r3   rE   zChatHuggingFace._to_chat_prompt¡   su   € ñ
 ÜÐJÓKÐKä˜( 2™,¬Ô5ÜÐCÓDÐDá=EÓF¹X¸˜$×0Ñ0°Õ3¸XˆÐFà�~‰~×1Ñ1Ø UÀ$ð 2ó 
ð 	
ùò Gs   °A(rC   c                 óÀ   — t        |t        «      rd}n=t        |t        «      rd}n*t        |t        «      rd}nt	        dt        |«      › �«      ‚||j                  dœS )z+Convert LangChain message to ChatML format.ÚsystemÚ	assistantÚuserzUnknown message type: )Úroler#   )r9   r   r   r   r_   r;   r#   )r1   rC   rh   s      r3   r`   z!ChatHuggingFace._to_chatml_format²   sW   € ô �gœ}Ô-Ø‰DÜ˜¤Ô+Ø‰DÜ˜¤Ô.Ø‰DäÐ5´d¸7³m°_ÐEÓFÐFà¨¯©Ñ9Ð9r4   rX   c                 óÔ   — g }| j                   d   D ]>  }t        t        |j                  ¬«      |j                  ¬«      }|j                  |«       Œ@ t        || j                  ¬«      S )Nr   r"   )rC   Úgeneration_info)ÚgenerationsÚ
llm_output)rk   r   r   Útextrj   Úappendr   rl   )rX   Úchat_generationsÚgÚchat_generations       r3   rT   zChatHuggingFace._to_chat_resultÀ   se   € àÐà×'Ñ'¨Ô*ˆAÜ,Ü!¨!¯&©&Ô1À1×CTÑCTôˆOð ×#Ñ# OÕ4ð	 +ô Ø(°Z×5JÑ5Jô
ð 	
r4   c                 óø  — ddl m}  |d«      }t        | j                  t        «      s,t        | j                  d«      r2| j                  j                  r| j                  j                  | _        yt        | j                  t        «      r| j                  j                  }n| j                  j                  }|D ]#  }|j                  |k(  sŒ|j                  | _        Œ% | j                  st        d|› d�«      ‚y)z8Resolve the model_id from the LLM's inference_server_urlr   )Úlist_inference_endpointsÚ*Úrepo_idNzIFailed to resolve model_id:Could not find model id for inference server: zBMake sure that your Hugging Face token has access to the endpoint.)Úhuggingface_hubrs   r9   r!   r   Úhasattrru   r&   r   Úinference_server_urlÚendpoint_urlÚurlÚ
repositoryr_   )r1   rs   Úavailable_endpointsry   Úendpoints        r3   r/   z!ChatHuggingFace._resolve_model_idÎ   sÍ   € õ 	=á6°sÓ;ÐÜ�d—h‘h¤Ô/Ü�D—H‘H˜iÔ(¨T¯X©X×-=Ò-=à ŸH™H×,Ñ,ˆDŒMØÜ˜Ÿ™Ô"=Ô>Ø*.¯(©(×*GÑ*G‰LàŸ8™8×0Ñ0ˆLã+ˆHØ�|‰|˜|Ó+Ø (× 3Ñ 3�•ð ,ð �}Š}ÜðAØAMÀØTðUóð ð r4   c                  ó   — y)Nzhuggingface-chat-wrapperr+   r<   s    r3   Ú	_llm_typezChatHuggingFace._llm_typeé   s   € à)r4   )NN)r7   N))Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   ÚDEFAULT_SYSTEM_PROMPTr$   r%   r&   r   Ústrr'   Úboolr-   r   r   r=   r   r   r
   r   r   rL   r	   r   rO   r   rS   rZ   rE   Údictr`   Ústaticmethodr   rT   r/   Úpropertyr   Ú__classcell__)r2   s   @r3   r    r    (   s3  ø… ñð 
ƒHðá$1Ð:OÔ$P€N�MÓPØ€IˆsÓØ"€Hˆh�s‰mÓ"Ø€IˆtÓð
 õ 
ñ ˜'Ô"ð	˜dò 	ó #ð	ð %)Ø:>ñ	à�{Ñ#ðð �t˜C‘yÑ!ðð Ð6Ñ7ð	ð
 ðð 
Ð%Ñ	&óð& %)Ø?Cñ	à�{Ñ#ðð �t˜C‘yÑ!ðð Ð;Ñ<ð	ð
 ðð 
Ð*Ñ	+óð$ %)Ø:>ñ	0à�{Ñ#ð0ð �t˜C‘yÑ!ð0ð Ð6Ñ7ð	0ð
 ð0ð 
ó0ð, %)Ø?Cñ	0à�{Ñ#ð0ð �t˜C‘yÑ!ð0ð Ð;Ñ<ð	0ð
 ð0ð 
ó0ð&
à�{Ñ#ð
ð 
ó
ð":¨ð :¸ó :ð ð
 Ið 
°*ò 
ó ð
óð6 ð*˜3ò *ó ô*r4   r    N)'rƒ   Útypingr   r   r   r   r   Úlangchain_core._api.deprecationr   Ú langchain_core.callbacks.managerr	   r
   Ú*langchain_core.language_models.chat_modelsr   r   r   Úlangchain_core.messagesr   r   r   r   r   Úlangchain_core.outputsr   r   r   r   Úpydanticr   Útyping_extensionsr   Ú-langchain_community.llms.huggingface_endpointr   Ú(langchain_community.llms.huggingface_hubr   Ú7langchain_community.llms.huggingface_text_gen_inferencer   r…   r    r+   r4   r3   Ú<module>r—      s|   ðÙ  ç ?Õ ?å 6÷÷ñ ÷
õ ÷ó õ %Ý "å MÝ Cõð SÐ ñ Ø
ØØ>ôô
~*�mó ~*óñ
~*r4   