a
    bgC                     @  sr  d Z ddlmZ ddlZddlmZmZ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 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 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/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5 e6e7Z8G dd deZ9dddddZ:ddddddZ;ddddddZ<dddddZ=dd d!d"d#Z>dS )$zChatYuan2 wrapper.    )annotationsN)AnyAsyncIteratorCallableDictIteratorListMappingOptionalTupleTypeUnion)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModelagenerate_from_streamgenerate_from_stream)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkFunctionMessageHumanMessageHumanMessageChunkSystemMessageSystemMessageChunk)ChatGenerationChatGenerationChunk
ChatResult)get_from_dict_or_envget_pydantic_field_namespre_init)	BaseModel
ConfigDictFieldmodel_validator)before_sleep_logretryretry_if_exception_typestop_after_attemptwait_exponentialc                   @  s6  e Zd ZU dZdZded< edddZded< edd	d
Zded< ee	dZ
ded< eddd
Zded< eddd
Zded< eddd
Zded< dZded< dZded< dZd ed!< d"Zd#ed$< d%Zd&ed'< ed(gd)d
Zd*ed+< d,Zd ed-< d.Zd&ed/< edd0Zed1d2d3d4Zedd2d5d6Zed7d8eddd9d:d;Zed<d<d9d=d>Zedd2d?d@Z dddAdBdCZ!dDdEdFdGdHZ"dedId*dJddKdLdMdNZ#dfdId*dJddOdLdPdQZ$dId*dRdSdTdUZ%dVdOdWdXdYZ&dgdId*dZdd[dLd\d]Z'dhdId*dZddOdLd^d_Z(ed`d2dadbZ)edd2dcddZ*dS )i	ChatYuan2a;  `Yuan2.0` Chat models API.

    To use, you should have the ``openai-python`` package installed, if package
    not installed, using ```pip install openai``` to install it. The
    environment variable ``YUAN2_API_KEY`` set to your API key, if not set,
    everyone can access apis.

    Any parameters that are valid to be passed to the openai.create call can be passed
    in, even if not explicitly saved on this class.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatYuan2

            chat = ChatYuan2()
    Nr   clientT)defaultexcludeasync_clientZyuan2model)r/   aliasstr
model_name)default_factoryzDict[str, Any]model_kwargsZEMPTYapi_keyzOptional[str]yuan2_api_keyzhttp://127.0.0.1:8000/v1base_urlyuan2_api_basetimeoutz+Optional[Union[float, Tuple[float, float]]]request_timeout   intmax_retriesFbool	streamingzOptional[int]
max_tokensg      ?floattemperatureg?zOptional[float]top_pz<eod>Zstop_sequenceszOptional[List[str]]stop@   repeat_last_ngzG?repeat_penalty)Zpopulate_by_namezDict[str, str])returnc                 C  s   ddiS )Nr9   YUAN2_API_KEY selfrM   rM   s/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/yuan2.py
lc_secrets   s    zChatYuan2.lc_secretsc                 C  s(   i }| j r| j |d< | jr$| j|d< |S )Nr;   r9   )r;   r9   )rO   
attributesrM   rM   rP   lc_attributes   s    

zChatYuan2.lc_attributesbefore)mode)valuesrK   c              
   C  s   t | }|di }t|D ]P}||v r8td| d||vrtd| d| d| d ||||< q|| }|rtd| d	||d< |S )
z>Build extra kwargs from additional params that were passed in.r7   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"   getlist
ValueErrorloggerwarningpopintersectionkeys)clsrV   Zall_required_field_namesextra
field_nameZinvalid_model_kwargsrM   rM   rP   build_extra   s*    
zChatYuan2.build_extrar   c                 C  s   t |dd|d< zddl}W n ty6   tdY n0 |d |d |d |d d	}|d
sx|jf i |jj|d
< |ds|jf i |jj|d< |S )z?Validate that api key and python package exists in environment.r9   rL   r   NzTCould not import openai python package. Please install it with `pip install openai`.r;   r=   r@   )r8   r:   r<   r@   r.   r1   )r!   openaiImportErrorrW   ZOpenAIZchatZcompletionsZAsyncOpenAI)r_   rV   rc   Zclient_paramsrM   rM   rP   validate_environment   s*    


