
    Ng-K                    *   d Z ddlmZ ddlZddlZddl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mZ ddlZddlZddlmZmZ ddlmZ ddlmZmZmZ dd	l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+m,Z,m-Z- ddl.m/Z/ ddl.m0Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@Z@mAZAmBZB ddlCmDZD ddlEmFZF  ejG        eH          ZI G d deJ          ZK	 d=d>dZLd?d!ZMd@d#ZNdAd'ZOdBd+ZPdCd-ZQ G d. de          ZRdDd2ZSdEd5ZTdFd9ZUdGd<ZVdS )Hz!deepinfra.com chat models wrapper    )annotationsN)JSONDecodeError)AnyAsyncIteratorCallableDictIteratorListMappingOptionalSequenceTupleTypeUnion)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LanguageModelInput)BaseChatModelagenerate_from_streamgenerate_from_stream)create_base_retry_decorator)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkFunctionMessageFunctionMessageChunkHumanMessageHumanMessageChunkSystemMessageSystemMessageChunkToolMessage)ToolCall	tool_call)ChatGenerationChatGenerationChunk
ChatResult)Runnable)BaseToolget_from_dict_or_envconvert_to_openai_tool)	BaseModel
ConfigDictFieldmodel_validator)Self)Requestsc                      e Zd ZdZdS )ChatDeepInfraExceptionz9Exception raised when the DeepInfra API returns an error.N)__name__
__module____qualname____doc__     e/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/deepinfra.pyr8   r8   F   s        CCDr>   r8   llmChatDeepInfrarun_managerHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]returnCallable[[Any], Any]c                \    t          t          j        j        t          g| j        |          S )zLReturns a tenacity retry decorator, preconfigured to handle PaLM exceptions.)error_typesmax_retriesrB   )r   requests
exceptionsConnectTimeoutr8   rH   )r@   rB   s     r?   _create_retry_decoratorrL   L   s2     '(79OPO   r>   r'   dictr%   c                    | d                              dd          }	 t          j        | d         d                   }n# t          t          f$ r i }Y nw xY w|                      d          }t          |||          S )zw
    Convert a tool calling response from server to a ToolCall object.
    Args:
        tool_call:

    Returns:

    functionname 	argumentsid)rP   argsrS   )getjsonloadsr   	TypeErrorcreate_tool_call)r'   rP   rT   rS   s       r?   _parse_tool_callingrZ   Z   s     Z $$VR00Dz)J/<==Y'   	t		BDR8888s    ? AADict[str, Any]c                v    dt          j        | d                   | d         d|                     d          dS )zu
    Convert a ToolCall object to a tool calling request for server.
    Args:
        tool_call:

    Returns:

    rO   rT   rP   )rR   rP   rS   )typerO   rS   )rV   dumpsrU   r&   s    r?   _convert_to_tool_callingr_   l   sK     If$566f%
 
 mmD!!  r>   _dictMapping[str, Any]r   c                   | d         }|dk    rt          | d                   S |dk    rM|                     dd          pd}|                     dg           pg }d |D             }t          ||	          S |d
k    rt          | d                   S |dk    rt	          | d         | d                   S t          | d         |          S )Nroleusercontentre   	assistantrQ   
tool_callsc                ,    g | ]}t          |          S r=   rZ   .0r'   s     r?   
<listcomp>z,_convert_dict_to_message.<locals>.<listcomp>   s.     
 
 
/8	**
 
 
r>   re   rh   systemrO   rP   re   rP   re   rc   )r    rU   r   r"   r   r   )r`   rc   re   tool_calls_contentrh   s        r?   _convert_dict_to_messagers      s    =Dv~~E)$45555			))Ir**0b"YY|R88>B
 
<N
 
 

 Z@@@@			U9%56666			uY'7eFmLLLL5#3$????r>   default_classType[BaseMessageChunk]r   c                   |                      d          }|                      d          pd}|                      d          pg }|dk    s|t          k    rt          |          S |dk    s|t          k    rd |D             }t          ||	          S |d
