
    hhZ                       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/ ddl0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: ddl;m<Z< ddl=m>Z>m?Z?  ej@        eA          ZB G d deC          ZD	 d1d2dZEd3dZF	 d1d4d!ZGd5d%ZHd6d)ZId7d+ZJg d,ZK G d- de          ZLd8d0ZMdS )9z+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)UsageMetadata)ChatGenerationChatGenerationChunk
ChatResult)Runnable)BaseTool)get_from_dict_or_envpre_initconvert_to_openai_tool)	BaseModelFieldc                      e Zd ZdZdS )ChatLiteLLMExceptionz$Error with the `LiteLLM I/O` libraryN)__name__
__module____qualname____doc__     d/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/langchain_community/chat_models/litellm.pyr4   r4   B   s        ....r:   r4   llmChatLiteLLMrun_managerHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]returnCallable[[Any], Any]c                l    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_retriesr>   )litellmTimeoutAPIErrorAPIConnectionErrorRateLimitErrorr   rD   )r<   r>   rE   errorss       r;   _create_retry_decoratorrK   F   sO     NNN 	"	F '[   r:   _dictMapping[str, Any]r   c                   | d         }|dk    rt          | d                   S |dk    rx|                     dd          pd}i }|                     d          rt          | d                   |d<   |                     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rQ   	assistant function_call
tool_calls)rQ   additional_kwargssystemfunctionnamerQ   rZ   rQ   rO   )r    getdictr   r"   r   r   )rL   rO   rQ   rW   s       r;   _convert_dict_to_messager_   Z   s   =Dv~~E)$45555			 ))Ir**0b99_%% 	N15eO6L1M1Mo.99\"" 	B.3L.Al+<MNNNN			U9%56666			uY'7eFmLLLL5#3$????r:   'Optional[AsyncCallbackManagerForLLMRun]kwargsr   c                b    K   t           |          }|d fd            } |di | d{V S )	z0Use tenacity to retry the async completion call.r>   ra   r   r@   c                 8   K    j         j        di |  d {V S Nr9   )clientacreate)ra   r<   s    r;   _completion_with_retryz6acompletion_with_retry.<locals>._completion_with_retry{   s6       (SZ'11&111111111r:   Nra   r   r@   r   r9   rK   )r<   r>   ra   retry_decoratorrh   s   `    r;   acompletion_with_retryrl   s   sn       .c{KKKO2 2 2 2 2 _2 ('11&111111111r:   default_classType[BaseMessageChunk]r   c                   |                      d          }|                      d          pd}|                      d          rdt          | d                   i}n"|                      d          rd| d         i}ni }g }|                      d          x}r#||d<   	 d |D             }n# t          $ r Y nw xY w|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 )NrO   rQ   rT   rU   reasoning_contentrV   c           	         g | ]`}t          |d                              d          |d                              d          |                    d          |d                   aS )rY   rZ   	argumentsidindex)rZ   argsrs   rt   )r%   r]   ).0rtcs     r;   
<listcomp>z3_convert_delta_to_message_chunk.<locals>.<listcomp>   sw            Z,,V44Z,,[99wwt}}g,	       r:   rP   rR   rS   )rQ   rW   tool_call_chunksrX   rY   rZ   r[   r\   )r]   r^   KeyErrorr!   r   r#   r   r   )rL   rm   rO   rQ   rW   ry   raw_tool_callss          r;   _convert_delta_to_message_chunkr|      s    99VDii	""(bGyy!! ,d53I.J.JK	&	'	' 0%8K2LM<000~ *8,'	    *       	 	 	D	 v~~*;;; 1111			 ? ?/-
 
 
 	

 
		].@@@!'2222			}0DDD#G%-HHHH	 ."222d;;;;}W----s   B( (
B54B5	tool_callr$   r^   c                \    d| d         | d         t          j        | d                   ddS )NrY   rs   rZ   ru   )rZ   rr   )typers   rY   )jsondumps)r}   s    r;   !_lc_tool_call_to_openai_tool_callr      s?    of%If$566
 
  r:   messagec                   d| j         i}t          | t                    r| j        |d<   nt          | t                    rd|d<   nt          | t
                    rTd|d<   d| j        v r| j        d         |d<   | j        rd | j        D             |d<   nd| j        v r| j        d         |d<   nwt          | t                    rd|d<   n\t          | t                    rd	|d<   | j
        |d
<   n7t          | t                    rd|d<   | j        |d<   nt          d|            d
| j        v r| j        d
         |d
