
    7|hK                    6   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j                  eH      ZI G d deJ      ZK	 d#	 	 	 	 	 d$dZLd%dZMd&dZNd'dZO	 	 	 	 	 	 d(dZPd)dZQ G d de      ZRd*dZSd+d ZTd,d!ZUd-d"ZVy).z!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y)ChatDeepInfraExceptionz9Exception raised when the DeepInfra API returns an error.N)__name__
__module____qualname____doc__     h/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/chat_models/deepinfra.pyr7   r7   F   s    Cr=   r7   ChatDeepInfrac                n    t        t        j                  j                  t        g| j
                  |      S )zLReturns a tenacity retry decorator, preconfigured to handle PaLM exceptions.)error_typesmax_retriesrun_manager)r   requests
exceptionsConnectTimeoutr7   rB   )llmrC   s     r>   _create_retry_decoratorrH   L   s0     '((779OPOO r=   c                    | d   j                  dd      }	 t        j                  | d   d         }| j                  d      }t        |||      S # t        t        f$ r i }Y 2w xY w)zw
    Convert a tool calling response from server to a ToolCall object.
    Args:
        tool_call:

    Returns:

    functionname 	argumentsid)rK   argsrN   )getjsonloadsr   	TypeErrorcreate_tool_call)r'   rK   rO   rN   s       r>   _parse_tool_callingrU   Z   sr     Z $$VR0Dzz)J/<= 
t	BDR88 Y' s   A A%$A%c                d    dt        j                  | d         | d   d| j                  d      dS )zu
    Convert a ToolCall object to a tool calling request for server.
    Args:
        tool_call:

    Returns:

    rJ   rO   rK   )rM   rK   rN   )typerJ   rN   )rQ   dumpsrP   r&   s    r>   _convert_to_tool_callingrY   l   s=     If$56f%
 mmD! r=   c                b   | d   }|dk(  rt        | d         S |dk(  rQ| j                  dd      xs d}| j                  dg       xs g }|D cg c]  }t        |       }}t        ||      S |d	k(  rt	        | d         S |d
k(  rt        | d   | d         S t        | d   |      S c c}w )Nroleusercontentr]   	assistantrL   
tool_callsr]   r`   systemrJ   rK   r]   rK   r]   r[   )r    rP   rU   r   r"   r   r   )_dictr[   r]   tool_calls_contentr'   r`   s         r>   _convert_dict_to_messagerg      s    =Dv~E)$455		))Ir*0b"YY|R8>B<N
/8	*

 
 Z@@		U9%566		uY'7eFmLL5#3$??
s   B,c                   | j                  d      }| j                  d      xs d}| j                  d      xs g }|dk(  s	|t        k(  rt        |      S |dk(  s	|t        k(  r%|D cg c]  }t        |       }}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 c c}w )Nr[   r]   rL   r`   r\   r^   r_   ra   rb   rJ   rK   rc   rd   )rP   r!   r   rU   r#   r   r   )re   default_classr[   r]   r`   r'   s         r>   _convert_delta_to_message_chunkrj      s     99VDii	"(bG<(.BJv~*;; 11		 ?FPQ))4Q
Qg*EE		].@@!'22		}0DD#G%-HH	"22d;;W-- Rs   (C"c                   t        | t              r| j                  | j                  d}nt        | t              rd| j                  d}nt        | t
              r3| j                  D cg c]  }t        |       }}d| j                  |d}nt        | t              rd| j                  d}not        | t              rd| j                  | j                  d}nDt        | t              r&d| j                  | j                  | j                  d	}nt        d
|        d| j                  v r| j                  d   |d<   |S c c}w )N)r[   r]   r\   r_   )r[   r]   r`   rb   rJ   )r[   r]   rK   tool)r[   r]   rK   tool_call_idzGot unknown type rK   )
isinstancer   r[   r]   r    r   r`   rY   r"   r   rK   r$   rm   
ValueErroradditional_kwargs)messagemessage_dictr'   r`   s       r>   _convert_message_to_dictrs      s(   ';' 'I	G\	* &7??C	GY	'AHASAS
4=$Y/

 
  $

 
