
    NgI                       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 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.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z<  ej=        e>          Z? G d de@          ZA	 d,d-dZBd.dZC	 d,d/d ZDd0d$ZEd1d(ZFd2d*ZG G d+ de          ZHdS )3z+Wrapper around LiteLLM's model I/O library.    )annotationsN)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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dS )ChatLiteLLMExceptionz$Error with the `LiteLLM I/O` libraryN)__name__
__module____qualname____doc__     c/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/litellm.pyr2   r2   @   s        ....r8   r2   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   rB   )r:   r<   rC   errorss       r9   _create_retry_decoratorrI   D   sO     NNN 	"	F '[   r8   _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rO   	assistant function_call
tool_calls)rO   additional_kwargssystemfunctionnamerO   rX   rO   rM   )r   getdictr   r!   r   r   )rJ   rM   rO   rU   s       r9   _convert_dict_to_messager]   X   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$????r8   'Optional[AsyncCallbackManagerForLLMRun]kwargsr   c                b    K   t           |          }|d fd            } |di | d{V S )	z0Use tenacity to retry the async completion call.r<   r_   r   r>   c                 8   K    j         j        di |  d {V S Nr7   )clientacreate)r_   r:   s    r9   _completion_with_retryz6acompletion_with_retry.<locals>._completion_with_retryy   s6       (SZ'11&111111111r8   Nr_   r   r>   r   r7   rI   )r:   r<   r_   retry_decoratorrf   s   `    r9   acompletion_with_retryrj   q   sn       .c{KKKO2 2 2 2 2 _2 ('11&111111111r8   default_classType[BaseMessageChunk]r   c                   |                      d          }|                      d          pd}|                      d          rdt          | 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 )NrM   rO   rR   rS   rT   c           	         g | ]`}t          |d                              d          |d                              d          |                    d          |d                   aS )rW   rX   	argumentsidindex)rX   argsrp   rq   )r$   r[   ).0rtcs     r9   
<listcomp>z3_convert_delta_to_message_chunk.<locals>.<listcomp>   sw            Z,,V44Z,,[99wwt}}g,	       r8   rN   rP   rQ   )rO   rU   tool_call_chunksrV   rW   rX   rY   rZ   )r[   r\   KeyErrorr    r   r"   r   r   )rJ   rk   rM   rO   rU   rv   raw_tool_callss          r9   _convert_delta_to_message_chunkry      s    99VDii	""(bGyy!! ,d53I.J.JK<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 
BB	tool_callr#   r\   c                \    d| d         | d         t          j        | d                   ddS )NrW   rp   rX   rr   )rX   ro   )typerp   rW   )jsondumps)rz   s    r9   !_lc_tool_call_to_openai_tool_callr      s?    of%If$566
 
  r8   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 )NrO   rM   rN   rQ   rS   c                ,    g | ]}t          |          S r7   )r   )rs   tcs     r9   ru   z,_convert_message_to_dict.<locals>.<listcomp>   s.     * * *:<1"55* * *r8   rT   rV   rW   rX   tooltool_call_idzGot unknown type )rO   
isinstancer   rM   r   r   rU   rT   r!   r   rX   r%   r   
ValueError)r   message_dicts     r9   _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r8   c                  :    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<    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dId'            ZedId(            Z	 dJdKd,Ze dLd/            Z!	 	 	 dMdNd7Z"dOd:Z#dPd<Z$	 	 dQdRd>Z%	 	 dQdSdAZ&	 	 	 dMdTdBZ'dU fdFZ(edIdG            Z)edVdH            Z* xZ+S )Wr;   z%Chat model that uses the LiteLLM API.Nr   rd   zgpt-3.5-turbostrmodelzOptional[str]
model_nameopenai_api_keyazure_api_keyanthropic_api_keyreplicate_api_keycohere_api_keyopenrouter_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   rB   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     r9   _default_paramszChatLiteLLM._default_params   sZ     *?&"oO$!1/n+#'#;	
 	
 	
 		
r8   c                    | j         }| j        | j        }| j        | j        _        | j        | j        _        || j        | j        d}i | j        |S )z.Get the parameters used for the openai client.N)r   r   r   )r   r   r   rd   r   r   r   )r   r   credss      r9   _client_paramszChatLiteLLM._client_params  sb     *?&"oO#}#'#4 $!1!
 !

 1$&0%00r8   r<   "Optional[CallbackManagerForLLMRun]r_   c                R     t           |          }|d fd            } |di |S )z*Use tenacity to retry the completion call.ra   r_   r   r>   c                 (     j         j        di | S rc   )rd   
