o
    Zh =                     @  sT  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Z:d&ddZ;d'ddZ<d(ddZ=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llmJinaChatreturnCallable[[Any], Any]c                 C  r   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)r.   r>   min_secondsmax_seconds rG   _/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/jinachat.py_create_retry_decorator=   $   





rI   kwargsr   c                   s0   t  }|d fdd}|di |I dH S )	z0Use tenacity to retry the async completion call.rK   r   r0   c                    s    j jdi | I d H S NrG   )clientZacreaterK   r.   rG   rH   _completion_with_retryW   s   z6acompletion_with_retry.<locals>._completion_with_retryNrK   r   r0   r   rG   rI   )r.   rK   retry_decoratorrP   rG   rO   rH   acompletion_with_retryS   s
   rT   _dictMapping[str, Any]default_classType[BaseMessageChunk]r   c                 C  s   |  d}|  dpd}|dks|tkrt|dS |dks!|tkr&t|dS |dks.|tkr3t|dS |s9|tkr?t||dS ||dS )	Nrolecontent userrZ   	assistantsystemrZ   rY   )getr   r   r   r   )rU   rW   rY   rZ   rG   rG   rH   _convert_delta_to_message_chunk_   s   




rb   r   c                 C  sb   | d }|dkrt | d dS |dkr| d pd}t|dS |dkr)t| d dS t| d |dS )	NrY   r\   rZ   r]   r^   r[   r_   r`   )r   r   r   r   )rU   rY   rZ   rG   rG   rH   _convert_dict_to_messageq   s   
rc   messagedictc                 C  s   t | tr| j| jd}n9t | trd| jd}n-t | tr%d| jd}n!t | tr1d| jd}nt | tr?d| j| jd}nt	d|  d| j
v rR| j
d |d< |S )	N)rY   rZ   r\   r^   r_   function)rY   namerZ   zGot unknown type rg   )
isinstancer   rY   rZ   r   r   r   r   rg   
ValueErrorZadditional_kwargs)rd   Zmessage_dictrG   rG   rH   _convert_message_to_dict~   s"   





rj   c                   @  sn  e Zd ZU dZedRddZedSd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dTd"d#ZedUd%d&ZedVd'd(ZdWd*d+ZdXd-d.ZdYd2d3Z				dZd[d;d<Z				dZd\d>d?Zd]dAdBZd^dEdFZ 				dZd_dIdJZ!				dZd`dKdLZ"edadMdNZ#edbdPdQZ$d	S )cr/   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()
    r0   Dict[str, str]c                 C  s   ddiS )Njinachat_api_keyJINACHAT_API_KEYrG   selfrG   rG   rH   
lc_secrets   s   zJinaChat.lc_secretsboolc                 C     dS )z9Return whether this model can be serialized by Langchain.FrG   )clsrG   rG   rH   is_lc_serializable      zJinaChat.is_lc_serializableNr   rM   gffffff?floattemperature)default_factoryDict[str, Any]model_kwargszOptional[SecretStr]rl   z+Optional[Union[float, Tuple[float, float]]]request_timeout   intr?   F	streamingzOptional[int]
max_tokensT)Zpopulate_by_namebefore)modevaluesc              
   C  s   t | }|di }t|D ](}||v rtd| d||vr6td| d| d| d ||||< q|| }|rHtd| d	||d< |S )