<   |S )NrQ   rO   rP   rS   rU   c                ,    g | ]}t          |          S r9   )r   )rv   tcs     r;   rx   z,_convert_message_to_dict.<locals>.<listcomp>   s.     * * *:<1"55* * *r:   rV   rX   rY   rZ   tooltool_call_idzGot unknown type )rQ   
isinstancer   rO   r    r   rW   rV   r"   r   rZ   r&   r   
ValueError)r   message_dicts     r;   _convert_message_to_dictr      s   $-w#?L';'' 8&|V	G\	*	* 8%V	GY	'	' 8*Vg777,3,Eo,VL) 	Q* *@G@R* * *L&& W666)0)B<)PL&	G]	+	+ 	8'V	G_	-	- 8)V&|V	G[	)	) 8%V'.';^$$6W66777***&8@Vr:   )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                  N    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dKd'            ZedKd(            Z	 dLdMd,Z e!dNd/            Z"	 	 	 dOdPd7Z#dQd:Z$dRd<Z%	 	 dSdTd>Z&	 	 dSdUdAZ'	 	 	 dOdVdBZ(	 dLdW fdHZ)edKdI            Z*edXdJ            Z+ xZ,S )Yr=   z%Chat model that uses the LiteLLM API.Nr   rf   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_timeoutzOptional[float]temperature)default_factoryDict[str, Any]model_kwargstop_pzOptional[int]top_kn
max_tokens   intrD   r@   c                    | j         }| j        | j        }|| j        | j        | j        | j        | j        | j        d| j        S )z2Get the default parameters for calling OpenAI API.N)r   force_timeoutr   streamr   r   r   )	r   r   r   r   r   r   r   r   r   selfset_model_values     r;   _default_paramszChatLiteLLM._default_params  sZ     *?&"oO$!1/n+#'#;	
 	
 	
 		
r:   c                J   | j         }| j        | j        }| j        | j        _        | j        | j        _        dD ]>}t          | |          x}r*t          | j        |                    dd          |           ?| j        | j        _        || j	        | j        d}i | j
        |S )z.Get the parameters used for the openai client.N)r   r   r   r   r   r   _api_key_key)r   r   r   )r   r   r   rf   r   getattrsetattrreplacer   r   r   )r   r   named_api_keyapi_key_valuecredss        r;   _client_paramszChatLiteLLM._client_params,  s     *?&"oO#}"l
 	 	M !(m < <<} K!))*f==!  
 $(#4 $!1!
 !

 1$&0%00r:   r>   "Optional[CallbackManagerForLLMRun]ra   c                R     t           |          }|d fd            } |di |S )z*Use tenacity to retry the completion call.rc   ra   r   r@   c                 (     j         j        di | S re   )rf   
completion)ra   r   s    r;   rh   zAChatLiteLLM.completion_with_retry.<locals>._completion_with_retryP  s    )4;)33F333r:   ri   r9   rj   )r   r>   ra   rk   rh   s   `    r;   completion_with_retryz!ChatLiteLLM.completion_with_retryJ  sX     2$KPPP		4 	4 	4 	4 	4 
	4 &%/////r:   valuesr   c                   	 ddl }n# t          $ r t          d          w xY w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n t	          d          |d         $d|d         cxk    rdk    sn t	          d          |d         |d         dk    rt	          d          |S )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_KEYrT   )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_KEYrf   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)rE   ImportErrorr4   r-   r   )clsr   rE   s      r;   validate_environmentz ChatLiteLLM.validate_environmentV  s*   	NNNN 	 	 	&?  	 $8$&6$
 $
 $
  #7O_b#
 #
 #
 ';')<b'
 '
 '
"# ';')<b'
 '
 '
"# (<(*>(
 (
 (
#$ $8$&6$
 $
 $
  )=)+@")
 )
 )
$% )=)+?)
 )
 )
$% #x- ,Q&:O5T5T5T5TST5T5T5T5TJKKK'?&qF7O/H/H/H/Hq/H/H/H/HDEEE'?&6'?a+?+?5666s    !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   r>   r   r>   r9   )r   _streamr   _create_message_dictsr   _create_chat_resultr   r   r   r>   r   ra   should_streamstream_itermessage_dictsparamsresponses              r;   	_generatezChatLiteLLM._generate  s     #)"4$. 	5&$,# @F K (444 $ : :8T J Jv%F%f%-4- 
"
 
?E
 
 ''111r:   r   rM   c           	        g }|                     di           }|d         D ]}t          |d                   }t          |t                    r)d| j        p| j        i|_        t          |          |_        t          |t          |                     d                              }|                    |           | j        }| j        | j        }||d}t          ||	          S )
Nusagechoicesr   r   finish_reason)r   )r   generation_info)token_usager   )generations
llm_output)r]   r_   r   r   r   r   response_metadata_create_usage_metadatausage_metadatar(   r^   appendr*   )	r   r   r   r   resr   genr   r   s	            r;   r   zChatLiteLLM._create_chat_result  s    ll7B//I& 	$ 	$C.s9~>>G'9-- M $/"?TZ-) *@)L)L&  $377?3K3K L L L  C s####*?&"oO%0?KK
kjIIIIr:   +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 r9   )r   )rv   ms     r;   rx   z5ChatLiteLLM._create_message_dicts.<locals>.<listcomp>  s!    GGG1!44GGGr:   )r   r   )r   r   r   r   r   s        r;   r   z!ChatLiteLLM._create_message_dicts  sS     $ !UVVV!F6NGGhGGGf$$r:   Iterator[ChatGenerationChunk]c              +  x  K   |                      ||          \  }}i ||ddi}t          }d} | j        d||d|D ]}	t          |	t                    s|	                                }	t          |	d                   dk    rE|	d         d         d         }
|	                    di           }t          |
|          }	t          |	t                    r-|sd	| j	        p| j
        i|	_        d}t          |          |	_        |	j        }t          |	
          }|r|                    |	j        |           |V  d S )Nr   TFr   r   r   deltar   r   r   chunkr9   )r   r   r   r   r^   
model_dumplenr]   r|   r   r   r   r   r   	__class__r)   on_llm_new_tokenrQ   r   r   r   r>   ra   r   r   default_chunk_classadded_model_namer   r   r   cg_chunks                r;   r   zChatLiteLLM._stream  s      !% : :8T J Jv5F5f5h55, /T/ 
"
 
?E
 
 	 	E eT** +((**5#$$)))$Q'0EIIgr**E3E;NOOE%00 E' ,$do&C/E+ (,$'=e'D'D$"'/*5999H L,,U](,KKKNNNN+	 	r:   r`   "AsyncIterator[ChatGenerationChunk]c                 K   |                      ||          \  }}i ||ddi}t          }d}t          | f||d| d {V 2 3 d {V }	t          |	t                    s|	                                }	t          |	d                   dk    rJ|	d         d         d         }
