
    g$+                         d Z ddlZddlZddlmZmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZmZmZ erdd
lmZ neZ G d de      Zy)z
Base Vertex, Google AI Studio LLM Class

Handles Authentication and generating request urls for Vertex AI and Google AI Studio
    N)TYPE_CHECKINGAnyLiteralOptionalTuple)verbose_logger)asyncify)BaseLLM)AsyncHTTPHandler   )_get_gemini_url_get_vertex_urlall_gemini_url_modes)Credentialsc                       e Zd Zd  fdZdee   defdZdee   dee   deeef   fdZ	deddfd	Z
dee   dee   d
ed   deeef   fdZdedefdZdee   d
edee   dedee   dee   dedeee   ef   fdZ	 	 d!dedee   dee   dee   dee   dee   dee   d
ed   dee   dee   dedeee   ef   fdZdee   dee   d
ed   deeef   fdZdee   dee   defdZ xZS )"
VertexBasereturnNc                 h    t         |           d | _        d | _        d | _        d | _        d | _        y )N)super__init__access_tokenrefresh_token_credentials
project_idasync_handler)self	__class__s    [/var/www/openai/venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/vertex_llm_base.pyr   zVertexBase.__init__   s5    +/,0?C)-9=    vertex_regionc                     |xs dS )Nzus-central1 )r   r    s     r   get_vertex_regionzVertexBase.get_vertex_region!   s    --r   credentialsr   c                    dd l m} ddl m} ddlm} |0t        |t              rdd l}t        j                  d|       t        j                  d|t        j                  j                  |      t        j                                	 t        j                  j                  |      rt        j                  t!        |            }nt        j"                  |      }d|v r$|d   dk(  r|j(                  j+                  |      }n2|j,                  j.                  j(                  j1                  |d	g
      }|)t3        |dd       }n|j5                  |d	g      \  }}	||	}|j7                   |              |st9        d      t        |t              st;        dt=        |             ||fS # t$        $ r t%        dj'                  |            w xY w)Nr   )identity_poolRequestz*Vertex: Loading vertex credentials from %szVVertex: checking if credentials is a valid path, os.path.exists(%s)=%s, current dir %sz:Unable to load vertex credentials from environment. Got={}typeexternal_accountz.https://www.googleapis.com/auth/cloud-platform)scopesr   )quota_project_idr+   Could not resolve project_idz(Expected project_id to be a str but got )google.authauthr&   google.auth.transport.requestsr(   
isinstancestrgoogle.oauth2.service_accountr   debugospathexistsgetcwdjsonloadopenloads	Exceptionformatr   	from_infooauth2service_accountfrom_service_account_infogetattrdefaultrefresh
ValueError	TypeErrorr)   )
r   r$   r   google_authr&   r(   googlejson_objcredscreds_project_ids
             r   	load_authzVertexBase.load_auth$   s    	*-	
 "z+s'C0  <k   h{+			
77>>+.#yyk):;H#zz+6H !hv&6:L&L%11;;HE MM11==WW  PQ X   !$UL$?
&1&9&9!+HI ': '#E# !-
gi ;<<*c*:4
;K:LM  j  M  PWW# s   	AF/ /$Gc                 <    ddl m} |j                   |              y )Nr   r'   )r0   r(   rE   )r   r$   r(   s      r   refresh_authzVertexBase.refresh_authg   s    	
 	GI&r   custom_llm_provider)	vertex_aivertex_ai_betageminic                    |dk(  ry| j                   4|| j                   |fS | j                  | j                   | j                  fS | j                  s3| j                  ||      \  | _        }| j                  sz|xs || _        nn| j                  j                  s| j                  j
                  s| j                  | j                         | j                  s| j                  j                  | _        | j                  st        d      | j                  r| j                  j
                  st        d      | j                  j
                  |xs | j                  fS )z3
        Returns auth token and project id
        rS    rV   r$   r   r-   0Could not resolve API token from the environment)
