a
    bg =                     @  sv  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*m+Z+ dd
l,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6 e7e8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>G d#d deZ?dS )$zJinaChat 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)convert_to_secret_strget_from_dict_or_envget_pydantic_field_namespre_init)
ConfigDictField	SecretStrmodel_validator)before_sleep_logretryretry_if_exception_typestop_after_attemptwait_exponentialJinaChatCallable[[Any], Any])llmreturnc                 C  sr   dd l }d}d}tdt| jtd||dt|jjt|jjB t|jj	B t|jj
B t|jjB tttjdS Nr      <   T)
multiplierminmax)reraisestopwaitr*   before_sleepopenair*   r,   max_retriesr-   r+   errorTimeoutZAPIErrorZAPIConnectionErrorZRateLimitErrorZServiceUnavailableErrorr)   loggerloggingWARNING)r0   r=   min_secondsmax_seconds rF   v/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/jinachat.py_create_retry_decorator=   s$    





rH   r   )r0   kwargsr1   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   r1   c                    s    j jf i | I d H S N)clientZacreaterI   r0   rF   rG   _completion_with_retryW   s    z6acompletion_with_retry.<locals>._completion_with_retryNrH   )r0   rI   retry_decoratorrO   rF   rN   rG   acompletion_with_retryS   s    rR   Mapping[str, Any]zType[BaseMessageChunk]r   )_dictdefault_classr1   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rolecontent userrW   	assistantsystemrW   rV   )getr   r   r   r   )rT   rU   rV   rW   rF   rF   rG   _convert_delta_to_message_chunk_   s    



