
    7|h =                    v   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jn                  e8      Z9ddZ:ddZ;	 	 	 	 	 	 ddZ<ddZ=ddZ> G d de      Z?y)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JinaChatc           
        dd l }d}d}t        dt        | j                        t	        d||      t        |j                  j                        t        |j                  j                        z  t        |j                  j                        z  t        |j                  j                        z  t        |j                  j                        z  t        t        t        j                              S Nr      <   T)
multiplierminmax)reraisestopwaitr+   before_sleepopenair+   r-   max_retriesr.   r,   errorTimeoutAPIErrorAPIConnectionErrorRateLimitErrorServiceUnavailableErrorr*   loggerloggingWARNING)llmr<   min_secondsmax_secondss       g/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/chat_models/jinachat.py_create_retry_decoratorrK   =   s    KK 0M#FLL$8$89%fll&;&;<=%fll&E&EFG &fll&A&ABC &fll&J&JK	L &fgoo>     c                \    K   t               }|d fd       } |di | d{   S 7 w)z0Use tenacity to retry the async completion call.c                 X   K    j                   j                  di |  d {   S 7 wN )clientacreate)kwargsrG   s    rJ   _completion_with_retryz6acompletion_with_retry.<locals>._completion_with_retryW   s)      (SZZ''1&1111s    *(*NrS   r   returnr   rP   rK   )rG   rS   retry_decoratorrT   s   `   rJ   acompletion_with_retryrY   S   s9     -c2O2 2 (1&1111s   ",*,c                ,   | j                  d      }| j                  d      xs d}|dk(  s	|t        k(  rt        |      S |dk(  s	|t        k(  rt        |      S |dk(  s	|t        k(  rt        |      S |s	|t        k(  rt	        ||      S  ||      S )	Nrolecontent userr\   	assistantsystemr\   r[   )getr   r   r   r   )_dictdefault_classr[   r\   s       rJ   _convert_delta_to_message_chunkrf   _   s     99VDii	"(bGv~*;; 11		 ?g..		].@@!'22	"22d;;W--rL   c                    | d   }|dk(  rt        | d         S |dk(  r| d   xs d}t        |      S |dk(  rt        | d         S t        | d   |      S )	Nr[   r^   r\   r_   r`   r]   ra   rb   )r   r   r   r   )rd   r[   r\   s      rJ   _convert_dict_to_messagerh   q   sn    =Dv~E)$455			"(b))		U9%5665#3$??rL   c                   t        | t              r| j                  | j                  d}nt        | t              rd| j                  d}nyt        | t
              rd| j                  d}nYt        | t              rd| j                  d}n9t        | t              rd| j                  | j                  d}nt        d|        d| j                  v r| j                  d   |d<   |S )	N)r[   r\   r^   r`   ra   function)r[   namer\   zGot unknown type rk   )
isinstancer   r[   r\   r   r   r   r   rk   
ValueErroradditional_kwargs)messagemessage_dicts     rJ   _convert_message_to_dictrq   ~   s    ';' 'I	G\	* &7??C	GY	' +H	G]	+ (W__E	G_	-LL
 ,WI677***&88@VrL   c                     e Zd ZU dZed+d       Zed,d       ZdZde	d<   dZ
d	e	d
<   	  ee      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      Z ed      ed-d              Zed.d       Zed/d       Zd0d Zd1d!Zd2d"Z	 	 d3	 	 	 	 	 	 	 	 	 d4d#Z	 	 d3	 	 	 	 	 	 	 	 	 d5d$Z	 	 	 	 	 	 d6d%Zd7d&Z 	 	 d3	 	 	 	 	 	 	 	 	 d8d'Z!	 	 d3	 	 	 	 	 	 	 	 	 d9d(Z"ed:d)       Z#ed;d*       Z$y)<r/   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()
    c                
    ddiS )Njinachat_api_keyJINACHAT_API_KEYrP   selfs    rJ   
lc_secretszJinaChat.lc_secrets   s    "$677rL   boolc                     y)z9Return whether this model can be serialized by Langchain.FrP   )clss    rJ   is_lc_serializablezJinaChat.is_lc_serializable   s     rL   Nr   rQ   gffffff?floattemperature)default_factoryDict[str, Any]model_kwargszOptional[SecretStr]rt   z+Optional[Union[float, Tuple[float, float]]]request_timeout   intr=   F	streamingzOptional[int]
max_tokensT)populate_by_namebefore)modec           
     `   t        |       }|j                  di       }t        |      D ]M  }||v rt        d| d      ||vst        j                  d| d| d| d       |j                  |      ||<   O |j                  |j                               }|rt        d| d	      ||d<   |S )