r   r   r   rM   expiredtokenrO   r,   rF   RuntimeErrorr   r$   r   rP   cred_project_ids        r   _ensure_access_tokenzVertexBase._ensure_access_tokenn   s1    (*(%((*44,(($//99  15'J 2@ 2.D ??","?  ((0A0A0G0G!!$"3"34??"&"3"3"D"D;<<  (9(9(?(?QRR  &&
(EdooEEr   optional_paramsc                     d|v ryd|v ryy)z
        VertexAI only supports ContextCaching on v1beta1

        use this helper to decide if request should be sent to v1 or v1beta1

        Returns v1beta1 if context caching is enabled
        Returns v1 in all other cases
        cached_contentTCachedContentFr"   )r   r_   s     r   is_using_v1beta1_featuresz$VertexBase.is_using_v1beta1_features   s     .o-r   api_basegemini_api_keyendpointstreamauth_headerurlc                     |rB|dk(  r"dj                  ||      }|t        d      |}ndj                  ||      }|du r|dz   }||fS )z
        for cloudflare ai gateway - https://github.com/BerriAI/litellm/issues/4317

        ## Returns
        - (auth_header, url) - Tuple[Optional[str], str]
        rS   z{}:{}z3Missing gemini_api_key, please set `GEMINI_API_KEY`Tz?alt=sse)r>   rF   )r   rd   rP   re   rf   rg   rh   ri   s           r   _check_custom_proxyzVertexBase._check_custom_proxy   sm      "h.nnXx8!)$M  #  nnXx8~J&Cr   modelvertex_projectvertex_locationvertex_credentialsshould_use_v1beta1_featuresmodec           	          |dk(  rt        ||||      \  }}d}n.| j                  |      }|
du rdnd}t        ||||||      \  }}| j                  |	||||||	      S )
z
        Internal function. Returns the token and url for the call.

        Handles logic if it's google ai studio vs. vertex ai.

        Returns
            token, url
        rS   )rq   rl   rg   re   N)r    Tv1beta1v1)rq   rl   rg   rm   rn   vertex_api_version)rd   rh   rP   re   rf   rg   ri   )r   r#   r   rk   )r   rl   rh   re   rm   rn   ro   rg   rP   rd   rp   rq   ri   rf   versions                  r   _get_token_and_urlzVertexBase._get_token_and_url   s    , (*+-	MC K"44?4SO 9D@	d  ,- /#*MC ''# 3) ( 
 	
r   c                 ^  K   |dk(  ry| j                   4|| j                   |fS | j                  | j                   | j                  fS | j                  sF	  t        | j                        ||       d{   \  | _        }| j                  s|xs || _        n| j                  j                  s| j                  j                  s- t        | j                        | j                         d{    | j                  s| j                  j                  | _        | j                  st        d      | j                  r| j                  j                  st        d      | j                  j                  |xs | j                  fS 7 # t
        $ r t        j                  d        w xY w7 w)z7
        Async version of _ensure_access_token
        rS   rU   NrW   zfFailed to load vertex credentials. Check to see if credentials containing partial/invalid information.r-   rX   )r   r   r   r	   rM   r=   r   	exceptionrY   rZ   rO   r,   rF   r[   r\   s        r   _ensure_access_token_asyncz%VertexBase._ensure_access_token_async   s     (*(%((*44,(($//99  ;S8DNN;S +
< 62!? ??","?  ((0A0A0G0G1ht001$2C2CDDD??"&"3"3"D"D;<<  (9(9(?(?QRR  &&
(EdooEE/6  ((| 	 Es>   AF- F 6F7F A,F-/F+0BF-F  F((F-extra_headersc                 H    ddi}|d| |d<   ||j                  |       |S )NzContent-Typezapplication/jsonzBearer Authorization)update)r   rh   r{   headerss       r   set_headerszVertexBase.set_headers,  sA     .
 ")0'>GO$$NN=)r   )r   N)Fchat)__name__
__module____qualname__r   r   r2   r#   r   r   rM   rO   r   r^   dictboolrc   rk   r   rw   rz   r   __classcell__)r   s   @r   r   r      sX   >.x} . .A!#C=A!6>smA!	sCxA!F' ' '&Fc]&F SM&F %3
	&F 
sCx&FP $  3-  !  !	 
     c]    
x}c!	" X 7<%+6
6
 c]6
 !	6

 !6
 "#6
 %SM6
 6
 %%LM6
 3-6
 &.d^6
 #6
 
x}c!	"6
p,Fc],F SM,F %3
	,F 
sCx,F\#C=9A$	r   r   )__doc__r9   r5   typingr   r   r   r   r   litellm._loggingr   #litellm.litellm_core_utils.asyncifyr	   litellm.llms.baser
   &litellm.llms.custom_httpx.http_handlerr   common_utilsr   r   r   google.auth.credentialsr   GoogleCredentialsObjectr   r"   r   r   <module>r      sD     	 ? ? + 8 % C P PN!_ _r   