
    iht                         d dl Z d dlZd dlmZmZmZmZmZ d dlZd dl	m
Z
 d dl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 d dlmZ d d	lmZ  e j6                  e      Zd
edefdZ e
dd       G d de             Z y)    N)AnyDictListMappingOptional)
deprecated)CallbackManagerForLLMRun)BaseChatModel)	AIMessageBaseMessageChatMessageHumanMessage)ChatGeneration
ChatResultget_from_dict_or_env)model_validatormessagereturnc                     t        | t              r| j                  | j                  d}|S t        | t              rd| j                  d}|S t        | t
              rd| j                  d}|S t        d|        )N)rolecontentuser	assistantzGot unknown type )
isinstancer   r   r   r   r   
ValueError)r   message_dicts     c/var/www/html/dev/engine/venv/lib/python3.12/site-packages/langchain_community/chat_models/ernie.py_convert_message_to_dictr      s    ';' 'I  
G\	* &7??C
 	 
GY	' +H  ,WI677    z0.0.13z3langchain_community.chat_models.QianfanChatEndpoint)sincealternativec                      e Zd ZU dZ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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<    ej,                         Z ed      ededefd              ZdedefdZd$dZ 	 	 d%de!e"   dee!e      dee#   dede$f
d Z%d!e&eef   de$fd"Z'e(defd#       Z)y)&ErnieBotChata#  `ERNIE-Bot` large language model.

    ERNIE-Bot is a large language model developed by Baidu,
    covering a huge amount of Chinese data.

    To use, you should have the `ernie_client_id` and `ernie_client_secret` set,
    or set the environment variable `ERNIE_CLIENT_ID` and `ERNIE_CLIENT_SECRET`.

    Note:
    access_token will be automatically generated based on client_id and client_secret,
    and will be regenerated after expiration (30 days).

    Default model is `ERNIE-Bot-turbo`,
    currently supported models are `ERNIE-Bot-turbo`, `ERNIE-Bot`, `ERNIE-Bot-8K`,
    `ERNIE-Bot-4`, `ERNIE-Bot-turbo-AI`.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ErnieBotChat
            chat = ErnieBotChat(model_name='ERNIE-Bot')


    Deprecated Note:
    Please use `QianfanChatEndpoint` instead of this class.
    `QianfanChatEndpoint` is a more suitable choice for production.

    Always test your code after changing to `QianfanChatEndpoint`.

    Example of `QianfanChatEndpoint`:
        .. code-block:: python

            from langchain_community.chat_models import QianfanChatEndpoint
            qianfan_chat = QianfanChatEndpoint(model="ERNIE-Bot",
                endpoint="your_endpoint", qianfan_ak="your_ak", qianfan_sk="your_sk")

    Nernie_api_baseernie_client_idernie_client_secretaccess_tokenERNIE-Bot-turbo
model_namesystem<   request_timeoutF	streamingg?top_pgffffff?temperature   penalty_scorebefore)modevaluesr   c                 h    t        |ddd      |d<   t        |dd      |d<   t        |dd      |d<   |S )Nr%   ERNIE_API_BASEzhttps://aip.baidubce.comr&   ERNIE_CLIENT_IDr'   ERNIE_CLIENT_SECRETr   )clsr5   s     r   validate_environmentz!ErnieBotChat.validate_environmento   s]     $8$&68R$
  %9%
 !
 )=!!)
$%
 r    payloadc           
      2   | j                    d}dddddddd	d
d	}| j                  |v r| d|| j                      }nt        d| j                         t        j                  || j
                  ddid| j                  i|      }|j                         S )Nz)/rpc/2.0/ai_custom/v1/wenxinworkshop/chatz
