o
    ưi                      @   s8  d Z ddlZddlZddlmZmZ ddl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 ddlmZmZ dd	lmZmZmZ G d
d deZG dd deZde	e de
e fddZ	ddede
e defddZ 	dde
eee ef  de
e de
e fddZ!de	e de	e fddZ"dS )z)
Utility functions for base LLM classes.
    N)ABCabstractmethod)AnyDictListOptionalTypeUnion)_parsing	_pydantic)	BaseModel)verbose_logger)AllMessageValuesChatCompletionToolCallChunk)MessageProviderSpecificModelInfoTokenCountResponsec                   @   s   e Zd Ze				ddedeeeeef   deeeeef   deeeef  dedeeeeef   d	ee d
ee	 fddZ
e	ddee d
efddZdS )BaseTokenCounterN model_to_usemessagescontents
deploymentrequest_modeltoolssystemreturnc                    s   d S N )selfr   r   r   r   r   r   r   r   r   W/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/base_llm/base_utils.pycount_tokens   s   zBaseTokenCounter.count_tokenscustom_llm_providerc                 C      dS )zr
        Returns True if we should the this API for token counting for the selected `custom_llm_provider`
        Fr   )r   r"   r   r   r    should_use_token_counting_api       z.BaseTokenCounter.should_use_token_counting_api)Nr   NNr   )__name__
__module____qualname__r   strr   r   r   r   r   r!   boolr$   r   r   r   r    r      s<    	r   c                   @   s  e Zd Zdedee fddZe	ddee dee dee fdd	Z	e
eddee dee fd
dZe
e	ddee dee fddZe		ddededee dededee dee defddZe
ededee fddZdee fddZdS )BaseLLMModelInfomodelr   c                 C   r#   )zE
        Default values all models of this provider support.
        Nr   )r   r,   r   r   r    get_provider_info,      z"BaseLLMModelInfo.get_provider_infoNapi_keyapi_basec                 C   s   g S )zF
        Returns a list of models supported by this provider.
        r   )r   r/   r0   r   r   r    
get_models5   r.   zBaseLLMModelInfo.get_modelsc                 C      d S r   r   )r/   r   r   r    get_api_key>   s   zBaseLLMModelInfo.get_api_keyc                 C   r2   r   r   )r0   r   r   r    get_api_baseC   s   zBaseLLMModelInfo.get_api_baseheadersr   optional_paramslitellm_paramsc                 C   r2   r   r   )r   r5   r,   r   r6   r7   r/   r0   r   r   r    validate_environmentJ   s   z%BaseLLMModelInfo.validate_environmentc                 C   r#   )a2  
        Returns the base model name from the given model name.

        Some providers like bedrock - can receive model=`invoke/anthropic.claude-3-opus-20240229-v1:0` or `converse/anthropic.claude-3-opus-20240229-v1:0`
            This function will return `anthropic.claude-3-opus-20240229-v1:0`
        Nr   r,   r   r   r    get_base_modelW   s   	zBaseLLMModelInfo.get_base_modelc                 C   r#   )z
        Factory method to create a token counter for this provider.
        
        Returns:
            Optional TokenCounterInterface implementation for this provider,
            or None if token counting is not supported.
        Nr   )r   r   r   r    get_token_counterb   r%   z"BaseLLMModelInfo.get_token_counter)NNr   )r&   r'   r(   r)   r   r   r-   r   r   r1   staticmethodr3   r4   dictr   r8   r:   r   r;   r   r   r   r    r+   +   sd    
	 		r+   
tool_callsr   c                 C   s   | d d  d}z0|dur7t|}t|tr,| d }dur,tt|d}|W S tt|d}|W S W dS  tjyH   t|d Y S w )z
    In JSON mode, Anthropic API returns JSON schema as a tool call, we need to convert it to a message to follow the OpenAI format

    r   function	argumentsNvalues)content)getjsonloads
isinstancer=   r   dumpsJSONDecodeError)r>   Zjson_mode_content_strargsrA   _messager   r   r    !_convert_tool_response_to_messagem   s   
rK   response_formatref_templatec                    sH    d ur"|  ddkr"t| }|d d } fdd}|| |S | S )Ntypejson_schemaschemac                    s   | g fg}t  }|rx| \}}t|}||v rq|| t|trUd|v r:|d }|dd } j|d|d< | D ]\}}	t|	tt	frS|
|	||g f q>nt|t	rtt|D ]\}
}t|tt	frs|
|||
g f q^|s
d S d S )Nz$ref/r9   )setpopidaddrF   r=   splitformatitemslistappend	enumerate)rP   stackvisitedobjpathobj_idZref_pathZ
model_namekviitemrM   r   r    update_refs   s0   



z4_dict_to_response_format_helper.<locals>.update_refs)rC   copydeepcopy)rL   rM   Zmodified_formatrP   rg   r   rf   r    _dict_to_response_format_helper   s   
rj   c                 C   sn   | du rdS t | trt| |S tj| std|  |dur(| j|d}nt	| }d|| j
dddS )z
    Re-implementation of openai's 'type_to_response_format_param' function

    Used for converting pydantic object to api schema.
    Nz#Unsupported response_format type - rf   rO   T)rP   namestrict)rN   rO   )rF   r=   rj   r
   Z_completionsZis_basemodel_type	TypeErrorZmodel_json_schemar   Zto_strict_json_schemar&   )rL   rM   rP   r   r   r    type_to_response_format_param   s   	


rn   r   c                 C   sH   g }| D ]}|d dkrt d |d|d d q|| q|S )zO
    Translate `developer` role to `system` role for non-OpenAI providers.
    roleZ	developerzCTranslating developer role to system role for non-OpenAI providers.r   rB   )ro   rB   )r   debugr[   )r   Znew_messagesmr   r   r    !map_developer_role_to_system_role   s   rr   r   )#__doc__rh   rD   abcr   r   typingr   r   r   r   r   r	   Z
openai.libr
   r   Zpydanticr   Zlitellm._loggingr   Zlitellm.types.llms.openair   r   Zlitellm.types.utilsr   r   r   r   r+   rK   r=   r)   rj   rn   rr   r   r   r   r    <module>   sL     B

+
$