G]	+ (W__E	G_	-LL

 
G[	)LL#00	
 ,WI677***&88@V7
s   )D?c                      e Zd ZU dZ edd      Zd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d7d!       Zed7d"       Z	 d8	 	 	 	 	 d9d#Z	 d8	 	 	 	 	 d:d$Z ed%&      ed;d'              Z ed(&      d<d)       Z	 	 	 d=	 	 	 	 	 	 	 	 	 	 	 d>d*Zd?d+Z	 	 	 	 	 	 d@d,Z 	 	 dA	 	 	 	 	 	 	 	 	 dBd-Z!	 	 dA	 	 	 	 	 	 	 	 	 dCd.Z"	 	 	 d=	 	 	 	 	 	 	 	 	 	 	 dDd/Z#ed7d0       Z$edEd1       Z%dFd2Z&dEd3Z'dGd4Z(dHd5Z)	 	 	 	 	 	 dI fd6Z* xZ+S )Jr?   z)A chat model that uses the DeepInfra API.zmeta-llama/Llama-2-70b-chat-hfmodel)defaultaliasstr
model_namez4https://api.deepinfra.com/v1/openai/chat/completionsurlNOptional[str]deepinfra_api_tokentimeoutzOptional[float]request_timeout   temperature)default_factoryDict[str, Any]model_kwargstop_pzOptional[int]top_kintn   
max_tokensFbool	streamingrB   T)populate_by_namec                    | j                   | j                  | j                  | j                  | j                  | j
                  d| j                  S )z2Get the default parameters for calling OpenAI API.)ru   r   streamr   r   r~   )ry   r   r   r   r   r~   r   selfs    r>   _default_paramszChatDeepInfra._default_params   sL     __//nn++#3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=   c                D     t         |      }|d fd       } |di |S )z*Use tenacity to retry the completion call.rC   c                 J   	 | j                  d      }t        j                               }|j                  j	                         j                  |       |      }j                  |j                  |j                         |S # t        $ r}t        d|        d }~ww xY wNr~   headersrz   datar}   EX)popr5   _headerspost_url_body_handle_statusstatus_codetext	Exceptionprintkwargsr~   requestresponseer   s        r>   _completion_with_retryzCChatDeepInfra.completion_with_retry.<locals>._completion_with_retry  s    
"(**->"?"4==?;"<<		$**V*<o (  ##H$8$8(--H dAs   BB 	B"BB"r   r   returnr   r<   rH   r   rC   r   retry_decoratorr   s   `    r>   completion_with_retryz#ChatDeepInfra.completion_with_retry   s3     2$KP		 
	 &///r=   c                `    K   t         |      }|d fd       } |di | d{   S 7 w)z0Use tenacity to retry the async completion call.r   c                   K   	 | j                  d      }t        j                               }|j                  j	                         j                  |       |      4 d {   }j                  |j                  |j                          d {          |j                          d {   cd d d       d {    S 7 _7 37 7 # 1 d {  7  sw Y   y xY w# t        $ r}t        d|        d }~ww xY wwr   )r   r5   r   apostr   r   r   statusr   rQ   r   r   r   s        r>   r   zDChatDeepInfra.acompletion_with_retry.<locals>._completion_with_retry  s     
"(**->"?"4==?;"==		$**V*<o )  1 1''x}}9NO!)0	1 1 1 :O0	1 1 1 1
  dAs   D A C" %C&C" )*CCC/C	0C3C" ?C C" D C" C	CC" CCCC" D C" "	C=+C88C==D Nr   r<   r   r   s   `    r>   acompletion_with_retryz$ChatDeepInfra.acompletion_with_retry  s=      2$KP		 
	 ,5f5555s   $.,.before)modec                H    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_KEYrL   )rv   r|   DEEPINFRA_API_TOKENr-   )clsvaluesapi_keys      r>   init_defaultszChatDeepInfra.init_defaults.  s?    
 '	
 )=!!	)
$% r=   afterc                2   | j                   ,d| j                   cxk  rdk  st        d       t        d      | j                  ,d| j                  cxk  rdk  st        d       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   ro   r   r   r   s    r>   validate_environmentz"ChatDeepInfra.validate_environmentA  s    'T5E5E0J0JJKK 1KJKK::!!tzz*>Q*>DEE +?DEE::!djjAo566r=   c                   ||n| j                   }|r! | j                  |f||d|}t        |      S | j                  ||      \  }}	i |	|}	 | j                  d||d|	}
| j                  |
j                               S )NstoprC   messagesrC   r<   )r   _streamr   _create_message_dictsr   _create_chat_resultrQ   )r   r   r   rC   r   r   should_streamstream_itermessage_dictsparamsr   s              r>   	_generatezChatDeepInfra._generateN  s     #)"4$..&$,,#@FK (44 $ : :8T Jv%F%f%-4-- 
"
?E
 ''88r=   c           	        g }|d   D ]G  }t        |d         }t        |t        |j                  d                  }|j	                  |       I |j                  di       }|| j
                  d}t        ||      }|S )	Nchoicesrq   finish_reason)r   rq   generation_infousage)token_usageru   )generations