k    s|t          k    rt          |          S |dk    s|t          k    rt	          || d                   S |s|t
          k    rt          ||          S  ||          S )Nrc   re   rQ   rh   rd   rf   rg   c                ,    g | ]}t          |          S r=   rj   rk   s     r?   rm   z3_convert_delta_to_message_chunk.<locals>.<listcomp>   s!    QQQ))44QQQr>   rn   ro   rO   rP   rp   rq   )rU   r!   r   r#   r   r   )r`   rt   rc   re   rh   s        r?   _convert_delta_to_message_chunkrx      s.    99VDii	""(bG<((.BJv~~*;;; 1111			 ? ?QQjQQQ
g*EEEE			].@@@!'2222			}0DDD#G%-HHHH	 ."222d;;;;}W----r>   messagec                .   t          | t                    r| j        | j        d}nt          | t                    rd| j        d}nt          | t
                    rd | j        D             }d| j        |d}nt          | t                    rd| j        d}ndt          | t                    rd| j        | j	        d}n>t          | t                    rd	| j        | j	        | j        d
}nt          d|            d| j        v r| j        d         |d<   |S )N)rc   re   rd   c                ,    g | ]}t          |          S r=   )r_   rk   s     r?   rm   z,_convert_message_to_dict.<locals>.<listcomp>   s.     
 
 
4=$Y//
 
 
r>   rg   )rc   re   rh   ro   rO   )rc   re   rP   tool)rc   re   rP   tool_call_idzGot unknown type rP   )
isinstancer   rc   re   r    r   rh   r"   r   rP   r$   r}   
ValueErroradditional_kwargs)ry   message_dictrh   s      r?   _convert_message_to_dictr      s^   ';'' 8 'II	G\	*	* 8 &7?CC	GY	'	' 8
 
AHAS
 
 

  $
 

 
G]	+	+ 8 (W_EE	G_	-	- 8L
 

 
G[	)	) 8L#0	
 
 6W66777***&8@Vr>   c                  n    e Zd ZU dZ edd          Zded<   	 dZded	<    ed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<   dZded<    ed          ZedPd             ZedPd!            Z	 dQdRd&Z	 dQdSd(Z ed)*          edTd-                        Z ed.*          dUd0            Z	 	 	 dVdWd8ZdXd;ZdYd=Z	 	 dZd[d?Z 	 	 dZd\dAZ!	 	 	 dVd]dBZ"edPdC            Z#ed^dD            Z$d_dHZ%d^dIZ&d`dJZ'dadKZ(db fdOZ) xZ*S )crA   z)A chat model that uses the DeepInfra API.zmeta-llama/Llama-2-70b-chat-hfmodel)defaultaliasstr
model_nameNOptional[str]deepinfra_api_tokentimeoutzOptional[float]request_timeout   temperature)default_factoryr[   model_kwargstop_pzOptional[int]top_kintn   
max_tokensFbool	streamingrH   T)populate_by_namerD   c                ^    | j         | j        | j        | j        | j        | j        d| j        S )z2Get the default parameters for calling OpenAI API.)r   r   streamr   r   r   )r   r   r   r   r   r   r   selfs    r?   _default_paramszChatDeepInfra._default_params   s@     _/n+#3
 
 
 	
