
    Ng =                    n   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j7        e8          Z9d dZ:d!dZ;d"dZ<d#dZ=d$dZ> G 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           
        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)r/   r?   min_secondsmax_secondss       d/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/jinachat.py_create_retry_decoratorrM   =   s    MMMKK 00MMM#FL$899%fl&;<<=%fl&EFFG &fl&ABBC &fl&JKK	L &fgo>>       kwargsr   c                ^    K   t                     }|d fd            } |di | d{V S )z0Use tenacity to retry the async completion call.rO   r   r1   c                 8   K    j         j        di |  d {V S N )clientacreate)rO   r/   s    rL   _completion_with_retryz6acompletion_with_retry.<locals>._completion_with_retryW   s6       (SZ'11&111111111rN   NrO   r   r1   r   rS   rM   )r/   rO   retry_decoratorrV   s   `   rL   acompletion_with_retryrZ   S   sg      -c22O2 2 2 2 2 _2 ('11&111111111rN   _dictMapping[str, Any]default_classType[BaseMessageChunk]r   c                t   |                      d          }|                      d          p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ra   	assistantsystemra   r`   )getr   r   r   r   )r[   r]   r`   ra   s       rL   _convert_delta_to_message_chunkri   _   s     99VDii	""(bGv~~*;;; 1111			 ? ?g....			].@@@!'2222	 ."222d;;;;}W----rN   r   c                    | d         }|dk    rt          | d                   S |dk    r| d         pd}t          |          S |dk    rt          | d                   S t          | d         |          S )	Nr`   rc   ra   rd   re   rb   rf   rg   )r   r   r   r   )r[   r`   ra   s      rL   _convert_dict_to_messagerk   q   s    =Dv~~E)$45555				"(b))))			U9%566665#3$????rN   messagedictc                   t          | t                    r| j        | j        d}nt          | t                    rd| j        d}nxt          | t
                    rd| j        d}nXt          | t                    rd| j        d}n8t          | t                    rd| j        | j        d}nt          d|            d| j
        v r| j
        d         |d<   |S )	N)r`   ra   rc   re   rf   function)r`   namera   zGot unknown type rp   )
isinstancer   r`   ra   r   r   r   r   rp   
ValueErroradditional_kwargs)rl   message_dicts     rL   _convert_message_to_dictru   ~   s    ';'' 8 'II	G\	*	* 8 &7?CC	GY	'	' 8 +HH	G]	+	+ 	8 (W_EE	G_	-	- 8L
 
 6W66777***&8@VrN   c                     e Zd ZU dZedBd            ZedCd            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dDd                         ZedEd"            ZedFd#            ZdGd%ZdHd'ZdId+Z	 	 dJdKd3Z	 	 dJdLd5ZdMd7ZdNd:Z 	 	 dJdOd=Z!	 	 dJdPd>Z"edQd?            Z#edRdA            Z$dS )Sr0   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()
    r1   Dict[str, str]c                
    ddiS )Njinachat_api_keyJINACHAT_API_KEYrS   selfs    rL   
lc_secretszJinaChat.lc_secrets   s    "$677rN   boolc                    dS )z9Return whether this model can be serialized by Langchain.FrS   )clss    rL   is_lc_serializablezJinaChat.is_lc_serializable   s	     urN   Nr   rT   gffffff?floattemperature)default_factoryDict[str, Any]model_kwargszOptional[SecretStr]ry   z+Optional[Union[float, Tuple[float, float]]]request_timeout   intr@   F	streamingzOptional[int]
max_tokensT)populate_by_namebefore)modevaluesc           
        t          |           }|                    di           }t          |          D ]Y}||v rt          d| d          ||vr<t                              d| d| d| d           |                    |          ||<   Z|                    |                                          }|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$   rh   listrr   rG   warningpopintersectionkeys)r   r   all_required_field_namesextra
field_nameinvalid_model_kwargss         rL   build_extrazJinaChat.build_extra   s4    $<C#@#@ 

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

 
 	
rN   r2   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 r4   r>   )r|   r?   rJ   rK   s       rL   rM   z JinaChat._create_retry_decorator  s     #D$455!QK[QQQ'(<==)&,*?@@A)&,*IJJK *&,*EFFG *&,*NOO	P *&'/BB
 
 
 	
rN   rO   c                X                                       }|d fd            } |di |S )z*Use tenacity to retry the completion call.rO   r   r1   c                 (     j         j        di | S rR   )rT   create)rO   r|   s    rL   rV   z>JinaChat.completion_with_retry.<locals>._completion_with_retry  s    %4;%/////rN   rW   rS   rX   )r|   rO   rY   rV   s   `   rL   completion_with_retryzJinaChat.completion_with_retry  sU    6688		0 	0 	0 	0 	0 
	0 &%/////rN   llm_outputsList[Optional[dict]]rm   c                    i }|D ]A}||d         }|                                 D ]\  }}||v r||xx         |z  cc<   |||<    Bd|iS )Ntoken_usage)items)r|   r   overall_token_usageoutputr   kvs          rL   _combine_llm_outputszJinaChat._combine_llm_outputs   s    $&! 		/ 		/F~ /K#))++ / /1+++'***a/****-.'**	/
 233rN   messagesList[BaseMessage]r;   Optional[List[str]]run_manager"Optional[CallbackManagerForLLMRun]Iterator[ChatGenerationChunk]c              +  <  K   |                      ||          \  }}i ||ddi}t          } | j        d	d|i|D ]_}|d         d         d         }	t          |	|          }|j        }t          |          }
