
    7|hT                       d Z ddlmZ ddl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mZm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+m,Z,m-Z- dd
l.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z: ddl;m<Z<m=Z=  ej|                  e?      Z@ G d deA      ZB	 d	 	 	 	 	 ddZCddZD	 d	 	 	 	 	 	 	 ddZE	 	 	 	 	 	 ddZFd dZGd!dZHg dZI G d de      ZJy)"z+Wrapper around LiteLLM's model I/O library.    )annotationsN)AnyAsyncIteratorCallableDictIteratorListLiteral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ToolCallToolCallChunkToolMessage)ChatGenerationChatGenerationChunk
ChatResult)Runnable)BaseTool)get_from_dict_or_envpre_init)convert_to_openai_tool)	BaseModelFieldc                      e Zd ZdZy)ChatLiteLLMExceptionz$Error with the `LiteLLM I/O` libraryN)__name__
__module____qualname____doc__     f/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/chat_models/litellm.pyr2   r2   A   s    .r8   r2   ChatLiteLLMc                    ddl }|j                  |j                  |j                  |j                  g}t        || j                  |      S )zKReturns a tenacity retry decorator, preconfigured to handle PaLM exceptionsr   N)error_typesmax_retriesrun_manager)litellmTimeoutAPIErrorAPIConnectionErrorRateLimitErrorr   r=   )llmr>   r?   errorss       r9   _create_retry_decoratorrF   E   sL      	""	F '[ r8   c                v   | d   }|dk(  rt        | d         S |dk(  r`| j                  dd      xs d}i }| j                  d      rt        | d         |d<   | j                  d      r| d   |d<   t        ||	      S |d
k(  rt	        | d         S |dk(  rt        | d   | d         S t        | d   |      S )NroleusercontentrJ   	assistant function_call
tool_calls)rJ   additional_kwargssystemfunctionnamerJ   rS   rJ   rH   )r    getdictr   r"   r   r   )_dictrH   rJ   rP   s       r9   _convert_dict_to_messagerY   Y   s    =Dv~E)$455		 ))Ir*0b99_%15eO6L1Mo.99\".3L.Al+<MNN		U9%566		uY'7eFmLL5#3$??r8   c                `    K   t         |      }|d fd       } |di | d{   S 7 w)z0Use tenacity to retry the async completion call.r>   c                 X   K    j                   j                  di |  d {   S 7 wNr7   )clientacreate)kwargsrD   s    r9   _completion_with_retryz6acompletion_with_retry.<locals>._completion_with_retryz   s)      (SZZ''1&1111s    *(*Nr`   r   returnr   r7   rF   )rD   r>   r`   retry_decoratorra   s   `    r9   acompletion_with_retryrf   r   s=      .c{KO2 2 (1&1111s   $.,.c           
        | j                  d      }| j                  d      xs d}| j                  d      rdt        | d         i}ni }g }| j                  d      x}rX||d<   	 |D cg c]G  }t        |d   j                  d      |d   j                  d      |j                  d	      |d
         I }}|dk(  s	|t        k(  rt	        |      S |dk(  s	|t
        k(  r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 # t        $ r Y w xY w)NrH   rJ   rM   rN   rO   rR   rS   	argumentsidindex)rS   argsri   rj   rI   rK   rL   )rJ   rP   tool_call_chunksrQ   rT   rU   )	rV   rW   r%   KeyErrorr!   r   r#   r   r   )rX   default_classrH   rJ   rP   rl   raw_tool_callsrtcs           r9   _convert_delta_to_message_chunkrq      s    99VDii	"(bGyy!,d53I.JK<00~0*8,'	 *   Z,,V4Z,,[9wwt}g,	    v~*;; 11		 ?/-
 	

 
	].@@!'22		}0DD#G%-HH	"22d;;W--7   		s%   &E *AE6E E 	EEc                L    d| d   | d   t        j                  | d         ddS )NrR   ri   rS   rk   )rS   rh   )typeri   rR   )jsondumps)	tool_calls    r9   !_lc_tool_call_to_openai_tool_callrw      s4    of%If$56
 r8   c                   d| j                   i}t        | t              r| j                  |d<   nt        | t              rd|d<   nt        | t
              ryd|d<   d| j                  v r| j                  d   |d<   | j                  r'| j                  D cg c]  }t        |       c}|d<   nd| j                  v r| j                  d   |d<   nnt        | t              rd|d<   nXt        | t              rd|d<   | j                  |d	<   n3t        | t              rd
|d<   | j                  |d<   nt        d|        d	| j                  v r| j                  d	   |d	<   |S c c}w )NrJ   rH   rI   rL   rN   rO   rQ   rR   rS   tooltool_call_idzGot unknown type )rJ   
isinstancer   rH   r    r   rP   rO   rw   r"   r   rS   r&   rz   
ValueError)messagemessage_dicttcs      r9   _convert_message_to_dictr      sb   $-w#?L';'&||V	G\	*%V	GY	'*Vg777,3,E,Eo,VL)@G@R@R*:<1"5*L& W666)0)B)B<)PL&	G]	+'V	G_	-)V&||V	G[	)%V'.';';^$,WI677***&88@V#*s   E)zo1-miniz
o1-previewzgpt-4o-minizgpt-4o-mini-2024-07-18zgpt-4ozgpt-4o-2024-08-06zgpt-4o-2024-05-13zgpt-4-turbozgpt-4-turbo-previewzgpt-4-0125-previewzgpt-4-1106-previewzgpt-3.5-turbo-1106gpt-3.5-turbozgpt-3.5-turbo-0301zgpt-3.5-turbo-0613zgpt-3.5-turbo-16kzgpt-3.5-turbo-16k-0613zgpt-4z
gpt-4-0314z
gpt-4-0613z	gpt-4-32kzgpt-4-32k-0314zgpt-4-32k-0613c                      e Zd ZU dZ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<   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<   dZded<   dZ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&<   ed4d'       Zed4d(       Z	 d5	 	 	 	 	 d6d)Z e!d7d*       Z"	 	 	 d8	 	 	 	 	 	 	 	 	 	 	 d9d+Z#d:d,Z$	 	 	 	 	 	 d;d-Z%	 	 d<	 	 	 	 	 	 	 	 	 d=d.Z&	 	 d<	 	 	 	 	 	 	 	 	 d>d/Z'	 	 	 d8	 	 	 	 	 	 	 	 	 	 	 d?d0Z(	 d5	 	 	 	 	 	 	 d@ fd1Z)ed4d2       Z*edAd3       Z+ xZ,S )Br:   z%Chat model that uses the LiteLLM API.Nr   r^   r   strmodelzOptional[str]
model_nameopenai_api_keyazure_api_keyanthropic_api_keyreplicate_api_keycohere_api_keyopenrouter_api_keyapi_keyFbool	streamingapi_baseorganizationcustom_llm_providerz+Optional[Union[float, Tuple[float, float]]]request_timeout   zOptional[float]temperature)default_factoryDict[str, Any]model_kwargstop_pzOptional[int]top_kintn
max_tokens   r=   c                    | j                   }| j                  | j                  }|| j                  | j                  | j                  | j
                  | j                  | j                  d| j                  S )z2Get the default parameters for calling OpenAI API.)r   force_timeoutr   streamr   r   r   )	r   r   r   r   r   r   r   r   r   selfset_model_values     r9   _default_paramszChatLiteLLM._default_params  sm     **??&"ooO$!11//nn++#'#;#;	
 	
 		