r>   c                    i | j         S )z.Get the parameters used for the openai client.)r   r   s    r?   _client_paramszChatDeepInfra._client_params   s     ($&''r>   rB   "Optional[CallbackManagerForLLMRun]kwargsr   c                R     t           |          }|d fd            } |di |S )z*Use tenacity to retry the completion call.rB   r   r   rD   c                 x   	 |                      d          }t                                                    }|                                                                        |           |          }                    |j        |j                   |S # t          $ r}t          d|            d }~ww xY wNr   headersurldatar   EX)popr6   _headerspost_url_body_handle_statusstatus_codetext	Exceptionprintr   r   requestresponseer   s        r?   _completion_with_retryzCChatDeepInfra.completion_with_retry.<locals>._completion_with_retry  s    
"(**->"?"?"4==??;;;"<<		$**V*<*<o (   ##H$8(-HHH   dAs   BB 
B9#B44B9r   r   rD   r   r=   rL   r   rB   r   retry_decoratorr   s   `    r?   completion_with_retryz#ChatDeepInfra.completion_with_retry   sX     2$KPPP		 	 	 	 	 
	 &%/////r>   'Optional[AsyncCallbackManagerForLLMRun]c                b    K   t           |          }|d fd            } |di | d{V S )	z0Use tenacity to retry the async completion call.r   r   r   rD   c                   K   	 |                      d          }t                                                    }|                                                                        |           |          4 d {V 	 }                    |j        |j                   |	                                 d {V cd d d           d {V  S # 1 d {V swxY w Y   d S # t          $ r}t          d|            d }~ww xY wr   )r   r6   r   apostr   r   r   statusr   rV   r   r   r   s        r?   r   zDChatDeepInfra.acompletion_with_retry.<locals>._completion_with_retry  s     
"(**->"?"?"4==??;;;"==		$**V*<*<o )   1 1 1 1 1 1 1 1''GGG!)000000	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    dAs<   A:C   :C:C  
CC  CC   
D *C;;D Nr   r=   r   r   s   `    r?   acompletion_with_retryz$ChatDeepInfra.acompletion_with_retry  sn       2$KPPP		 	 	 	 	 
	 ,+55f555555555r>   before)modevaluesr   c                X    t          |ddd          }t          |dd|          |d<   |S )zGValidate api key, python package exists, temperature, top_p, and top_k.deepinfra_api_keyDEEPINFRA_API_KEYrQ   )r   r   DEEPINFRA_API_TOKENr-   )clsr   api_keys      r?   init_defaultszChatDeepInfra.init_defaults)  sS    
 '	
 
 
 )=!!	)
 )
 )
$% r>   afterr5   c                    | j         #d| j         cxk    rdk    sn t          d          | j        #d| j        cxk    rdk    sn t          d          | j        | j        dk    rt          d          | S )Nr   r   z+temperature must be in the range [0.0, 1.0]z%top_p must be in the range [0.0, 1.0]ztop_k must be positive)r   r   r   r   r   s    r?   validate_environmentz"ChatDeepInfra.validate_environment<  s    'T5E0J0J0J0J0J0J0J0JJKKK:!!tz*>*>*>*>Q*>*>*>*>DEEE:!djAoo5666r>   messagesList[BaseMessage]stopOptional[List[str]]r   Optional[bool]r*   c                   ||n| j         }|r  | j        |f||d|}t          |          S |                     ||          \  }}	i |	|}	 | j        d||d|	}
|                     |
                                          S )Nr   rB   r   rB   r=   )r   _streamr   _create_message_dictsr   _create_chat_resultrV   )r   r   r   rB   r   r   should_streamstream_itermessage_dictsparamsr   s              r?   	_generatezChatDeepInfra._generateI  s     #)"4$. 	5&$,# @F K (444 $ : :8T J Jv%F%f%-4- 
"
 
?E
 
 ''888r>   r   ra   c           	     :   g }|d         D ]^}t          |d                   }t          |t          |                    d                              }|                    |           _|                    di           }|| j        d}t          ||          }|S )	Nchoicesry   finish_reason)r   ry   generation_infousage)token_usager   )generations
llm_output)rs   r(   rM   rU   appendr   r*   )r   r   r   resry   genr   r   s           r?   r   z!ChatDeepInfra._create_chat_result_  s    I& 	$ 	$C.s9~>>G  $377?3K3K L L L  C s####ll7B//%04?KK
[ZHHH
r>   +Tuple[List[Dict[str, Any]], Dict[str, Any]]c                d    | 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 r=   )r   )rl   ms     r?   rm   z7ChatDeepInfra._create_message_dicts.<locals>.<listcomp>u  s!    GGG1!44GGGr>   )r   r   )r   r   r   r   r   s        r?   r   z#ChatDeepInfra._create_message_dictsm  sS     $ !UVVV!F6NGGhGGGf$$r>   Iterator[ChatGenerationChunk]c              +  Z  K   |                      ||          \  }}i ||ddi} | j        d||d|}t          |                                          D ]S}t	          |          }	|	r@t          |	d           }
|r)|                    t          |	j                  |
           |
V  Td S )Nr   Tr   r   chunkr=   )	r   r   _parse_stream
iter_lines_handle_sse_liner)   on_llm_new_tokenr   re   )r   r   r   rB   r   r   r   r   liner   cg_chunks              r?   r   zChatDeepInfra._streamx  s       !% : :8T J Jv5F5f5h55-4- 
"
 
?E
 
 "("5"5"7"788 	 	D$T**E .udSSS U00U]1C1C80TTT	 	r>   "AsyncIterator[ChatGenerationChunk]c               z  K   |                      ||          \  }}|dd||}|                    d          }t          |                                           }|                    |                                 |                     |          |          4 d {V 	 }	t          |	j                  2 3 d {V }
t          |
          }|rGt          |d           }|r/|                    t          |j                  |           d {V  |W V  `6 	 d d d           d {V  d S # 1 d {V swxY w Y   d S )NT)r   r   r   r   r   r   r   )r   r   r6   r   r   r   r   _parse_stream_asyncre   r   r)   r   r   )r   r   r   rB   r   r   r   r   r   r   r   r   r   s                r?   _astreamzChatDeepInfra._astream  s      !% : :8T J Jv+tPPvPP **%6774==??333==		$**V"4"4o ! 
 
 	# 	# 	# 	# 	# 	# 	# 	#1(2BCC # # # # # # #d(.. #25RVWWWH" )::..h ;          #NNNN DC	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s    D*5D;AD**
D47D4c                  K   ||n| j         }|r& | j        |f||d|}t          |           d {V S |                     ||          \  }}	d|i|	|}	 | j        dd|i|	 d {V }
|                     |
          S )Nr   r   rB   r=   )r   r  r   r   r   r   )r   r   r   rB   r   r   r   r   r   r   r   s              r?   
