o
    Zh.                     @   sn  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/dede0fddZ1de
e2ef defddZ3de
e2ef dee defddZ4edede2de2dedef
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   sx   t | tr| j| jd}|S t | trd| jd}|S t | tr(d| jd}|S t | tr5d| jd}|S td|  )N)rolecontentuser	assistantzGot unknown type )
isinstancer   r$   r%   r   r   r   	TypeError)r"   Zmessage_dict r*   Y/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/yi.py_convert_message_to_dict)   s   




r,   _dictc                 C   sb   | d }|dkrt | d dS |dkrt| ddpddS |dkr)t| d dS t| d |dS )	Nr$   r&   r%   r%   r'    systemr%   r$   )r   r   getr   )r-   r$   r*   r*   r+   _convert_dict_to_message9   s   r3   default_classc                 C   sn   | d }|  dp
d}|dks|tkrt|dS |dks |tkr%t|dS |s+|tkr1t||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kwargsc              	   K  sf   ddl m} | j||fi |4 I d H }||V  W d   I d H  d S 1 I d H s,w   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deeef fddZedef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deddf fdd Zedeeef fd!d"Z		d:d#e e! d$ee e  d%ee" dede#f
d&d'Z$		d:d#e e! d$ee e  d%ee" dede%e& f
d(d)Z'			d;d#e e! d$ee e  d%ee( d*ee dede#fd+d,Z)		d:d#e e! d$ee e  d%ee( dede*e& f
d-d.Z+d#e e! dede,j-fd/d0Z.d#e e! dedeeef fd1d2Z/dedeeef fd3d4Z0d5e1eef de#fd6d7Z2edefd8d9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      dS )NTr*   rB   r*   r*   r+   lc_serializableh      zChatYi.lc_serializable)defaultyi_api_baseapi_key)aliasr@   cnregionF	streaming<   timeout)rH   rK   request_timeoutzyi-largemodelffffff?temperaturetop_p)default_factorymodel_kwargsT)Zpopulate_by_namer:   Nc                    s   t t|ddgd|d< |dd u r(|dd }|dkr$t|d< nt|d< t| j}|di }t|D ]}||v rEt	d	| d
||vrP|
|||< q7|| }|rbt	d| d||d< t jdi | d S )Nr@   rJ   rA   rI   rM   rL   globalrW   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   r   r2   lowerDEFAULT_API_BASE_GLOBALDEFAULT_API_BASE_CNr   	__class__list
ValueErrorpopintersectionkeyssuper__init__)rC   r:   rM   Zall_required_field_namesextra
field_nameZinvalid_model_kwargsr\   r*   r+   rc   z   s6   


zChatYi.__init__c                 C   s   | j | j| j| jdS )N)rR   rT   rU   r<   )rR   rT   rU   rN   rB   r*   r*   r+   _default_params   s
   zChatYi._default_paramsmessagesstoprun_managerc                 K   sb   | j r| jd|||d|}t|S | j|fi |}|jdkr(td| | }| |S )N)rh   ri   rj      Error from Yi api response: r*   )rN   _streamr   _chatstatus_coder^   json_create_chat_result)rC   rh   ri   rj   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 ]R}|dd}|dd}t|dkr8|d nd }|d u r?q|d	krF d S t	
|}	|	d
D ]}
t|
d|}|j}t|d}|rl|j|j|d |V  qPqd S )Nr<   Trk   rl   zutf-8z
zdata:    z[DONE]choicesdeltar"   chunk)rn   ro   r^   r   
iter_linesdecodestripsplitlenrp   loadsr2   r6   r\   r   on_llm_new_tokenr%   )rC   rh   ri   rj   r:   rs   Zdefault_chunk_classrz   partsr=   mZcg_chunkr*   r*   r+   rm      s2   



zChatYi._streamr<   c              	      s   |d ur|n| j }|r| j|f||d|}t|I d H S | jdi |}| j|fi |}	dd l}
|
j|| jd4 I d H }|j| j	|	dI d H }|
  W d   I d H  n1 I d H s`w   Y  | | S )N)ri   rj   r   headersrP   rp   r*   )rN   _astreamr   _create_headers_parameters_create_payload_parametershttpxAsyncClientrQ   postrI   raise_for_statusrq   rp   )rC   rh   ri   rj   r<   r:   Zshould_streamrr   r   payloadr   r7   r=   r*   r*   r+   
_agenerate   s,   
(zChatYi._ageneratec              
   K  sh  | j d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 zN3 d H W }
t	|
j
}t|d dkrLq7|d d }t|d t}|d	d }|d urgd	|ind }t||d
}|r||j|j|dI d H  |V  |d ur nq76 W d   I d H  n1 I d H sw   Y  W d   I d H  d S 1 I d H sw   Y  d S )Nr<   Tr   r   POSTr   rv   rw   finish_reason)r"   generation_infory   r*   )r   r   r   r   rQ   r>   rI   Z	aiter_sserp   r   datar   r6   r   r2   r   r   text)rC   rh   ri   rj   r:   r   r   r   r7   Zevent_sourceZsserz   choicer   r   r*   r*   r+   r      sJ   
*.zChatYi._astreamc                 K   sD   | j |fi |}| j}| jdi |}tj|| j||| jd}|S )N)r9   rP   r   rp   r<   r*   )r   rI   r   requestsr   rQ   rN   )rC   rh   r:   r   r9   r   rs   r*   r*   r+   rn     s   zChatYi._chatc           	      K   sZ   i | j |}|dd}|dd}|d}|dd}|dd |D |||d	}|S )
NrT   rS   rU   rR   r<   Fc                 S   s   g | ]}t |qS r*   )r,   ).0r   r*   r*   r+   
<listcomp>2  s    z5ChatYi._create_payload_parameters.<locals>.<listcomp>)rR   rh   rU   rT   r<   )rg   r_   )	rC   rh   r:   
parametersrT   rU   rR   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)rg   r_   r@   Zget_secret_value)rC   r:   r   default_headersrJ   r   r*   r*   r+   r   9  s   
z!ChatYi._create_headers_parametersr=   c                 C   sR   g }|d D ]}t |d }t|d}|| q|d }|| jd}t||dS )Nrv   r"   rx   usage)token_usagerR   )generations
llm_output)r3   r   appendrR   r   )rC   r=   r   cr"   genr   r   r*   r*   r+   rq   G  s   
zChatYi._create_chat_resultc                 C   rE   )Nzyi-chatr*   rB   r*   r*   r+   	_llm_typeR  rG   zChatYi._llm_type)NN)NNN)5__name__
__module____qualname____doc__propertyr   strrD   boolrF   r    r[   rI   __annotations__r@   r!   rM   rN   rQ   intrR   rT   r	   floatrU   dictrW   r   r   Zmodel_configrc   rg   r   r   r   r   rt   r   r   rm   r   r   r   r   r   Responsern   r   r   r   rq   r   __classcell__r*   r*   rf   r+   r?   _   s   
 !



!



)

r?   )7rp   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   loggerr[   rZ   r   r,   r   r3   r6   r>   r?   r*   r*   r*   r+   <module>   sH    (,


	