
    3fi)                         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#y)    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/Z0y)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                 F    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     n/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_community/chat_models/pai_eas_endpoint.pyvalidate_environmentz'PaiEasChatEndpoint.validate_environmentF   s?     %9%'8%
 ! ';')<'
"#     c                 \    | j                   xs 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3!%!7!7
 }-
 	
r3   c                      y)zReturn type of llm.pai_eas_chat_endpoint r5   s    r1   	_llm_typezPaiEasChatEndpoint._llm_type]   s     'r3   c                     | 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   s?     #11++ZZZZ 
 	
r3   kwargsc                     | j                   }| j                  r|j                  | 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   s{     %%MM$++,*~/IQRR  ,!00F6N+F6N#&#F##r3   messagesc                    i }g }g }|D ]  }	 t        t        |j                        }t        |t              r||gz   }5t        |t
              r||gz   }Lt        |t              r||d<   bt        |t              rP|j                  dv rB|j                  dk(  r||d<   |j                  dk(  r||gz   }|j                  dk(  s||gz   }dj                  dD cg c]  }| c}      }	t        d|	        |t        |      dz
     |d	<   t        t        |d d
 |            D 
cg c]  \  }
}|	 }}
}||d<   i ||S c c}w c c}}
w )Nsystem_prompt)user	assistantsystemrK   rI   rJ   ,z`Received unsupported role. 
                    Supported roles for the LLaMa Foundation Model:    prompthistory)r   strcontent
isinstancer   r   r   r   rolejoinrC   len	enumeratezip)r5   rF   r&   rN   user_contentassistant_contentmessagerR   rT   	supported_history_itemrP   s                r1   format_request_payloadz)PaiEasChatEndpoint.format_request_payload}   s    "$"$') 	G>30G'<0+wi7GY/$5	$A!G]3*1'G[1gll G 7
 <<8+.5F?+\\V+#/7)#;L\\[0(9WI(E%HH7V%Wtd%WX	 EENKS -	4 (L(9A(=>x $-Scr1BDU-V#W
< 
 

 $y)&)L)) &X
s   	E
(Eoutputc                     	 t        j                  |      d   }|rt        ||      }|S # t        $ rA}t	        |t         j
                  j                        r|j                  d      cY d}~S |d}~ww xY w)zFormats responseresponseutf-8N)jsonloadsr   	ExceptionrS   decoderJSONDecodeErrordecode)r5   r`   r$   textes        r1   _format_response_payloadz+PaiEasChatEndpoint._format_response_payload   sf    	::f%j1D*4@K 	!T\\99:}}W--G	s    '* 	A44A/'A4-A//A4rA   run_managerc                 x     | j                   |f||d|}t        |      }t        |      }t        |g      S )N)rA   rm   rR   r[   )generations)_callr   r   r   )r5   rF   rA   rm   r?   
output_strr[   
generations           r1   	_generatezPaiEasChatEndpoint._generate   sB      TZZWtWPVW
J/#G4
zl33r3   c                      | j                   |fi |} | j                  |fi |}| j                  |      }| j                  ||d         }|r|j	                  |       |S )NrA   )rE   r_   	_call_easrl   on_llm_new_token)	r5   rF   rA   rm   r?   rD   request_payloadresponse_payloadgenerated_texts	            r1   rr   zPaiEasChatEndpoint._call   sp     )((885$55hI&I>>/:667GPVX((8r3   
query_bodyc                     dd| j                    d}t        j                  | j                  ||| j                        }|j
                  dk7  r%t        d|j
                   d|j                         |j                  S z#Generate text from the eas service.zapplication/json)zContent-TypeAcceptAuthorization)headersrd   r(      z Request failed with status code z and message r   requestspostr   r(   status_coderf   rj   r5   r|   r   rb   s       r1   rw   zPaiEasChatEndpoint._call_eas   s     /( $ 6 67
 ==  '
DLL
 3&283G3G2H0 
 }}r3   c                     dd| j                    d}t        j                  | j                  ||| j                        }|j
                  dk7  r%t        d|j
                   d|j                         |S r~   r   r   s       r1   _call_eas_streamz#PaiEasChatEndpoint._call_eas_stream   s     /( $ 6 67
 ==  '
DLL
 3&283G3G2H0 
 r3   chunkc                     t        j                  |j                  d            }t        |j	                  dd            S )Nrc   rb    ro   )rd   re   encoder   get)r5   r   datas      r1   !_convert_chunk_to_message_messagez4PaiEasChatEndpoint._convert_chunk_to_message_message   s1     zz%,,w/0dhhz2&>??r3   c                  K    | j                   |fi |} | j                  |fi |}d|d<   | j                  |      }|j                  ddd      D ]  }|s| j	                  |      }	d }
|d   D ]  }||	j
                  v s|}
 d }|
r-|	j
                  d |	j
                  j                  |
       |	_        |rFt        |	      }|r3|j                  t        t        |	j
                        |	       d {    | |
s y  y 7 w)
NTuse_stream_chati    F    )
chunk_sizedecode_unicode	delimiterrA   rp   )r   )rE   r_   r   
iter_linesr   rR   indexr   rx   r   rQ   )r5   rF   rA   rm   r?   rD   ry   rb   r   rR   stop_seq_foundstop_seqrj   cg_chunks                 r1   _astreamzPaiEasChatEndpoint._astream  s8     )((885$55hI&I-1)*((9((EU ) 
 	E @@G 15 &v 2H7??2)12
 '+!&-oo?'////?'GO
 27CH"):: goo6h ;    #N "=	.s%   AD	)D	A3D	6D7D	D	)NN)1__name__
__module____qualname____doc__rQ   __annotations__r   r   intr   floatr   r!   r"   boolr#   r$   r   r%   r&   dictr'   r(   r   classmethodr   r   r2   propertyr7   r<   r>   rE   r   r_   bytesrl   r
   r   ru   rr   rw   r   r   r   r	   r   r   r   r:   r3   r1   r   r      s     &$'NHSM'#&K%& E8E? E8C= %Ix~% $Ix~$*.NHT#Y'."ItK#'L(4.'"GXc]"!GXc]!(#	$ 	3 	  $	 
T#s(^ 
 
 '3 ' ' 

c3h 

 

$&tCy1$=@$	$)*[))*;>)*	)*V-5d3i-@	" %):>	
4{#
4 tCy!
4 67	
4
 
4 

4 %):>	{# tCy! 67	
  
$D S *4 C *@@ 
@ %)?C	+{#+ tCy!+ ;<	+
 + 
*	++r3   r   )$rd   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  E  S R 5 $ >			8	$T Tr3   