
    Ng                        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&dS )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                      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      g/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/huggingface.pyr-   zChatHuggingFace.__init__C   sv    ""6"""......    ~% ))$-88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   s\    H(*=~N
 
 	 RAEdhR R   r4   messagesstoprun_managerc              +      K   |                      |          } | j        j        |fi |D ]?}|}t          t	          |                    }|r|                    ||           |V  @d S 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\   s       &&x00#DHOG66v66 	 	DE'u0M0M0MNNNE A,,U%,@@@KKKK	 	r4   c                   K   |                      |          } | j        j        |fi |2 3 d {V }|}t          t	          |                    }|r|                    ||           d {V  |W V  L6 d S rB   )rE   r!   astreamr   r   rG   rH   s	            r3   _astreamzChatHuggingFace._astreaml   s       &&x00*$(*7==f== 	 	 	 	 	 	 	$E'u0M0M0MNNNE G!2252FFFFFFFFFKKKKK >==s   A7c                     | j         r  | j        |f||d|}t          |          S |                     |          } | j        j        d|g||d|}|                     |          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     > 	5&$,# @F K (444((22	'TX' 
Kd
 
GM
 

 ##J///r4   c                    K   | j         r& | j        |f||d|}t          |           d {V S |                     |          } | j        j        d|g||d| d {V }|                     |          S rQ   )r'   rO   r   rE   r!   
_ageneraterT   rU   s           r3   rZ   zChatHuggingFace._agenerate   s       > 	<'$-# @F K /{;;;;;;;;;((22	.48. 
Kd
 
GM
 
 
 
 
 
 
 

 ##J///r4   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 HumanMessage!c                 :    g | ]}                     |          S r+   )_to_chatml_format).0mr1   s     r3   
<listcomp>z3ChatHuggingFace._to_chat_prompt.<locals>.<listcomp>   s'    FFF$0033FFFr4   FT)tokenizeadd_generation_prompt)
ValueErrorr9   r   r%   apply_chat_template)r1   r>   messages_dictss   `  r3   rE   zChatHuggingFace._to_chat_prompt   s    
  	LJKKK(2,55 	ECDDDFFFFXFFF~11U$ 2 
 
 	
r4   rC   c                     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#   )r9   r   r   r   rd   r;   r#   )r1   rC   rk   s      r3   r^   z!ChatHuggingFace._to_chatml_format   s     g}-- 	GDD++ 	GDD.. 	GDDEd7mmEEFFF999r4   rX   c                     g }| j         d         D ]@}t          t          |j                  |j                  }|                    |           At          || j                  S )Nr   r"   )rC   generation_info)generations
llm_output)rn   r   r   textrm   appendr   ro   )rX   chat_generationsgchat_generations       r3   rT   zChatHuggingFace._to_chat_result   s    '* 	5 	5A,!!&1111CT  O ##O4444(Z5J
 
 
 	
r4   c                    ddl m}  |d          }t          | j        t                    s!t          | j        d          r| j        j        r| j        j        | _        dS t          | j        t                    r| j        j	        }n| j        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*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_hubrv   r9   r!   r   hasattrrx   r&   r   inference_server_urlendpoint_urlurl
repositoryrd   )r1   rv   available_endpointsr|   endpoints        r3   r/   z!ChatHuggingFace._resolve_model_id   s    	=<<<<<66s;;dh// 	1DHi((	1-1X-=	1 !H,DMF"=>> 	1*.(*GLL80L+ 	4 	4H||++ ( 3} 	UAMU U U  	 	r4   c                     dS )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    (   s=          
HHH$1M:O$P$P$PNMPPPIs"Hhsm"""It
 
 
 
 
 
 
 _'"""	d 	 	 	 #"	 %):>	 {# tCy! 67	
  
%	&   & %)?C	 {# tCy! ;<	
  
*	+   $ %):>	0 0{#0 tCy!0 67	0
 0 
0 0 0 0, %)?C	0 0{#0 tCy!0 ;<	0
 0 
0 0 0 0&
{#
 

 
 
 
": : : : : : 
I 
* 
 
 
 \
   6 *3 * * * X* * * * *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 6 6 6 6 6                
                         % $ $ $ $ $ " " " " " " M M M M M M C C C C C C      S  
>  
~* ~* ~* ~* ~*m ~* ~* 
~* ~* ~*r4   