o
    a+ i2\                     @  s  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BeCZDG dd deEZF	d=d>ddZGd?dd ZH	d=d@d$d%ZIdAd)d*ZJdBd.d/ZKdCd1d2ZLg d3ZMed4d5d6d7G d8d deZNdDd;d<ZOdS )Eu   
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                   @  s   e Zd ZdZdS )ChatLiteLLMExceptionz$Error with the `LiteLLM I/O` libraryN)__name__
__module____qualname____doc__ r8   r8   s/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/langchain_community/chat_models/litellm.pyr3   H   s    r3   llmChatLiteLLMrun_managerHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]returnCallable[[Any], Any]c                 C  s,   ddl }|j|j|j|jg}t|| j|dS )zKReturns a tenacity retry decorator, preconfigured to handle PaLM exceptionsr   N)Zerror_typesmax_retriesr<   )litellmTimeoutZAPIErrorZAPIConnectionErrorZRateLimitErrorr   r@   )r:   r<   rA   errorsr8   r8   r9   _create_retry_decoratorL   s   rD   _dictMapping[str, Any]r   c                 C  s   | d }|dkrt | d dS |dkr;| ddpd}i }| dr*t| d |d< | dr5| d |d< t||d	S |d
krFt| d dS |dkrTt| d | d dS t| d |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   )rE   rG   rI   rO   r8   r8   r9   _convert_dict_to_message`   s    

rW   'Optional[AsyncCallbackManagerForLLMRun]kwargsr   c                   s4   t  |d}|d fdd}|d	i |I dH S )
z0Use tenacity to retry the async completion call.r<   rY   r   r>   c                    s    j jdi | I d H S Nr8   )clientZacreaterY   r:   r8   r9   _completion_with_retry   s   z6acompletion_with_retry.<locals>._completion_with_retryNrY   r   r>   r   r8   rD   )r:   r<   rY   retry_decoratorr_   r8   r^   r9   acompletion_with_retryy   s
   rc   default_classType[BaseMessageChunk]r   c                 C  s$  |  d}|  dpd}|  drdt| d i}n|  dr&d| d i}ni }g }|  d }rH||d< z	dd |D }W n	 tyG   Y nw |d	ksP|tkrUt|d
S |dks]|tkrdt|||dS |dksl|tkrqt|d
S |dksy|tkrt|| d dS |s|tkrt||dS ||d
S )NrG   rI   rL   rM   Zreasoning_contentrN   c                 S  s:   g | ]}t |d  d|d  d|d|d dqS )rQ   rR   	argumentsidindex)rR   argsrg   rh   )r%   rU   ).0Zrtcr8   r8   r9   
<listcomp>   s    z3_convert_delta_to_message_chunk.<locals>.<listcomp>rH   rJ   rK   )rI   rO   tool_call_chunksrP   rQ   rR   rS   rT   )rU   rV   KeyErrorr!   r   r#   r   r   )rE   rd   rG   rI   rO   rl   Zraw_tool_callsr8   r8   r9   _convert_delta_to_message_chunk   s@   



	


rn   	tool_callr$   rV   c                 C  s$   d| d | d t | d ddS )NrQ   rg   rR   ri   )rR   rf   )typerg   rQ   )jsondumps)ro   r8   r8   r9   !_lc_tool_call_to_openai_tool_call   s   rs   messagec                 C  s  d| j i}t| tr| j|d< nit| trd|d< n_t| trJd|d< d| jv r/| jd |d< | jr=dd | jD |d< n<d| jv rI| jd |d< n/t| trTd	|d< n%t| t	rcd
|d< | j
|d< nt| trrd|d< | j|d< ntd|  d| jv r| jd |d< |S )NrI   rG   rH   rK   rM   c                 S     g | ]}t |qS r8   )rs   )rj   Ztcr8   r8   r9   rk      s    z,_convert_message_to_dict.<locals>.<listcomp>rN   rP   rQ   rR   tooltool_call_idzGot unknown type )rI   
isinstancer   rG   r    r   rO   rN   r"   r   rR   r&   rw   
ValueError)rt   Zmessage_dictr8   r8   r9   _convert_message_to_dict   s8   











rz   )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)ZsinceZremovalZalternative_importc                      s  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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dXd'd(ZedXd)d*Z	dYdZd.d/Z e!d[d2d3Z"			d\d]d;d<Z#d^d?d@Z$d_dBdCZ%		d`dadEdFZ&		d`dbdIdJZ'			d\dcdKdLZ(	dYdd fdRdSZ)edXdTdUZ*ededVdWZ+  Z,S )fr;   u;   DEPRECATED – use `langchain_litellm.ChatLiteLLM` instead.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_timeoutzOptional[float]temperature)default_factoryDict[str, Any]model_kwargstop_pzOptional[int]top_kn
max_tokens   intr@   r>   c                 C  s<   | j }| jdur| 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_valuer8   r8   r9   _default_params&  s   
zChatLiteLLM._default_paramsc                 C  s   | j }| jdur| j}| j| j_| j| j_dD ]}t| | }r+t| j|dd| q| j| j_|| j	| jd}i | j
|S )z.Get the parameters used for the openai client.N)r   r   r   r   r   r   Z_api_key_key)r}   r   r   )r}   r~   r   r\   r   getattrsetattrreplacer   r   r   )r   r   Znamed_api_keyZapi_key_valuecredsr8   r8   r9   _client_params7  s&   




zChatLiteLLM._client_paramsr<   "Optional[CallbackManagerForLLMRun]rY   c                   s,   t  |d}|d fdd}|d	i |S )
z*Use tenacity to retry the completion call.rZ   rY   r   r>   c                    s    j jdi | S r[   )r\   
completionr]   r   r8   r9   r_   [  s   zAChatLiteLLM.completion_with_retry.<locals>._completion_with_retryNr`   r8   ra   )r   r<   rY   rb   r_   r8   r   r9   completion_with_retryU  s   z!ChatLiteLLM.completion_with_retryvaluesr   c                 C  sX  zddl }W n ty   tdw t|dddd|d< t|dd	dd|d< t|d
ddd|d
< t|dddd|d< t|dddd|d< t|dddd|d< t|dddd|d< t|dddd|d< ||d< |d durd|d   kr{dkstd td|d durd|d   krdkstd td|d dur|d dkrt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   ZOPENAI_API_KEYrL   )defaultr   ZAZURE_API_KEYr   ZANTHROPIC_API_KEYr   ZREPLICATE_API_KEYr   ZOPENROUTER_API_KEYr   ZCOHERE_API_KEYZhuggingface_api_keyZHUGGINGFACE_API_KEYZtogether_ai_api_keyZ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)rA   ImportErrorr3   r-   ry   )clsr   rA   r8   r8   r9   validate_environmenta  sV   