completion)r_   r   s    r9   rf   zAChatLiteLLM.completion_with_retry.<locals>._completion_with_retry   s    )4;)33F333r8   rg   r7   rh   )r   r<   r_   ri   rf   s   `    r9   completion_with_retryz!ChatLiteLLM.completion_with_retry  sX     2$KPPP		4 	4 	4 	4 	4 
	4 &%/////r8   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_KEYrR   )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_KEYrd   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)rC   ImportErrorr2   r+   r   )clsr   rC   s      r9   validate_environmentz ChatLiteLLM.validate_environment&  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<   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._generateV  s     #)"4$. 	5&$,# @F K (444 $ : :8T J Jv%F%f%-4- 
"
 
?E
 
 ''111r8   r   rK   c           	     V   g }|d         D ]^}t          |d                   }t          |t          |                    d                              }|                    |           _|                    di           }| j        }| j        | j        }||d}t          ||          S )	Nchoicesr   finish_reason)r   )r   generation_infousage)token_usager   )generations
llm_output)r]   r&   r\   r[   appendr   r   r(   )	r   r   r   resr   genr   r   r   s	            r9   r   zChatLiteLLM._create_chat_resultl  s    I& 	$ 	$C.s9~>>G  $377?3K3K L L L  C s####ll7B//*?&"oO%0?KK
kjIIIIr8   +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 r7   )r   )rs   ms     r9   ru   z5ChatLiteLLM._create_message_dicts.<locals>.<listcomp>  s!    GGG1!44GGGr8   )r   r   )r   r   r   r   r   s        r9   r   z!ChatLiteLLM._create_message_dicts|  sS     $ !UVVV!F6NGGhGGGf$$r8   Iterator[ChatGenerationChunk]c              +    K   |                      ||          \  }}i ||ddi}t          } | j        d	||d|D ]}t          |t                    s|                                }t          |d                   dk    rE|d         d         d         }	t          |	|          }|j        }t          |          }
|r|
                    |j        |
           |
V  d S )
Nr   Tr   r   r   deltar   chunkr7   )r   r   r   r   r\   
model_dumplenry   	__class__r'   on_llm_new_tokenrO   r   r   r   r<   r_   r   r   default_chunk_classr   r   cg_chunks              r9   r   zChatLiteLLM._stream  s+      !% : :8T J Jv5F5f5h55,/T/ 
"
 
?E
 
 	 	E eT** +((**5#$$)))$Q'0E3E;NOOE"'/*5999H L,,U](,KKKNNNN	 	r8   r^   "AsyncIterator[ChatGenerationChunk]c                 K   |                      ||          \  }}i ||ddi}t          }t          | f||d| d {V 2 3 d {V }t          |t                    s|                                }t          |d                   dk    rJ|d         d         d         }	t          |	|          }|j        }t          |          }
|r"|
                    |j        |
           d {V  |
W V  6 d S )	Nr   Tr   r   r   r   r   r   )r   r   rj   r   r\   r   r   ry   r   r'   r   rO   r   s              r9   _astreamzChatLiteLLM._astream  sy      !% : :8T J Jv5F5f5h55,!7"
(k"
 "
EK"
 "
 
 
 
 
 
 
 	 	 	 	 	 	 	% eT** +((**5#$$)))$Q'0E3E;NOOE"'/*5999H R!225=2QQQQQQQQQNNNNN
 
 
s   C2c                   K   ||n| j         }|r& | j        d|||d|}t          |           d {V S |                     ||          \  }}	i |	|}	t	          | f||d|	 d {V }
|                     |
          S )N)r   r   r<   r   r7   )r   r   r   r   rj   r   r   s              r9   
_ageneratezChatLiteLLM._agenerate  s       #)"4$. 	<'$- !+ IO K /{;;;;;;;;; $ : :8T J Jv%F%f%/
(k
 
EK
 
 
 
 
 
 
 
 ''111r8   toolsDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]])Runnable[LanguageModelInput, BaseMessage]c                R    d |D             } t                      j        dd|i|S )au  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.
                Must be the name of the single provided function or
                "auto" to automatically determine which function to call
                (if any), or a dict of the form:
                {"type": "function", "function": {"name": <<tool_name>>}}.
            **kwargs: Any additional parameters to pass to the
                :class:`~langchain.runnable.Runnable` constructor.
        c                ,    g | ]}t          |          S r7   r-   )rs   r   s     r9   ru   z*ChatLiteLLM.bind_tools.<locals>.<listcomp>  s!    JJJD1$77JJJr8   r   r7   )superbind)r   r   r_   formatted_toolsr   s       r9   
bind_toolszChatLiteLLM.bind_tools  s:    . KJEJJJuww|<</<V<<<r8   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     r9   _identifying_paramszChatLiteLLM._identifying_params  sA     *?&"oO$+ZZ
 
 	
r8   c                    dS )Nzlitellm-chatr7   )r   s    r9   	_llm_typezChatLiteLLM._llm_type  s    ~r8   )r>   r   N)r<   r   r_   r   r>   r   )r   r   r>   r   )NNN)r   r   r   r   r<   r   r   r   r_   r   r>   r(   )r   rK   r>   r(   )r   r   r   r   r>   r   )NN)
r   r   r   r   r<   r   r_   r   r>   r   )
r   r   r   r   r<   r^   r_   r   r>   r   )r   r   r   r   r<   r^   r   r   r_   r   r>   r(   )r   r   r_   r   r>   r   )r>   r   ),r3   r4   r5   r6   rd   __annotations__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r\   r   r   r   r   r   rB   propertyr   r   r   r,   r   r   r   r   r   r   r   r   r   r  __classcell__)r   s   @r9   r;   r;      sE        //F E     $J$$$$$(N((((#'M'''''+++++'+++++$(N(((((,,,,,I"H"""""&L&&&&)-----CGOGGGG#$K$$$$#(5#>#>#>L>>>>!E!!!!XEAJJJJ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 	% 	% 	% 	% %):>	    : %)?C	    : %)?C!%2 2 2 2 2,= = = = = =4 
 
 
 X
    X    r8   r  )r:   r;   r<   r=   r>   r?   )rJ   rK   r>   r   )r:   r;   r<   r^   r_   r   r>   r   )rJ   rK   rk   rl   r>   r   )rz   r#   r>   r\   )r   r   r>   r\   )Ir6   
__future__r   r}   loggingtypingr   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   rI   r]   rj   ry   r   r   r;   r7   r8   r9   <module>r     s   1 1 " " " " " "                                     > = = = = =         
 L K K K K K                                 "         
 . - - - - - ) ) ) ) ) ) ? ? ? ? ? ? ? ? H H H H H H % % % % % % % %		8	$	$/ / / / /9 / / / 		    (@ @ @ @6 <@2 2 2 2 2 ). ). ). ).X      >d d d d d- d d d d dr8   