
    Ngo?                     |   d dl Z d dlZd dlmZmZmZ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mZmZmZmZmZmZmZmZ d dlmZm Z m!Z! d dl"m#Z#m$Z$m%Z%  G d d	e%          Z& G d
 de%          Z' G d de'          Z( G d de(          Z) G d dee#          Z*dee+ef         de
e         defdZ,dS )    N)	AnyAsyncIteratorDictIteratorListMappingOptionalTypecast)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModel)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkFunctionMessageChunkHumanMessageHumanMessageChunkSystemMessageSystemMessageChunkToolMessageChunk)ChatGenerationChatGenerationChunk
ChatResult)AzureMLBaseEndpointAzureMLEndpointApiTypeContentFormatterBasec                       e Zd ZdZddZdS )LlamaContentFormatterzContent formatter for `LLaMA`.returnNc                      t          d          )Nzb`LlamaContentFormatter` is deprecated for chat models. Use `CustomOpenAIContentFormatter` instead.)	TypeErrorselfs    l/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/azureml_endpoint.py__init__zLlamaContentFormatter.__init__.   s    6
 
 	
    r#   N)__name__
__module____qualname____doc__r)    r*   r(   r"   r"   +   s.        ((
 
 
 
 
 
r*   r"   c                       e Zd ZU dZg dZee         ed<   ede	de
fd            Zedee         fd            Zdee	         d	e
d
edefdZej        fded
edefdZdS ) CustomOpenAIChatContentFormatterz>Chat Content formatter for models with OpenAI like API scheme.)user	assistantsystemSUPPORTED_ROLESmessager#   c                 <   t          t          | j                  }t          | t                    rdt          j        |          dS t          | t                    rdt          j        |          dS t          | t                    rdt          j        |          dS t          | t                    r/| j
        t          j        v r| j
        t          j        |          dS d                    d t          j        D                       }t          d|           )z0Converts a message to a dict according to a roler3   )rolecontentr4   r5   ,c                     g | ]}|S r0   r0   ).0r9   s     r(   
<listcomp>zMCustomOpenAIChatContentFormatter._convert_message_to_dict.<locals>.<listcomp>W   s    SSS$SSSr*   z\Received unsupported role. 
                Supported roles for the LLaMa Foundation Model: )r   strr:   
isinstancer   r    escape_special_charactersr   r   r   r9   r2   r6   join
ValueError)r7   r:   	supporteds      r(   _convert_message_to_dictz9CustomOpenAIChatContentFormatter._convert_message_to_dict:   sK    sGO,,g|,, 	/I'RR   ++ 	#/I'RR   // 	 /I'RR  
 w,,	 @ PPP  /I'RR  
 SS"B"RSSS I OAJO O  r*   c                 2    t           j        t           j        gS )N)r   	dedicated
serverlessr&   s    r(   supported_api_typesz4CustomOpenAIChatContentFormatter.supported_api_types^   s    &02H2STTr*   messagesmodel_kwargsapi_typec                 .   d |D             }|t           j        t           j        fv rt          j        d||di          }n<|t           j        k    rt          j        d|i|          }nt          d| d          t                              |          S )/Formats the request according to the chosen apic                 B    g | ]}t                               |          S r0   r2   rE   )r=   r7   s     r(   r>   zTCustomOpenAIChatContentFormatter.format_messages_request_payload.<locals>.<listcomp>i   s6     
 
 
 -EEgNN
 
 
r*   
input_datainput_string
parametersrJ   `api_type` # is not supported by this formatter)	r   rG   realtimejsondumpsrH   rC   r?   encoder'   rJ   rK   rL   chat_messagesrequest_payloads         r(   format_messages_request_payloadz@CustomOpenAIChatContentFormatter.format_messages_request_payloadb   s    
 
#
 
 
 ","+
 
 
 #j (5&2# # OO /:::"j*m)T|)TUUOOKhKKK   zz/***r*   outputc           	      B   |t           j        t           j        fv r	 t          j        |          d         }nH# t
          t          t          f$ r.}t          | j	        
                    |                    |d}~ww xY wt          t          |                                          d          S |t           j        k    rM	 t          j        |          d         d         }t          |t                     st          d          nH# t
          t          t          f$ r.}t          | j	        
                    |                    |d}~ww xY wt          |d	         d
         dk    r.t          |d	         d                                                   n:t#          |d	         d                                         |d	         d
                   t!          |                    d          |                    d                              S t          d| d          )zFormats responser_   )rL   Nr:   r7   generation_infochoicesr   ziEndpoint response is not well formed for a chat model. Expected `dict` but `{type(choice)}` was received.r7   r9   r4   r:   )r:   typefinish_reasonlogprobs)rf   rg   rU   rV   )r   rG   rW   rX   loadsKeyError
IndexErrorr%   rC   format_error_msgformatr   r   striprH   r@   dictr   get)r'   r_   rL   choicees        r(   format_response_payloadz8CustomOpenAIChatContentFormatter.format_response_payload   sQ    ","+
 
 
YF++H5j)4 Y Y Y !6!=!=x!=!P!PQQWXXY!!"LLNN   !%	    -888YF++I6q9!&$// #T  
 j)4 Y Y Y !6!=!=x!=!P!PQQWXXY!)$V,;; "&*;I*F*L*L*N*NOOOO "9-i8>>@@	*62   !%"(**_"="=#ZZ