zChatYuan2.validate_environmentc                 C  sH   | j | j| j| jd| j}| jdur0| j|d< | jdurD| j|d< |S )z1Get the default parameters for calling yuan2 API.)r2   streamrE   rF   NrC   r=   )r5   rB   rE   rF   r7   rC   r=   )rO   paramsrM   rM   rP   _default_params   s    



zChatYuan2._default_paramskwargsrK   c                   s.   t  }|ddd fdd}|f i |S )z*Use tenacity to retry the completion call.r   ri   c                    s    j jf i | S N)r.   createrj   rN   rM   rP   _completion_with_retry   s    z?ChatYuan2.completion_with_retry.<locals>._completion_with_retry_create_retry_decorator)rO   rj   retry_decoratorrn   rM   rN   rP   completion_with_retry   s    zChatYuan2.completion_with_retryzList[Optional[dict]]dict)llm_outputsrK   c                 C  sz   i }t dt| d|  |D ]J}|d u r0q"|d }| D ]*\}}||v rb||  |7  < q@|||< q@q"|| jdS )Nztype(llm_outputs): z; llm_outputs: token_usageru   r5   )rZ   debugtypeitemsr5   )rO   rt   Zoverall_token_usageoutputru   kvrM   rM   rP   _combine_llm_outputs   s    zChatYuan2._combine_llm_outputszList[BaseMessage]z"Optional[CallbackManagerForLLMRun]zIterator[ChatGenerationChunk])messagesrG   run_managerrj   rK   c                 k  s   |  ||\}}i ||ddi}t}| jf d|i|D ]}t|tsR| }t|d dkrdq<|d d }	t|	d |}|	d}
|
d urt|
dnd }|j	}t
||d	}|r|j|j|d
 |V  q<d S Nrf   Tr~   choicesr   deltafinish_reasonr   messagegeneration_info)chunk)_create_message_dictsr   rr   
isinstancers   
model_dumplen_convert_delta_to_message_chunkrW   	__class__r   on_llm_new_tokencontentrO   r~   rG   r   rj   message_dictsrg   Zdefault_chunk_classr   choicer   r   Zcg_chunkrM   rM   rP   _stream   s.    

zChatYuan2._streamr    c           	      K  s`   | j r&| jf |||d|}t|S | ||\}}i ||}| jf d|i|}| |S N)r~   rG   r   r~   )rB   r   r   r   rr   _create_chat_result	rO   r~   rG   r   rj   Zstream_iterr   rg   responserM   rM   rP   	_generate  s    zChatYuan2._generatez+Tuple[List[Dict[str, Any]], Dict[str, Any]])r~   rG   rK   c                 C  s@   t | j}|d ur*d|v r"td||d< dd |D }||fS )NrG   z2`stop` found in both the input and default params.c                 S  s   g | ]}t |qS rM   )_convert_message_to_dict).0mrM   rM   rP   
<listcomp>2      z3ChatYuan2._create_message_dicts.<locals>.<listcomp>)rs   _invocation_paramsrY   )rO   r~   rG   rg   r   rM   rM   rP   r   *  s    
zChatYuan2._create_message_dictszUnion[dict, BaseModel])r   rK   c                 C  s   g }t dt| d|  t|ts0| }|d D ]H}t|d }t|d d}d|v rj|d |d< t||d}|| q8|d	i | j	d
}t
||dS )Nztype(response): z; response: r   r   r   r   Zlogprobsr   usagerv   )generations
llm_output)rZ   rw   rx   r   rs   _convert_dict_to_messager   appendrW   r5   r    )rO   r   r   resr   r   genr   rM   rM   rP   r   5  s$    

zChatYuan2._create_chat_resultz'Optional[AsyncCallbackManagerForLLMRun]z"AsyncIterator[ChatGenerationChunk]c                 K s   |  ||\}}i ||ddi}t}t| fd|i|I d H 2 z3 d H W }t|ts`| }t|d dkrrqB|d d }	t|	d |}|	d}
|
d urt|
dnd }|j	}t
||d	}|r|j|j|d
I d H  |V  qB6 d S r   )r   r   acompletion_with_retryr   rs   r   r   r   rW   r   r   r   r   r   rM   rM   rP   _astreamJ  s:    