r8   c                   | j                   }| j                  | j                  }| j                  | j                  _        | j                  | j                  _        dD ]8  }t        | |      x}st        | j                  |j                  dd      |       : | j                  | j                  _        || j                  | j                  d}i | j                  |S )z.Get the parameters used for the openai client.)r   r   r   r   r   r   _api_key_key)r   r   r   )r   r   r   r^   r   getattrsetattrreplacer   r   r   )r   r   named_api_keyapi_key_valuecredss        r9   _client_paramszChatLiteLLM._client_params)  s     **??&"ooO#}}"ll
 	M !(m <<}<KK!))*f=!	 $(#4#4 $!11!

 1$&&0%00r8   c                D     t         |      }|d fd       } |di |S )z*Use tenacity to retry the completion call.r[   c                 <     j                   j                  di | S r]   )r^   
completion)r`   r   s    r9   ra   zAChatLiteLLM.completion_with_retry.<locals>._completion_with_retryM  s    )4;;))3F33r8   rb   r7   rd   )r   r>   r`   re   ra   s   `    r9   completion_with_retryz!ChatLiteLLM.completion_with_retryG  s3     2$KP		4 
	4 &///r8   c                B   	 ddl }t        |ddd      |d<   t        |dd	d      |d<   t        |d
dd      |d
<   t        |ddd      |d<   t        |ddd      |d<   t        |ddd      |d<   t        |ddd      |d<   t        |ddd      |d<   ||d<   |d   %d|d   cxk  rdk  st	        d       t	        d      |d   %d|d   cxk  rdk  st	        d       t	        d      |d   |d   dk  rt	        d      |S # t        $ r t        d      w xY w)zGValidate api key, python package exists, temperature, top_p, and top_k.r   NzUCould not import litellm python package. Please install it with `pip install litellm`r   OPENAI_API_KEYrM   )defaultr   AZURE_API_KEYr   ANTHROPIC_API_KEYr   REPLICATE_API_KEYr   OPENROUTER_API_KEYr   COHERE_API_KEYhuggingface_api_keyHUGGINGFACE_API_KEYtogether_ai_api_keyTOGETHERAI_API_KEYr^   r   r   z+temperature must be in the range [0.0, 1.0]r   z%top_p must be in the range [0.0, 1.0]r   ztop_k must be positive)r?   ImportErrorr2   r,   r|   )clsvaluesr?   s      r9   validate_environmentz ChatLiteLLM.validate_environmentS  s   	 $8$&6$
  #7O_b#
 ';')<b'
"# ';')<b'
"# (<(*>(
#$ $8$&6$
  )=)+@")
$% )=)+?)
$% #x- ,Q&:O5TST5TJKK 6UJKK'?&qF7O/Hq/HDEE 0IDEE'?&6'?a+?566S  	&? 	s   D	 	Dc                    ||n| j                   }|r! | j                  |f||d|}t        |      S | j                  ||      \  }}	i |	|}	 | j                  d||d|	}
| j                  |
      S )N)stopr>   messagesr>   r7   )r   _streamr   _create_message_dictsr   _create_chat_resultr   r   r   r>   r   r`   should_streamstream_itermessage_dictsparamsresponses              r9   	_generatezChatLiteLLM._generate  s     #)"4$..&$,,#@FK (44 $ : :8T Jv%F%f%-4-- 