llm_output)rg   r(   dictrP   appendry   r*   )r   r   r   resrq   genr   r   s           r>   r   z!ChatDeepInfra._create_chat_resultd  s    I& 	$C.s9~>G  $377?3K LC s#	$ ll7B/%04??K
[ZH
r=   c                    | j                   }|d|v rt        d      ||d<   |D cg c]  }t        |       }}||fS c c}w )Nr   z2`stop` found in both the input and default params.)r   ro   rs   )r   r   r   r   mr   s         r>   r   z#ChatDeepInfra._create_message_dictsr  s\     $$ !UVV!F6N>FG1!4GGf$$ Hs   ?c              +  >  K   | j                  ||      \  }}i ||ddi} | j                  d||d|}t        |j                               D ]I  }t	        |      }	|	st        |	d       }
|r&|j                  t        |	j                        |
       |
 K y w)Nr   Tr   r   chunkr<   )	r   r   _parse_stream
iter_lines_handle_sse_liner)   on_llm_new_tokenrx   r]   )r   r   r   rC   r   r   r   r   liner   cg_chunks              r>   r   zChatDeepInfra._stream}  s      !% : :8T Jv5F5f5h5-4-- 
"
?E
 "("5"5"78 	D$T*E.udS00U]]1C80T	s   AB!<Bc               J  K   | j                  ||      \  }}|dd||}|j                  d      }t        | j                               }|j	                  | j                         | j                  |      |      4 d {   }	t        |	j                        2 3 d {   }
t        |
      }|st        |d       }|r.|j                  t        |j                        |       d {    | Z7 s7 W7 6 d d d       d {  7   y # 1 d {  7  sw Y   y xY ww)NT)r   r   r~   r   r   r   r   )r   r   r5   r   r   r   r   _parse_stream_asyncr]   r   r)   r   rx   )r   r   r   rC   r   r   r   r~   r   r   r   r   r   s                r>   _astreamzChatDeepInfra._astream  s      !% : :8T Jv+tPvPP **%674==?3==		$**V"4o ! 
 	# 	#1(2B2BC # #d(.25RVWH")::.h ;    #N	##
 D	# 	# 	# 	# 	#s   A?D#C5D#DC;C7 C;#D28D*C9+
D5D#7C;9D;D<D#D
D#D DD D#c                  K   ||n| j                   }|r) | j                  |f||d|}t        |       d {   S | j                  ||      \  }}	d|i|	|}	 | j                  dd|i|	 d {   }
| j                  |
      S 7 N7 w)Nr   r   rC   r<   )r   r   r   r   r   r   )r   r   r   rC   r   r   r   r   r   r   r   s              r>   
_ageneratezChatDeepInfra._agenerate  s      #)"4$..'$--#@FK /{;;; $ : :8T Jvm@v@@/D//RKR6RR'',, <
 Ss!   7BB8B2B
3B
Bc                v    | j                   | j                  | j                  | j                  | j                  dS )zGet the identifying parameters.)ru   r   r   r   r   )ry   r   r   r   r   r   s    r>   _identifying_paramsz!ChatDeepInfra._identifying_params  s3     __++ZZZZ
 	
r=   c                     y)Nzdeepinfra-chatr<   r   s    r>   	_llm_typezChatDeepInfra._llm_type  s    r=   c                    |dk\  rt        d| d|       |dk\  rt        d|       |dk7  rt        d| d|       y )Ni  zDeepInfra Server error status z: i  z'DeepInfra received an invalid payload:    z6DeepInfra returned an unexpected response with status )r7   ro   r   )r   coder   s      r>   r   zChatDeepInfra._handle_status  sm    3;(0b?  S[FtfMNNS[HbQUPVW  r=   c                    | j                   S N)rz   r   s    r>   r   zChatDeepInfra._url  s    xxr=   c                &    d| j                    ddS )Nzbearer zapplication/json)AuthorizationzContent-Type)r|   r   s    r>   r   zChatDeepInfra._headers  s     &t'?'?&@A.
 	
