U
    h9&                     @   s8  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
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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#m$Z$m%Z% e&e'Z(ee)d	d
dZ*ee+ef edddZ,ee+ef e	e e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Type)CallbackManagerForLLMRun)BaseChatModelgenerate_from_stream)		AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkHumanMessageHumanMessageChunkSystemMessage)ChatGenerationChatGenerationChunk
ChatResult)Field	SecretStrroot_validator)convert_to_secret_strget_from_dict_or_envget_pydantic_field_namespre_init)messagereturnc                 C   st   t | tr| j| jd}nVt | tr2d| jd}n>t | trJd| jd}n&t | trbd| jd}ntd|  |S )N)RoleContentsystemuser	assistantzGot unknown type )
isinstancer   rolecontentr   r   r   	TypeError)r   Zmessage_dict r*   K/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/chat_models/hunyuan.py_convert_message_to_dict!   s    



r,   )_dictr    c                 C   sn   | d }|dkr&t | ddp ddS |dkr<t| d dS |dkrZt| ddpTddS t| d |dS d S )	Nr!   r#   r"    r(   r$   r%   r(   r'   )r   getr   r   r   )r-   r'   r*   r*   r+   _convert_dict_to_message1   s    r2   )r-   default_classr    c                 C   sr   |  d}|  dpd}|dks(|tkr2t|dS |dksB|tkrLt|dS |sX|tkrdt||dS ||dS d S )Nr!   r"   r.   r$   r/   r%   r0   )r1   r   r   r   )r-   r3   r'   r(   r*   r*   r+   _convert_delta_to_message_chunk=   s    


r4   )responser    c                 C   sX   g }| d D ].}t |d }| dd|_|t|d q| d }d|i}t||dS )	NChoicesMessageIdr.   r   Usagetoken_usage)generations
llm_output)r2   r1   idappendr   r   )r5   r<   choicer   r;   r=   r*   r*   r+   _create_chat_resultM   s    rA   c                   @   s  e Zd ZU dZeeeef dddZeedddZ	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d< dZeed< dZeed< dZeed< dZeed< dZeed< eedZeeef ed< G dd dZeddeeef eeef dddZ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d(d)d*Z+eedd+d,Z,dS )/ChatHunyuanzTencent Hunyuan chat models API by Tencent.

    For more information, see https://cloud.tencent.com/document/product/1729
    )r    c                 C   s   ddddS )NHUNYUAN_APP_IDHUNYUAN_SECRET_IDHUNYUAN_SECRET_KEY)hunyuan_app_idhunyuan_secret_idhunyuan_secret_keyr*   selfr*   r*   r+   
lc_secrets_   s    zChatHunyuan.lc_secretsc                 C   s   dS )NTr*   rI   r*   r*   r+   lc_serializableg   s    zChatHunyuan.lc_serializableNrF   rG   rH   F	streaming<   request_timeoutg      ?temperaturetop_pzhunyuan-litemodelstream_moderationTenable_enhancement)default_factorymodel_kwargsc                   @   s   e Zd ZdZdS )zChatHunyuan.ConfigTN)__name__
__module____qualname__Zallow_population_by_field_namer*   r*   r*   r+   Config   s   rZ   )pre)valuesr    c              
   C   s   t | }|di }t|D ]P}||kr8td| d||krtd| d| d| d ||||< q|| }|rtd| d	||d< |S )
z>Build extra kwargs from additional params that were passed in.rV   zFound z supplied twice.z	WARNING! z/ is not default parameter.
                    zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.zParameters za should be specified explicitly. Instead they were passed in as part of `model_kwargs` parameter.)	r   r1   list
ValueErrorloggerwarningpopintersectionkeys)clsr\   Zall_required_field_namesextra
field_nameZinvalid_model_kwargsr*   r*   r+   build_extra   s"    
zChatHunyuan.build_extrac                 C   s8   t |dd|d< t |dd|d< tt |dd|d< |S )NrF   rC   rG   rD   rH   rE   )r   r   )rd   r\   r*   r*   r+   validate_environment   s$    z ChatHunyuan.validate_environmentc                 C   s(   | j | j| j| j| j| jd}|| jS )z3Get the default parameters for calling Hunyuan API.)ZTemperatureZTopPZModelZStreamZStreamModerationZEnableEnhancement)rP   rQ   rR   rM   rS   rT   rV   )rJ   Znormal_paramsr*   r*   r+   _default_params   s    zChatHunyuan._default_params)messagesstoprun_managerkwargsr    c                 K   sF   | j r&| jf |||d|}t|S | j|f|}tt| S )N)rj   rk   rl   )rM   _streamr   _chatrA   jsonloadsZto_json_string)rJ   rj   rk   rl   rm   Zstream_iterresr*   r*   r+   	_generate   s      zChatHunyuan._generatec                 k   s   | j |f|}t}|D ]}|dd}t|dkr4qt|}d|krTtd| |d D ]J}	t|	d |}|dd|_|j	}t
|d	}
|r|j|j|
d
 |
V  q\qd S )Ndatar.   r   errorz!Error from Hunyuan api response: r6   Deltar8   r9   )chunk)ro   r   r1   lenrp   rq   r^   r4   r>   	__class__r   Zon_llm_new_tokenr(   )rJ   rj   rk   rl   rm   rr   Zdefault_chunk_classrw   r5   r@   Zcg_chunkr*   r*   r+   rn      s(    
 
zChatHunyuan._stream)rj   rm   r    c                 K   s   | j d krtdz ddlm} ddlm}m} W n tk
rN   tdY nX | j|}|	| j
t| j  }||d}| }	ddd	 |D i|}
|	t|
 ||	}|S )
NzHunyuan secret key is not set.r   )
credential)hunyuan_clientmodelszkCould not import tencentcloud python package. Please install it with `pip install tencentcloud-sdk-python`.r.   ZMessagesc                 S   s   g | ]}t |qS r*   )r,   ).0mr*   r*   r+   
<listcomp>  s     z%ChatHunyuan._chat.<locals>.<listcomp>)rH   r^   Ztencentcloud.commonrz   Ztencentcloud.hunyuan.v20230901r{   r|   ImportErrorri   Z
CredentialrG   strZget_secret_valueZHunyuanClientZChatCompletionsRequestZfrom_json_stringrp   dumpsZChatCompletions)rJ   rj   rm   rz   r{   r|   
parameterscredclientreqparamsrespr*   r*   r+   ro      s0    


  
zChatHunyuan._chatc                 C   s   dS )Nzhunyuan-chatr*   rI   r*   r*   r+   	_llm_type  s    zChatHunyuan._llm_type)NN)NN)-rW   rX   rY   __doc__propertyr   r   rK   boolrL   rF   r   int__annotations__rG   rH   r   rM   rO   rP   floatrQ   rR   rS   rT   r   dictrV   r   rZ   r   rg   r   rh   ri   r   r   r	   r   rs   r   r   rn   ro   r   r*   r*   r*   r+   rB   Y   sX   
"  
  
rB   )0rp   loggingtypingr   r   r   r   r   r   r   Zlangchain_core.callbacksr	   Z*langchain_core.language_models.chat_modelsr
   r   Zlangchain_core.messagesr   r   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   r   r   	getLoggerrW   r_   r   r,   r   r2   r4   rA   rB   r*   r*   r*   r+   <module>   s"   $,

 