zChatYuan2._astreamc           	        sl   | j r,| jf |||d|}t|I d H S | ||\}}i ||}t| fd|i|I d H }| |S r   )rB   r   r   r   r   r   r   rM   rM   rP   
_ageneratem  s    zChatYuan2._agenerateMapping[str, Any]c                 C  s   d| j i}i || jS )z,Get the parameters used to invoke the model.r2   )r5   rh   )rO   Zyuan2_credsrM   rM   rP   r     s    zChatYuan2._invocation_paramsc                 C  s   dS )zReturn type of chat model.z
chat-yuan2rM   rN   rM   rM   rP   	_llm_type  s    zChatYuan2._llm_type)NN)NN)NN)NN)+__name__
__module____qualname____doc__r.   __annotations__r&   r1   r5   rs   r7   r9   r;   r=   r@   rB   rC   rE   rF   rG   rI   rJ   r%   Zmodel_configpropertyrQ   rS   r'   classmethodrb   r#   re   rh   rr   r}   r   r   r   r   r   r   r   r   rM   rM   rM   rP   r-   <   sl   

  $    &  r-   zCallable[[Any], Any])llmrK   c                 C  sh   dd l }d}d}tdt| jtd||dt|jt|jB t|jB t|j	B t|j
B tttjdS )Nr      <   T)
multiplierminmax)reraiserG   waitr)   before_sleep)rc   r)   r+   r@   r,   r*   ZAPITimeoutErrorZAPIErrorZAPIConnectionErrorZRateLimitErrorZInternalServerErrorr(   rZ   loggingWARNING)r   rc   Zmin_secondsZmax_secondsrM   rM   rP   rp     s$    
rp   r   )r   rj   rK   c                   s4   t  }|ddd fdd}|f i |I dH S )z0Use tenacity to retry the async completion call.r   ri   c                    s    j jf i | I d H S rk   )r1   rl   rm   r   rM   rP   rn     s    z6acompletion_with_retry.<locals>._completion_with_retryNro   )r   rj   rq   rn   rM   r   rP   r     s    r   r   zType[BaseMessageChunk]r   )_dictdefault_classrK   c                 C  s   |  d}|  dpd}|dks(|tkr2t|dS |dksB|tkrLt|dS |dks\|tkrft|dS |sr|tkr~t||dS ||dS d S )	Nroler    userr   	assistantsystemr   r   )rW   r   r   r   r   )r   r   r   r   rM   rM   rP   r     s    



r   r   )r   rK   c                 C  sp   |  d}|dkr$t|  dddS |dkr>t|  dddS |dkrXt|  dddS t|  dd|dS d S )	Nr   r   r   r   r   r   r   r   )rW   r   r   r   r   )r   r   rM   rM   rP   r     s    
r   rs   )r   rK   c                 C  s   t | tr| j| jd}nrt | tr2d| jd}nZt | trJd| jd}nBt | trbd| jd}n*t | tr~d| j| jd}nt	d|  d| j
v r| j
d |d< |S )	zConvert a LangChain message to a dictionary.

    Args:
        message: The LangChain message.

    Returns:
        The dictionary.
    )r   r   r   r   r   function)r   namer   zGot unknown type r   )r   r   r   r   r   r   r   r   r   rY   Zadditional_kwargs)r   Zmessage_dictrM   rM   rP   r     s"    






r   )?r   
__future__r   r   typingr   r   r   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   r   r   Zlangchain_core.outputsr   r   r    Zlangchain_core.utilsr!   r"   r#   Zpydanticr$   r%   r&   r'   tenacityr(   r)   r*   r+   r,   	getLoggerr   rZ   r-   rp   r   r   r   r   rM   rM   rM   rP   <module>   s&   44
  S