a
    bg.                     @   s^  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%m&Z& d d	l'm(Z(m)Z)m*Z* e+e,Z-d
Z.dZ/ee0dddZ1e
e2ef edddZ3e
e2ef ee edddZ4eee2e2eedddZ5G dd deZ6d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)convert_to_secret_strget_from_dict_or_envget_pydantic_field_names)
ConfigDictField	SecretStrz/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*   p/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/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    r3   )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'   r1   )r%   type)r2   r   r   r   )r-   r4   r$   r%   r*   r*   r+   _convert_delta_to_message_chunkE   s    

r6   )clientmethodurlkwargsr#   c              	   K  sb   ddl m} | j||fi |4 I d H  }||V  W d   I d H  q^1 I d H sT0    Y  d S )Nr   )EventSource)Z	httpx_sser;   stream)r7   r8   r9   r:   r;   responser*   r*   r+   aconnect_httpx_sseU   s    r>   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< 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< e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Z0e1eef e#d4d5d6Z2eedd7d8Z3  Z4S )=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*   rB   r*   r*   r+   lc_serializableh   s    zChatYi.lc_serializable)defaultyi_api_baseapi_key)aliasr@   cnregionF	streaming<   timeout)rF   rI   request_timeoutzyi-largemodelffffff?temperaturetop_p)default_factorymodel_kwargsT)Zpopulate_by_nameN)r:   r#   c                    s   t t|ddgd|d< |dd u rP|dd }|dkrHt|d< nt|d< t| j}|di }t|D ]2}||v rt	d	| d
||vrn|
|||< qn|| }|rt	d| d||d< t jf i | d S )Nr@   rH   rA   rG   rK   rJ   globalrU   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   r2   lowerDEFAULT_API_BASE_GLOBALDEFAULT_API_BASE_CNr   	__class__list
ValueErrorpopintersectionkeyssuper__init__)rC   r:   rK   Zall_required_field_namesextra
field_nameZinvalid_model_kwargsrZ   r*   r+   ra   z   s4    


zChatYi.__init__c                 C   s   | j | j| j| jdS )N)rP   rR   rS   r<   )rP   rR   rS   rL   rB   r*   r*   r+   _default_params   s
    zChatYi._default_params)messagesstoprun_managerr:   r#   c                 K   sb   | j r&| jf |||d|}t|S | j|fi |}|jdkrPtd| | }| |S )N)rf   rg   rh      Error from Yi api response: )rL   _streamr   _chatstatus_coder\   json_create_chat_result)rC   rf   rg   rh   r:   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 u r|q:|d	kr qt	
|}	|	d
D ]>}
t|
d|}|j}t|d}|r|j|j|d |V  qq:d S )Nr<   Tri   rj   zutf-8z
zdata:    z[DONE]choicesdeltar"   chunk)rl   rm   r\   r   
iter_linesdecodestripsplitlenrn   loadsr2   r6   rZ   r   on_llm_new_tokenr%   )rC   rf   rg   rh   r:   rq   Zdefault_chunk_classrx   partsr=   mZcg_chunkr*   r*   r+   rk      s,    



zChatYi._stream)rf   rg   rh   r<   r:   r#   c              	      s   |d ur|n| j }|r<| j|f||d|}t|I d H S | jf i |}| j|fi |}	dd l}
|
j|| jd4 I d H 4}|j| j	|	dI d H }|
  W d   I d H  q1 I d H s0    Y  | | S )N)rg   rh   r   headersrN   rn   )rL   _astreamr   _create_headers_parameters_create_payload_parametershttpxAsyncClientrO   postrG   raise_for_statusro   rn   )rC   rf   rg   rh   r<   r:   Zshould_streamrp   r   payloadr   r7   r=   r*   r*   r+   
_agenerate   s(    2zChatYi._ageneratec              
   K  sp  | j f i |}| 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rqn|d d }t|d t}|d	d }|d urd	|ind }t||d
}|r|j|j|dI d H  |V  |d urn qqn6 W d   I d H  q>1 I d H s40    Y  W d   I d H  ql1 I d H sb0    Y  d S )Nr<   Tr   r   POSTr   rt   ru   finish_reason)r"   generation_inforw   )r   r   r   r   rO   r>   rG   Z	aiter_ssern   r~   datar}   r6   r   r2   r   r   text)rC   rf   rg   rh   r:   r   r   r   r7   Zevent_sourceZsserx   choicer   r   r*   r*   r+   r      s@    

zChatYi._astream)rf   r:   r#   c                 K   sD   | j |fi |}| j}| jf i |}tj|| j||| jd}|S )N)r9   rN   r   rn   r<   )r   rG   r   requestsr   rO   rL   )rC   rf   r:   r   r9   r   rq   r*   r*   r+   rl     s    zChatYi._chatc           	      K   sZ   i | j |}|dd}|dd}|d}|dd}|dd |D |||d	}|S )
NrR   rQ   rS   rP   r<   Fc                 S   s   g | ]}t |qS r*   )r,   ).0r   r*   r*   r+   
<listcomp>2      z5ChatYi._create_payload_parameters.<locals>.<listcomp>)rP   rf   rS   rR   r<   )re   r]   )	rC   rf   r:   
parametersrR   rS   rP   r<   r   r*   r*   r+   r   '  s    
z!ChatYi._create_payload_parametersc                 K   sF   i | j |}|di }d}| jr.| j }dd| d|}|S )Nr   r/   zapplication/jsonzBearer )zContent-TypeAuthorization)re   r]   r@   Zget_secret_value)rC   r:   r   default_headersrH   r   r*   r*   r+   r   9  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 )Nrt   r"   rv   usage)token_usagerP   )generations
llm_output)r3   r   appendrP   r   )rC   r=   r   cr"   genr   r   r*   r*   r+   ro   G  s    
zChatYi._create_chat_resultc                 C   s   dS )Nzyi-chatr*   rB   r*   r*   r+   	_llm_typeR  s    zChatYi._llm_type)NN)NN)NNN)NN)5__name__
__module____qualname____doc__propertyr   strrD   boolrE   r    rY   rG   __annotations__r@   r!   rK   rL   rO   intrP   rR   r	   floatrS   dictrU   r   r   Zmodel_configra   re   r   r   r   r   rr   r   r   rk   r   r   r   r   r   Responserl   r   r   r   ro   r   __classcell__r*   r*   rd   r+   r?   _   s   
!  
  
!   
  
)
r?   )7rn   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.utilsr   r   r   Zpydanticr   r    r!   	getLoggerr   loggerrY   rX   r   r,   r   r3   r6   r>   r?   r*   r*   r*   r+   <module>   s.   (,
	