"
?E
 ''11r8   c           	     4   g }|d   D ]G  }t        |d         }t        |t        |j                  d                  }|j	                  |       I |j                  di       }| j
                  }| j                  | j                  }||d}t        ||      S )	Nchoicesr}   finish_reason)r   )r}   generation_infousage)token_usager   )generations
llm_output)rY   r'   rW   rV   appendr   r   r)   )	r   r   r   resr}   genr   r   r   s	            r9   r   zChatLiteLLM._create_chat_result  s    I& 	$C.s9~>G  $377?3K LC s#	$ ll7B/**??&"ooO%0?K
kjIIr8   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   r|   r   )r   r   r   r   mr   s         r9   r   z!ChatLiteLLM._create_message_dicts  s\     $$ !UVV!F6N>FG1!4GGf$$ Hs   ?c              +    K   | j                  ||      \  }}i ||ddi}t        } | j                  d	||d|D ]  }t        |t              s|j                         }t        |d         dk(  r5|d   d   d   }	t        |	|      }|j                  }t        |      }
|r|j                  |j                  |
       |
  y w)
Nr   Tr   r   r   deltar}   chunkr7   )r   r   r   r{   rW   
model_dumplenrq   	__class__r(   on_llm_new_tokenrJ   r   r   r   r>   r`   r   r   default_chunk_classr   r   cg_chunks              r9   r   zChatLiteLLM._stream  s      !% : :8T Jv5F5f5h5,/T// 
"
?E
 	E eT*((*5#$))$Q'0E3E;NOE"'//*59H,,U]](,KN	s   CCc                 K   | j                  ||      \  }}i ||ddi}t        }t        | f||d| d {   2 3 d {   }t        |t              s|j                         }t        |d         dk(  r;|d   d   d   }	t        |	|      }|j                  }t        |      }
|r%|j                  |j                  |
       d {    |
 7 7 7 6 y w)	Nr   Tr   r   r   r   r   r   )r   r   rf   r{   rW   r   r   rq   r   r(   r   rJ   r   s              r9   _astreamzChatLiteLLM._astream  s
     !% : :8T Jv5F5f5h5,!7"
(k"
EK"
 
 	 	% eT*((*5#$))$Q'0E3E;NOE"'//*59H!225==2QQQN
 	 R
sE   8CCCCCCBCCCCCCc                  K   ||n| j                   }|r) | j                  d|||d|}t        |       d {   S | j                  ||      \  }}	i |	|}	t	        | f||d|	 d {   }
| j                  |
      S 7 G7 w)N)r   r   r>   r   r7   )r   r   r   r   rf   r   r   s              r9   
_ageneratezChatLiteLLM._agenerate  s      #)"4$..'$-- !+IOK /{;;; $ : :8T Jv%F%f%/
(k
EK
 
 ''11 <
s!   7BB1B+B,BBc                :   |D cg c]  }t        |       }}| j                  d| j                  v sV| j                  d| j                  v s<| j                  | j                  t        v s| j                  *| j                  t        v rdk(  st	        t
              rdn^t	        t
              rdnKt	        t              r;|D cg c]
  }|d   d    }}t        fd|D              st        d d| d	      t        | (  d|d
|S c c}w c c}w )a  Bind tool-like objects to this chat model.

        LiteLLM expects tools argument in OpenAI format.

        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.
            tool_choice: Which tool to require the model to call. Options are:
                - str of the form ``"<<tool_name>>"``: calls <<tool_name>> tool.
                - ``"auto"``:
                    automatically selects a tool (including no tool).
                - ``"none"``:
                    does not call a tool.
                - ``"any"`` or ``"required"`` or ``True``:
                    forces least one tool to be called.
                - dict of the form:
                ``{"type": "function", "function": {"name": <<tool_name>>}}``
                - ``False`` or ``None``: no effect
            **kwargs: Any additional parameters to pass to the
                :class:`~langchain.runnable.Runnable` constructor.
        azureanyrequiredrR   rS   c              3  4   K   | ]  }|d    d   k(    yw)rR   rS   Nr7   ).0	tool_nametool_choices     r9   	<genexpr>z)ChatLiteLLM.bind_tools.<locals>.<genexpr>0  s%      AJ	[4V<<s   zTool choice z1 was specified, but the only provided tools were .)toolsr   r7   )r.   r   r   _OPENAI_MODELSr{   r   rW   r   r|   superbind)	r   r   r   r`   ry   formatted_toolsformatted_tool
tool_namesr   s	     `     r9   
bind_toolszChatLiteLLM.bind_tools  s.   @ EJJD1$7JJ
 ZZ#4::(=+4??0J

&4::+G+>0Qe#z+t'D$KT*KT*IX7Ez*62J   NX  !";- 0++5,a9  w|U/{UfUU3 Ks   D
Dc                    | j                   }| j                  | j                  }|| j                  | j                  | j                  | j
                  dS )zGet the identifying parameters.)r   r   r   r   r   )r   r   r   r   r   r   r   s     r9   _identifying_paramszChatLiteLLM._identifying_params9  sK     **??&"ooO$++ZZZZ
 	
r8   c                     y)Nzlitellm-chatr7   )r   s    r9   	_llm_typezChatLiteLLM._llm_typeG  s    r8   )rc   r   N)r>   "Optional[CallbackManagerForLLMRun]r`   r   rc   r   )r   r   rc   r   )NNN)r   List[BaseMessage]r   Optional[List[str]]r>   r  r   Optional[bool]r`   r   rc   r)   )r   Mapping[str, Any]rc   r)   )r   r  r   r  rc   z+Tuple[List[Dict[str, Any]], Dict[str, Any]])NN)
r   r  r   r  r>   r  r`   r   rc   zIterator[ChatGenerationChunk])
r   r  r   r  r>   'Optional[AsyncCallbackManagerForLLMRun]r`   r   rc   z"AsyncIterator[ChatGenerationChunk])r   r  r   r  r>   r
  r   r  r`   r   rc   r)   )r   zDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]]r   zLOptional[Union[dict, str, Literal['auto', 'none', 'required', 'any'], bool]]r`   r   rc   z)Runnable[LanguageModelInput, BaseMessage])rc   r   )-r3   r4   r5   r6   r^   __annotations__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   rW   r   r   r   r   r   r=   propertyr   r   r   r-   r   r   r   r   r   r   r   r   r  r  __classcell__)r   s   @r9   r:   r:      s   /FC E3  $J$$(NM(#'M=''+}+'+}+$(NM((,,!G]!It"Hm""&L-&)--CGO@G#$K$#(#>L.>Q!E?!XE=AsJI $J$K
 
  1 1< AE
0=
0PS
0	
0 - -d %):>!%2#2 "2 8	2
 2 2 
2,J 	%)	%1D	%	4	% %):>	# " 8	
  
': %)?C	# " =	
  
,: %)?C!%2#2 "2 =	2
 2 2 
26 9VS9V
9V 9V 
39Vv 
 
  r8   r  )rD   r:   r>   zHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]rc   zCallable[[Any], Any])rX   r	  rc   r   )rD   r:   r>   r
  r`   r   rc   r   )rX   r	  rn   zType[BaseMessageChunk]rc   r   )rv   r$   rc   rW   )r}   r   rc   rW   )Kr6   
__future__r   rt   loggingtypingr   r   r   r   r   r	   r
   r   r   r   r   r   r   langchain_core.callbacksr   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$   r%   r&   langchain_core.outputsr'   r(   r)   langchain_core.runnablesr*   langchain_core.toolsr+   langchain_core.utilsr,   r-   %langchain_core.utils.function_callingr.   pydanticr/   r0   	getLoggerr3   logger	Exceptionr2   rF   rY   rf   rq   rw   r   r   r:   r7   r8   r9   <module>r     s)   1 "       > 
 L    " 
 . ) ? H %			8	$/9 / 			
 (@6 <@2	282 2 		2 ).).-C).).X>6V- Vr8   