eb-instantcompletionsernie_bot_8kcompletions_proai_apaas
bloomz_7b1
llama_2_7bllama_2_13bllama_2_70b)	r)   z	ERNIE-BotzERNIE-Bot-8KzERNIE-Bot-4zERNIE-Bot-turbo-AIz	BLOOMZ-7BzLlama-2-7b-chatzLlama-2-13b-chatzLlama-2-70b-chat/zGot unknown model_name Content-Typeapplication/jsonr(   )timeoutheadersparamsjson)r%   r*   r   requestspostr-   r(   rL   )selfr<   base_urlmodel_pathsurlresps         r   _chatzErnieBotChat._chat   s    ))**ST+&*,",%+ - -

 ??k)JaDOO <=>C6t6GHII}}(( 2 #D$5$56
 yy{r    c           
      P   | j                   5  t        j                  d       | j                   d}t	        j
                  |ddddd| j                  | j                  d      }t        |j                         j                  d	            | _        d d d        y # 1 sw Y   y xY w)
NzRefreshing access tokenz/oauth/2.0/token
   rH   )rG   Acceptclient_credentials)
grant_type	client_idclient_secret)rI   rJ   rK   r(   )_lockloggerdebugr%   rM   rN   r&   r'   strrL   getr(   )rO   rP   rS   s      r   _refresh_access_token_with_lockz,ErnieBotChat._refresh_access_token_with_lock   s    ZZ 	ELL23#2233CDH==$60
 #7!%!5!5%)%=%=D !$DIIKOON$C DD!	E 	E 	Es   BBB%messagesstoprun_managerkwargsc                 L   | j                   rt        d      | j                  s| j                          |D cg c]  }t	        |       c}| j
                  | j                  | j                  | j                  d|}t        j                  d|        | j                  |      }|j                  d      rY|j                  d      dk(  r7t        j                  d       | j                          | j                  |      }nt        d|       | j                  |      S c c}w )Nz)`streaming` option currently unsupported.)rb   r/   r0   r2   r+   zPayload for ernie api is 
error_codeo   z access_token expired, refresh itz#Error from ErnieChat api response: )r.   r   r(   ra   r   r/   r0   r2   r+   r]   r^   rT   r`   _create_chat_result)rO   rb   rc   rd   re   mr<   rS   s           r   	_generatezErnieBotChat._generate   s    >>HII  002>FG1!4GZZ++!//kk
 
 	0	:;zz'"88L!xx%,?@446zz'* #Ftf!MNN''--! Hs   D!responsec                     d|v rdt        |j                  di             i}ni }t        t        |j                  dd      i |            g}|j                  di       }|| j                  d}t        ||      S )	Nfunction_callresult )r   additional_kwargs)r   usage)token_usager*   )generations
llm_output)dictr`   r   r   r*   r   )rO   rl   rq   rt   rs   ru   s         r   ri   z ErnieBotChat._create_chat_result   s    h&hll?B&G!H! !#!$LL26&;):&;
 ll7B/%0P
kjIIr    c                      y)Nzernie-bot-chat )rO   s    r   	_llm_typezErnieBotChat._llm_type   s    r    )r   N)NN)*__name__
__module____qualname____doc__r%   r   r_   __annotations__r&   r'   r(   r*   r+   r-   intr.   boolr/   floatr0   r2   	threadingLockr\   r   classmethodr   r   r;   objectrv   rT   ra   r   r   r	   r   rk   r   ri   propertyry   rx   r    r   r$   r$   "   s   
$L %)NHSM(,%)OXc])%)-#-)"&L(3-&7 (J'< !FHSM @ &(OXc]'0 %Ix~%, E8E? #'K%'%&M8E?&INNE(#$ 3   $ V  :E, %):>	.{#. tCy!. 67	.
 . 
.>JGCH,= J* J&  3    r    r$   )!loggingr   typingr   r   r   r   r   rM   langchain_core._api.deprecationr   langchain_core.callbacksr	   *langchain_core.language_models.chat_modelsr
   langchain_core.messagesr   r   r   r   langchain_core.outputsr   r   langchain_core.utilsr   pydanticr   	getLoggerrz   r]   rv   r   r$   rx   r    r   <module>r      s      5 5  6 = D  > 5 $			8	$	k 	d 	 
E =  	 r    