
    hh)                         d dl Z d dlZd dlmZmZmZmZmZmZ d dl	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 d dlmZmZmZ d dlmZ d dlmZ d d	lmZ  ej         e!          Z" G d
 de          Z#dS )    N)AnyAsyncIteratorDictListOptionalcast)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModel)	AIMessageAIMessageChunkBaseMessageChatMessageHumanMessageSystemMessage)ChatGenerationChatGenerationChunk
ChatResultget_from_dict_or_env)model_validator)enforce_stop_tokensc                      e Zd ZU dZ	 eed<   	 eed<   	 dZee         ed<   dZ	ee
         ed<   dZee
         ed	<   d
Zee         ed<   dZee         ed<   dZee         ed<   dZeee                  ed<   	 dZeed<   	 dZee         ed<   dZee         ed<   dZee         ed<    ed          ededefd                        Zedeeef         fd            Zedefd            Zedeeef         fd            Zdeee                  d edefd!Z d"ee!         dedefd#Z"d$e#deee                  defd%Z$	 	 d0d"ee!         d&eee                  d'ee%         d ede&f
d(Z'	 	 d0d"ee!         d&eee                  d'ee%         d edef
d)Z(d*edefd+Z)d*edefd,Z*d-ede+fd.Z,	 	 d0d"ee!         d&eee                  d'ee-         d ede.e/         f
d/Z0dS )1PaiEasChatEndpointa0  Alibaba Cloud PAI-EAS LLM Service chat model API.

        To use, must have a deployed eas chat llm service on AliCloud. One can set the
    environment variable ``eas_service_url`` and ``eas_service_token`` set with your eas
    service url and service token.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import PaiEasChatEndpoint
            eas_chat_endpoint = PaiEasChatEndpoint(
                eas_service_url="your_service_url",
                eas_service_token="your_service_token"
            )
    eas_service_urleas_service_tokeni   max_new_tokensg?temperatureg?top_p
   top_kF	do_sampleT	use_cacheNstop_sequences	streamingmodel_kwargsz2.0versioni  timeoutbefore)modevaluesreturnc                 V    t          |dd          |d<   t          |dd          |d<   |S )z?Validate that api key and python package exists in environment.r   EAS_SERVICE_URLr   EAS_SERVICE_TOKENr   )clsr+   s     m/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/langchain_community/chat_models/pai_eas_endpoint.pyvalidate_environmentz'PaiEasChatEndpoint.validate_environmentF   sI     %9%'8%
 %
 ! ';')<'
 '
"#     c                 :    | j         pi }| j        | j        dd|iS )zGet the identifying parameters.)r   r   r&   )r&   r   r   )self_model_kwargss     r1   _identifying_paramsz&PaiEasChatEndpoint._identifying_paramsS   s;     )/R#3!%!7
 
 }-
 	
r3   c                     dS )zReturn type of llm.pai_eas_chat_endpoint r5   s    r1   	_llm_typezPaiEasChatEndpoint._llm_type]   s
     '&r3   c                 R    | j         | j        | j        | j        g | j        | j        dS )z2Get the default parameters for calling Cohere API.)r   r   r!   r   r$   r"   r#   )r   r   r!   r   r"   r#   r;   s    r1   _default_paramsz"PaiEasChatEndpoint._default_paramsb   s6     #1+ZZ 
 
 	
r3   kwargsc                     | j         }| j        r|                    | j                   | j        |t	          d          | j        | j        |d<   n||d<   i ||S )Nz2`stop` found in both the input and default params.stop)r>   r&   updater$   
ValueError)r5   r$   r?   paramss       r1   _invocation_paramsz%PaiEasChatEndpoint._invocation_paramso   sy     % 	-MM$+,,,*~/IQRRR ,!0F6NN+F6N#&#F##r3   messagesc                    i }g }g }|D ]}	 t          t          |j                  }t          |t                    r||gz   }9t          |t
                    r||gz   }Ut          |t                    r||d<   pt          |t                    r>|j        dv r5|j        dk    r||d<   |j        dk    r||gz   }|j        dk    r||gz   }d	                    d dD                       }t          d|           |t          |          d	z
           |d