_ageneratezChatDeepInfra._agenerate  s       #)"4$. 	<'$-# @F K /{;;;;;;;;; $ : :8T J Jvm@v@@/D/RRKR6RRRRRRRR'',,,r>   c                D    | j         | j        | j        | j        | j        dS )zGet the identifying parameters.)r   r   r   r   r   )r   r   r   r   r   r   s    r?   _identifying_paramsz!ChatDeepInfra._identifying_params  s-     _+ZZ
 
 	
r>   c                    dS )Nzdeepinfra-chatr=   r   s    r?   	_llm_typezChatDeepInfra._llm_type  s    r>   coder   Nonec                    |dk    rt          d| d|           |dk    rt          d|           |dk    rt          d| d|           d S )Ni  zDeepInfra Server error status z: i  z'DeepInfra received an invalid payload:    z6DeepInfra returned an unexpected response with status )r8   r   r   )r   r  r   s      r?   r   zChatDeepInfra._handle_status  s    3;;(?????   S[[MtMMNNNS[["" "" "   [r>   c                    dS )Nz:https://stage.api.deepinfra.com/v1/openai/chat/completionsr=   r   s    r?   r   zChatDeepInfra._url  s    KKr>   c                    d| j          ddS )Nzbearer zapplication/json)AuthorizationzContent-Type)r   r   s    r?   r   zChatDeepInfra._headers  s"    At'?AA.
 
 	
r>   c                    |S Nr=   )r   r   s     r?   r   zChatDeepInfra._body  s    r>   toolsDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]])Runnable[LanguageModelInput, BaseMessage]c                R    d |D             } t                      j        dd|i|S )a3  Bind tool-like objects to this chat model.

        Assumes model is compatible with OpenAI tool-calling API.

        Args:
            tools: A list of tool definitions to bind to this chat model.
                Can be  a dictionary, pydantic model, callable, or BaseTool. Pydantic
                models, callables, and BaseTools will be automatically converted to
                their schema dictionary representation.
            **kwargs: Any additional parameters to pass to the
                :class:`~langchain.runnable.Runnable` constructor.
        c                ,    g | ]}t          |          S r=   r/   )rl   r|   s     r?   rm   z,ChatDeepInfra.bind_tools.<locals>.<listcomp>  s!    JJJD1$77JJJr>   r  r=   )superbind)r   r  r   formatted_tools	__class__s       r?   
