a
    bg'!                     @   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(ee)d
ddZ*ee+ef e	edf dddZ,ee+ef ed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}nd| jdd}|S )Nusertext)rolecontentcontent_type	assistant)
isinstancer   r"   )r   Zmessage_dict r&   r/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/coze.py_convert_message_to_dict!   s    
r(   )_dictr   c                 C   sd   | d }|dkrd S | d }|dkr2t | d dS |dkrPt| ddpJddS t| d |d	S 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   sL   |  d}|  dpd}|dkr*t|dS |dkr<t|dS t||dS 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eeef dddZeed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eedddZeeeef dddZd+ee eee  ee  ee!ddd Z"d,ee eee  ee  ee#e$ dd!d"Z%ee ee&j'd#d$d%Z(ee)eef  e!d&d'd(Z*eed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   s   dS )NTr&   r6   r&   r&   r'   lc_serializableW   s    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)valuesr   c                 C   s*   t |ddt|d< tt |dd|d< |S )Nr;   ZCOZE_API_BASEr4   r5   )r   DEFAULT_API_BASEr   )clsrE   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.r@   rA   r   rB   rI   r6   r&   r&   r'   _default_params   s
    zChatCoze._default_params)messagesstoprun_managerkwargsr   c              	   K   s   | j r&| jf |||d|}t|S | j|fi |}| }|d dkrvtd|d  d|d  d|jd | |d	pg S )
N)rK   rL   rM   coder   Error from Coze api response: z: msg	, logid: 
X-Tt-LogidrK   )	rB   _streamr   _chatjson
ValueErrorheadersr/   _create_chat_result)r7   rK   rL   rM   rN   Zstream_iterrresr&   r&   r'   	_generate   s     
zChatCoze._generatec           
      k   s   | j |fi |}| D ]}|dd}|dd}t|dkrN|d nd }|d u r\qt|}|d dkrx qn|d dks|d d d	krqt|d }t	|d
}	|r|j
|j|	d |	V  qd S )Nzutf-8z
zdata:   eventdoner   r*   r+   r   )chunk)rU   
iter_linesdecodestripsplitlenrV   loadsr2   r   Zon_llm_new_tokenr"   )
r7   rK   rL   rM   rN   r[   ra   partsresponseZcg_chunkr&   r&   r'   rT      s(    


zChatCoze._stream)rK   rN   r   c                 K   s   i | j |}d}g }|D ]$}t|tr0|j }|t| q|d}|d}|d}	|d}
|||	||
d}|r||d< | jd }d}| jr| j	 }t
j|| jd	d
| d||
d}|jdkr|jd}td| d| |S )Nr-   rA   r@   r   rB   )rA   r@   r   querystreamchat_historyz/open_api/v2/chatzapplication/jsonzBearer )zContent-TypeAuthorization)urlr=   rX   rV   rk      rS   rP   rR   )rJ   r%   r   r"   appendr(   popr;   r4   Zget_secret_valuerequestspostr?   status_coderX   r/   rW   )r7   rK   rN   
parametersrj   rl   rQ   rA   r@   r   rB   payloadrn   Zapi_keyr[   Zlogidr&   r&   r'   rU      sH    








zChatCoze._chat)rK   r   c                 C   s@   g }|D ] }t |}|r|t|d qddd}t||dS )Nr`   r-   )Ztoken_usagemodel)generations
llm_output)r1   rp   r   r   )r7   rK   rx   crQ   ry   r&   r&   r'   rY      s    
zChatCoze._create_chat_resultc                 C   s   dS )Nz	coze-chatr&   r6   r&   r&   r'   	_llm_type   s    zChatCoze._llm_type)NN)NN),__name__
__module____qualname____doc__propertyr   strr8   boolr9   r   rF   r;   __annotations__r4   r   r   r?   intr@   rA   r   rB   r   Zmodel_configr   classmethodr   rH   rJ   r   r   r	   r   r\   r   r   rT   rr   ResponserU   r   rY   r{   r&   r&   r&   r'   r3   K   sT   
	  
  
-
r3   )/rV   loggingtypingr   r   r   r   r   r   r   rr   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|   loggerrF   dictr(   r   r1   r2   r3   r&   r&   r&   r'   <module>   s   $(

 