|	                    di           }t          |
|          }	t          |	t                    r-|sd	| j	        p| j
        i|	_        d}t          |          |	_        |	j        }t          |	
          }|r"|                    |	j        |           d {V  |W V  6 d S )Nr   TFr   r   r   r   r   r   r   r   )r   r   rl   r   r^   r   r   r]   r|   r   r   r   r   r   r   r)   r   rQ   r   s                r;   _astreamzChatLiteLLM._astream  s      !% : :8T J Jv5F5f5h55, !7"
(k"
 "
EK"
 "
 
 
 
 
 
 
 	 	 	 	 	 	 	% eT** +((**5#$$)))$Q'0EIIgr**E3E;NOOE%00 E' ,$do&C/E+ (,$'=e'D'D$"'/*5999H R!225=2QQQQQQQQQNNNNN+
 
 
s   Ec                   K   ||n| j         }|r& | j        d|||d|}t          |           d {V S |                     ||          \  }}	i |	|}	t	          | f||d|	 d {V }
|                     |
          S )N)r   r   r>   r   r9   )r   r  r   r   rl   r   r   s              r;   
_ageneratezChatLiteLLM._agenerate  s       #)"4$. 	<'$- !+ IO K /{;;;;;;;;; $ : :8T J Jv%F%f%/
(k
 
EK
 
 
 
 
 
 
 
 ''111r:   toolsDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]]tool_choiceLOptional[Union[dict, str, Literal['auto', 'none', 'required', 'any'], bool]])Runnable[LanguageModelInput, BaseMessage]c                   d |D             }| j         	d| j         v s:| j        	d| j        v s*| j         | j         t          v s| j        ,| j        t          v rdk    st          t                    rdnjt          t                    rdnRt          t
                    r=d |D             }t          fd|D                       st          d d	| d
           t                      j	        d|d|S )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.
        c                ,    g | ]}t          |          S r9   r/   )rv   r   s     r;   rx   z*ChatLiteLLM.bind_tools.<locals>.<listcomp>8  s!    JJJD1$77JJJr:   Nazureanyrequiredc                *    g | ]}|d          d         S )rY   rZ   r9   )rv   formatted_tools     r;   rx   z*ChatLiteLLM.bind_tools.<locals>.<listcomp>G  s/       7Ez*62  r:   c              3  <   K   | ]}|d          d         k    V  dS )rY   rZ   Nr9   )rv   	tool_namer  s     r;   	<genexpr>z)ChatLiteLLM.bind_tools.<locals>.<genexpr>J  sC        AJ	[4V<<     r:   zTool choice z1 was specified, but the only provided tools were .)r  r  r9   )