bind_toolszChatDeepInfra.bind_tools  s:    $ KJEJJJuww|<</<V<<<r>   )rD   r[   r  )rB   r   r   r   rD   r   )rB   r   r   r   rD   r   )r   r   rD   r   )rD   r5   )NNN)r   r   r   r   rB   r   r   r   r   r   rD   r*   )r   ra   rD   r*   )r   r   r   r   rD   r   )NN)
r   r   r   r   rB   r   r   r   rD   r   )
r   r   r   r   rB   r   r   r   rD   r   )r   r   r   r   rB   r   r   r   r   r   rD   r*   )rD   r   )r  r   r   r   rD   r	  )rD   r   )r   r   rD   r   )r  r  r   r   rD   r  )+r9   r:   r;   r<   r3   r   __annotations__r   r   r   rM   r   r   r   r   r   r   rH   r2   model_configpropertyr   r   r   r   r4   classmethodr   r   r   r   r   r   r  r  r  r  r   r   r   r   r  __classcell__)r  s   @r?   rA   rA      s        33 e$DGTTTJTTTT)-----',uT'K'K'KOKKKK#$K$$$$#(5#>#>#>L>>>>!E!!!!XEAJJJJIJIK:  L 

 

 

 X

 ( ( ( X(
 AE0 0 0 0 00 @D6 6 6 6 60 _(###   [ $#" _'"""
 
 
 #"
 %):>!%9 9 9 9 9,   	% 	% 	% 	% %):>	    0 %)?C	# # # # #8 %)?C!%- - - - -* 
 
 
 X
       X    L L L L
 
 
 
   = = = = = = = = = =r>   rbodyIterator[bytes]Iterator[str]c              #  >   K   | D ]}t          |          }||V  d S r  _parse_stream_helperr   r   _lines      r?   r   r     s<        $T**KKK r>   aiohttp.StreamReaderAsyncIterator[str]c               L   K   | 2 3 d {V }t          |          }||W V  6 d S r  r$  r&  s      r?   r   r      sV             d$T**KKKK ees   #r   bytesr   c                   | r|                      d          rs|                      d          r| t          d          d          } n| t          d          d          } |                                 dk    rd S |                     d          S d S )Ns   data:s   data: s   [DONE]zutf-8)
startswithlenstripdecode)r   s    r?   r%  r%    s     ()) (??9%% 	)I(()DDH(D::<<9$$ 4;;w'''4r>   r   Optional[BaseMessageChunk]c                    	 t          j        |           }t          }|                    di g          d                             di           }t	          ||          S # t
          $ r Y d S w xY w)Nr   r   delta)rV   rW   r   rU   rx   r   )r   objdefault_chunk_classr3  s       r?   r   r     sy    j,	B4((+//<<.u6IJJJ   tts   AA 
A,+A,r  )r@   rA   rB   rC   rD   rE   )r'   rM   rD   r%   )r'   r%   rD   r[   )r`   ra   rD   r   )r`   ra   rt   ru   rD   r   )ry   r   rD   rM   )r   r!  rD   r"  )r   r(  rD   r)  )r   r+  rD   r   )r   r   rD   r1  )Wr<   
__future__r   rV   loggingr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   aiohttprI    langchain_core.callbacks.managerr   r   langchain_core.language_modelsr   *langchain_core.language_models.chat_modelsr   r   r   #langchain_core.language_models.llmsr   langchain_core.messagesr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   langchain_core.messages.toolr%   r'   rY   langchain_core.outputsr(   r)   r*   langchain_core.runnablesr+   langchain_core.toolsr,   langchain_core.utilsr.   %langchain_core.utils.function_callingr0   pydanticr1   r2   r3   r4   typing_extensionsr5   &langchain_community.utilities.requestsr6   	getLoggerr9   loggerr   r8   rL   rZ   r_   rs   rx   r   rA   r   r   r%  r   r=   r>   r?   <module>rJ     s4   ' ' " " " " " "                                                   > = = = = =         
 L K K K K K                              2 1 1 1 1 1 F F F F F F         
 . - - - - - ) ) ) ) ) ) 5 5 5 5 5 5 H H H H H H B B B B B B B B B B B B " " " " " " ; ; ; ; ; ;		8	$	$	 	 	 	 	Y 	 	 	 		    9 9 9 9$   &@ @ @ @&. . . .,! ! ! !Hj= j= j= j= j=M j= j= j=Z	               r>   