|r|                    |j        |
           |
V  `d S )
Nr   Tr   choicesr   deltarl   chunkrS   )_create_message_dictsr   r   ri   	__class__r    on_llm_new_tokenra   r|   r   r;   r   rO   message_dictsparamsdefault_chunk_classr   r   cg_chunks              rL   _streamzJinaChat._stream.  s       !% : :8T J Jv5F5f5h55,/T/QQQ&QQ 	 	E)$Q'0E3E;NOOE"'/*5999H L,,U](,KKKNNNN	 	rN   r!   c                    | j         r  | j        d|||d|}t          |          S |                     ||          \  }}i ||} | j        dd|i|}|                     |          S N)r   r;   r   r   rS   )r   r   r   r   r   _create_chat_result	r|   r   r;   r   rO   stream_iterr   r   responses	            rL   	_generatezJinaChat._generateB  s     > 	5&$, !+ IO K (444 $ : :8T J Jv%F%f%-4-OO}OOO''111rN   +Tuple[List[Dict[str, Any]], Dict[str, Any]]c                ~    t          | j                  }|d|v rt          d          ||d<   d |D             }||fS )Nr;   z2`stop` found in both the input and default params.c                ,    g | ]}t          |          S rS   )ru   ).0ms     rL   
<listcomp>z2JinaChat._create_message_dicts.<locals>.<listcomp>\  s!    GGG1!44GGGrN   )rm   _invocation_paramsrr   )r|   r   r;   r   r   s        rL   r   zJinaChat._create_message_dictsT  s[     d-.. !UVVV!F6NGGhGGGf$$rN   r   r\   c                    g }|d         D ]<}t          |d                   }t          |          }|                    |           =d|d         i}t          ||          S )Nr   rl   r   r   usage)generations
llm_output)rk   r   appendr!   )r|   r   r   resrl   genr   s          rL   r   zJinaChat._create_chat_result_  su    I& 	$ 	$C.s9~>>G 111Cs#####Xg%67
kjIIIIrN   'Optional[AsyncCallbackManagerForLLMRun]"AsyncIterator[ChatGenerationChunk]c               b  K   |                      ||          \  }}i ||ddi}t          }t          | fd|i| d {V 2 3 d {V }|d         d         d         }	t          |	|          }|j        }t          |          }
|r"|                    |j        |
           d {V  |
W V  l6 d S )	Nr   Tr   r   r   r   r   r   )r   r   rZ   ri   r   r    r   ra   r   s              rL   _astreamzJinaChat._astreamh  s9      !% : :8T J Jv5F5f5h55,!7"
 "
("
,2"
 "
 
 
 
 
 
 
 		 		 		 		 		 		 		% )$Q'0E3E;NOOE"'/*5999H R!225=2QQQQQQQQQNNNNN
 
 
s   B.c                   K   | j         r& | j        d|||d|}t          |           d {V S |                     ||          \  }}i ||}t	          | fd|i| d {V }|                     |          S r   )r   r   r   r   rZ   r   r   s	            rL   
_ageneratezJinaChat._agenerate~  s       > 	<'$- !+ IO K /{;;;;;;;;; $ : :8T J Jv%F%f%/WW}WPVWWWWWWWW''111rN   c                `    | 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)api_keyapi_basemodel)ry   get_secret_valuer   )r|   jinachat_credss     rL   r   zJinaChat._invocation_params  sH     , 9%66885	*
 *
 :.9D$899rN   strc                    dS )zReturn type of chat model.r   rS   r{   s    rL   	_llm_typezJinaChat._llm_type  s	     zrN   )r1   rw   )r1   r~   )r   r   r1   r   )r   r   r1   r   )r1   r   )r1   r2   rW   )r   r   r1   rm   )NN)
r   r   r;   r   r   r   rO   r   r1   r   )
r   r   r;   r   r   r   rO   r   r1   r!   )r   r   r;   r   r1   r   )r   r\   r1   r!   )
r   r   r;   r   r   r   rO   r   r1   r   )
r   r   r;   r   r   r   rO   r   r1   r!   )r1   r\   )r1   r   )%__name__
__module____qualname____doc__propertyr}   classmethodr   rT   __annotations__r   r'   rm   r   ry   r   r@   r   r   r&   model_configr)   r   r%   r   r   rM   r   r   r   r   r   r   r   r   r   r   rS   rN   rL   r0   r0      s           8 8 8 X8    [ FK+#(5#>#>#>L>>>>V,00000=CGOGGGGRK<I/ $J$$$$/:  L _(###   [ $#2    X. 
 
 
 X

 
 
 
*0 0 0 04 4 4 4" %):>	    . %):>	2 2 2 2 2$	% 	% 	% 	%J J J J %)?C	    2 %)?C	2 2 2 2 2$ : : : X:    X  rN   )r/   r0   r1   r2   )r/   r0   rO   r   r1   r   )r[   r\   r]   r^   r1   r   )r[   r\   r1   r   )rl   r   r1   rm   )@r   
__future__r   rH   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   rG   rM   rZ   ri   rk   ru   r0   rS   rN   rL   <module>r      s     " " " " " "                                          
                          S R R R R R R R R R            C B B B B B B B B B B B              
	8	$	$   ,	2 	2 	2 	2. . . .$
@ 
@ 
@ 
@   ,J J J J J} J J J J JrN   