r   r   _OPENAI_MODELSr   r   r^   r  r   superbind)r   r  r  ra   formatted_tools
tool_namesr   s     `   r;   
bind_toolszChatLiteLLM.bind_tools  sm   @ KJEJJJ
 Z#4:(=(=+4?0J0J
&4:+G+G+>0Q0Qe##z+t'D'D#$KKT** 	KKT** 
	 IX  J     NX      !9; 9 9+59 9 9   uww|U/{UUfUUUr:   c                d    | j         }| j        | j        }|| j        | j        | j        | j        dS )zGet the identifying parameters.N)r   r   r   r   r   )r   r   r   r   r   r   r   s     r;   _identifying_paramszChatLiteLLM._identifying_paramsS  sA     *?&"oO$+ZZ
 
 	
r:   c                    dS )Nzlitellm-chatr9   )r   s    r;   	_llm_typezChatLiteLLM._llm_typea  s    ~r:   )r@   r   N)r>   r   ra   r   r@   r   )r   r   r@   r   )NNN)r   r   r   r   r>   r   r   r   ra   r   r@   r*   )r   rM   r@   r*   )r   r   r   r   r@   r   )NN)
r   r   r   r   r>   r   ra   r   r@   r   )
r   r   r   r   r>   r`   ra   r   r@   r   )r   r   r   r   r>   r`   r   r   ra   r   r@   r*   )r  r  r  r  ra   r   r@   r	  )r@   r   )-r5   r6   r7   r8   rf   __annotations__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r^   r   r   r   r   r   rD   propertyr   r   r   r.   r   r   r   r   r   r  r  r  r  r  __classcell__)r   s   @r;   r=   r=      sq        //F E     $J$$$$$(N((((#'M'''''+++++'+++++$(N(((((,,,,,!G!!!!I"H"""""&L&&&&)-----CGOGGGG#'K''''#(5#>#>#>L>>>>Q!E!!!!XEAI $J$$$$K
 
 
 X
  1 1 1 X1< AE
0 
0 
0 
0 
0 - - - X-d %):>!%2 2 2 2 2,J J J J*	% 	% 	% 	% %):>	! ! ! ! !L %)?C	! ! ! ! !L %)?C!%2 2 2 2 26 9V 9V 9V 9V 9V 9V 9Vv 
 
 
 X
    X    r:   r   r'   c                    |                      dd          }|                      dd          }t          ||||z             S )Nprompt_tokensr   completion_tokens)input_tokensoutput_tokenstotal_tokens)r]   r'   )r   r&  r'  s      r;   r   r   f  sN    ???A66LOO$7;;M!#!M1   r:   r  )r<   r=   r>   r?   r@   rA   )rL   rM   r@   r   )r<   r=   r>   r`   ra   r   r@   r   )rL   rM   rm   rn   r@   r   )r}   r$   r@   r^   )r   r   r@   r^   )r   rM   r@   r'   )Nr8   
__future__r   r   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.messages.air'   langchain_core.outputsr(   r)   r*   langchain_core.runnablesr+   langchain_core.toolsr,   langchain_core.utilsr-   r.   %langchain_core.utils.function_callingr0   pydanticr1   r2   	getLoggerr5   logger	Exceptionr4   rK   r_   rl   r|   r   r   r  r=   r   r9   r:   r;   <module>r;     s   1 1 " " " " " "                                        > = = = = =         
 L K K K K K                                 " 5 4 4 4 4 4         
 . - - - - - ) ) ) ) ) ) ? ? ? ? ? ? ? ? H H H H H H % % % % % % % %		8	$	$/ / / / /9 / / / 		    (@ @ @ @6 <@2 2 2 2 2 +. +. +. +.\      >  6m m m m m- m m m`     r:   