U
    h!                     @   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m Z  d dl!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)Field	SecretStrroot_validator)convert_to_secret_strget_from_dict_or_envz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%   H/tmp/pip-unpacked-wheel-9gdii04g/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    r0   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    


r1   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< G dd dZedd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%   r5   r%   r%   r&   lc_serializableW   s    zChatCoze.lc_serializable)defaultcoze_api_baseNr3   <   timeout)r9   aliasrequest_timeoutr,   bot_idconversation_idr   F	streamingc                   @   s   e Zd ZdZdS )zChatCoze.ConfigTN)__name__
__module____qualname__Zallow_population_by_field_namer%   r%   r%   r&   Configr   s   rE   T)pre)valuesr   c                 C   s*   t |ddt|d< tt |dd|d< |S )Nr:   ZCOZE_API_BASEr3   r4   )r   DEFAULT_API_BASEr   )clsrG   r%   r%   r&   validate_environmentu   s    zChatCoze.validate_environmentc                 C   s   | j | j| j| jdS )z0Get the default parameters for calling Coze API.r?   r@   r   rA   rK   r5   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|}| }|d dkrrtd|d  d|d  d|jd | |d	pg S )
N)rM   rN   rO   coder   Error from Coze api response: z: msg	, logid: 
X-Tt-LogidrM   )	rA   _streamr   _chatjson
ValueErrorheadersr.   _create_chat_result)r6   rM   rN   rO   rP   Zstream_iterrresr%   r%   r&   	_generate   s       $zChatCoze._generatec           
      k   s   | j |f|}| D ]}|dd}|dd}t|dkrJ|d nd }|d krXqt|}|d dkrt 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)rW   
iter_linesdecodestripsplitlenrX   loadsr1   r   Zon_llm_new_tokenr!   )
r6   rM   rN   rO   rP   r]   rc   partsresponseZcg_chunkr%   r%   r&   rV      s(    


zChatCoze._stream)rM   rP   r   c                 K   s   | j |}d}g }|D ]$}t|tr,|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,   r@   r?   r   rA   )r@   r?   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:   r3   Zget_secret_valuerequestspostr>   status_coderZ   r.   rY   )r6   rM   rP   
parametersrl   rn   rS   r@   r?   r   rA   payloadrp   Zapi_keyr]   Zlogidr%   r%   r&   rW      sH    









zChatCoze._chat)rM   r   c                 C   s@   g }|D ] }t |}|r|t|d qddd}t||dS )Nrb   r,   )Ztoken_usagemodel)generations
llm_output)r0   rr   r   r   )r6   rM   rz   crS   r{   r%   r%   r&   r[      s    
zChatCoze._create_chat_resultc                 C   s   dS )Nz	coze-chatr%   r5   r%   r%   r&   	_llm_type   s    zChatCoze._llm_type)NN)NN)*rB   rC   rD   __doc__propertyr   strr7   boolr8   r   rH   r:   __annotations__r3   r   r   r>   intr?   r@   r   rA   rE   r   rJ   r   rL   r   r   r	   r   r^   r   r   rV   rt   ResponserW   r   r[   r}   r%   r%   r%   r&   r2   K   sN   
	  
  
-
r2   ).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.pydantic_v1r   r   r   Zlangchain_core.utilsr   r   	getLoggerrB   loggerrH   dictr'   r   r0   r1   r2   r%   r%   r%   r&   <module>   s   $(

 