r=   c                    |S r   r<   )r   r   s     r>   r   zChatDeepInfra._body  s    r=   c                `    |D cg c]  }t        |       }}t        |   dd|i|S c c}w )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.
        toolsr<   )r/   superbind)r   r   r   rl   formatted_tools	__class__s        r>   
bind_toolszChatDeepInfra.bind_tools  s=    $ EJJD1$7JJw|</<V<< Ks   +)r   r   r   )rC   "Optional[CallbackManagerForLLMRun]r   r   r   r   )rC   'Optional[AsyncCallbackManagerForLLMRun]r   r   r   r   )r   r   r   r   )r   r4   )NNN)r   List[BaseMessage]r   Optional[List[str]]rC   r  r   Optional[bool]r   r   r   r*   )r   Mapping[str, Any]r   r*   )r   r  r   r  r   z+Tuple[List[Dict[str, Any]], Dict[str, Any]])NN)
r   r  r   r  rC   r  r   r   r   zIterator[ChatGenerationChunk])
r   r  r   r  rC   r  r   r   r   z"AsyncIterator[ChatGenerationChunk])r   r  r   r  rC   r  r   r  r   r   r   r*   )r   rx   )r   r   r   r   r   None)r   r   )r   r   r   r   )r   zDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]]r   r   r   z)Runnable[LanguageModelInput, BaseMessage]),r8   r9   r:   r;   r2   ry   __annotations__rz   r|   r~   r   r   r   r   r   r   r   r   rB   r1   model_configpropertyr   r   r   r   r3   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  __classcell__)r   s   @r>   r?   r?      s    3 $DGTJTECE&)--',T'KO_K#$K$#(#>L.>Q!E?!XE=AsJIJItKL 

 

 ( (
 AE0=0PS0	00 @D6<6 6 
	60 (#  $" '"
 #
 %):>!%9#9 "9 8	9
 9 9 
9,	%)	%1D	%	4	% %):>	# " 8	
  
'0 %)?C	### "# =	#
 # 
,#8 %)?C!%-#- "- =	-
 - - 
-* 
 
    

=S= = 
3	= =r=   c              #  >   K   | D ]  }t        |      }||  y wr   _parse_stream_helperrbodyr   _lines      r>   r   r     s*      $T*Ks   c               P   K   | 2 3 d {   }t        |      }|| 7 6 y wr   r  r  s      r>   r   r     s2       d$T*Kes    &$"$&&$&c                    | rd| j                  d      rS| j                  d      r| t        d      d  } n| t        d      d  } | j                         dk(  ry | j                  d      S y )Ns   data:s   data: s   [DONE]zutf-8)
startswithlenstripdecode)r   s    r>   r  r    sb    )??9%I()DH(D::<9$ ;;w''r=   c                    	 t        j                  |       }t        }|j                  di g      d   j                  di       }t	        ||      S # t
        $ r Y y w xY w)Nr   r   delta)rQ   rR   r   rP   rj   r   )r   objdefault_chunk_classr  s       r>   r   r     s_    jj,	B4(+//<.u6IJJ s   AA 	AAr   )rG   r?   rC   zHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]r   zCallable[[Any], Any])r'   r   r   r%   )r'   r%   r   r   )re   r  r   r   )re   r  ri   zType[BaseMessageChunk]r   r   )rq   r   r   r   )r  zIterator[bytes]r   zIterator[str])r  zaiohttp.StreamReaderr   zAsyncIterator[str])r   bytesr   r{   )r   rx   r   zOptional[BaseMessageChunk])Wr;   
__future__r   rQ   loggingr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   aiohttprD    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'   rT   langchain_core.outputsr(   r)   r*   langchain_core.runnablesr+   langchain_core.toolsr,   langchain_core.utilsr.   %langchain_core.utils.function_callingr/   pydanticr0   r1   r2   r3   typing_extensionsr4   &langchain_community.utilities.requestsr5   	getLoggerr8   loggerr   r7   rH   rU   rY   rg   rj   rs   r?   r   r   r  r   r<   r=   r>   <module>r3     s$   ' "          > 
 L    2 F 
 . ) 5 H B B " ;			8	$	Y 	 			
 9$&@&..-C..,!Hn=M n=b	 r=   