z>Build extra kwargs from additional params that were passed in.r   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$   rc   listrm   rD   warningpopintersectionkeys)r{   valuesall_required_field_namesextra
field_nameinvalid_model_kwargss         rJ   build_extrazJinaChat.build_extra   s     $<C#@ 

>2.v, 		;JU" 6*5E!FGG!99!* .L !))34JN
 %+JJz$:j!		;  8DDUZZ\R23 4S T 
 "'~rL   c                    t        t        |dd            |d<   	 ddl}	 |j                  |d<   |S # t        $ r t        d      w xY w# t
        $ r t        d      w xY w)z?Validate that api key and python package exists in environment.rt   ru   r   NzTCould not import openai python package. Please install it with `pip install openai`.rQ   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<   ImportErrorChatCompletionAttributeErrorrm   )r{   r   r<   s      rJ   validate_environmentzJinaChat.validate_environment   s     &; );=OP&
!"		%44F8   	? 	  	7 	s   1 A	 A	Ac                x    | j                   | j                  | j                  | j                  d| j                  S )z4Get the default parameters for calling JinaChat API.)r   r   streamr~   )r   r   r   r~   r   rv   s    rJ   _default_paramszJinaChat._default_params   s>      $33//nn++	

 
 	
rL   c           
        dd l }d}d}t        dt        | j                        t	        d||      t        |j                  j                        t        |j                  j                        z  t        |j                  j                        z  t        |j                  j                        z  t        |j                  j                        z  t        t        t        j                              S r1   r;   )rw   r<   rH   rI   s       rJ   rK   z JinaChat._create_retry_decorator  s     #D$4$45!QK[Q'(<(<=)&,,*?*?@A)&,,*I*IJK *&,,*E*EFG *&,,*N*NO	P *&'//B
 	
rL   c                J      j                         }|d fd       } |di |S )z*Use tenacity to retry the completion call.c                 <     j                   j                  di | S rO   )rQ   create)rS   rw   s    rJ   rT   z>JinaChat.completion_with_retry.<locals>._completion_with_retry  s    %4;;%%///rL   rU   rP   rW   )rw   rS   rX   rT   s   `   rJ   completion_with_retryzJinaChat.completion_with_retry  s3    668		0 
	0 &///rL   c                    i }|D ]9  }||d   }|j                         D ]  \  }}||v r||xx   |z  cc<   |||<    ; d|iS )Ntoken_usage)items)rw   llm_outputsoverall_token_usageoutputr   kvs          rJ   _combine_llm_outputszJinaChat._combine_llm_outputs   sw    $&! 		/F~ /K#))+ /1++'*a/*-.'*	/		/ 233rL   c              +  ,  K   | j                  ||      \  }}i ||ddi}t        } | j                  d	d|i|D ]T  }|d   d   d   }	t        |	|      }|j                  }t        |      }
|r|j                  |j                  |
       |
 V y w)
Nr   Tmessageschoicesr   deltaro   chunkrP   )_create_message_dictsr   r   rf   	__class__r    on_llm_new_tokenr\   rw   r   r8   run_managerrS   message_dictsparamsdefault_chunk_classr   r   cg_chunks              rJ   _streamzJinaChat._stream.  s      !% : :8T Jv5F5f5h5,/T//QQ&Q 	E)$Q'0E3E;NOE"'//*59H,,U]](,KN	s   BBc                    | j                   r! | j                  d|||d|}t        |      S | j                  ||      \  }}i ||} | j                  dd|i|}| j                  |      S N)r   r8   r   r   rP   )r   r   r   r   r   _create_chat_result	rw   r   r8   r   rS   stream_iterr   r   responses	            rJ   	_generatezJinaChat._generateB  s     >>&$,, !+IOK (44 $ : :8T Jv%F%f%-4--O}OO''11rL   c                    t        | j                        }|d|v rt        d      ||d<   |D cg c]  }t        |       }}||fS c c}w )Nr8   z2`stop` found in both the input and default params.)dict_invocation_paramsrm   rq   )rw   r   r8   r   mr   s         rJ   r   zJinaChat._create_message_dictsT  sa     d--. !UVV!F6N>FG1!4GGf$$ Hs   Ac                    g }|d   D ]-  }t        |d         }t        |      }|j                  |       / d|d   i}t        ||      S )Nr   ro   r   r   usage)generations
llm_output)rh   r   appendr!   )rw   r   r   resro   genr   s          rJ   r   zJinaChat._create_chat_result_  s_    I& 	$C.s9~>G 1Cs#	$ $Xg%67
kjIIrL   c               Z  K   | j                  ||      \  }}i ||ddi}t        }t        | fd|i| d {   2 3 d {   }|d   d   d   }	t        |	|      }|j                  }t        |      }
|r%|j                  |j                  |
       d {    |
 e7 i7 b7 6 y w)	Nr   Tr   r   r   r   r   r   )r   r   rY   rf   r   r    r   r\   r   s              rJ   _astreamzJinaChat._astreamh  s      !% : :8T Jv5F5f5h5,!7"
