U
    h.                     @   sZ  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZ d dlZd dlmZmZ d dlmZ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% d d	l&m'Z'm(Z(m)Z) e*e+Z,d
Z-dZ.ee/dddZ0e
e1ef edddZ2e
e1ef ee edddZ3eee1e1eedddZ4G dd deZ5dS )    N)asynccontextmanager)AnyAsyncIteratorDictIteratorListMappingOptionalType)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModelagenerate_from_streamgenerate_from_stream)		AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkHumanMessageHumanMessageChunkSystemMessage)ChatGenerationChatGenerationChunk
ChatResult)Field	SecretStr)convert_to_secret_strget_from_dict_or_envget_pydantic_field_namesz/https://api.lingyiwanwu.com/v1/chat/completionsz%https://api.01.ai/v1/chat/completions)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user	assistantzGot unknown type )
isinstancer   r#   r$   r   r   r   	TypeError)r!   Zmessage_dict r)   F/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/chat_models/yi.py_convert_message_to_dict)   s    



r+   )_dictr"   c                 C   sf   | d }|dkrt | d dS |dkr<t| ddp6ddS |dkrRt| d dS t| d |dS d S )	Nr#   r%   r$   r$   r&    systemr$   r#   )r   r   getr   )r,   r#   r)   r)   r*   _convert_dict_to_message9   s    r2   )r,   default_classr"   c                 C   sr   | d }|  dpd}|dks&|tkr0t|dS |dks@|tkrJt|dS |sV|tkrbt||dS |||dS d S )	Nr#   r$   r.   r%   r-   r&   r0   )r$   type)r1   r   r   r   )r,   r3   r#   r$   r)   r)   r*   _convert_delta_to_message_chunkE   s    

r5   )clientmethodurlkwargsr"   c              
   K  sD   ddl m} | j||f|4 I d H }||V  W 5 Q I d H R X d S )Nr   )EventSource)Z	httpx_sser:   stream)r6   r7   r8   r9   r:   responser)   r)   r*   aconnect_httpx_sseU   s    r=   c                       sB  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< e
d	d
Zeed< e
ddZeed< dZeed< e
dddZeed< dZeed< e
ddZe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 fdd Zeeeef dd!d"Zd9e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&d;ee  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eef d-d0d1Z.eeeef dd2d3Z/e0eef e"d4d5d6Z1eedd7d8Z2  Z3S )=ChatYizYi chat models API.)r"   c                 C   s   ddiS )N
yi_api_key
YI_API_KEYr)   selfr)   r)   r*   
lc_secretsb   s     zChatYi.lc_secretsc                 C   s   dS )NTr)   rA   r)   r)   r*   lc_serializableh   s    zChatYi.lc_serializable)defaultyi_api_baseapi_key)aliasr?   cnregionF	streaming<   timeout)rE   rH   request_timeoutzyi-largemodelffffff?temperaturetop_p)default_factorymodel_kwargsc                   @   s   e Zd ZdZdS )zChatYi.ConfigTN)__name__
__module____qualname__Zallow_population_by_field_namer)   r)   r)   r*   Configv   s   rX   N)r9   r"   c                    s   t t|ddgd|d< |dd krP|dd }|dkrHt|d< nt|d< t| j}|di }t|D ]2}||krt	d	| d
||krn|
|||< qn|| }|rt	d| d||d< t jf | d S )Nr?   rG   r@   rF   rJ   rI   globalrT   zFound z supplied twice.zParameters za should be specified explicitly. Instead they were passed in as part of `model_kwargs` parameter.)r   r   r1   lowerDEFAULT_API_BASE_GLOBALDEFAULT_API_BASE_CNr    	__class__list
ValueErrorpopintersectionkeyssuper__init__)rB   r9   rJ   Zall_required_field_namesextra
field_nameZinvalid_model_kwargsr]   r)   r*   rd   y   s4    


zChatYi.__init__c                 C   s   | j | j| j| jdS )N)rO   rQ   rR   r;   )rO   rQ   rR   rK   rA   r)   r)   r*   _default_params   s
    zChatYi._default_params)messagesstoprun_managerr9   r"   c                 K   s^   | j r&| jf |||d|}t|S | j|f|}|jdkrLtd| | }| |S )N)ri   rj   rk      Error from Yi api response: )rK   _streamr   _chatstatus_coder_   json_create_chat_result)rB   ri   rj   rk   r9   stream_iterresr<   r)   r)   r*   	_generate   s      
