
    ~
i0\                       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 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l0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> ddl?m@Z@mAZA  ejB        eC          ZD G d deE          ZF	 d6d7dZGd8dZH	 d6d9d"ZId:d&ZJd;d*ZKd<d,ZLg d-ZM ed.d/d01           G d2 de                      ZNd=d5ZOdS )>u   
Deprecated LiteLLM wrapper.

⭐  Use `pip install langchain-litellm` and import
   `from langchain_litellm import ChatLiteLLM` instead.
    )annotationsN)AnyAsyncIteratorCallableDictIteratorListLiteralMappingOptionalSequenceTupleTypeUnion)
deprecated)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__     C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain_community/chat_models/litellm.pyr5   r5   H   s        ....r;   r5   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   rE   )r=   r?   rF   errorss       r<   _create_retry_decoratorrL   L   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rR   	assistant function_call
tool_calls)rR   additional_kwargssystemfunctionnamerR   r[   rR   rP   )r!   getdictr   r#   r   r   )rM   rP   rR   rX   s       r<   _convert_dict_to_messager`   `   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?   rb   r   rA   c                 8   K    j         j        di |  d {V S Nr:   )clientacreate)rb   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rb   r   rA   r   r:   rL   )r=   r?   rb   retry_decoratorri   s   `    r<   acompletion_with_retryrm   y   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 )NrP   rR   rU   rV   reasoning_contentrW   c           	         g | ]`}t          |d                              d          |d                              d          |                    d          |d                   aS )rZ   r[   	argumentsidindex)r[   argsrt   ru   )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;   rQ   rS   rT   )rR   rX   tool_call_chunksrY   rZ   r[   r\   r]   )r^   r_   KeyErrorr"   r   r$   r    r   )rM   rn   rP   rR   rX   rz   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 )NrZ   rt   r[   rv   )r[   rs   )typert   rZ   )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 )NrR   rP   rQ   rT   rV   c                ,    g | ]}t          |          S r:   )r   )rw   tcs     r<   ry   z,_convert_message_to_dict.<locals>.<listcomp>   s.     * * *:<1"55* * *r;   rW   rY   rZ   r[   tooltool_call_idzGot unknown type )rR   
isinstancer   rP   r!   r   rX   rW   r#   r   r[   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-0613z0.3.24z1.0zlangchain_litellm.ChatLiteLLM)sinceremovalalternative_importc                  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>   u;   DEPRECATED – use `langchain_litellm.ChatLiteLLM` instead.Nr   rg   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   intrE   rA   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   rg   r   getattrsetattrreplacer   r   r   )r   r   named_api_keyapi_key_valuecredss        r<   _client_paramszChatLiteLLM._client_params7  s     *?&"oO#}"l
 	 	M !(m < <<} K!))*f==!  
 $(#4 $!1!
 !

 1$&0%00r;   r?   "Optional[CallbackManagerForLLMRun]rb   c                R     t           |          }|d fd            } |di |S )z*Use tenacity to retry the completion call.rd   rb   r   rA   c                 (     j         j        di | S rf   )rg   
completion)rb   r   s    r<   ri   zAChatLiteLLM.completion_with_retry.<locals>._completion_with_retry[  s    )4;)33F333r;   rj   r:   rk   )r   r?   rb   rl   ri   s   `    r<   completion_with_retryz!ChatLiteLLM.completion_with_retryU  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_KEYrU   )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_KEYrg   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)rF   ImportErrorr5   r.   r   )clsr   rF   s      r<   validate_environmentz ChatLiteLLM.validate_environmenta  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?   r:   )r   _streamr   _create_message_dictsr   _create_chat_resultr   r   r   r?   r   rb   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   rN   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 r:   )r   )rw   ms     r<   ry   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              +    K   |                      ||          \  }}i ||ddi}t          }d} | j        d||d|D ]}	t          |	t                    s|	                                }	t          |	d                   dk    rF|	d         d         d         }
|	                    di           }t          |
|          }	t          |	t                    r-|sd	| j	        p| j
        i|	_        d}t          |          |	_        |	j        }t          |	
          }|r)|                    t#          |	j                  |           |V  
d S )Nr   TFr   r   r   deltar   r   r   chunkr:   )r   r   r   r   r_   
model_dumplenr^   r}   r   r   r   r   r   	__class__r*   on_llm_new_tokenr   rR   r   r   r   r?   rb   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6D /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 Q,,S-?-?x,PPPNNNN+	 	r;   ra   "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/|                    t#          |	j                  |           d {V  |W V  6 d S )Nr   TFr   r   r   r   r   r   r   r   )r   r   rm   r   r_   r   r   r^   r}   r   r   r   r   r   r   r*   r   r   rR   r   s                r<   _astreamzChatLiteLLM._astream  s      !% : :8T J Jv5F5f5h556D !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 W!223u}3E3EX2VVVVVVVVV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   r:   )r   r  r   r   rm   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, AIMessage]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 r:   r0   )rw   r   s     r<   ry   z*ChatLiteLLM.bind_tools.<locals>.<listcomp>C  s!    JJJD1$77JJJr;   Nazureanyrequiredc                *    g | ]}|d          d         S )rZ   r[   r:   )rw   formatted_tools     r<   ry   z*ChatLiteLLM.bind_tools.<locals>.<listcomp>R  s/       7Ez*62  r;   c              3  <   K   | ]}|d          d         k    V  dS )rZ   r[   Nr:   )rw   	tool_namer  s     r<   	<genexpr>z)ChatLiteLLM.bind_tools.<locals>.<genexpr>U  sC        AJ	[4V<<     r;   zTool choice z1 was specified, but the only provided tools were .)r	  r  r:   )
r   r   _OPENAI_MODELSr   r   r_   r  r   superbind)r   r	  r  rb   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_params^  sA     *?&"oO$+ZZ
 
 	
r;   c                    dS )Nzlitellm-chatr:   )r   s    r<   	_llm_typezChatLiteLLM._llm_typel  s    ~r;   )rA   r   N)r?   r   rb   r   rA   r   )r   r   rA   r   )NNN)r   r   r   r   r?   r   r   r   rb   r   rA   r+   )r   rN   rA   r+   )r   r   r   r   rA   r   )NN)
r   r   r   r   r?   r   rb   r   rA   r   )
r   r   r   r   r?   ra   rb   r   rA   r  )r   r   r   r   r?   ra   r   r   rb   r   rA   r+   )r	  r
  r  r  rb   r   rA   r  )rA   r   )-r6   r7   r8   r9   rg   __annotations__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r_   r   r   r   r   r   rE   propertyr   r   r   r/   r   r   r   r   r   r  r  r  r   r"  __classcell__)r   s   @r<   r>   r>      st         FE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   q  sN    ???A66LOO$7;;M!#!M1   r;   r#  )r=   r>   r?   r@   rA   rB   )rM   rN   rA   r   )r=   r>   r?   ra   rb   r   rA   r   )rM   rN   rn   ro   rA   r   )r~   r%   rA   r_   )r   r   rA   r_   )r   rN   rA   r(   )Pr9   
__future__r   r   loggingtypingr   r   r   r   r   r	   r
   r   r   r   r   r   r   langchain_core._api.deprecationr   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_callingr1   pydanticr2   r3   	getLoggerr6   logger	Exceptionr5   rL   r`   rm   r}   r   r   r  r>   r   r:   r;   r<   <module>r@     s    # " " " " "                                 7 6 6 6 6 6        > = = = = =         
 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 +. +. +. +.\      >  6 
6  
m m m m m- m m 
m`     r;   