z>Build extra kwargs from additional params that were passed in.rz   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#   ra   listri   rB   warningpopintersectionkeys)rs   r   Zall_required_field_namesextra
field_nameZinvalid_model_kwargsrG   rG   rH   build_extra   s,   
zJinaChat.build_extrar   c                 C  s`   t t|dd|d< zddl}W n ty   tdw z|j|d< W |S  ty/   tdw )z?Validate that api key and python package exists in environment.rl   rm   r   NzTCould not import openai python package. Please install it with `pip install openai`.rM   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AttributeErrorri   )rs   r   r>   rG   rG   rH   validate_environment   s$   
zJinaChat.validate_environmentc                 C  s   | j | j| j| jd| jS )z4Get the default parameters for calling JinaChat API.)r{   r   streamrw   )r{   r   r~   rw   rz   rn   rG   rG   rH   _default_params   s   zJinaChat._default_paramsr1   c                 C  r2   r3   r=   )ro   r>   rE   rF   rG   rG   rH   rI     rJ   z JinaChat._create_retry_decoratorrK   c                   s(      }|d fdd}|di |S )	z*Use tenacity to retry the completion call.rK   r   r0   c                    s    j jdi | S rL   )rM   createrN   rn   rG   rH   rP     s   z>JinaChat.completion_with_retry.<locals>._completion_with_retryNrQ   rG   rR   )ro   rK   rS   rP   rG   rn   rH   completion_with_retry  s   zJinaChat.completion_with_retryllm_outputsList[Optional[dict]]re   c                 C  s\   i }|D ]%}|d u rq|d }|  D ]\}}||v r$||  |7  < q|||< qqd|iS )Ntoken_usage)items)ro   r   Zoverall_token_usageoutputr   kvrG   rG   rH   _combine_llm_outputs   s   
zJinaChat._combine_llm_outputsmessagesList[BaseMessage]r:   Optional[List[str]]run_manager"Optional[CallbackManagerForLLMRun]Iterator[ChatGenerationChunk]c                 k  s    |  ||\}}i ||ddi}t}| jd	d|i|D ]$}|d d d }	t|	|}|j}t|d}
|r@|j|j|
d |
V  qd S )
Nr   Tr   choicesr   deltard   chunkrG   )_create_message_dictsr   r   rb   	__class__r   on_llm_new_tokenrZ   ro   r   r:   r   rK   message_dictsparamsZdefault_chunk_classr   r   Zcg_chunkrG   rG   rH   _stream.  s   

zJinaChat._streamr    c           	      K  s`   | j r| jd|||d|}t|S | ||\}}i ||}| jdd|i|}| |S N)r   r:   r   r   rG   )r~   r   r   r   r   _create_chat_result	ro   r   r:   r   rK   Zstream_iterr   r   responserG   rG   rH   	_generateB  s   
zJinaChat._generate+Tuple[List[Dict[str, Any]], Dict[str, Any]]c                 C  s@   t | j}|d urd|v rtd||d< dd |D }||fS )Nr:   z2`stop` found in both the input and default params.c                 S  s   g | ]}t |qS rG   )rj   ).0mrG   rG   rH   
<listcomp>\  s    z2JinaChat._create_message_dicts.<locals>.<listcomp>)re   _invocation_paramsri   )ro   r   r:   r   r   rG   rG   rH   r   T  s   
zJinaChat._create_message_dictsr   rV   c                 C  sJ   g }|d D ]}t |d }t|d}|| qd|d i}t||dS )Nr   rd   r   r   usage)generations
llm_output)rc   r   appendr    )ro   r   r   resrd   genr   rG   rG   rH   r   _  s   
zJinaChat._create_chat_result'Optional[AsyncCallbackManagerForLLMRun]"AsyncIterator[ChatGenerationChunk]c                 K s   |  ||\}}i ||ddi}t}t| fd|i|I d H 2 z+3 d H W }|d d d }	t|	|}|j}t|d}
|rJ|j|j|
dI d H  |
V  q"6 d S )	Nr   Tr   r   r   r   r   r   )r   r   rT   rb   r   r   r   rZ   r   rG   rG   rH   _astreamh  s&   

zJinaChat._astreamc           	        sn   | j r| jd|||d|}t|I d H S | ||\}}i ||}t| fd|i|I d H }| |S r   )r~   r   r   r   rT   r   r   rG   rG   rH   
_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)rl   Zget_secret_valuer   )ro   Zjinachat_credsrG   rG   rH   r     s   zJinaChat._invocation_paramsstrc                 C  rr   )zReturn type of chat model.r   rG   rn   rG   rG   rH   	_llm_type  ru   zJinaChat._llm_type)r0   rk   )r0   rq   )r   ry   r0   r   )r   r   r0   r   )r0   ry   )r0   r1   rQ   )r   r   r0   re   )NN)
r   r   r:   r   r   r   rK   r   r0   r   )
r   r   r:   r   r   r   rK   r   r0   r    )r   r   r:   r   r0   r   )r   rV   r0   r    )
r   r   r:   r   r   r   rK   r   r0   r   )
r   r   r:   r   r   r   rK   r   r0   r    )r0   rV   )r0   r   )%__name__
__module____qualname____doc__propertyrp   classmethodrt   rM   __annotations__rw   r&   re   rz   rl   r{   r?   r~   r   r%   Zmodel_configr(   r   r$   r   r   rI   r   r   r   r   r   r   r   r   r   r   rG   rG   rG   rH   r/      sh   
 







)r.   r/   r0   r1   )r.   r/   rK   r   r0   r   )rU   rV   rW   rX   r0   r   )rU   rV   r0   r   )rd   r   r0   re   )@r   
__future__r   rC   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   rB   rI   rT   rb   rc   rj   r/   rG   rG   rG   rH   <module>   s$    44





