
    IgI                       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jz                  e>      Z? G d de@      ZA	 d	 	 	 	 	 ddZBddZC	 d	 	 	 	 	 	 	 ddZD	 	 	 	 	 	 ddZEddZFd dZG G d de      ZHy)!z+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y)ChatLiteLLMExceptionz$Error with the `LiteLLM I/O` libraryN)__name__
__module____qualname____doc__     d/var/www/html/answerous/venv/lib/python3.12/site-packages/langchain_community/chat_models/litellm.pyr1   r1   @   s    .r7   r1   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       r8   _create_retry_decoratorrE   D   sL      	""	F '[ r7   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rI   	assistant function_call
tool_calls)rI   additional_kwargssystemfunctionnamerI   rR   rI   rG   )r   getdictr   r!   r   r   )_dictrG   rI   rO   s       r8   _convert_dict_to_messagerX   X   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$??r7   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Nr6   )clientacreate)kwargsrC   s    r8   _completion_with_retryz6acompletion_with_retry.<locals>._completion_with_retryy   s)      (SZZ''1&1111s    *(*Nr_   r   returnr   r6   rE   )rC   r=   r_   retry_decoratorr`   s   `    r8   acompletion_with_retryre   q   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)NrG   rI   rL   rM   rN   rQ   rR   	argumentsidindex)rR   argsrh   ri   rH   rJ   rK   )rI   rO   tool_call_chunksrP   rS   rT   )	rU   rV   r$   KeyErrorr    r   r"   r   r   )rW   default_classrG   rI   rO   rk   raw_tool_callsrtcs           r8   _convert_delta_to_message_chunkrp      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 )NrQ   rh   rR   rj   )rR   rg   )typerh   rQ   )jsondumps)	tool_calls    r8   !_lc_tool_call_to_openai_tool_callrv      s4    of%If$56
 r7   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 )NrI   rG   rH   rK   rM   rN   rP   rQ   rR   tooltool_call_idzGot unknown type )rI   
isinstancer   rG   r   r   rO   rN   rv   r!   r   rR   r%   ry   
ValueError)messagemessage_dicttcs      r8   _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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d3d&       Zed3d'       Z	 d4	 	 	 	 	 d5d(Ze d6d)       Z!	 	 	 d7	 	 	 	 	 	 	 	 	 	 	 d8d*Z"d9d+Z#	 	 	 	 	 	 d:d,Z$	 	 d;	 	 	 	 	 	 	 	 	 d<d-Z%	 	 d;	 	 	 	 	 	 	 	 	 d=d.Z&	 	 	 d7	 	 	 	 	 	 	 	 	 	 	 d>d/Z'	 	 	 	 	 	 d? fd0Z(ed3d1       Z)ed@d2       Z* xZ+S )Ar9   z%Chat model that uses the LiteLLM API.Nr   r]   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   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     r8   _default_paramszChatLiteLLM._default_params   sm     **??&"ooO$!11//nn++#'#;#;	
 	
 		
r7   c                
   | j                   }| j                  | j                  }| j                  | j                  _        | j                  | j                  _        || j
                  | j                  d}i | j                  |S )z.Get the parameters used for the openai client.)r   r   r   )r   r   r   r]   r   r   r   )r   r   credss      r8   _client_paramszChatLiteLLM._client_params  st     **??&"ooO#}}#'#4#4 $!11!

 1$&&0%00r7   c                D     t         |      }|d fd       } |di |S )z*Use tenacity to retry the completion call.rZ   c                 <     j                   j                  di | S r\   )r]   
completion)r_   r   s    r8   r`   zAChatLiteLLM.completion_with_retry.<locals>._completion_with_retry   s    )4;;))3F33r7   ra   r6   rc   )r   r=   r_   rd   r`   s   `    r8   completion_with_retryz!ChatLiteLLM.completion_with_retry  s3     2$KP		4 
	4 &///r7   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_KEYrL   )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>   ImportErrorr1   r+   r{   )clsvaluesr>   s      r8   validate_environmentz ChatLiteLLM.validate_environment&  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=   r6   )r   _streamr   _create_message_dictsr   _create_chat_resultr   r   r   r=   r   r_   should_streamstream_itermessage_dictsparamsresponses              r8   	_generatezChatLiteLLM._generateV  s     #)"4$..&$,,#@FK (44 $ : :8T Jv%F%f%-4-- 
"
?E
 ''11r7   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)rX   r&   rV   rU   appendr   r   r(   )	r   r   r   resr|   genr   r   r   s	            r8   r   zChatLiteLLM._create_chat_resultl  s    I& 	$C.s9~>G  $377?3K LC s#	$ ll7B/**??&"ooO%0?K
kjIIr7   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         r8   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|   chunkr6   )r   r   r   rz   rV   
model_dumplenrp   	__class__r'   on_llm_new_tokenrI   r   r   r   r=   r_   r   r   default_chunk_classr   r   cg_chunks              r8   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   re   rz   rV   r   r   rp   r   r'   r   rI   r   s              r8   _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   r6   )r   r   r   r   re   r   r   s              r8   
_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        |       }}t        |   dd|i|S c c}w )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.
        toolsr6   )r-   superbind)r   r   r_   rx   formatted_toolsr   s        r8   
bind_toolszChatLiteLLM.bind_tools  s=    . EJJD1$7JJw|</<V<< Ks   +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     r8   _identifying_paramszChatLiteLLM._identifying_params  sK     **??&"ooO$++ZZZZ
 	
r7   c                     y)Nzlitellm-chatr6   )r   s    r8   	_llm_typezChatLiteLLM._llm_type  s    r7   )rb   r   N)r=   "Optional[CallbackManagerForLLMRun]r_   r   rb   r   )r   r   rb   r   )NNN)r   List[BaseMessage]r   Optional[List[str]]r=   r   r   Optional[bool]r_   r   rb   r(   )r   Mapping[str, Any]rb   r(   )r   r   r   r   rb   z+Tuple[List[Dict[str, Any]], Dict[str, Any]])NN)
r   r   r   r   r=   r   r_   r   rb   zIterator[ChatGenerationChunk])
r   r   r   r   r=   'Optional[AsyncCallbackManagerForLLMRun]r_   r   rb   z"AsyncIterator[ChatGenerationChunk])r   r   r   r   r=   r   r   r   r_   r   rb   r(   )r   zDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]]r_   r   rb   z)Runnable[LanguageModelInput, BaseMessage])rb   r   ),r2   r3   r4   r5   r]   __annotations__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r/   rV   r   r   r   r   r   r<   propertyr   r   r   r,   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r8   r9   r9      s   /FC E3  $J$$(NM(#'M=''+}+'+}+$(NM((,,It"Hm""&L-&)--CGO@G#$K$#(#>L.>!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 
2,=S= = 
3	=4 
 
  r7   r   )rC   r9   r=   zHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]rb   zCallable[[Any], Any])rW   r   rb   r   )rC   r9   r=   r   r_   r   rb   r   )rW   r   rm   zType[BaseMessageChunk]rb   r   )ru   r#   rb   rV   )r|   r   rb   rV   )Ir5   
__future__r   rs   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.   r/   	getLoggerr2   logger	Exceptionr1   rE   rX   re   rp   rv   r   r9   r6   r7   r8   <module>r	     s"   1 "      > 
 L    " 
 . ) ? H %			8	$/9 / 			
 (@6 <@2	282 2 		2 ).).-C).).X>d- dr7   