
    j              	          d dl Z d dlZd dlmZmZmZmZmZ d dlZd dl	Z	d dl
mZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZ  G d	 d
e      Z G d de      Z	 ddeeef   dedeeef   fdZdee   fdZ G d de      Zy)    N)AnyDictListOptionalUnion)DEFAULT_MAX_RECURSE_DEPTH)BaseLLMModelInfoBaseTokenCounter)BaseLLMExceptionget_secret_str)AllMessageValues)TokenCountResponsec                       e Zd Zy)GeminiErrorN)__name__
__module____qualname__     y/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/llms/gemini/common_utils.pyr   r      s    r   r   c                   j   e Zd Z	 	 ddededee   dededee   dee   d	efd
Ze	d	efd       Z
eddee   d	ee   fd       Zeddee   d	ee   fd       Zeded	ee   fd       Zdeeeef      d	ee   fdZ	 ddee   dee   d	ee   fdZdededeeej*                  f   d	efdZd	ee   fdZy)GeminiModelInfoNheadersmodelmessagesoptional_paramslitellm_paramsapi_keyapi_basereturnc                     |S )z.Google AI Studio sends api key in query paramsr   )selfr   r   r   r   r   r   r    s           r   validate_environmentz$GeminiModelInfo.validate_environment   s	     r   c                      y)Nv1betar   r#   s    r   api_versionzGeminiModelInfo.api_version"   s    r   c                 (    | xs t        d      xs dS )NGEMINI_API_BASEz)https://generativelanguage.googleapis.comr   )r    s    r   get_api_basezGeminiModelInfo.get_api_base&   s"      ;/0;:	
r   c                 :    | xs t        d      xs t        d      S NGOOGLE_API_KEYGEMINI_API_KEYr   )r   s    r   get_api_keyzGeminiModelInfo.get_api_key.   s    b>*:;bP`Aabr   c                 &    | j                  dd      S )Ngemini/ )replace)r   s    r   get_base_modelzGeminiModelInfo.get_base_model2   s    }}Y++r   modelsc                 n    g }|D ]-  }|d   j                  dd      }d|z   }|j                  |       / |S )Nnamezmodels/r3   r2   )r4   append)r#   r6   litellm_model_namesr   stripped_model_namelitellm_model_names         r   process_model_namez"GeminiModelInfo.process_model_name6   sL     E"'-"7"7	2"F!*-@!@&&'9:  #"r   c                    t         j                  |      }t         j                  |      }d| j                   d}||t	        d      t
        j                  j                  | | d|       }|j                  dk7  r)t	        d|j                   d|j                                |j                         d	   }| j                  |      }|S )
N/z/modelszGEMINI_API_BASE or GEMINI_API_KEY/GOOGLE_API_KEY is not set. Please set the environment variable, to query Gemini's `/models` endpoint.z?key=)url   z1Failed to fetch models from Gemini. Status code: z, Response: r6   )r   r+   r0   r(   
ValueErrorlitellmmodule_level_clientgetstatus_codejsonr=   )r#   r   r    endpointresponser6   r:   s          r   
get_modelszGeminiModelInfo.get_models>   s     #//9!--g6t''(0w Z  ..22*XJeG95 3 
 3&CHDXDXCYYefnfsfsfuevw  *"55f=""r   error_messagerF   c                     t        |||      S )N)rF   messager   )r   )r#   rK   rF   r   s       r   get_error_classzGeminiModelInfo.get_error_classW   s     #]G
 	
r   c                     t               S )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.
        GoogleAIStudioTokenCounterr'   s    r   get_token_counterz!GeminiModelInfo.get_token_counter^   s     *++r   )NNN)r   r   r   dictstrr   r   r   r$   propertyr(   staticmethodr+   r0   r5   r   r=   rJ   intr   httpxHeadersr   rN   r
   rR   r   r   r   r   r      s    "&"&  '(	
   # 3- 
 S   
x} 
 
 
 cXc] chsm c c ,c ,hsm , ,#d38n)= #$s) # HL#}#7?}#	c#2
 
/2
=B4CV=W
	
,8,<#= ,r   r   datadepthr!   c           	         |t         kD  r| S i }t        | t              s| S | j                         D ]B  \  }}t        |t              r(t        j                  |      j                  d      ||<   ?t        |t        j                        r|j                         ||<   mt        |t              rt        ||dz         ||<   t        |t              rt        d |D              r5|D cg c]&  }t        j                  |      j                  d      ( c}||<   t        d |D              r#|D cg c]  }|j                          c}||<   |D cg c]  }t        ||dz          c}||<   >|||<   E |S c c}w c c}w c c}w )a  Converts unserializable types in dict to json.dumps() compatible types.

    This function is called in models.py after calling convert_to_dict(). The
    convert_to_dict() can convert pydantic object to dict. However, the input to
    convert_to_dict() is dict mixed of pydantic object and nested dict(the output
    of converters). So they may be bytes in the dict and they are out of
    `ser_json_bytes` control in model_dump(mode='json') called in
    `convert_to_dict`, as well as datetime deserialization in Pydantic json mode.

    Returns:
      A dictionary with json.dumps() incompatible type (e.g. bytes datetime)
      to compatible type (e.g. base64 encoded string, isoformat date string).
    ascii   c              3   <   K   | ]  }t        |t                y wrS   )
isinstancebytes.0vs     r   	<genexpr>z.encode_unserializable_types.<locals>.<genexpr>   s     7A:a's   c              3   P   K   | ]  }t        |t        j                           y wrS   )ra   datetimerc   s     r   rf   z.encode_unserializable_types.<locals>.<genexpr>   s     CU:a!2!23Us   $&)r   ra   rT   itemsrb   base64urlsafe_b64encodedecoderh   	isoformatencode_unserializable_typeslistall)r[   r\   processed_datakeyvaluere   s         r   rn   rn   i   sq     (((*NdD!jjl
UeU#"(":":5"A"H"H"QN3x001"'//"3N3t$"=eUQY"ON3t$777IN'INAF,,Q/66w?'s# CUCC>C&Deq{{}e&Ds# HM'GL!/519=u's# #(N3' #( ' 'E's   &+E8-E=Fc                  2    t        d      xs t        d      S r-   r   r   r   r   get_api_key_from_envru      s    *+O~>N/OOr   c                       e Zd ZdZ	 ddee   defdZ	 	 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   fdZy)rQ   z;Token counter implementation for Google AI Studio provider.Ncustom_llm_providerr!   c                 @    ddl m} ||j                  j                  k(  S )Nr   )LlmProviders)litellm.types.utilsry   GEMINIrs   )r#   rw   ry   s      r   should_use_token_counting_apiz8GoogleAIStudioTokenCounter.should_use_token_counting_api   s     	5"l&9&9&?&???r   model_to_user   contents
deploymentrequest_modelc           	      @  K   dd l }ddlm} |xs i }|j                  |j	                  di             }||d}	|j                  |	         |       j                  d	i | d {   }
|
0t        |
j	                  dd      |||
j	                  dd      |
      S y 7 7w)
Nr   rP   r   )r   r~   totalTokenstokenizer_usedr3   )total_tokensr   
model_usedtokenizer_typeoriginal_responser   )copy(litellm.llms.gemini.count_tokens.handlerrQ   deepcopyrE   updateacount_tokensr   )r#   r}   r   r~   r   r   r   rQ   count_tokens_params_requestcount_tokens_paramsresults              r   count_tokensz'GoogleAIStudioTokenCounter.count_tokens   s      	W%2
&*mmJNNCSUW4X&Y#! 
 	$**+>?A13AA 
)
 
 %#ZZq9+'%zz*:B?"(  
s   A"B$B%8BrS   )Nr3   )r   r   r   __doc__r   rU   boolr|   r   r   r   r   r   r   r   r   rQ   rQ      s    E .2@%c]@ 
@ 04 4S#X/0 4S#X/0	
 T#s(^,  
$	%r   rQ   )r   )rj   rh   typingr   r   r   r   r   rY   rC   litellm.constantsr    litellm.llms.base_llm.base_utilsr	   r
   )litellm.llms.base_llm.chat.transformationr   litellm.secret_managers.mainr   litellm.types.llms.openair   rz   r   r   r   rU   objectrX   rn   ru   rQ   r   r   r   <module>r      s      3 3   7 O F 7 6 2	" 	R,& R,l +,)
sF{
)$')	#v+)XPhsm P(!1 (r   