<   d t          t          |d d         |                    D             }	|	|d<   i ||S )Nsystem_prompt)user	assistantsystemrK   rI   rJ   ,c                     g | ]}|S r:   r:   ).0roles     r1   
<listcomp>z=PaiEasChatEndpoint.format_request_payload.<locals>.<listcomp>   s    %W%W%Wtd%W%W%Wr3   z`Received unsupported role. 
                    Supported roles for the LLaMa Foundation Model:    promptc                     g | ]\  }}|S r:   r:   )rN   _history_items      r1   rP   z=PaiEasChatEndpoint.format_request_payload.<locals>.<listcomp>   s,     
 
 
< 
 
 
r3   history)r   strcontent
isinstancer   r   r   r   rO   joinrC   len	enumeratezip)
r5   rF   r&   rR   user_contentassistant_contentmessagerY   	supportedrW   s
             r1   format_request_payloadz)PaiEasChatEndpoint.format_request_payload}   s    "$"$') 	 	G>300G'<00 +wi7GY// $5	$A!!G]33 *1''G[11 gl G 7 7
 <8++.5F?++\V++#/7)#;LL\[00(9WI(E%HH%W%W7V%W%W%WXX	 SENS S   (L(9(9A(=>x
 
#,Scrc1BDU-V-V#W#W
 
 

 $y)&)L))r3   outputc                     	 t          j        |          d         }|rt          ||          }|S # t          $ r@}t	          |t           j        j                  r|                    d          cY d}~S |d}~ww xY w)zFormats responseresponseutf-8N)jsonloadsr   	ExceptionrZ   decoderJSONDecodeErrordecode)r5   rd   r$   textes        r1   _format_response_payloadz+PaiEasChatEndpoint._format_response_payload   s    	:f%%j1D A*4@@K 	 	 	!T\9:: .}}W--------G	s    -0 
A:3A5-A:3A55A:rA   run_managerc                      | j         |f||d|}t          |          }t          |          }t          |g          S )N)rA   rq   rY   ra   )generations)_callr   r   r   )r5   rF   rA   rq   r?   
output_strra   
generations           r1   	_generatezPaiEasChatEndpoint._generate   sX      TZWtWWPVWW
J///#G444
zl3333r3   c                      | j         |fi |} | j        |fi |}|                     |          }|                     ||d                   }|r|                    |           |S )NrA   )rE   rc   	_call_easrp   on_llm_new_token)	r5   rF   rA   rq   r?   rD   request_payloadresponse_payloadgenerated_texts	            r1   rv   zPaiEasChatEndpoint._call   s     )(88885$5hII&II>>/::667GPVXX 	9((888r3   
query_bodyc                     dd| j          d}t          j        | j        ||| j                  }|j        dk    rt          d|j         d|j                   |j        S z#Generate text from the eas service.zapplication/json)zContent-TypeAcceptAuthorization)headersrh   r(      z Request failed with status code z and message r   requestspostr   r(   status_coderj   rn   r5   r   r   rf   s       r1   r{   zPaiEasChatEndpoint._call_eas   s     /( $ 68
 
 = '
DL
 
 
 3&&083G 0 0 (0 0  
 }r3   c                     dd| j          d}t          j        | j        ||| j                  }|j        dk    rt          d|j         d|j                   |S r   r   r   s       r1   _call_eas_streamz#PaiEasChatEndpoint._call_eas_stream   s     /( $ 68
 
 = '
DL
 
 
 3&&083G 0 0 (0 0  
 r3   chunkc                     t          j        |                    d                    }t          |                    dd                    S )Nrg   rf    rs   )rh   ri   encoder   get)r5   r   datas      r1   !_convert_chunk_to_message_messagez4PaiEasChatEndpoint._convert_chunk_to_message_message   s>     z%,,w//00dhhz2&>&>????r3   c                  K    | j         |fi |} | j        |fi |}d|d<   |                     |          }|                    ddd          D ]}|r|                     |          }	d }
|d         D ]}||	j        v r|}
d }|
r,|	j        d |	j                            |
                   |	_        |rLt          |	          }|r5|                    t          t          |	j                  |	           d {V  |W V  |
r d S d S )
NTuse_stream_chati    F    )
chunk_sizedecode_unicode	delimiterrA   rt   )r   )rE   rc   r   
iter_linesr   rY   indexr   r|   r   rX   )r5   rF   rA   rq   r?   rD   r}   rf   r   rY   stop_seq_foundstop_seqrn   cg_chunks                 r1   _astreamzPaiEasChatEndpoint._astream  s      )(88885$5hII&II-1)*((99((EU ) 
 
 	 	E  @@GG 15 &v 2 2H7?22)1 '+! &-o?'///???'GO
  #27CCCH" ):: go66h ;          #NNNN " EE=	 	r3   )NN)1__name__
__module____qualname____doc__rX   __annotations__r   r   intr   floatr   r!   r"   boolr#   r$   r   r%   r&   dictr'   r(   r   classmethodr   r   r2   propertyr7   r<   r>   rE   r   rc   bytesrp   r
   r   ry   rv   r{   r   r   r   r	   r   r   r   r:   r3   r1   r   r      s0           &$'NHSM'''#&K%&&& E8E?   E8C= %Ix~%%% $Ix~$$$*.NHT#Y'..."ItK#'L(4.'''"GXc]"""!GXc]!!!_(###	$ 	3 	 	 	 [ $#	 
T#s(^ 
 
 
 X
 '3 ' ' ' X' 

c3h 

 

 

 X

$&tCy1$=@$	$ $ $ $)*[))*;>)*	)* )* )* )*V-5d3i-@	   " %):>	
4 
4{#
4 tCy!
4 67	
4
 
4 

4 
4 
4 
4 %):>	 {# tCy! 67	
  
   $D S    *4 C    *@@ 
@ @ @ @ %)?C	+ +{#+ tCy!+ ;<	+
 + 
*	++ + + + + +r3   r   )$rh   loggingtypingr   r   r   r   r   r   r   langchain_core.callbacksr	   r
   *langchain_core.language_models.chat_modelsr   langchain_core.messagesr   r   r   r   r   r   langchain_core.outputsr   r   r   langchain_core.utilsr   pydanticr   langchain_community.llms.utilsr   	getLoggerr   loggerr   r:   r3   r1   <module>r      s     A A A A A A A A A A A A A A A A         E D D D D D                S R R R R R R R R R 5 5 5 5 5 5 $ $ $ $ $ $ > > > > > >		8	$	$T T T T T T T T T Tr3   