§
    æ˜ºh­  ã                   ó®   — d Z ddl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mZ ddlmZ ddlmZ dd	lmZ d
Z G d„ de
¦  «        ZdS )zHugging Face Chat Wrapper.é    )ÚAnyÚListÚOptionalÚUnion)ÚAsyncCallbackManagerForLLMRunÚCallbackManagerForLLMRun)ÚBaseChatModel)Ú	AIMessageÚBaseMessageÚHumanMessageÚSystemMessage)ÚChatGenerationÚ
ChatResultÚ	LLMResult)ÚHuggingFaceEndpoint)ÚHuggingFaceHub)ÚHuggingFaceTextGenInferencez4You are a helpful, respectful, and honest assistant.c                   ó˜  ‡ — e Zd ZU dZeeeef         ed<    e	e
¬¦  «        Ze	ed<   dZeed<   dZeed<   defˆ 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_idÚkwargsc                 óÈ   •—  t          ¦   «         j        di |¤Ž ddlm} |                      ¦   «          | j        €|                     | j        ¦  «        n| j        | _        d S )Nr   )ÚAutoTokenizer© )ÚsuperÚ__init__Útransformersr   Ú_resolve_model_idr   Úfrom_pretrainedr   )Úselfr   r   Ú	__class__s      €ús/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/chat_models/huggingface.pyr!   zChatHuggingFace.__init__1   sv   ø€ Ø�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"à.Ð.Ð.Ð.Ð.Ð.à×ÒÑ Ô Ð ð Œ~Ð%ð ×)Ò)¨$¬-Ñ8Ô8Ð8à”ð 	Œˆˆó    ÚmessagesÚstopÚrun_managerÚreturnc                 ó„   — |                       |¦  «        } | j        j        d|g||dœ|¤Ž}|                      |¦  «        S ©N)Úpromptsr*   r+   r   )Ú_to_chat_promptr   Ú	_generateÚ_to_chat_result©r%   r)   r*   r+   r   Ú	llm_inputÚ
llm_results          r'   r1   zChatHuggingFace._generate=   s^   € ð ×(Ò(¨Ñ2Ô2ˆ	Ø'�T”XÔ'ð 
Ø�K d¸ð
ð 
ØGMð
ð 
ˆ
ð ×#Ò# JÑ/Ô/Ð/r(   c              ‹   ó”   K  — |                       |¦  «        } | j        j        d|g||dœ|¤Žƒ d {V —†}|                      |¦  «        S r.   )r0   r   Ú
_agenerater2   r3   s          r'   r7   zChatHuggingFace._agenerateJ   s€   è è € ð ×(Ò(¨Ñ2Ô2ˆ	Ø.˜4œ8Ô.ð 
Ø�K d¸ð
ð 
ØGMð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ˆ
ð ×#Ò# JÑ/Ô/Ð/r(   c                 óÐ   ‡ — |st          d¦  «        ‚t          |d         t          ¦  «        st          d¦  «        ‚ˆ fd„|D ¦   «         }‰ j                             |dd¬¦  «        S )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 HumanMessagec                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r   )Ú_to_chatml_format)Ú.0Úmr%   s     €r'   ú
<listcomp>z3ChatHuggingFace._to_chat_prompt.<locals>.<listcomp>b   s'   ø€ ÐFÐFÐF¸˜$×0Ò0°Ñ3Ô3ÐFÐFÐFr(   FT)ÚtokenizeÚadd_generation_prompt)Ú
ValueErrorÚ
isinstancer   r   Úapply_chat_template)r%   r)   Úmessages_dictss   `  r'   r0   zChatHuggingFace._to_chat_promptW   s‚   ø€ ð
 ð 	KÝÐIÑJÔJÐJå˜( 2œ,­Ñ5Ô5ð 	DÝÐBÑCÔCÐCàFÐFÐFÐF¸XÐFÑFÔFˆàŒ~×1Ò1Ø UÀ$ð 2ñ 
ô 
ð 	
r(   Úmessagec                 óä   — t          |t          ¦  «        rd}nOt          |t          ¦  «        rd}n7t          |t          ¦  «        rd}nt	          dt          |¦  «        › �¦  «        ‚||j        dœS )z+Convert LangChain message to ChatML format.ÚsystemÚ	assistantÚuserzUnknown message type: )Úroler   )rB   r   r
   r   rA   Útyper   )r%   rE   rJ   s      r'   r;   z!ChatHuggingFace._to_chatml_formath   s   € õ �g�}Ñ-Ô-ð 	GØˆDˆDÝ˜¥Ñ+Ô+ð 	GØˆDˆDÝ˜¥Ñ.Ô.ð 	GØˆDˆDåÐEµd¸7±m´mÐEÐEÑFÔFÐFà¨¬Ð9Ð9Ð9r(   r5   c                 óÎ   — g }| j         d         D ]@}t          t          |j        ¬¦  «        |j        ¬¦  «        }|                     |¦  «         ŒAt          || j        ¬¦  «        S )Nr   r   )rE   Úgeneration_info)ÚgenerationsÚ
llm_output)rN   r   r
   ÚtextrM   Úappendr   rO   )r5   Úchat_generationsÚgÚchat_generations       r'   r2   zChatHuggingFace._to_chat_resultv   s€   € àÐàÔ'¨Ô*ð 	5ð 	5ˆAÝ,Ý!¨!¬&Ð1Ñ1Ô1À1ÔCTðñ ô ˆOð ×#Ò# OÑ4Ô4Ð4Ð4åØ(°ZÔ5Jð
ñ 
ô 
ð 	
r(   c                 óÒ  — ddl m}  |d¦  «        }t          | j        t          ¦  «        r| j        j        }nxt          | j        t          ¦  «        r| j        j        }nQt          | j        t          ¦  «        r| j        j	        | _
        dS t          dt          | j        ¦  «        › �¦  «        ‚|D ]}|j        |k    r|j        | _
        Œ| j
        st          d|› d�¦  «        ‚dS )z8Resolve the model_id from the LLM's inference_server_urlr   )Úlist_inference_endpointsÚ*NzUnknown LLM type: zQFailed to resolve model_idCould not find model id for inference server provided: zBMake sure that your Hugging Face token has access to the endpoint.)Úhuggingface_hubrV   rB   r   r   Úinference_server_urlr   Úendpoint_urlr   Úrepo_idr   rA   rK   ÚurlÚ
repository)r%   rV   Úavailable_endpointsrZ   Úendpoints        r'   r#   z!ChatHuggingFace._resolve_model_id„   s  € ð 	=Ð<Ð<Ð<Ð<Ð<à6Ð6°sÑ;Ô;Ðå�d”hÕ ;Ñ<Ô<ð 	DØœ8Ô8ˆLˆLå˜œÕ"5Ñ6Ô6ð 		DØœ8Ô0ˆLˆLå˜œ¥.Ñ1Ô1ð 	Dà œHÔ,ˆDŒMØˆFõ ÐBµ$°t´x±.´.ÐBÐBÑCÔCÐCà+ð 	4ð 	4ˆHØŒ|˜|Ò+Ð+Ø (Ô 3�”øàŒ}ð 	ÝðUØJVðUð Uð Uñô ð ð	ð 	r(   c                 ó   — dS )Nzhuggingface-chat-wrapperr   )r%   s    r'   Ú	_llm_typezChatHuggingFace._llm_type¤   s   € à)Ð)r(   )NN)r,   N)#Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   Ú__annotations__r   ÚDEFAULT_SYSTEM_PROMPTr   r   r   r   Ústrr!   r   r   r   r   r   r1   r   r7   r0   Údictr;   Ústaticmethodr   r2   r#   Úpropertyra   Ú__classcell__)r&   s   @r'   r   r      s+  ø€ € € € € € ðð ð 
Ð*Ð,?ÀÐOÔ	PÐPÐPÑPØ$1 MÐ:OÐ$PÑ$PÔ$P€N�MÐPÐPÑPØ€IˆsÐÐÑØ€HˆcÐÐÑð

 ð 

ð 

ð 

ð 

ð 

ð 

ð %)Ø:>ð	0ð 0à�{Ô#ð0ð �t˜C”yÔ!ð0ð Ð6Ô7ð	0ð
 ð0ð 
ð0ð 0ð 0ð 0ð  %)Ø?Cð	0ð 0à�{Ô#ð0ð �t˜C”yÔ!ð0ð Ð;Ô<ð	0ð
 ð0ð 
ð0ð 0ð 0ð 0ð
à�{Ô#ð
ð 
ð
ð 
ð 
ð 
ð":¨ð :¸ð :ð :ð :ð :ð ð
 Ið 
°*ð 
ð 
ð 
ñ „\ð
ðð ð ð ð@ ð*˜3ð *ð *ð *ñ „Xð*ð *ð *ð *ð *r(   r   N)re   Útypingr   r   r   r   Ú langchain_core.callbacks.managerr   r   Ú*langchain_core.language_models.chat_modelsr	   Úlangchain_core.messagesr
   r   r   r   Úlangchain_core.outputsr   r   r   Ú-langchain_community.llms.huggingface_endpointr   Ú(langchain_community.llms.huggingface_hubr   Ú7langchain_community.llms.huggingface_text_gen_inferencer   rg   r   r   r(   r'   ú<module>ru      sf  ðØ  Ð  Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -ðð ð ð ð ð ð ð ð EÐ DÐ DÐ DÐ DÐ Dðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð NÐ MÐ MÐ MÐ MÐ MØ CÐ CÐ CÐ CÐ CÐ Cðð ð ð ð ð ð SÐ ðH*ð H*ð H*ð H*ð H*�mñ H*ô H*ð H*ð H*ð H*r(   