
    dh;                       S r SSKJr  SSKrSSKJrJrJrJrJ	r	J
r
JrJrJrJrJr  SSKJrJr  SSKJrJrJr  SSKJrJrJrJrJrJrJrJrJ r J!r!J"r"  SSK#J$r$J%r%J&r&  SS	K'J(r(J)r)J*r*J+r+  SS
K,J-r-J.r.J/r/J0r0  SSK1J2r2J3r3J4r4J5r5J6r6  \Rn                  " \85      r9SS jr:SS jr;      SS jr<SS jr=SS jr> " S S\5      r?g)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           
        SS K nSnSn[        S[        U R                  5      [	        SX#S9[        UR                  R                  5      [        UR                  R                  5      -  [        UR                  R                  5      -  [        UR                  R                  5      -  [        UR                  R                  5      -  [        [        [        R                  5      S9$ 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       `/var/www/html/shao/venv/lib/python3.13/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                `   ^ #    [        T 5      nUSU 4S jj5       nU" S0 UD6I Sh  vN $  N7f)z0Use tenacity to retry the async completion call.c                 X   >#    TR                   R                  " S0 U D6I S h  vN $  N7fN )clientacreate)kwargsrG   s    rJ   _completion_with_retry6acompletion_with_retry.<locals>._completion_with_retryW   s&      ZZ''1&1111s    *(*NrS   r   returnr   rP   rK   )rG   rS   retry_decoratorrT   s   `   rJ   acompletion_with_retryrZ   S   s8     -c2O2 2 (1&1111s   $.,.c                .   U R                  S5      nU R                  S5      =(       d    SnUS:X  d
  U[        :X  a	  [        US9$ US:X  d
  U[        :X  a	  [        US9$ US:X  d
  U[        :X  a	  [        US9$ U(       d
  U[        :X  a	  [	        X2S9$ U" US9$ )	Nrolecontent userr]   	assistantsystemr]   r\   )getr   r   r   r   )_dictdefault_classr\   r]   s       rJ   _convert_delta_to_message_chunkrg   _   s     99VDii	"(bGv~*;; 11		 ?g..		].@@!'22	"22;;W--rL   c                    U S   nUS:X  a  [        U S   S9$ US:X  a  U S   =(       d    Sn[        US9$ US:X  a  [        U S   S9$ [        U S   US9$ )	Nr\   r_   r]   r`   ra   r^   rb   rc   )r   r   r   r   )re   r\   r]   s      rJ   _convert_dict_to_messageri   q   sn    =Dv~E)$455			"(b))		U9%5665#3$??rL   c                   [        U [        5      (       a  U R                  U R                  S.nO[        U [        5      (       a  SU R                  S.nO[        U [
        5      (       a  SU R                  S.nOc[        U [        5      (       a  SU R                  S.nO>[        U [        5      (       a  SU R                  U R                  S.nO[        SU  35      eSU R                  ;   a  U R                  S   US'   U$ )	N)r\   r]   r_   ra   rb   function)r\   namer]   zGot unknown type rl   )
isinstancer   r\   r]   r   r   r   r   rl   
ValueErroradditional_kwargs)messagemessage_dicts     rJ   _convert_message_to_dictrr   ~   s    ';'' 'I	G\	*	* &7??C	GY	'	' +H	G]	+	+ (W__E	G_	-	-LL
 ,WI677***&88@VrL   c                     \ rS rSr% Sr\S-S j5       r\S.S j5       rSr	S\
S'   S	rS
\
S'    \" \S9rS\
S'    SrS\
S'    SrS\
S'    SrS\
S'    SrS\
S'    SrS\
S'    \" SS9r\" SS9\S/S j5       5       r\S0S j5       r\S1S  j5       rS2S! jrS3S" jrS4S# jr  S5         S6S$ jjr  S5         S7S% jjr      S8S& jr S9S' jr!  S5         S:S( jjr"  S5         S;S) jjr#\S<S* j5       r$\S=S+ j5       r%S,r&g)>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                
    SS0$ )Njinachat_api_keyJINACHAT_API_KEYrP   selfs    rJ   
lc_secretsJinaChat.lc_secrets   s    "$677rL   boolc                    g)z9Return whether this model can be serialized by Langchain.FrP   )clss    rJ   is_lc_serializableJinaChat.is_lc_serializable   s     rL   Nr   rQ   gffffff?floattemperature)default_factoryDict[str, Any]model_kwargszOptional[SecretStr]rv   z+Optional[Union[float, Tuple[float, float]]]request_timeout   intr=   F	streamingzOptional[int]
max_tokensT)populate_by_namebefore)modec           
     p   [        U 5      nUR                  S0 5      n[        U5       HP  nXC;   a  [        SU S35      eXB;  d  M  [        R                  SU SU SU S35        UR                  U5      X4'   MR     UR                  UR                  5       5      nU(       a  [        SU S	35      eX1S'   U$ )
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$   rd   listrn   rD   warningpopintersectionkeys)r~   valuesall_required_field_namesextra
field_nameinvalid_model_kwargss         rJ   build_extraJinaChat.build_extra   s     $<C#@ 

>2.v,J" 6*5E!FGG9!* .L !))34JN
 %+JJz$:! '  8DDUZZ\R23 4S T 
 "'~rL   c                    [        [        USS5      5      US'    SSKn UR                  US'   U$ ! [         a    [        S5      ef = f! [
         a    [        S5      ef = f)z?Validate that api key and python package exists in environment.rv   rw   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AttributeErrorrn   )r~   r   r<   s      rJ   validate_environmentJinaChat.validate_environment   s     &; );=OP&
!"		%44F8   	? 	  	7 	s   1 A
 A
A c                x    U R                   U R                  U R                  U R                  S.U R                  E$ )z4Get the default parameters for calling JinaChat API.)r   r   streamr   )r   r   r   r   r   rx   s    rJ   _default_paramsJinaChat._default_params   s>      $33//nn++	

 
 	
rL   c           
        SS K nSnSn[        S[        U R                  5      [	        SX#S9[        UR                  R                  5      [        UR                  R                  5      -  [        UR                  R                  5      -  [        UR                  R                  5      -  [        UR                  R                  5      -  [        [        [        R                  5      S9$ r1   r;   )ry   r<   rH   rI   s       rJ   rK    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                N   ^  T R                  5       nUSU 4S jj5       nU" S0 UD6$ )z*Use tenacity to retry the completion call.c                 <   > TR                   R                  " S0 U D6$ rO   )rQ   create)rS   ry   s    rJ   rT   >JinaChat.completion_with_retry.<locals>._completion_with_retry  s    ;;%%///rL   rV   rP   rX   )ry   rS   rY   rT   s   `   rJ   completion_with_retryJinaChat.completion_with_retry  s3    668		0 
	0 &///rL   c                    0 nU H=  nUc  M  US   nUR                  5        H  u  pVXR;   a  X%==   U-  ss'   M  XbU'   M     M?     SU0$ )Ntoken_usage)items)ry   llm_outputsoverall_token_usageoutputr   kvs          rJ   _combine_llm_outputsJinaChat._combine_llm_outputs   sc    $&!F~ /K#))++'*a/*-.*	 , " 233rL   c              +  (  #    U R                  X5      u  pV0 UEUESS0En[        nU R                  " S	SU0UD6 HS  nUS   S   S   n	[        X5      nUR                  n[        US9n
U(       a  UR                  UR                  U
S9  U
v   MU     g 7f)
Nr   Tmessageschoicesr   deltarp   chunkrP   )_create_message_dictsr   r   rg   	__class__r    on_llm_new_tokenr]   ry   r   r8   run_managerrS   message_dictsparamsdefault_chunk_classr   r   cg_chunks              rJ   _streamJinaChat._stream.  s      !% : :8 J5F5f5h5,//QQ&QE)$Q'0E3EOE"'//*59H,,U]](,KN Rs   BBc                    U R                   (       a   U R                  " SXUS.UD6n[        U5      $ U R                  X5      u  pg0 UEUEnU R                  " SSU0UD6nU R                  U5      $ N)r   r8   r   r   rP   )r   r   r   r   r   _create_chat_result	ry   r   r8   r   rS   stream_iterr   r   responses	            rJ   	_generateJinaChat._generateB  s     >>,, !+IOK (44 $ : :8 J%F%f%--O}OO''11rL   c                    [        U R                  5      nUb  SU;   a  [        S5      eX#S'   U Vs/ sH  n[        U5      PM     nnXS4$ s  snf )Nr8   z2`stop` found in both the input and default params.)dict_invocation_paramsrn   rr   )ry   r   r8   r   mr   s         rJ   r   JinaChat._create_message_dictsT  s^     d--. !UVV!6N>FGh1!4hG$$ Hs   Ac                    / nUS    H+  n[        US   5      n[        US9nUR                  U5        M-     SUS   0n[        X&S9$ )Nr   rp   r   r   usage)generations
llm_output)ri   r   appendr!   )ry   r   r   resrp   genr   s          rJ   r   JinaChat._create_chat_result_  sX    I&C.s9~>G 1Cs# ' $Xg%67
kIIrL   c               T  #    U R                  X5      u  pV0 UEUESS0En[        n[        U 4SU0UD6I S h  vN   S h  vN nUS   S   S   n	[        X5      nUR                  n[        US9n
U(       a"  UR                  UR                  U
S9I S h  vN   U
7v   Md   Nh Na N
 g 7f)	Nr   Tr   r   r   r   r   r   )r   r   rZ   rg   r   r    r   r]   r   s              rJ   _astreamJinaChat._astreamh  s      !% : :8 J5F5f5h5,!7"
("
,2"
 
 
 		% )$Q'0E3EOE"'//*59H!225==2QQQN
 		 R
sE   5B(B B(B& B"B&AB(B$B("B&$B(&B(c                  #    U R                   (       a(  U R                  " SXUS.UD6n[        U5      I S h  vN $ U R                  X5      u  pg0 UEUEn[	        U 4SU0UD6I S h  vN nU R                  U5      $  ND N7fr   )r   r   r   r   rZ   r   r   s	            rJ   
_agenerateJinaChat._agenerate~  s      >>-- !+IOK /{;;; $ : :8 J%F%f%/W}WPVWW''11 < Xs!   5B A<.B &A>'B >B c                    U R                   =(       a    U R                   R                  5       SSS.n0 UEU R                  E$ )z,Get the parameters used to invoke the model.zhttps://api.chat.jina.ai/v1jinachat)api_keyapi_basemodel)rv   get_secret_valuer   )ry   jinachat_credss     rJ   r   JinaChat._invocation_params  sI     ,, 9%%6685	*
 :.9D$8$899rL   c                    g)zReturn type of chat model.r   rP   rx   s    rJ   	_llm_typeJinaChat._llm_type  s     rL   rP   )rW   zDict[str, str])rW   r|   )r   r   rW   r   )r   r   rW   r   )rW   r   )rW   Callable[[Any], Any]rV   )r   zList[Optional[dict]]rW   r   )NN)
r   List[BaseMessage]r8   Optional[List[str]]r   "Optional[CallbackManagerForLLMRun]rS   r   rW   zIterator[ChatGenerationChunk])
r   r   r8   r   r   r   rS   r   rW   r!   )r   r   r8   r   rW   z+Tuple[List[Dict[str, Any]], Dict[str, Any]])r   Mapping[str, Any]rW   r!   )
r   r   r8   r   r   'Optional[AsyncCallbackManagerForLLMRun]rS   r   rW   z"AsyncIterator[ChatGenerationChunk])
r   r   r8   r   r   r   rS   r   rW   r!   )rW   r   )rW   str)'__name__
__module____qualname____firstlineno____doc__propertyrz   classmethodr   rQ   __annotations__r   r'   r   r   rv   r   r=   r   r   r&   model_configr)   r   r%   r   r   rK   r   r   r   r   r   r   r   r   r   r   __static_attributes__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/   rW   r   )rG   r/   rS   r   rW   r   )re   r   rf   zType[BaseMessageChunk]rW   r   )re   r   rW   r   )rp   r   rW   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   rZ   rg   ri   rr   r/   rP   rL   rJ   <module>r
     s     "     
    S R  C B  
		8	$,	2..-C..$
@,J} JrL   