zChatYi._generatec                 k   s   | j |fddi|}|jdkr.td| t}| D ]}|dd}|dd}t|dkrn|d nd }|d kr|q:|d	kr qt	
|}	|	d
D ]>}
t|
d|}|j}t|d}|r|j|j|d |V  qq:d S )Nr;   Trl   rm   zutf-8z
zdata:    z[DONE]choicesdeltar!   chunk)ro   rp   r_   r   
iter_linesdecodestripsplitlenrq   loadsr1   r5   r]   r   on_llm_new_tokenr$   )rB   ri   rj   rk   r9   rt   Zdefault_chunk_classr{   partsr<   mZcg_chunkr)   r)   r*   rn      s.    

 
zChatYi._stream)ri   rj   rk   r;   r9   r"   c              
      s   |d k	r|n| j }|r<| j|f||d|}t|I d H S | jf |}| j|f|}	dd l}
|
j|| jd4 I d H $}|j| j	|	dI d H }|
  W 5 Q I d H R X | | S )N)rj   rk   r   headersrM   rq   )rK   _astreamr   _create_headers_parameters_create_payload_parametershttpxAsyncClientrN   postrF   raise_for_statusrr   rq   )rB   ri   rj   rk   r;   r9   Zshould_streamrs   r   payloadr   r6   r<   r)   r)   r*   
_agenerate   s,      zChatYi._ageneratec                 K  s.  | j f |}| j|fddi|}dd l}|j|| jd4 I d H }t|d| j|d4 I d H }	|	 2 z3 d H W }
t	|
j
}t|d dkrqh|d d }t|d t}|d	d }|d k	rd	|ind }t||d
}|r|j|j|dI d H  |V  |d k	rh q
qh6 W 5 Q I d H R X W 5 Q I d H R X d S )Nr;   Tr   r   POSTr   rw   rx   finish_reason)r!   generation_inforz   )r   r   r   r   rN   r=   rF   Z	aiter_sserq   r   datar   r5   r   r1   r   r   text)rB   ri   rj   rk   r9   r   r   r   r6   Zevent_sourceZsser{   choicer   r   r)   r)   r*   r      sL         
 zChatYi._astream)ri   r9   r"   c                 K   s<   | j |f|}| j}| jf |}tj|| j||| jd}|S )N)r8   rM   r   rq   r;   )r   rF   r   requestsr   rN   rK   )rB   ri   r9   r   r8   r   rt   r)   r)   r*   ro     s    zChatYi._chatc           	      K   sV   | j |}|dd}|dd}|d}|dd}|dd |D |||d	}|S )
NrQ   rP   rR   rO   r;   Fc                 S   s   g | ]}t |qS r)   )r+   ).0r   r)   r)   r*   
<listcomp>1  s     z5ChatYi._create_payload_parameters.<locals>.<listcomp>)rO   ri   rR   rQ   r;   )rh   r`   )	rB   ri   r9   
parametersrQ   rR   rO   r;   r   r)   r)   r*   r   &  s    

z!ChatYi._create_payload_parametersc                 K   sB   | j |}|di }d}| jr*| j }dd| d|}|S )Nr   r.   zapplication/jsonzBearer )zContent-TypeAuthorization)rh   r`   r?   Zget_secret_value)rB   r9   r   default_headersrG   r   r)   r)   r*   r   8  s    

z!ChatYi._create_headers_parameters)r<   r"   c                 C   sR   g }|d D ]$}t |d }t|d}|| q|d }|| jd}t||dS )Nrw   r!   ry   usage)token_usagerO   )generations
llm_output)r2   r   appendrO   r   )rB   r<   r   cr!   genr   r   r)   r)   r*   rr   F  s    
zChatYi._create_chat_resultc                 C   s   dS )Nzyi-chatr)   rA   r)   r)   r*   	_llm_typeQ  s    zChatYi._llm_type)NN)NN)NNN)NN)4rU   rV   rW   __doc__propertyr   strrC   boolrD   r   r\   rF   __annotations__r?   r   rJ   rK   rN   intrO   rQ   r	   floatrR   dictrT   r   rX   rd   rh   r   r   r   r   ru   r   r   rn   r   r   r   r   r   Responsero   r   r   r   rr   r   __classcell__r)   r)   rg   r*   r>   _   s   
!  
  
!   
  
) 
r>   )6rq   logging
contextlibr   typingr   r   r   r   r   r   r	   r
   r   Zlangchain_core.callbacksr   r   Z*langchain_core.language_models.chat_modelsr   r   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   Zlangchain_core.utilsr   r   r    	getLoggerrU   loggerr\   r[   r   r+   r   r2   r5   r=   r>   r)   r)   r)   r*   <module>   s6   (,

    	