
    h                     .   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
 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  G d
 de      Zdee   dee   fdZ	 ddedee   defdZ	 ddee
e	e   ef      dee   dee   fdZdee   dee   fdZy)z)
Utility functions for base LLM classes.
    N)ABCabstractmethod)ListOptionalTypeUnion)_parsing	_pydantic)	BaseModel)verbose_logger)AllMessageValuesChatCompletionToolCallChunk)MessageProviderSpecificModelInfoc                   0   e Zd Zdedee   fdZe	 ddee   dee   dee   fd       Z	e
eddee   dee   fd              Ze
e	 ddee   dee   f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       Ze
ededee   fd              Zy)BaseLLMModelInfomodelreturnc                      y)zE
        Default values all models of this provider support.
        N )selfr   s     \/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/base_llm/base_utils.pyget_provider_infoz"BaseLLMModelInfo.get_provider_info   s         Napi_keyapi_basec                     g S )zF
        Returns a list of models supported by this provider.
        r   )r   r   r   s      r   
get_modelszBaseLLMModelInfo.get_models   s	     	r   c                      y Nr   )r   s    r   get_api_keyzBaseLLMModelInfo.get_api_key%   s     	r   c                      y r    r   )r   s    r   get_api_basezBaseLLMModelInfo.get_api_base*   s    
 	r   headersmessagesoptional_paramslitellm_paramsc                      y r    r   )r   r$   r   r%   r&   r'   r   r   s           r   validate_environmentz%BaseLLMModelInfo.validate_environment1   s     	r   c                      y)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   s    r   get_base_modelzBaseLLMModelInfo.get_base_model>   s     	r   )NNr    )__name__
__module____qualname__strr   r   r   r   r   r   staticmethodr!   r#   dictr   r)   r,   r   r   r   r   r      si    
+	, GK}7?}	c  Xc] hsm    "&3-	#  
  "&"&

 
 '(	

 
 
 #
 3-
 

 
 c hsm   r   r   
tool_callsr   c                 x   | d   d   j                  d      }	 |zt        j                  |      }t        |t              r4|j                  d      x}!t        t        j                  |            }|S t        t        j                  |            }|S 	 y# t        j                  $ r t        |      cY S w xY 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
isinstancer2   r   dumpsJSONDecodeError)r3   json_mode_content_strargsr7   _messages        r   !_convert_tool_response_to_messagerB   J   s     ,6a=+D+H+H+U6 ,::34D$%TXXh5G+G6*T"4::f+=> #4::d+;< -   64556s   AB 4 B B98B9response_formatref_templatec                     @| j                  d      dk(  r,t        j                  |       }|d   d   }fd} ||       |S | S )Ntypejson_schemaschemac                 P   | g fg}t               }|r|j                         \  }}t        |      }||v r&|j                  |       t	        |t
              ryd|v r.|d   }|j                  d      d   }j                  |      |d<   |j                         D ]3  \  }}	t	        |	t
        t        f      s|j                  |	||gz   f       5 nQt	        |t              rAt        |      D ]3  \  }
}t	        |t
        t        f      s|j                  |||
gz   f       5 |ry y )Nz$ref/r+   )setpopidaddr<   r2   splitformatitemslistappend	enumerate)rH   stackvisitedobjpathobj_idref_path
model_namekviitemrD   s               r   update_refsz4_dict_to_response_format_helper.<locals>.update_refsm   s   b\NEeG!IIK	TCW$F#c4(}#&v;%-^^C%8%<
&2&9&9
&9&KF #		1%a$6!LL!TQCZ9 !,  T*#,S>4%dT4L9!LL$s
);< $2' r   )r9   copydeepcopy)rC   rD   modified_formatrH   ra   s    `   r   _dict_to_response_format_helperre   d   sU     O$7$7$?=$P--8 /9	=6 	Fr   c                    | yt        | t              rt        | |      S t        j                  j                  |       st        d|        || j                  |      }nt        j                  |       }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 - )rD   rG   T)rH   namestrict)rF   rG   )r<   r2   re   r	   _completionsis_basemodel_type	TypeErrormodel_json_schemar
   to_strict_json_schemar-   )rC   rD   rH   s      r   type_to_response_format_paramrn      s     /4(.MM
   22?C=o=NOPP 222M00A #,,
 r   r%   c                     g }| D ]H  }|d   dk(  r-t        j                  d       |j                  d|d   d       8|j                  |       J |S )zO
    Translate `developer` role to `system` role for non-OpenAI providers.
    role	developerzCTranslating developer role to system role for non-OpenAI providers.systemr8   )rp   r8   )r   debugrT   )r%   new_messagesms      r   !map_developer_role_to_system_rolerv      s_     ,.LV9#  U a	l KL"  r   r    )__doc__rb   r:   abcr   r   typingr   r   r   r   
openai.libr	   r
   pydanticr   litellm._loggingr   litellm.types.llms.openair   r   litellm.types.utilsr   r   r   rB   r2   r0   re   rn   rv   r   r   r   <module>r      s      # . . *  + S B5s 5p01g6 :>&&)1#&	&V #'!eDOT$9:;!3-! d^!H#$	
r   