r_   r   )rT   r1   c                 C  sf   | d }|dkrt | d dS |dkr<| d p0d}t|dS |dkrRt| d dS t| d |dS d S )	NrV   rY   rW   rZ   r[   rX   r\   r]   )r   r   r   r   )rT   rV   rW   rF   rF   rG   _convert_dict_to_messageq   s    
r`   dict)messager1   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 )	N)rV   rW   rY   r[   r\   function)rV   namerW   zGot unknown type rd   )
isinstancer   rV   rW   r   r   r   r   rd   
ValueErrorZadditional_kwargs)rb   Zmessage_dictrF   rF   rG   _convert_message_to_dict~   s"    





rg   c                   @  s  e Zd ZU dZeddddZeddddZd	Zd
e	d< dZ
de	d< ee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dZedd edd
d!d"d#Zed$d$d!d%d&Zeddd'd(Zd)dd*d+Zd
d
d,d-d.Zd/d0d1d2d3ZdQd4d5d6d
d7d8d9d:ZdRd4d5d6d
d;d8d<d=Zd4d5d>d?d@dAZdBd;dCdDdEZ dSd4d5dFd
dGd8dHdIZ!dTd4d5dFd
d;d8dJdKZ"edBddLdMZ#edNddOdPZ$d	S )Ur.   a  `Jina AI` Chat models API.

    To use, you should have the ``openai`` python package installed, and the
    environment variable ``JINACHAT_API_KEY`` set to your API key, which you
    can generate at https://chat.jina.ai/api.

    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 JinaChat
            chat = JinaChat()
    zDict[str, str])r1   c                 C  s   ddiS )Njinachat_api_keyJINACHAT_API_KEYrF   selfrF   rF   rG   
lc_secrets   s    zJinaChat.lc_secretsboolc                 C  s   dS )z9Return whether this model can be serialized by Langchain.FrF   )clsrF   rF   rG   is_lc_serializable   s    zJinaChat.is_lc_serializableNr   rL   gffffff?floattemperature)default_factoryzDict[str, Any]model_kwargszOptional[SecretStr]rh   z+Optional[Union[float, Tuple[float, float]]]request_timeout   intr>   F	streamingzOptional[int]
max_tokensT)Zpopulate_by_namebefore)mode)valuesr1   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.rs   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#   r^   listrf   rA   warningpopintersectionkeys)rn   r{   Zall_required_field_namesextra
field_nameZinvalid_model_kwargsrF   rF   rG   build_extra   s*    
zJinaChat.build_extrar   c                 C  sj   t t|dd|d< zddl}W n ty:   tdY n0 z|j|d< W n tyd   tdY n0 |S )z?Validate that api key and python package exists in environment.rh   ri   r   NzTCould not import openai python package. Please install it with `pip install openai`.rL   z`openai` has no `ChatCompletion` attribute, this is likely due to an old version of the openai package. Try upgrading it with `pip install --upgrade openai`.)r!   r"   r=   ImportErrorZChatCompletionAttributeErrorrf   )rn   r{   r=   rF   rF   rG   validate_environment   s     


zJinaChat.validate_environmentc                 C  s   | j | j| j| jd| jS )z4Get the default parameters for calling JinaChat API.)rt   rx   streamrq   )rt   rx   rw   rq   rs   rj   rF   rF   rG   _default_params   s    zJinaChat._default_paramsr/   c                 C  sr   dd l }d}d}tdt| jtd||dt|jjt|jjB t|jj	B t|jj
B t|jjB tttjdS r2   r<   )rk   r=   rD   rE   rF   rF   rG   rH     s$    





z JinaChat._create_retry_decoratorrJ   c                   s.      }|ddd fdd}|f i |S )z*Use tenacity to retry the completion call.r   rJ   c                    s    j jf i | S rK   )rL   createrM   rj   rF   rG   rO     s    z>JinaChat.completion_with_retry.<locals>._completion_with_retryrP   )rk   rI   rQ   rO   rF   rj   rG   completion_with_retry  s    zJinaChat.completion_with_retryzList[Optional[dict]]ra   )llm_outputsr1   c                 C  s\   i }|D ]J}|d u rq|d }|  D ]*\}}||v rH||  |7  < q&|||< q&qd|iS )Ntoken_usage)items)rk   r   Zoverall_token_usageoutputr   kvrF   rF   rG   _combine_llm_outputs   s    zJinaChat._combine_llm_outputszList[BaseMessage]zOptional[List[str]]z"Optional[CallbackManagerForLLMRun]zIterator[ChatGenerationChunk])messagesr9   run_managerrI   r1   c                 k  s   |  ||\}}i ||ddi}t}| jf d|i|D ]H}|d d d }	t|	|}|j}t|d}
|r~|j|j|
d |
V  q<d S 	Nr   Tr   choicesr   deltarb   )chunk)_create_message_dictsr   r   r_   	__class__r   on_llm_new_tokenrW   rk   r   r9   r   rI   message_dictsparamsZdefault_chunk_classr   r   Zcg_chunkrF   rF   rG   _stream.  s    

zJinaChat._streamr    c           	      K  s`   | j r&| jf |||d|}t|S | ||\}}i ||}| jf d|i|}| |S N)r   r9   r   r   )rw   r   r   r   r   _create_chat_result	rk   r   r9   r   rI   Zstream_iterr   r   responserF   rF   rG   	_generateB  s    zJinaChat._generatez+Tuple[List[Dict[str, Any]], Dict[str, Any]])r   r9   r1   c                 C  s@   t | j}|d ur*d|v r"td||d< dd |D }||fS )Nr9   z2`stop` found in both the input and default params.c                 S  s   g | ]}t |qS rF   )rg   ).0mrF   rF   rG   
<listcomp>\      z2JinaChat._create_message_dicts.<locals>.<listcomp>)ra   _invocation_paramsrf   )rk   r   r9   r   r   rF   rF   rG   r   T  s    
zJinaChat._create_message_dictsrS   )r   r1   c                 C  sJ   g }|d D ]$}t |d }t|d}|| qd|d i}t||dS )Nr   rb   r   r   usage)generations
llm_output)r`   r   appendr    )rk   r   r   resrb   genr   rF   rF   rG   r   _  s    
zJinaChat._create_chat_resultz'Optional[AsyncCallbackManagerForLLMRun]z"AsyncIterator[ChatGenerationChunk]c                 K s   |  ||\}}i ||ddi}t}t| fd|i|I d H 2 zV3 d H W }|d d d }	t|	|}|j}t|d}
|r|j|j|
dI d H  |
V  qB6 d S r   )r   r   rR   r_   r   r   r   rW   r   rF   rF   rG   _astreamh  s"    

zJinaChat._astreamc           	        sl   | j r,| jf |||d|}t|I d H S | ||\}}i ||}t| fd|i|I d H }| |S r   )rw   r   r   r   rR   r   r   rF   rF   rG   
_agenerate~  s    zJinaChat._ageneratec                 C  s&   | j o| j  ddd}i || jS )z,Get the parameters used to invoke the model.zhttps://api.chat.jina.ai/v1jinachat)Zapi_keyZapi_basemodel)rh   Zget_secret_valuer   )rk   Zjinachat_credsrF   rF   rG   r     s    zJinaChat._invocation_paramsstrc                 C  s   dS )zReturn type of chat model.r   rF   rj   rF   rF   rG   	_llm_type  s    zJinaChat._llm_type)NN)NN)NN)NN)%__name__
__module____qualname____doc__propertyrl   classmethodro   rL   __annotations__rq   r&   ra   rs   rh   rt   r>   rw   rx   r%   Zmodel_configr(   r   r$   r   r   rH   r   r   r   r   r   r   r   r   r   r   rF   rF   rF   rG   r.      sX   


        
)@r   
__future__r   rB   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#   r$   Zpydanticr%   r&   r'   r(   tenacityr)   r*   r+   r,   r-   	getLoggerr   rA   rH   rR   r_   r`   rg   r.   rF   rF   rF   rG   <module>   s"   44
