o
    Zh'!                     @   s,  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	 d dl
Z
d dlmZ d dlmZmZ d dl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 d dl m!Z!m"Z"m#Z#m$Z$ e%e&Z'd	Z(d
ede)fddZ*dee+ef de	edf fddZ,dee+ef defddZ-G dd deZ.dS )    N)AnyDictIteratorListMappingOptionalUnion)CallbackManagerForLLMRun)BaseChatModelgenerate_from_stream)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkHumanMessageHumanMessageChunk)ChatGenerationChatGenerationChunk
ChatResult)convert_to_secret_strget_from_dict_or_env)
ConfigDictField	SecretStrmodel_validatorzhttps://api.coze.commessagereturnc                 C   s.   t | trd| jdd}|S d| jdd}|S )Nusertext)rolecontentcontent_type	assistant)
isinstancer   r"   )r   Zmessage_dict r&   [/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/coze.py_convert_message_to_dict!   s   
r(   _dictc                 C   s`   | d }|dkr
d S | d }|dkrt | d dS |dkr(t| ddp%ddS t| d |d	S )
Ntypeanswerr!   r   r"   r"   r$    r"   r!   )r   r   getr   )r)   msg_typer!   r&   r&   r'   _convert_dict_to_message2   s   r1   c                 C   sH   |  d}|  dpd}|dkrt|dS |dkrt|dS t||dS )Nr!   r"   r-   r   r,   r$   r.   )r/   r   r   r   )r)   r!   r"   r&   r&   r'   _convert_delta_to_message_chunk?   s   


r2   c                   @   s  e Zd ZU dZedeeef fddZedefddZ	e
edZeed< 	 d	Zee ed
< 	 e
dddZeed< 	 e
ddZeed< 	 e
ddZeed< 	 e
ddZeed< 	 dZeed< 	 eddZeddededefddZedeeef fddZ				d,dee deee  d ee  d!ede!f
d"d#Z"				d,dee deee  d ee  d!ede#e$ f
d$d%Z%dee d!ede&j'fd&d'Z(dee)eef  de!fd(d)Z*edefd*d+Z+d	S )-ChatCozezlChatCoze chat models API by coze.com

    For more information, see https://www.coze.com/open/docs/chat
    r   c                 C   s   ddiS )Ncoze_api_keyCOZE_API_KEYr&   selfr&   r&   r'   
lc_secretsQ   s   zChatCoze.lc_secretsc                 C      dS )NTr&   r6   r&   r&   r'   lc_serializableW      zChatCoze.lc_serializable)defaultcoze_api_baseNr4   <   timeout)r<   aliasrequest_timeoutr-   bot_idconversation_idr   F	streamingT)Zpopulate_by_namebefore)modevaluesc                 C   s*   t |ddt|d< tt |dd|d< |S )Nr=   ZCOZE_API_BASEr4   r5   )r   DEFAULT_API_BASEr   )clsrG   r&   r&   r'   validate_environmentv   s   zChatCoze.validate_environmentc                 C   s   | j | j| j| jdS )z0Get the default parameters for calling Coze API.rB   rC   r   rD   rK   r6   r&   r&   r'   _default_params   s
   zChatCoze._default_paramsmessagesstoprun_managerkwargsc              	   K   s   | j r| jd
|||d|}t|S | j|fi |}| }|d dkr;td|d  d|d  d|jd | |d	pCg S )N)rM   rN   rO   coder   Error from Coze api response: z: msg	, logid: 
X-Tt-LogidrM   r&   )	rD   _streamr   _chatjson
ValueErrorheadersr/   _create_chat_result)r7   rM   rN   rO   rP   Zstream_iterrresr&   r&   r'   	_generate   s    
zChatCoze._generatec           
      k   s    | j |fi |}| D ]V}|dd}|dd}t|dkr(|d nd }|d u r/qt|}|d dkr= d S |d dksK|d d d	krLqt|d }t	|d
}	|ra|j
|j|	d |	V  qd S )Nzutf-8z
zdata:   eventdoner   r*   r+   r   )chunk)rW   
iter_linesdecodestripsplitlenrX   loadsr2   r   Zon_llm_new_tokenr"   )
r7   rM   rN   rO   rP   r]   rc   partsresponseZcg_chunkr&   r&   r'   rV      s(   

zChatCoze._streamc                 K   s   i | j |}d}g }|D ]}t|tr|j }|t| q|d}|d}|d}	|d}
|||	||
d}|rB||d< | jd }d}| jrQ| j	 }t
j|| jd	d
| d||
d}|jdkrw|jd}td| d| |S )Nr-   rC   rB   r   rD   )rC   rB   r   querystreamchat_historyz/open_api/v2/chatzapplication/jsonzBearer )zContent-TypeAuthorization)urlr?   rZ   rX   rm      rU   rR   rT   )rL   r%   r   r"   appendr(   popr=   r4   Zget_secret_valuerequestspostrA   status_coderZ   r/   rY   )r7   rM   rP   
parametersrl   rn   rS   rC   rB   r   rD   payloadrp   Zapi_keyr]   Zlogidr&   r&   r'   rW      sH   








zChatCoze._chatc                 C   s@   g }|D ]}t |}|r|t|d qddd}t||dS )Nrb   r-   )Ztoken_usagemodel)generations
llm_output)r1   rr   r   r   )r7   rM   rz   crS   r{   r&   r&   r'   r[      s   
zChatCoze._create_chat_resultc                 C   r9   )Nz	coze-chatr&   r6   r&   r&   r'   	_llm_type   r;   zChatCoze._llm_type)NN),__name__
__module____qualname____doc__propertyr   strr8   boolr:   r   rH   r=   __annotations__r4   r   r   rA   intrB   rC   r   rD   r   Zmodel_configr   classmethodr   rJ   rL   r   r   r	   r   r^   r   r   rV   rt   ResponserW   r   r[   r}   r&   r&   r&   r'   r3   K   st   
 



-
r3   )/rX   loggingtypingr   r   r   r   r   r   r   rt   Zlangchain_core.callbacksr	   Z*langchain_core.language_models.chat_modelsr
   r   Zlangchain_core.messagesr   r   r   r   r   r   r   r   Zlangchain_core.outputsr   r   r   Zlangchain_core.utilsr   r   Zpydanticr   r   r   r   	getLoggerr~   loggerrH   dictr(   r   r1   r2   r3   r&   r&   r&   r'   <module>   s     $(

"