33! ! !    TxTTTUUUs.   7 A<)A77A<AD E)EEN)r,   r-   r.   r/   r6   r   r?   __annotations__staticmethodr   r   rE   propertyr   rI   bytesr^   rG   r   rr   r0   r*   r(   r2   r2   5   s        HH!@!@!@OT#Y@@@!+ !$ ! ! ! \!F UT*@%A U U U XU+{#+ + )	+
 
+ + + +D ,B+K*V *V*V )*V 
	*V *V *V *V *V *Vr*   r2   c                   $     e Zd ZdZd fdZ xZS )LlamaChatContentFormatterzSDeprecated: Kept for backwards compatibility

    Chat Content formatter for Llama.r#   Nc                 p    t                                                       t          j        d           d S )Nz`LlamaChatContentFormatter` will be deprecated in the future. 
                Please use `CustomOpenAIChatContentFormatter` instead.  
            )superr)   warningswarn)r'   	__class__s    r(   r)   z"LlamaChatContentFormatter.__init__   s<    	
 	
 	
 	
 	
r*   r+   )r,   r-   r.   r/   r)   __classcell__)r}   s   @r(   rx   rx      sG        ) )
 
 
 
 
 
 
 
 
 
r*   rx   c                   6    e Zd ZdZdee         dededefdZ	dS )MistralChatContentFormatterz Content formatter for `Mistral`.rJ   rK   rL   r#   c                      fd|D             }|r>|d         d         dk    r,|d         d         dz   |d         d         z   |d         d<   |d= |t           j        k    rt          j        d||d	i          }n<|t           j        k    rt          j        d
|i|          }nt          d| d          t                              |          S )rN   c                 :    g | ]}                     |          S r0   )rE   )r=   r7   r'   s     r(   r>   zOMistralChatContentFormatter.format_messages_request_payload.<locals>.<listcomp>   s'    XXXG66w??XXXr*   r   r9   r5   r:   z

   rQ   rR   rJ   rU   rV   )r   rW   rX   rY   rH   rC   r?   rZ   r[   s   `     r(   r^   z;MistralChatContentFormatter.format_messages_request_payload   s    YXXXxXXX 	!]1-f5AA a +f4}Q7G	7RR !Y' a -666"j (5&2# # OO /:::"j*m)T|)TUUOOKhKKK   zz/***r*   N)
r,   r-   r.   r/   r   r   r   r   rv   r^   r0   r*   r(   r   r      sY        ** +{# +  + )	 +
 
 +  +  +  +  +  +r*   r   c                   h   e Zd ZdZedeeef         fd            Z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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S )AzureMLChatOnlineEndpointa  Azure ML Online Endpoint chat models.

    Example:
        .. code-block:: python
            azure_llm = AzureMLOnlineEndpoint(
                endpoint_url="https://<your-endpoint>.<your_region>.inference.ml.azure.com/v1/chat/completions",
                endpoint_api_type=AzureMLApiType.serverless,
                endpoint_api_key="my-api-key",
                content_formatter=chat_content_formatter,
            )
    r#   c                      | j         pi }i d|iS )zGet the identifying parameters.rK   )rK   )r'   _model_kwargss     r(   _identifying_paramsz-AzureMLChatOnlineEndpoint._identifying_params   s(     )/R
}-
 	
r*   c                     dS )zReturn type of llm.azureml_chat_endpointr0   r&   s    r(   	_llm_typez#AzureMLChatOnlineEndpoint._llm_type   s
     '&r*   NrJ   stoprun_managerkwargsc                 (   | j         pi }|                    |           |r||d<   | j                            ||| j                  }| j                            ||          }| j                            || j                  }t          |g          S )a  Call out to an AzureML Managed Online endpoint.
        Args:
            messages: The messages in the conversation with the chat model.
            stop: Optional list of stop words to use when generating.
        Returns:
            The string generated by the model.
        Example:
            .. code-block:: python
                response = azureml_model.invoke("Tell me a joke.")
        r   )bodyr   )generations)	rK   updatecontent_formatterr^   endpoint_api_typehttp_clientcallrr   r   )	r'   rJ   r   r   r   r   r]   response_payloadr   s	            r(   	_generatez#AzureMLChatOnlineEndpoint._generate   s    " )/RV$$$ 	)$(M&!0PPmT%;
 
  +00 k 1 
 
 ,DDd4
 
 {m4444r*   c              +      K   | j                             dd          | _         d|vrd n|d         }dd l}i }| j                                        | j         |d d d d} |j        di |}	d |D             }
d|d d|}t          } |	j        j        j	        dd	|
i|D ]}t          |t                    s|                                }t          |d
                   dk    rE|d
         d         }t          |d         |          }i }|                    d          x}r||d<   |                    d          }|r||d<   |j        }t!          ||pd           }|r|                    |j        ||           |V  d S )N/chat/completions timeoutr   api_keybase_urlr   default_headersdefault_queryr   c                 B    g | ]}t                               |          S r0   rP   r=   ms     r(   r>   z5AzureMLChatOnlineEndpoint._stream.<locals>.<listcomp>4  6     
 
 
 -EEaHH
 
 
r*   Tstreamr   modelrJ   rd   deltarf   rg   rb   )chunkrg   r0   )endpoint_urlreplaceopenaiendpoint_api_keyget_secret_valueOpenAIr   chatcompletionscreater@   rn   len_convert_delta_to_message_chunkro   r}   r   on_llm_new_tokentext)r'   rJ   r   r   r   r   r   paramsclient_paramsclientmessage_dictsdefault_chunk_classr   rp   rc   rf   rg   s                    r(   _streamz!AzureMLChatOnlineEndpoint._stream  s      !-556I2NN#611$$vi7H,==??)#!
 
 ////
 

 
 
 !$HHH,3V[,3UU]UfUU 	 	EeT** %

5#$$))9%a(F3w# E !O &

? ; ;;} A3@0zz*--H 7.6
+"'/' / 74  E  Y,,UZux,XXXKKKK/	 	r*   c                &  K   | j                             dd          | _         d|vrd n|d         }dd l}i }| j                                        | j         |d d d d} |j        di |}	d |D             }
d|d d|}t          } |	j        j        j	        dd	|
i| d {V 2 3 d {V }t          |t                    s|                                }t          |d
                   dk    rJ|d
         d         }t          |d         |          }i }|                    d          x}r||d<   |                    d          }|r||d<   |j        }t!          ||pd           }|r#|                    |j        ||           d {V  |W V  6 d S )Nr   r   r   r   r   c                 B    g | ]}t                               |          S r0   rP   r   s     r(   r>   z6AzureMLChatOnlineEndpoint._astream.<locals>.<listcomp>k  r   r*   Tr   rJ   rd   r   rf   rg   rb   )tokenr   rg   r0   )r   r   r   r   r   AsyncOpenAIr   r   r   r   r@   rn   r   r   ro   r}   r   r   r   )r'   rJ   r   r   r   r   r   r   r   async_clientr   r   r   rp   rc   rf   rg   s                    r(   _astreamz"AzureMLChatOnlineEndpoint._astreamT  s      !-556I2NN#611$$vi7H,==??)#!
 
 *v)::M::
 

 
 
 !$HHH,!E!2!>!E "
 "
""
"
 "
 
 
 
 
 
 
 	 	 	 	 	 	 	% eT** %

5#$$))9%a(F3w!4 E !O &

? ; ;;} A3@0zz*--H 7.6
+"'/'/F$  E  !22*EH 3          KKKKK5
 
 
s   #F)NN)r,   r-   r.   r/   ru   r   r?   r   r   r   r   r   r	   r   r   r   r   r   r   r   r   r   r0   r*   r(   r   r      s       
 
 
T#s(^ 
 
 
 X
 '3 ' ' ' X' %):>	5 5{#5 tCy!5 67	5
 5 
5 5 5 5H %):>	5 5{#5 tCy!5 67	5
 5 
%	&5 5 5 5t %)?C	8 8{#8 tCy!8 ;<	8
 8 
*	+8 8 8 8 8 8r*   r   _dictdefault_classr#   c                 &   t          t          |                     d                    }t          t          |                     d          pd          }i }|                     d          r+t          | d                   }d|v r|d         d|d<   ||d<   |                     d          r| d         |d<   |dk    s|t          k    rt	          |          S |d	k    s|t
          k    rt          ||
          S |dk    s|t          k    rt          |          S |dk    s|t          k    rt          || d                   S |dk    s|t          k    rt          || d                   S |s|t          k    rt          ||          S  ||          S )Nr9   r:   r   function_callname
tool_callsr3   ra   r4   )r:   additional_kwargsr5   function)r:   r   tooltool_call_id)r:   r   )r:   r9   )
r   r?   ro   rn   r   r   r   r   r   r   )r   r   r9   r:   r   r   s         r(   r   r     s    UYYv&&''D3		),,233G yy!! ;U?344]""}V'<'D$&M&!-:/*yy >*/*=,'v~~*;;; 1111			 ? ?gARSSSS			].@@@!'2222			}0DDD#G%-HHHH	=,<<<eN>STTTT	 ."222d;;;;}W----r*   )-rX   r{   typingr   r   r   r   r   r   r	   r
   r   langchain_core.callbacksr   r   *langchain_core.language_models.chat_modelsr   langchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   r   langchain_core.outputsr   r   r   )langchain_community.llms.azureml_endpointr   r   r    r"   r2   rx   r   r   r?   r   r0   r*   r(   <module>r      s    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
        E D D D D D                            S R R R R R R R R R         
 
 
 
 
0 
 
 
vV vV vV vV vV'; vV vV vVr
 
 
 
 
 @ 
 
 
#+ #+ #+ #+ #+"; #+ #+ #+Lj j j j j/B j j jZ.38.-12B-C.. . . . . .r*   