("
,2"
 
 		 		% )$Q'0E3E;NOE"'//*59H!225==2QQQN
 		 R
sE   7B+B#B+B)B%B)AB+B'B+%B)'B+)B+c                   K   | j                   r) | j                  d|||d|}t        |       d {   S | j                  ||      \  }}i ||}t	        | fd|i| d {   }| j                  |      S 7 F7 wr   )r   r   r   r   rY   r   r   s	            rJ   
_ageneratezJinaChat._agenerate~  s      >>'$-- !+IOK /{;;; $ : :8T Jv%F%f%/W}WPVWW''11 < Xs!   1A>A:0A>$A<%A><A>c                z    | j                   xr | j                   j                         ddd}i || j                  S )z,Get the parameters used to invoke the model.zhttps://api.chat.jina.ai/v1jinachat)api_keyapi_basemodel)rt   get_secret_valuer   )rw   jinachat_credss     rJ   r   zJinaChat._invocation_params  sI     ,, 9%%6685	*
 :.9D$8$899rL   c                     y)zReturn type of chat model.r   rP   rv   s    rJ   	_llm_typezJinaChat._llm_type  s     rL   )rV   zDict[str, str])rV   ry   )r   r   rV   r   )r   r   rV   r   )rV   r   )rV   Callable[[Any], Any]rU   )r   zList[Optional[dict]]rV   r   )NN)
r   List[BaseMessage]r8   Optional[List[str]]r   "Optional[CallbackManagerForLLMRun]rS   r   rV   zIterator[ChatGenerationChunk])
r   r   r8   r   r   r   rS   r   rV   r!   )r   r   r8   r   rV   z+Tuple[List[Dict[str, Any]], Dict[str, Any]])r   Mapping[str, Any]rV   r!   )
r   r   r8   r   r   'Optional[AsyncCallbackManagerForLLMRun]rS   r   rV   z"AsyncIterator[ChatGenerationChunk])
r   r   r8   r   r   r   rS   r   rV   r!   )rV   r   )rV   str)%__name__
__module____qualname____doc__propertyrx   classmethodr|   rQ   __annotations__r~   r'   r   r   rt   r   r=   r   r   r&   model_configr)   r   r%   r   r   rK   r   r   r   r   r   r   r   r   r   r   rP   rL   rJ   r/   r/      sD     8 8   FCK+#(#>L.>V,0)0=CGO@GRK<It/ $J$/L (#  $2  . 
 

*04" %):>	# " 8	
  
'. %):>	2#2 "2 8	2
 2 
2$	%)	%1D	%	4	%J %)?C	# " =	
  
,2 %)?C	2#2 "2 =	2
 2 
2$ : :  rL   )rG   r/   rV   r   )rG   r/   rS   r   rV   r   )rd   r   re   zType[BaseMessageChunk]rV   r   )rd   r   rV   r   )ro   r   rV   r   )@r   
__future__r   rE   typingr   r   r   r   r   r	   r
   r   r   r   r   langchain_core.callbacksr   r   *langchain_core.language_models.chat_modelsr   r   r   langchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   langchain_core.outputsr   r    r!   langchain_core.utilsr"   r#   r$   r%   pydanticr&   r'   r(   r)   tenacityr*   r+   r,   r-   r.   	getLoggerr   rD   rK   rY   rf   rh   rq   r/   rP   rL   rJ   <module>r      s     "     
    S R  C B  
		8	$,	2..-C..$
@,J} JrL   