""z ChatLiteLLM.validate_environmentmessagesList[BaseMessage]stopOptional[List[str]]r   Optional[bool]r*   c                 K  sr   |d ur|n| j }|r| j|f||d|}t|S | ||\}}	i |	|}	| jd||d|	}
| |
S )N)r   r<   r   r<   r8   )r   _streamr   _create_message_dictsr   _create_chat_resultr   r   r   r<   r   rY   Zshould_streamZstream_itermessage_dictsparamsresponser8   r8   r9   	_generate  s$   
zChatLiteLLM._generater   rF   c           	      C  s   g }| di }|d D ],}t|d }t|tr'd| jp| ji|_t||_t	|t
| ddd}|| q| j}| jd urD| j}||d}t||d	S )
Nusagechoicesrt   r~   finish_reason)r   )rt   Zgeneration_info)token_usager}   )generations
llm_output)rU   rW   rx   r   r~   r}   response_metadata_create_usage_metadatausage_metadatar(   rV   appendr*   )	r   r   r   r   resrt   genr   r   r8   r8   r9   r     s$   



zChatLiteLLM._create_chat_result+Tuple[List[Dict[str, Any]], Dict[str, Any]]c                 C  s<   | j }|d urd|v rtd||d< dd |D }||fS )Nr   z2`stop` found in both the input and default params.c                 S  ru   r8   )rz   )rj   mr8   r8   r9   rk         z5ChatLiteLLM._create_message_dicts.<locals>.<listcomp>)r   ry   )r   r   r   r   r   r8   r8   r9   r     s   z!ChatLiteLLM._create_message_dictsIterator[ChatGenerationChunk]c                 k  s    |  ||\}}i ||ddi}t}d}| jd||d|D ]U}	t|	ts-|	 }	t|	d dkr6q"|	d d d }
|	di }t|
|}	t|	tr`|s[d	| j	pV| j
i|	_d}t||	_|	j}t|	d
}|rt|jt|	j|d |V  q"d S )Nr   TFr   r   r   deltar   r~   rt   chunkr8   )r   r   r   rx   rV   
model_dumplenrU   rn   r~   r}   r   r   r   	__class__r)   on_llm_new_tokenr|   rI   r   r   r   r<   rY   r   r   Zdefault_chunk_classZadded_model_namer   r   r   Zcg_chunkr8   r8   r9   r     s:   





zChatLiteLLM._streamrX   "AsyncIterator[ChatGenerationChunk]c                 K s
  |  ||\}}i ||ddi}t}d}t| f||d|I d H 2 z\3 d H W }	t|	ts4|	 }	t|	d dkr=q%|	d d d }
|	di }t|
|}	t|	trg|sbd	| j	p]| j
i|	_d}t||	_|	j}t|	d
}|r~|jt|	j|dI d H  |V  q%6 d S )Nr   TFr   r   r   r   r   r~   r   r   )r   r   rc   rx   rV   r   r   rU   rn   r~   r}   r   r   r   r   r)   r   r|   rI   r   r8   r8   r9   _astream  s>   




zChatLiteLLM._astreamc                   s   |d ur|n| j }|r| jd|||d|}t|I d H S | ||\}}	i |	|}	t| f||d|	I d H }
| |
S )N)r   r   r<   r   r8   )r   r   r   r   rc   r   r   r8   r8   r9   
_agenerate  s&   
zChatLiteLLM._ageneratetoolsDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]]tool_choiceLOptional[Union[dict, str, Literal['auto', 'none', 'required', 'any'], bool]])Runnable[LanguageModelInput, BaseMessage]c                   s   dd |D }| j durd| j v s/| jdurd| jv s/| j dur%| j tv s/| jdur;| jtv r; dks8t tr;d n*t trCd n"t tredd |D }t fdd	|D set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                 S  ru   r8   r/   )rj   rv   r8   r8   r9   rk   C  r   z*ChatLiteLLM.bind_tools.<locals>.<listcomp>NZazureanyrequiredc                 S  s   g | ]}|d  d qS )rQ   rR   r8   )rj   Zformatted_toolr8   r8   r9   rk   R  s    c                 3  s     | ]}| d  d kV  qdS )rQ   rR   Nr8   )rj   Z	tool_namer   r8   r9   	<genexpr>U  s    
z)ChatLiteLLM.bind_tools.<locals>.<genexpr>zTool choice z1 was specified, but the only provided tools were .)r   r   r8   )
r}   r~   _OPENAI_MODELSrx   r   rV   r   ry   superbind)r   r   r   rY   Zformatted_toolsZ
tool_namesr   r   r9   
bind_tools#  s,    

zChatLiteLLM.bind_toolsc                 C  s.   | j }| jdur| 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   r8   r8   r9   _identifying_params^  s   
zChatLiteLLM._identifying_paramsc                 C  s   dS )Nzlitellm-chatr8   r   r8   r8   r9   	_llm_typel  s   zChatLiteLLM._llm_type)r>   r   N)r<   r   rY   r   r>   r   )r   r   r>   r   )NNN)r   r   r   r   r<   r   r   r   rY   r   r>   r*   )r   rF   r>   r*   )r   r   r   r   r>   r   )NN)
r   r   r   r   r<   r   rY   r   r>   r   )
r   r   r   r   r<   rX   rY   r   r>   r   )r   r   r   r   r<   rX   r   r   rY   r   r>   r*   )r   r   r   r   rY   r   r>   r   )r>   r|   )-r4   r5   r6   r7   r\   __annotations__r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   rV   r   r   r   r   r   r@   propertyr   r   r   r.   r   r   r   r   r   r   r   r   r   r   __classcell__r8   r8   r   r9   r;      sx   
 2

&&;r   r'   c                 C  s*   |  dd}|  dd}t|||| dS )NZprompt_tokensr   Zcompletion_tokens)input_tokensoutput_tokensZtotal_tokens)rU   r'   )r   r   r   r8   r8   r9   r   q  s   r   r   )r:   r;   r<   r=   r>   r?   )rE   rF   r>   r   )r:   r;   r<   rX   rY   r   r>   r   )rE   rF   rd   re   r>   r   )ro   r$   r>   rV   )rt   r   r>   rV   )r   rF   r>   r'   )Pr7   
__future__r   rq   loggingtypingr   r   r   r   r   r   r	   r
   r   r   r   r   r   Zlangchain_core._api.deprecationr   Zlangchain_core.callbacksr   r   Zlangchain_core.language_modelsr   Z*langchain_core.language_models.chat_modelsr   r   r   Z#langchain_core.language_models.llmsr   Zlangchain_core.messagesr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   Zlangchain_core.messages.air'   Zlangchain_core.outputsr(   r)   r*   Zlangchain_core.runnablesr+   Zlangchain_core.toolsr,   Zlangchain_core.utilsr-   r.   Z%langchain_core.utils.function_callingr0   Zpydanticr1   r2   	getLoggerr4   logger	Exceptionr3   rD   rW   rc   rn   rs   rz   r   r;   r   r8   r8   r8   r9   <module>   sL    <D



.
  r