Ë
    uPêjÑ  ã                   ó  — U d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZ ddlmZ ddl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 ddlmZmZmZmZmZ dZ e
e!d<   erddl"m#Z$ ddl"m%Z% ne	Z$ G d„ d«      Z&y)z€
Base Vertex, Google AI Studio LLM Class

Handles Authentication and generating request urls for Vertex AI and Google AI Studio
é    N)ÚMapping)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteral)Úurlparse)Úverbose_logger)Úasyncify)ÚAsyncHTTPHandler)Úget_secret_str)ÚVERTEX_CREDENTIALS_TYPESÚVertexPartnerProvideré   )Ú_get_gemini_urlÚ_get_vertex_urlÚall_gemini_url_modesÚget_vertex_base_model_nameÚget_vertex_base_urlzqGoogle Cloud SDK not found. Install it with: pip install 'litellm[google]' or pip install google-cloud-aiplatformÚGOOGLE_IMPORT_ERROR_MESSAGE)ÚCredentials©Ú
TokenStatec                   ó  ‡ — e Zd ZdLˆ fd„Zededz  dedefd„«       Zdedz  dedz  dee	ef   fd	„Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdefd„Zdedz  dedz  defd„Ze	 dMdededededz  dededz  defd„«       Zdedz  dedz  dedz  dedededz  dedefd„Zde	ddfd„Zdedej2                  fd„Zdedej2                  ddfd„Zdededz  deeef   dz  fd„Zdededz  deeed e	edz  f   dz  fd!„Zdedee	edz  f   fd"„Zde	dd fd#„Zdedz  dedz  dedee	edz  f   fd$„Z de	ded%edz  ddfd&„Z!deddfd'„Z"de	ded%edz  ddfd(„Z#dedz  dedz  d)e$d*   deeef   fd+„Z%d,e&defd-„Z'	 	 	 	 	 dNdedz  d)ed.edz  d/ededz  d0edz  d1ededz  dedz  dedz  d2e$d3   dz  d4edeedz  ef   fd5„Z(	 	 	 dOded0edz  d.edz  dedz  dedz  d6edz  dedz  d)e$d*   dedz  d7edz  d8e)d4edeedz  ef   fd9„Z*dedz  dedz  ded:e+deeef   f
d;„Z,dedz  dedz  ded:e+deeef   f
d<„Z-	 dPdedz  dedz  d=edeeef   fd>„Z.dedz  dedz  deeef   fd?„Z/dedz  dedz  d)e$d*   deeef   fd@„Z0d0edz  dAe&dz  de&fdB„Z1edCe&dedz  fdD„«       Z2edCe&dedz  fdE„«       Z3edCe&dedz  fdF„«       Z4edCe&dedz  fdG„«       Z5edCe&dedz  fdH„«       Z6edIe7ee8f   dedz  fdJ„«       Z9edCe7ee8f   dedz  fdK„«       Z:ˆ xZ;S )QÚ
VertexBaseÚreturnNc                 óÒ   •— t         ‰| �  «        d | _        d | _        d | _        i | _        d | _        d | _        i | _        i | _	        i | _
        t        j                  «       | _        y ©N)ÚsuperÚ__init__Úaccess_tokenÚrefresh_tokenÚ_credentialsÚ_credentials_project_mappingÚ
project_idÚasync_handlerÚ_async_refresh_locksÚ_async_refresh_lock_refcountsÚ_background_refresh_tasksÚ	threadingÚRLockÚ_sync_refresh_lock)ÚselfÚ	__class__s    €úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/vertex_llm_base.pyr   zVertexBase.__init__*   sq   ø€ Ü‰ÑÔØ(,ˆÔØ)-ˆÔØ<@ˆÔð ð 	Ô)ð '+ˆŒØ6:ˆÔð @BˆÔ!Ø?AˆÔ*àDFˆÔ&ô
 #,§/¡/Ó"3ˆÕó    Úvertex_regionÚmodelc                 ó  — dd l }|j                  d«      sd|› �n|}|j                  j                  |i «      }|j                  d«      }|r<t	        |«      dkD  r.| €|d   S | |vr!t        j                  d|| ||d   «       |d   S | S | xs dS )Nr   z
vertex_ai/Úsupported_regionszSVertex AI model '%s' does not support region '%s' (supported: %s). Routing to '%s'.úus-central1)ÚlitellmÚ
startswithÚ
model_costÚgetÚlenr	   Úwarning)r0   r1   r5   Ú	model_keyÚ
model_infor3   s         r.   Úget_vertex_regionzVertexBase.get_vertex_regionH   sµ   € ãð 8=×7GÑ7GÈÔ7U˜Z¨ wÑ/Ð[`ˆ	Ø#×.Ñ.×2Ñ2°9¸bÓAˆ
Ø#-§>¡>Ð2EÓ#FÐá¤Ð%6Ó!7¸!Ò!;àÐ$Ø(¨Ñ+Ð+àÐ$5Ñ5Ü×&Ñ&ØiØØ!Ø%Ø% aÑ(ôð )¨Ñ+Ð+Ø Ð ØÒ- Ð-r/   Úcredentialsr$   c                 ó,  — |��ðt        |t        «      r‹t        j                  j	                  |«      }t        j                  d|t        j                  «       «       	 |r*t        |«      5 }t        j                  |«      }d d d «       nt        j                  |«      }n*t        |t        «      r|}nt!        dt        |«      › �«      ‚dv rÔ|d   dk(  rÌ|j#                  di «      }t        |t        «      r|j#                  dd«      nd}t        |t        «      rHd	|v rDd
dlm}	 |	j)                  |«      }
|
r|	j+                  ||
dg¬«      }n–| j-                  |dg¬«      }n�t        |t        «      rd|v r| j/                  |dg¬«      }nX| j1                  |dg¬«      }nCd|v r+|d   dk(  r#| j3                  |dg¬«      }|€!|j4                  }n| j7                  |dg¬«      }|€(t9        |dd «      }n| j;                  dg¬«      \  }}|€|}| j=                  |«       |st!        d«      ‚t        |t        «      st?        dt        |«      › �«      ‚||fS # 1 sw Y   �ŒÃxY w# t        $ r&}t        dt        |«      j                  › �«      ‚d }~ww xY w)NzCVertex: Loading vertex credentials, is_file_path=%s, current dir %sz‰Unable to load vertex credentials from environment. Ensure the JSON is valid (check for unescaped newlines in private_key). Parse error: zInvalid credentials type: ÚtypeÚexternal_accountÚcredential_sourceÚenvironment_idÚ Úawsr   )ÚVertexAIAwsWifAuthz.https://www.googleapis.com/auth/cloud-platform)Ú
aws_paramsÚscopes©rH   Ú
executableÚauthorized_userr$   úCould not resolve project_idz(Expected project_id to be a str but got ) Ú
isinstanceÚstrÚosÚpathÚexistsr	   ÚdebugÚgetcwdÚopenÚjsonÚloadÚloadsÚ	Exceptionr@   Ú__name__ÚdictÚ
ValueErrorr8   Ú(litellm.llms.vertex_ai.vertex_ai_aws_wifrF   Úextract_aws_paramsÚcredentials_from_explicit_awsÚ(_credentials_from_identity_pool_with_awsÚ_credentials_from_pluggableÚ_credentials_from_identity_poolÚ!_credentials_from_authorized_userÚquota_project_idÚ!_credentials_from_service_accountÚgetattrÚ_credentials_from_default_authÚrefresh_authÚ	TypeError)r,   r>   r$   Ú_is_pathÚfÚjson_objÚerB   rC   rF   rG   ÚcredsÚcreds_project_ids                r.   Ú	load_authzVertexBase.load_authc   s  € ð
 Ñ"Ü˜+¤sÔ+Ü"$§'¡'§.¡.Øó#�ô ×$Ñ$ØYØÜ—I‘I“KôðÙÜ! +Ó.ð 4°!Ü'+§y¡y°£|˜H÷4ð 4ô $(§:¡:¨kÓ#:˜øô ˜K¬Ô.Ø&‘ä Ð#=¼dÀ;Ó>OÐ=PÐ!QÓRÐRð ˜Ñ! h¨vÑ&6Ð:LÒ&Là+3¯<©<Ð8KÈRÓ+PÐ!äCMÐN_ÔaeÔCfÐ%×)Ñ)Ð*:¸BÔ?Ðlnð ô ˜n¬cÔ2°uÀÑ7Nõð );×(MÑ(MÈhÓ(W�JÙ!Ø 2× PÑ PØ$Ø'1Ø$TÐ#Uð !Qó !™ð !%× MÑ MØ$Ø$TÐ#Uð !Nó !™ô  Ð 1´4Ô8¸\ÐM^Ñ=^Ø ×<Ñ<Ø Ø PÐQð =ó ‘Eð
 !×@Ñ@Ø Ø PÐQð Aó ‘Eð
 ˜8Ñ#¨°Ñ(8Ð<MÒ(MØ×>Ñ>ØØLÐMð ?ó �ð Ð%à×.Ñ.ñ ð ×>Ñ>ØØLÐMð ?ó �ð
 Ð!Ü$ U¨L¸$Ó?‘
à&*×&IÑ&IØHÐIð 'Jó 'Ñ#ˆEÐ#ð Ð!Ø-�
à×Ñ˜%Ô áÜÐ;Ó<Ð<ä˜*¤cÔ*ÜÐFÄtÈJÓGWÐFXÐYÓZÐZà�jÐ Ð ÷g4ñ 4ûô !ò Ü#ð(ä(,¨Q«×(8Ñ(8Ð'9ð;óð ûðús0   ÁI$ Á*IÂ I$ ÉI!ÉI$ É$	JÉ-!JÊJc                 óØ   — 	 ddl m} |j                  j                  |«      }|r)t        |d«      r|j                  r|j                  |«      }|S # t        $ r t        t        «      ‚w xY w)Nr   )Úidentity_poolÚrequires_scopes)	Úgoogle.authrq   ÚImportErrorr   r   Ú	from_infoÚhasattrrr   Úwith_scopes)r,   rk   rH   rq   rm   s        r.   ra   z*VertexBase._credentials_from_identity_poolË   si   € ð	;Ý1ð ×)Ñ)×3Ñ3°HÓ=ˆÙ”g˜eÐ%6Ô7¸E×<QÒ<QØ×%Ñ% fÓ-ˆEØˆøô ò 	;ÜÔ9Ó:Ð:ð	;úó   ‚A ÁA)c                 óØ   — 	 ddl m} |j                  j                  |«      }|r)t        |d«      r|j                  r|j                  |«      }|S # t        $ r t        t        «      ‚w xY w)Nr   )Ú	pluggablerr   )	rs   rz   rt   r   r   ru   rv   rr   rw   )r,   rk   rH   rz   rm   s        r.   r`   z&VertexBase._credentials_from_pluggableÖ   si   € ð	;Ý-ð ×%Ñ%×/Ñ/°Ó9ˆÙ”g˜eÐ%6Ô7¸E×<QÒ<QØ×%Ñ% fÓ-ˆEØˆøô ò 	;ÜÔ9Ó:Ð:ð	;úrx   c                 óØ   — 	 ddl m} |j                  j                  |«      }|r)t        |d«      r|j                  r|j                  |«      }|S # t        $ r t        t        «      ‚w xY w)Nr   )rE   rr   )	rs   rE   rt   r   r   ru   rv   rr   rw   )r,   rk   rH   rE   rm   s        r.   r_   z3VertexBase._credentials_from_identity_pool_with_awsá   sg   € ð	;Ý'ð —‘×)Ñ)¨(Ó3ˆÙ”g˜eÐ%6Ô7¸E×<QÒ<QØ×%Ñ% fÓ-ˆEØˆøô ò 	;ÜÔ9Ó:Ð:ð	;úrx   c                 ó¦   — 	 dd l }|j                  j                  j
                  j                  ||¬«      S # t        $ r t        t        «      ‚w xY w©Nr   rI   )Úgoogle.oauth2.credentialsrt   r   Úoauth2r>   r   Úfrom_authorized_user_info©r,   rk   rH   Úgoogles       r.   rb   z,VertexBase._credentials_from_authorized_userì   sP   € ð	;Û,ð �}‰}×(Ñ(×4Ñ4×NÑNÈxÐ`fÐNÓgÐgøô ò 	;ÜÔ9Ó:Ð:ð	;úó	   ‚7 ·Ac                 ó¦   — 	 dd l }|j                  j                  j
                  j                  ||¬«      S # t        $ r t        t        «      ‚w xY wr}   )Úgoogle.oauth2.service_accountrt   r   r   Úservice_accountr   Úfrom_service_account_infor�   s       r.   rd   z,VertexBase._credentials_from_service_accountô   sQ   € ð	;Û0ð �}‰}×,Ñ,×8Ñ8×RÑRÐS[ÐdjÐRÓkÐkøô ò 	;ÜÔ9Ó:Ð:ð	;úrƒ   c                 ól   — 	 dd l m} |j	                  |¬«      S # t        $ r t        t        «      ‚w xY wr}   )rs   Úauthrt   r   Údefault)r,   rH   Úgoogle_auths      r.   rf   z)VertexBase._credentials_from_default_authü   s=   € ð	;Ý-ð ×"Ñ"¨&Ð"Ó1Ð1øô ò 	;ÜÔ9Ó:Ð:ð	;ús   ‚ š3c                  ó   — y)Nr4   © )r,   s    r.   Úget_default_vertex_locationz&VertexBase.get_default_vertex_location  s   € Ør/   Úapi_baseÚvertex_locationc                 óD   — |r|S t        |xs | j                  «       «      S r   )r   rŽ   )r,   r�   r�   s      r.   Úget_api_basezVertexBase.get_api_base  s#   € ÙØˆOÜ" ?Ò#X°d×6VÑ6VÓ6XÓYÐYr/   Úvertex_projectÚpartnerÚstreamc                 ó€  — |€t        | «      }|t        j                  k(  r|› d|› d| › d�S |t        j                  k(  r|r|› d|› d| › d|› d�S |› d|› d| › d|› d�S |t        j                  k(  r|r|› d|› d| › d	|› d�S |› d|› d| › d	|› d�S |t        j
                  k(  r|r|› d|› d| › d
|› d�S |› d|› d| › d
|› d�S y)z1Return the base url for the vertex partner modelsNz/v1/projects/z/locations/z#/endpoints/openapi/chat/completionsz/publishers/mistralai/models/z:streamRawPredictz:rawPredictz/v1beta1/projects/z/publishers/ai21/models/z/publishers/anthropic/models/)r   r   ÚllamaÚ	mistralaiÚai21Úclaude©r�   r“   r”   r•   r1   r�   s         r.   Úcreate_vertex_urlzVertexBase.create_vertex_url  s°  € ð ÐÜ*¨?Ó;ˆHØÔ+×1Ñ1Ò1Ø�Z˜}¨^Ð,<¸KÈÐGXÐX{Ð|Ð|ØÔ-×7Ñ7Ò7ÙØ"˜ =°Ð0@ÀÈOÐK\Ð\yÐzð  zAð  ARð  Sð  Sà"˜ =°Ð0@ÀÈOÐK\Ð\yÐzð  zAð  ALð  Mð  MØÔ-×2Ñ2Ò2ÙØ"˜Ð#5°nÐ5EÀ[ÐQ`ÐPaÐayÐzð  zAð  ARð  Sð  Sà"˜Ð#5°nÐ5EÀ[ÐQ`ÐPaÐayÐzð  zAð  ALð  Mð  MØÔ-×4Ñ4Ò4ÙØ"˜ =°Ð0@ÀÈOÐK\Ð\yÐzð  zAð  ARð  Sð  Sà"˜ =°Ð0@ÀÈOÐK\Ð\yÐzð  zAð  ALð  Mð  Mð	 5r/   Úcustom_api_basec                 óf  — | j                  ||«      }| j                  ||¬«      }	t        j                  ||xs |||||	¬«      }
|t        j
                  k(  r|
S t        |
j                  d«      «      dkD  r|
j                  d«      d   }nd}| j                  |dd ||d |
||xs ||d¬	«      \  }}	|	S )
N)r�   r�   r›   ú:r   éÿÿÿÿrD   Ú	vertex_aiÚv1)r�   Úcustom_llm_providerÚgemini_api_keyÚendpointr•   Úauth_headerÚurlr1   r“   r�   Úvertex_api_version)	r=   r’   r   rœ   r   r—   r9   ÚsplitÚ_check_custom_proxy)r,   r�   r�   r“   r$   r”   r•   r1   Úresolved_locationr�   Údefault_api_baser¥   Ú_s                r.   Úget_complete_vertex_urlz"VertexBase.get_complete_vertex_url+  sê   € ð $(×#9Ñ#9¸/È5Ó#QÐØ×$Ñ$¨oÐO`Ð$ÓaˆÜ",×">Ñ">Ø-Ø)Ò7¨ZØØØØð #?ó #
Ðð Ô+×1Ñ1Ò1Ø#Ð#äÐ×%Ñ% cÓ*Ó+¨aÒ/Ø'×-Ñ-¨cÓ2°2Ñ6‰HàˆHà×.Ñ.Ø$Ø +ØØØØØ ØØ)Ò7¨ZØ-Ø#ð /ó 
‰ˆˆ8ð ˆr/   c                 ó¸   — 	 ddl m} | j                  5  |j                   |«       «       d d d «       y # t        $ r t        t        «      ‚w xY w# 1 sw Y   y xY w)Nr   )ÚRequest)Úgoogle.auth.transport.requestsr°   rt   r   r+   Úrefresh)r,   r>   r°   s      r.   rg   zVertexBase.refresh_authX  s^   € ð	;õð ×$Ñ$ñ 	+Ø×Ñ¡£	Ô*÷	+ð 	+øô ò 	;ÜÔ9Ó:Ð:ð	;ú÷	+ð 	+ús   ‚4 ”A´AÁAÚcredential_cache_keyc                 óº   — | j                   j                  |t        j                  «       «      }| j                  j                  |d«      dz   | j                  |<   |S )a  Increment the refcount and return the lock for ``credential_cache_key``.

        Every call must be paired with ``_release_async_refresh_lock`` once the
        caller is done with the lock so the entry can be pruned when no other
        coroutine is holding or waiting on it.
        r   r   )r&   Ú
setdefaultÚasyncioÚLockr'   r8   )r,   r³   Úlocks      r.   Ú_acquire_async_refresh_lockz&VertexBase._acquire_async_refresh_lockl  s[   € ð ×/Ñ/×:Ñ:Ð;OÔQX×Q]ÑQ]ÓQ_Ó`ˆà×.Ñ.×2Ñ2Ð3GÈÓKÈaÑOð 	×*Ñ*Ð+?Ñ@ð ˆr/   r¸   c                 ó  — | j                   j                  |d«      dz
  }|dkD  r|| j                   |<   y| j                   j                  |d«       | j                  j                  |«      |u r| j                  j                  |d«       yy)aS  Decrement the refcount and drop the lock entry when it reaches zero.

        Must be called only after the caller has released ``lock`` (i.e. once
        the surrounding ``async with`` has exited). asyncio is cooperative, so
        the decrement-then-pop sequence below runs atomically with respect to
        other coroutines.
        r   r   N)r'   r8   Úpopr&   )r,   r³   r¸   Ú	remainings       r.   Ú_release_async_refresh_lockz&VertexBase._release_async_refresh_locky  s�   € ð  ×=Ñ=×AÑAÐBVÐXYÓZÐ]^Ñ^ˆ	Ø�qŠ=ØGPˆD×.Ñ.Ð/CÑDØØ×*Ñ*×.Ñ.Ð/CÀTÔJØ×$Ñ$×(Ñ(Ð)=Ó>À$ÑFØ×%Ñ%×)Ñ)Ð*>ÀÕEð Gr/   c                 óð   — ddl m} | j                  |«      \  }}|�Z| j                  |«      |j                  k(  r<|j
                  �0t        |j
                  t        «      r|xs |}|r|j
                  |fS y)z“
        Look up cached credentials and return (token, project_id) if the token
        is FRESH. Returns None if not cached or not fresh.
        r   r   N)Úgoogle.auth.credentialsr   Ú_unpack_cached_credentialsÚ_get_token_stateÚFRESHÚtokenrM   rN   )r,   r³   r$   r   rm   Úcached_project_idÚresolved_projects          r.   Ú_try_get_cached_tokenz VertexBase._try_get_cached_token‰  sw   € õ 	7à#'×#BÑ#BÐCWÓ#XÑ ˆÐ àÐØ×%Ñ% eÓ,°
×0@Ñ0@Ò@Ø—‘Ð'Ü˜5Ÿ;™;¬Ô,à&0Ò&EÐ4EÐÙØ—{‘{Ð$4Ð4Ð4Ør/   r   c                 ó  — ddl m} | j                  |«      \  }}|€y| j                  |«      }||j                  |j
                  fvry|j                  �t        |j                  t        «      sy|xs |}|sy|j                  ||||fS )a`  
        Look up cached credentials and return usable token info for FRESH or
        STALE tokens (both are still valid for outbound requests). STALE
        tokens are returned along with their state and the underlying
        credentials object so the caller can schedule a background refresh
        without holding the per-key async lock.
        r   r   N)	r¿   r   rÀ   rÁ   rÂ   ÚSTALErÃ   rM   rN   )r,   r³   r$   r   rm   rÄ   Útoken_staterÅ   s           r.   Ú_try_get_usable_cached_tokenz'VertexBase._try_get_usable_cached_token   s•   € õ 	7à#'×#BÑ#BÐCWÓ#XÑ ˆÐ Øˆ=ØØ!×2Ñ2°5Ó9ˆØ˜z×/Ñ/°×1AÑ1AÐBÑBØØ�;‰;Ð¤j°·±¼cÔ&BØØ",Ò"AÐ0AÐÙØØ�{‰{Ð,¨k¸5ÐBSÐSÐSr/   c                 óœ   — || j                   vry| j                   |   }t        |t        «      r|S ||j                  xs t	        |dd«      fS )z–
        Return (credentials, project_id) from the cache, or (None, None) if
        not cached. Handles both tuple and legacy cache formats.
        )NNr$   N)r#   rM   Útuplerc   re   )r,   r³   Úcached_entrys      r.   rÀ   z%VertexBase._unpack_cached_credentials»  sW   € ð
   t×'HÑ'HÑHØØ"×?Ñ?Ð@TÑUˆÜ�l¤EÔ*ØÐØ˜\×:Ñ:Òg¼gÀlÐT`ÐbfÓ>gÐgÐgr/   c                 óÀ   — ddl m} t        |dd«      }t        ||«      r|S t        |dd«      r|j                  S t        |dd«      r|j
                  S |j                  S )	zÛ
        Return the token state using google-auth's TokenState enum.

        Falls back to expired/valid checks if token_state is unavailable
        (e.g. older google-auth versions or mock objects in tests).
        r   r   rÉ   NÚexpiredTÚvalidF)r¿   r   re   rM   ÚINVALIDrÂ   )r,   r>   Ú_TokenStaterÉ   s       r.   rÁ   zVertexBase._get_token_stateÇ  sb   € õ 	Fä$ [°-ÀÓFˆÜ�k ;Ô/ØÐä�; 	¨4Ô0Ø×&Ñ&Ð&Ü�; ¨Ô/Ø×$Ñ$Ð$Ø×"Ñ"Ð"r/   c              ƒ   ó  K  — 	  t        | j                  «      ||¬«      ƒ d{  –—† \  }}|€t        d«      ‚||f| j                  |<   ||fS 7 Œ)# t        $ r%}t        j                  dt        |«      «       ‚ d}~ww xY w­w)z@Load credentials via load_auth (in thread) and cache the result.©r>   r$   Nz%Failed to load vertex credentials: %szCould not resolve credentials)r
   ro   rX   r	   Ú	exceptionrN   r[   r#   )r,   r>   r$   r³   r"   Úcredential_project_idrl   s          r.   Ú_load_and_cache_credentialsz&VertexBase._load_and_cache_credentialsÚ  sœ   è ø€ ð	Ø8P¼ÀÇÁÓ8PØ'Ø%ô9÷ 3Ñ/ˆLÐ/ð ÐÜÐ<Ó=Ð=àØ!ðC
ˆ×)Ñ)Ð*>Ñ?ð Ð2Ð2Ð2ð3ùô ò 	Ü×$Ñ$Ð%LÌcÐRSËfÔUØûð	üs7   ‚B„ A ¤A¥A ¬"BÁA Á	A>Á A9Á9A>Á>BrÖ   c              ƒ   ó"  K  — 	 t        j                  d«        t        | j                  «      |«      ƒ d{  –—†  | j	                  |«      \  }}||u r||f| j
                  |<   yy7 Œ/# t        $ r t        j                  dd¬«       Y yw xY w­w)u  
        Refresh credentials in the background without blocking the calling request.

        Called when the token is still valid but nearing expiry (proactive refresh).
        Errors are logged but not raised â€” the current token is still usable.
        z'Background proactive credential refreshNz@Background credential refresh failed, will retry on next requestT)Úexc_info)r	   rR   r
   rg   rÀ   r#   rX   )r,   r>   r³   rÖ   Úcached_credsr­   s         r.   Ú_background_refresh_credentialsz*VertexBase._background_refresh_credentialsñ  sœ   è ø€ ð	Ü× Ñ Ð!JÔKØ-”(˜4×,Ñ,Ó-¨kÓ:×:Ð:ð #×=Ñ=Ð>RÓS‰OˆL˜!Ø˜{Ñ*àØ)ðK�×1Ñ1Ð2FÒGð +ð ;ùô ò 	Ü× Ñ ØRØ÷ð	üs8   ‚B„3A) ·A'¸-A) Á%BÁ'A) Á) BÂ	BÂBÂBc              ƒ   ó    K  — | j                   j                  |«      }|�|j                  «       ry	 |ƒ d{  –—†  y7 Œ# t        $ r Y yw xY w­w)ab  Wait for an in-flight background refresh to finish, if any.

        google-auth's ``Credentials.refresh()`` is not safe to invoke
        concurrently on the same credentials object. Coroutines that need a
        blocking refresh must first drain any background refresh that was
        scheduled while a previous STALE token was being served.
        N)r(   r8   ÚdonerX   )r,   r³   Úexisting_tasks      r.   Ú#_await_in_flight_background_refreshz.VertexBase._await_in_flight_background_refresh  sT   è ø€ ð  $×=Ñ=×AÑAÐBVÓWˆØÐ  M×$6Ñ$6Ô$8Øð	Ø×ÒùÜò 	ñ ð		üs1   ‚/A²? ·=¸? ¼A½? ¿	AÁAÁ
AÁAc                 óh  ‡ ‡— ‰ j                   j                  ‰«      }|�|j                  «       sy‰ j                   j                  ‰d«       t	        j
                  ‰ j                  |‰|«      «      }dt        j                  t           ddfˆˆ fd„}|j                  |«       |‰ j                   ‰<   y)a1  Kick off a single background refresh for ``credential_cache_key``.

        Skips scheduling if a refresh is already in flight. The done-callback
        guards against removing a newer task that has replaced this one in the
        tracking dict (done_callbacks are scheduled via ``call_soon``).
        NÚ_futr   c                 óz   •— ‰j                   j                  ‰«      | u r‰j                   j                  ‰d «       y y r   )r(   r8   r»   )rá   r³   r,   s    €€r.   Ú_drop_background_refresh_taskzNVertexBase._schedule_background_refresh.<locals>._drop_background_refresh_task9  s:   ø€ Ø×-Ñ-×1Ñ1Ð2FÓGÈ4ÑOØ×.Ñ.×2Ñ2Ð3GÈÕNð Pr/   )
r(   r8   rÝ   r»   r¶   Úcreate_taskrÛ   ÚFuturer   Úadd_done_callback)r,   r>   r³   rÖ   ÚexistingÚtaskrã   s   ` `    r.   Ú_schedule_background_refreshz'VertexBase._schedule_background_refresh%  s©   ù€ ð ×8Ñ8×<Ñ<Ð=QÓRˆØÐ¨¯©¬ØØ×&Ñ&×*Ñ*Ð+?ÀÔFÜ×)Ñ)Ø×0Ñ0°Ð>RÐTiÓjó
ˆð	O´·±¼sÑ0Cð 	OÈö 	Oð 	×ÑÐ<Ô=Ø?Cˆ×&Ñ&Ð';Ò<r/   r£   )r¡   Úvertex_ai_betaÚgeminic                 ó4   — |dk(  ry| j                  ||¬«      S )z3
        Returns auth token and project id
        rë   ©rD   rD   rÔ   )Úget_access_token©r,   r>   r$   r£   s       r.   Ú_ensure_access_tokenzVertexBase._ensure_access_token@  s-   € ð  (Ò*Øà×(Ñ(Ø'Ø%ð )ó ð r/   Úoptional_paramsc                  ó   — y)z´
        use this helper to decide if request should be sent to v1 or v1beta1

        Returns true if any beta feature is enabled
        Returns false in all other cases
        Fr�   )r,   rñ   s     r.   Úis_using_v1beta1_featuresz$VertexBase.is_using_v1beta1_featuresS  s   € ð r/   r¤   r¥   r¦   r§   r¨   )r¢   Úv1beta1Úuse_psc_endpoint_formatc                 ó¢  — |rÊ|dk(  r+|€t        d«      ‚|› d|› d|› �}|€t        d«      ‚|�–d|i}n‘|rI|	r|
r|st        d«      ‚t        |¬«      }|xs d	}d
j                  |j                  d«      ||	|
||«      }nFt	        |«      j
                  dv r(|j                  d«      t	        |«      j
                  z   }n|› d|› �}|du r|dz   }||fS )ag  
        for cloudflare ai gateway - https://github.com/BerriAI/litellm/issues/4317

        Handles custom api_base for:
        1. Gemini (Google AI Studio) - constructs /models/{model}:{endpoint}
        2. Vertex AI with standard proxies - constructs {api_base}:{endpoint};
           if api_base has no path (bare host), grafts the default vertex URL path onto it
        3. Vertex AI with PSC endpoints - constructs full path structure
           {api_base}/v1/projects/{project}/locations/{location}/endpoints/{model}:{endpoint}
           (only when use_psc_endpoint_format=True)

        Args:
            use_psc_endpoint_format: If True, constructs PSC endpoint URL format.
                                     If False (default), uses api_base as-is and appends :{endpoint}

        ## Returns
        - (auth_header, url) - Tuple[Optional[str], str]
        rë   z;Model parameter is required for Gemini custom API base URLsz/models/rŸ   úVMissing Gemini API key. Set the GEMINI_API_KEY or GOOGLE_API_KEY environment variable.úx-goog-api-keyzYvertex_project, vertex_location, and model are required when use_psc_endpoint_format=True)r1   r¢   z.{}/{}/projects/{}/locations/{}/endpoints/{}:{}ú/)rD   rù   Tz?alt=sse)r[   r   ÚformatÚrstripr   rP   )r,   r�   r£   r¤   r¥   r•   r¦   r§   r1   r“   r�   r¨   rõ   Úmodel_for_urlÚversions                  r.   rª   zVertexBase._check_custom_proxy\  s  € ñB Ø" hÒ.à�=Ü$Ð%bÓcÐcØ!˜
 (¨5¨'°°8°*Ð=�Ø!Ð)Ü$Øpóð ð "Ð-Ø#3°^Ð"D‘Kñ +ñ +©Á5Ü(Øwóð ô ,FÈEÔ+R�Mà%7Ò%?¸4�GØJ×QÑQØ Ÿ™¨Ó,ØØ&Ø'Ø%Ø ó‘Cô ˜hÓ'×,Ñ,°	Ñ9Ø"Ÿ/™/¨#Ó.´¸#³×1CÑ1CÑC‘Cà%˜J a¨ zÐ2�CØ˜‰~Ø˜JÑ&�Ø˜CÐÐr/   Úvertex_credentialsÚshould_use_v1beta1_featuresÚmodec                 óî   — d}|dk(  r#|st        d«      ‚t        |||¬«      \  }}d|i}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
        Nrë   r÷   )r   r1   r•   rø   )r0   r1   Trô   r¢   )r   r1   r•   r“   r�   r¨   )r�   r¦   r£   r¤   r¥   r•   r§   r1   r“   r�   r¨   rõ   )r[   r   r=   r   rª   )r,   r1   r¦   r¤   r“   r�   rþ   r•   r£   r�   rÿ   r   rõ   rý   r§   r¥   s                   r.   Ú_get_token_and_urlzVertexBase._get_token_and_url¦  sÒ   € ð. 48ˆØ (Ò*Ù!Ü Ølóð ô ,ØØØô‰MˆC�ð
 ,¨^Ð<‰Kà"×4Ñ4Ø-Øð 5ó ˆOð $?À$Ñ#F‘iÈDˆGÜ+ØØØØ-Ø /Ø#*ô‰MˆC�ð ×'Ñ'ØØ#Ø 3Ø)ØØØØØ)Ø+Ø&Ø$;ð (ó 
ð 	
r/   Úerrorc                 óä   — t        j                  d|«       || j                  v r| j                  |= 	 | j                  ||d¬«      S # t        $ r}t        j
                  d|||«       |‚d}~ww xY w)ab  
        Handle reauthentication when credentials refresh fails.

        This method clears the cached credentials and attempts to reload them once.
        It should only be called when "Reauthentication is needed" error occurs.

        Args:
            credentials: The original credentials
            project_id: The project ID
            credential_cache_key: The cache key to clear
            error: The original error that triggered reauthentication

        Returns:
            Tuple of (access_token, project_id)

        Raises:
            The original error if reauthentication fails
        zOHandling reauthentication for project_id: %s. Clearing cache and retrying once.T)r>   r$   Ú_retry_reauthzUReauthentication retry failed for project_id: %s. Original error: %s. Retry error: %sN)r	   rR   r#   rî   rX   r  )r,   r>   r$   r³   r  Úretry_errors         r.   Ú_handle_reauthenticationz#VertexBase._handle_reauthenticationé  s�   € ô2 	×ÑØ]Ð_iô	
ð
   4×#DÑ#DÑDØ×1Ñ1Ð2FÐGð	Ø×(Ñ(Ø'Ø%Ø"ð )ó ð øô
 ò 	Ü× Ñ ØgØØØô	ð ˆKûð	ús   ³A Á	A/ÁA*Á*A/c              ƒ   ó‚  K  — t        j                  d|«       | j                  j                  |d«       	 | j	                  |||¬«      ƒ d{  –—† \  }}|€Nt        |t        «      r>|}t        |t        «      rt        j                  |«      n|}||f}||f| j                  |<   |j                  �t        |j                  t        «      s,t        dt        |j                  «      j                  › d�«      ‚|€t        d«      ‚|j                  |fS 7 ŒÄ# t        $ r}	t        j                  d|||	«       |‚d}	~	ww xY w­w)zX
        Async reauthentication retry that stays within the per-key async lock.
        zUHandling async reauthentication for project_id: %s. Clearing cache and retrying once.N)r>   r$   r³   úHCould not resolve credentials token. Got None or non-string token (type=ú)rL   z[Async reauthentication retry failed for project_id: %s. Original error: %s. Retry error: %s)r	   rR   r#   r»   r×   rM   rN   rZ   rU   ÚdumpsrÃ   r[   r@   rY   rX   r  )
r,   r>   r$   r³   r  r"   rÖ   Úcache_credentialsÚresolved_cache_keyr  s
             r.   Ú_handle_reauthentication_asyncz)VertexBase._handle_reauthentication_async  s~  è ø€ ô 	×ÑØcÐeoô	
ð 	×)Ñ)×-Ñ-Ð.BÀDÔIð%	ð ×6Ñ6Ø'Ø%Ø%9ð 7ó ÷ ñØØ%ð Ð!¤jÐ1FÌÔ&LØ2�
ÜFPÐQ\Ô^bÔFc¬4¯:©:°kÔ+BÐitÐ!Ø->À
Ð,KÐ"ð !Ø)ðI�×1Ñ1Ð2DÑEð
 ×!Ñ!Ð)´¸L×<NÑ<NÔPSÔ1TÜ Ø^Ô_cÐdp×dvÑdvÓ_w÷  `Añ  `Að  _Bð  BCð  Dóð ð Ð!Ü Ð!?Ó@Ð@à×%Ñ% zÐ1Ð1ð3ùô4 ò 	Ü× Ñ ØmØØØô	ð ˆKûð	üs;   ‚3D?¶D ÁDÁCD ÄD?ÄD Ä	D<ÄD7Ä7D<Ä<D?r  c                 ó˜  — t        |t        «      rt        j                  |«      n|}||f}d}t	        j
                  d|«       || j                  v r…t	        j
                  d|«       | j                  |   }t	        j
                  d|«       t        |t        «      r|\  }}n|}|j                  xs t        |dd«      }t	        j
                  d|«       nNt	        j
                  d|«       	 | j                  ||¬«      \  }}|€t        d
|› �«      ‚||f| j                  |<   t	        j
                  d«       |€7|�5t        |t        «      r%|}||f}
|
| j                  vr||f| j                  |
<   |€t        d«      ‚|j                  rY| j                   5  |j                  r8	 t	        j
                  d«       | j#                  |«       ||f| j                  |<   ddd«       |j&                  �t        |j&                  t        «      s,t        dt)        |j&                  «      j*                  › d�«      ‚|€t        d«      ‚|j&                  |fS # t        $ r}	t	        j                  d	|	«       |	‚d}	~	ww xY w# t        $ r9}	dt        |	«      v r%|s#| j%                  ||||	¬«      cY d}	~	cddd«       S |	‚d}	~	ww xY w# 1 sw Y   ŒäxY w)aˆ  
        Get access token and project id

        1. Check if credentials are already in self._credentials_project_mapping
        2. If not, load credentials and add to self._credentials_project_mapping
        3. Check if loaded credentials have expired
        4. If expired, refresh credentials
        5. Return access token and project id

        Args:
            credentials: The credentials to use for authentication
            project_id: The Google Cloud project ID
            _retry_reauth: Internal flag to prevent infinite recursion during reauthentication

        Returns:
            Tuple of (access_token, project_id)
        Nz.Checking cached credentials for project_id: %sz,Cached credentials found for project_id: %s.zcached_entry: %sr$   z+Using cached credentials for project_id: %szJCredential cache key not found for project_id: %s, loading new credentialsrÔ   zpFailed to load vertex credentials. Check to see if credentials containing partial/invalid information. Error: %szXCould not resolve credentials - either dynamically or from environment, for project_id: zValidating credentialsz"Credentials are None after loadingúCredentials expired, refreshingúReauthentication is needed©r>   r$   r³   r  r	  r
  rL   )rM   rZ   rU   r  r	   rR   r#   rÌ   rc   re   ro   rX   rÕ   r[   rN   rÏ   r+   rg   r  rÃ   r@   rY   )r,   r>   r$   r  r  r³   r"   rÍ   rÖ   rl   r  s              r.   rî   zVertexBase.get_access_tokenR  s  € ô2 ?IÈÔVZÔ>[¤4§:¡:¨kÔ#:ÐalÐØ'8¸*Ð&EÐØ7;ˆä×ÑÐMÈzÔZà 4×#DÑ#DÑDÜ× Ñ Ð!OÐQ[Ô\à"&×"CÑ"CÐDXÑ"YˆLÜ× Ñ Ð!3°\ÔBÜ˜,¬Ô.Ø6BÑ3�Ñ3ð  ,�Ø(4×(EÑ(EÒ(rÌÐQ]Ð_kÐmqÓIrÐ%Ü× Ñ Ø=Ø%õô × Ñ Ø\Ð^hôðØ6:·n±nÐQ\Ðis°nÓ6tÑ3�Ð3ð Ð#Ü ØnÐoyÐnzÐ{óð ð
 Ø%ðGˆD×-Ñ-Ð.BÑCô 	×ÑÐ5Ô6ØÐÐ"7Ð"CÌ
ÐShÔjmÔHnØ.ˆJà):¸JÐ(GÐØ!¨×)JÑ)JÑJà Ø)ðI�×1Ñ1Ð2DÑEð ÐÜÐAÓBÐBà×ÒØ×(Ñ(ñ  à×'Ò'ð Ü&×,Ñ,Ð-NÔOØ×)Ñ)¨,Ô7à(Ø1ðS˜×9Ñ9Ð:NÑO÷ ð. ×ÑÐ%¬Z¸×8JÑ8JÌCÔ-PÜØZÔ[_Ð`l×`rÑ`rÓ[s×[|Ñ[|ÐZ}Ð}~Ðóð ð ÐÜÐ;Ó<Ð<à×!Ñ! :Ð-Ð-øôC ò Ü×(Ñ(ð GØôð �ûðûôX %ò 
 ð 8¼3¸q»6ÑAÉ-Ø#'×#@Ñ#@Ø,7Ø+5Ø5IØ&'ð	 $Aó $ô ÷ ñ  ð(  ˜ûð
 ú÷ ð  úsT   Ã.I ÆK Æ&7I;É	I8ÉI3É3I8É;	J=Ê#J8Ê'J=Ê(K Ê6J8Ê8J=Ê=K Ë K	c              ƒ   ó’  K  — ddl m} t        |t        «      rt	        j
                  |«      n|}||f}| j                  ||«      }|�.|\  }}}	}
}|	|j                  k(  r| j                  |
||«       ||fS | j                  |«      }	 |4 ƒd{  –—†  | j                  ||«      }|�%|cddd«      ƒd{  –—†  | j                  ||«       S | j                  |«      \  }}|€| j                  |||«      ƒ d{  –—† \  }}|€'t        |t        «      r|}||f}||f| j                  |<   | j!                  |«      }	|	|j                  k(  rr|€t#        d«      ‚|j$                  }|�t        |t        «      s|j&                  }	n:| j                  |||«       ||fcddd«      ƒd{  –—†  | j                  ||«       S |	|j&                  k(  rœ| j)                  |«      ƒ d{  –—†  | j                  ||«      }|�%|cddd«      ƒd{  –—†  | j                  ||«       S 	 t+        j,                  d«        t/        | j0                  «      |«      ƒ d{  –—†  ||f| j                  |<   |j$                  �t        |j$                  t        «      s,t#        d	t7        |j$                  «      j8                  › d
�«      ‚|€t#        d«      ‚|j$                  |fcddd«      ƒd{  –—†  | j                  ||«       S 7 �Œh7 �ŒE7 �Œ7 �Œ\7 �Œ$7 �Œ7 Œ·# t2        $ ro}dt        |«      v r\t+        j,                  d«       | j5                  ||||¬«      ƒ d{  –—†7  cY d}~cddd«      ƒd{  –—†7   | j                  ||«       S ‚ d}~ww xY w7 Œ¦# 1 ƒd{  –—†7  sw Y   nxY w	 | j                  ||«       y# | j                  ||«       w xY w­w)aJ  
        Async version of get_access_token with single-flight refresh coordination.

        Prevents thundering herd: when credentials expire under high concurrency,
        only one coroutine refreshes while others wait on the lock. Uses native
        async refresh for service_account and authorized_user credentials.
        r   r   NrL   r  r  z4Reauthentication needed, clearing cache and retryingr  r	  r
  )r¿   r   rM   rZ   rU   r  rÊ   rÈ   ré   r¹   rÆ   r½   rÀ   r×   rN   r#   rÁ   r[   rÃ   rÑ   rß   r	   rR   r
   rg   rX   r  r@   rY   )r,   r>   r$   r   r  r³   ÚusableÚcached_tokenrÅ   rÉ   rm   rÄ   r¸   Úcachedr"   rÖ   r  Úcurrent_tokenrl   s                      r.   Úget_access_token_asyncz!VertexBase.get_access_token_asyncË  s{  è ø€ õ 	7ä>HÈÔVZÔ>[¤4§:¡:¨kÔ#:ÐalÐØ'8¸*Ð&EÐð ×9Ñ9Ð:NÐPZÓ[ˆØÐØTZÑQˆLÐ*¨K¸Ð@QØ˜j×.Ñ.Ò.Ø×1Ñ1°%Ð9MÐO`ÔaØÐ!1Ð1Ð1ð ×6Ñ6Ð7KÓLˆð\	IØ÷ Y6ñ Y6à×3Ñ3Ð4HÈ*ÓU�ØÐ%Ø!÷	Y6÷ Y6ð Y6ðv ×,Ñ,Ð-AÀ4ÕHðk 7;×6UÑ6UÐVjÓ6kÑ3�Ð3ð  Ð'ð #×>Ñ>¸{ÈJÐXlÓm×mñØ$Ø-ð Ð%¬*Ð5JÌCÔ*PØ!6�JØ1BÀJÐ0OÐ&ð %Ø-ðM�D×5Ñ5Ð6HÑIð #×3Ñ3°LÓA�à *×"2Ñ"2Ò2Ø!Ð)Ü(Ð)GÓHÐHØ+7×+=Ñ+=�MØ$Ð,´J¸}ÌcÔ4Rð '1×&8Ñ&8™à×9Ñ9Ø(Ø0Ø1ôð
  -¨jÐ8÷cY6÷ Y6ð Y6ðv ×,Ñ,Ð-AÀ4ÕHðQ  *×"4Ñ"4Ò4ð ×BÑBÐCWÓX×XÐXØ!×7Ñ7Ð8LÈjÓY�FØÐ)Ø%÷yY6÷ Y6ð Y6ðv ×,Ñ,Ð-AÀ4ÕHð9Ü&×,Ñ,Ð-NÔOØ9œh t×'8Ñ'8Ó9¸,ÓG×GÐGà(Ø1ðS˜×9Ñ9Ð:NÑOð   ×%Ñ%Ð-´ZÀ×@RÑ@RÔTWÔ5XÜ$ØbÔcgÐht×hzÑhzÓc{÷  dEñ  dEð  cFð  FGð  Hóð ð Ð%Ü$Ð%CÓDÐDà#×)Ñ)¨:Ð5÷sY6÷ Y6ð Y6ðv ×,Ñ,Ð-AÀ4ÕHðwY6ùð Y6ùð nùðY6ùðr YùðsY6ùðB Hùô
 %ò 	Ø7¼3¸q»6ÑAÜ*×0Ñ0Ð1gÔhØ)-×)LÑ)LØ,7Ø+5Ø5IØ&'ð	 *Mó *÷ $ð $ô ÷SY6÷ Y6ñ Y6ðv ×,Ñ,Ð-AÀ4ÕHð ûð	úðMY6ø÷ Y6÷ Y6ñ Y6úð Y6ðv ×,Ñ,Ð-AÀ4ÕHøˆD×,Ñ,Ð-AÀ4ÕHüsd  ‚BOÂN0 ÂK6ÂN0 ÂNÂ(N0 Â4K9Â5N0 Â9OÃ,NÃ8K<Ã9BNÆN0 Æ#K?Æ$N0 Æ(OÆ;#NÇLÇNÇ8N0 ÈLÈN0 È	OÈ3L
ÉLÉL
É&A,NËN0 ËNËN0 Ë#OË6N0 Ë9N0 Ë<NË?N0 ÌNÌN0 ÌL
Ì
	NÌ:M=ÍMÍM=ÍNÍNÍN0 Í#M&Í$N0 Í)OÍ<M=Í=NÎNÎN0 ÎNÎNÎNÎN0 ÎOÎ0OÏOc              ƒ   óP   K  — |dk(  ry| j                  ||¬«      ƒ d{  –—† S 7 Œ­w)z7
        Async version of _ensure_access_token
        rë   rí   rÔ   N)r  rï   s       r.   Ú_ensure_access_token_asyncz%VertexBase._ensure_access_token_asyncI  s;   è ø€ ð  (Ò*Øà×4Ñ4Ø'Ø%ð 5ó ÷ ð ð ús   ‚&Ÿ$ &Úextra_headersc                 óH   — ddi}|�d|› �|d<   |�|j                  |«       |S )NzContent-Typezapplication/jsonzBearer ÚAuthorization)Úupdate)r,   r¦   r  Úheaderss       r.   Úset_headerszVertexBase.set_headers\  s?   € àÐ.ð
ˆð Ð"Ø)0°°Ð'>ˆG�OÑ$ØÐ$Ø�N‰N˜=Ô)àˆr/   Úlitellm_paramsc                 óŒ   — | j                  dd «      xs1 | j                  dd «      xs t        j                  xs t        d«      S )Nr“   Úvertex_ai_projectÚVERTEXAI_PROJECT)r»   r5   r“   r   ©r!  s    r.   Úget_vertex_ai_projectz VertexBase.get_vertex_ai_projectg  sN   € ð ×ÑÐ/°Ó6ò 2Ø×!Ñ!Ð"5°tÓ<ò2ä×%Ñ%ò2ô Ð0Ó1ð		
r/   c                 óh   — | j                  dd «      xs | j                  dd «      xs t        d«      S )Nrþ   Úvertex_ai_credentialsÚVERTEXAI_CREDENTIALS)r»   r   r%  s    r.   Úget_vertex_ai_credentialsz$VertexBase.get_vertex_ai_credentialsp  s>   € ð ×ÑÐ3°TÓ:ò 6Ø×!Ñ!Ð"9¸4Ó@ò6äÐ4Ó5ð	
r/   c                 ó¦   — | j                  dd «      xs> | j                  dd «      xs* t        j                  xs t        d«      xs t        d«      S )Nr�   Úvertex_ai_locationÚVERTEXAI_LOCATIONÚVERTEX_LOCATION)r»   r5   r�   r   r%  s    r.   Úget_vertex_ai_locationz!VertexBase.get_vertex_ai_locationx  s^   € ð ×ÑÐ0°$Ó7ò 1Ø×!Ñ!Ð"6¸Ó=ò1ä×&Ñ&ò1ô Ð1Ó2ò1ô Ð/Ó0ð	
r/   c                 óˆ   — | j                  d«      xs0 | j                  d«      xs t        j                  xs t        d«      S )a†  
        Safely get Vertex AI project without mutating the litellm_params dict.

        Unlike get_vertex_ai_project(), this does NOT pop values from the dict,
        making it safe to call multiple times with the same litellm_params.

        Args:
            litellm_params: Dictionary containing Vertex AI parameters

        Returns:
            Vertex AI project ID or None
        r“   r#  r$  )r8   r5   r“   r   r%  s    r.   Úsafe_get_vertex_ai_projectz%VertexBase.safe_get_vertex_ai_project‚  sJ   € ð ×ÑÐ/Ó0ò 2Ø×!Ñ!Ð"5Ó6ò2ä×%Ñ%ò2ô Ð0Ó1ð		
r/   c                 ód   — | j                  d«      xs | j                  d«      xs t        d«      S )a�  
        Safely get Vertex AI credentials without mutating the litellm_params dict.

        Unlike get_vertex_ai_credentials(), this does NOT pop values from the dict,
        making it safe to call multiple times with the same litellm_params.

        Args:
            litellm_params: Dictionary containing Vertex AI parameters

        Returns:
            Vertex AI credentials or None
        rþ   r(  r)  )r8   r   r%  s    r.   Úsafe_get_vertex_ai_credentialsz)VertexBase.safe_get_vertex_ai_credentials—  s:   € ð ×ÑÐ3Ó4ò 6Ø×!Ñ!Ð"9Ó:ò6äÐ4Ó5ð	
r/   Úparamsc                 ó€   — | j                  d«      | j                  d«      fD ]  }t        |t        «      sŒ|sŒ|c S  y)z�
        The location explicitly configured in the given params, without any
        module-level or environment fallback. None when not configured.
        r�   r,  N)r8   rM   rN   )r4  Ú
configureds     r.   Úexplicit_vertex_ai_locationz&VertexBase.explicit_vertex_ai_location«  sC   € ð "Ÿ:™:Ð&7Ó8¸&¿*¹*ÐEYÓ:ZÐ[ò 	"ˆJÜ˜*¤cÕ*ªzØ!Ò!ð	"ð r/   c                 ó„   — t         j                  | «      xs* t        j                  xs t	        d«      xs t	        d«      S )a�  
        Safely get Vertex AI location without mutating the litellm_params dict.

        Unlike get_vertex_ai_location(), this does NOT pop values from the dict,
        making it safe to call multiple times with the same litellm_params.

        Args:
            litellm_params: Dictionary containing Vertex AI parameters

        Returns:
            Vertex AI location/region or None
        r-  r.  )r   r7  r5   r�   r   r%  s    r.   Úsafe_get_vertex_ai_locationz&VertexBase.safe_get_vertex_ai_location¶  sC   € ô ×2Ñ2°>ÓBò 1Ü×&Ñ&ò1äÐ1Ó2ò1ô Ð/Ó0ð		
r/   )r   Nr   )NNNNF)FÚchatF)F)<rY   Ú
__module__Ú__qualname__r   ÚstaticmethodrN   r=   r   rÌ   r   ro   ra   r`   r_   rb   rd   rf   rŽ   r’   r   Úboolrœ   r®   rg   r¶   r·   r¹   r½   rÆ   rÊ   rÀ   rÁ   r×   rÛ   rß   ré   r   rð   rZ   ró   rª   r   r  rX   r  r  rî   r  r  r   r&  r*  r/  r1  r3  r   Úobjectr7  r9  Ú__classcell__)r-   s   @r.   r   r   )   sØ  ø„ õ4ð< ð.¨¨t©ð .¸Cð .ÀCò .ó ð.ð4e!à-°Ñ4ðe!ð ˜$‘Jðe!ð 
ˆs�Cˆx‰ó	e!òP	ò	ò	òhòlò2ð¨Só ðZ S¨4¡Zð ZÀ#ÈÁ*ð ZÐQTó Zð
 ð  $ñMØðMàðMð 'ðMð �t‘ð	Mð
 ðMð ˜‘*ðMð 
òMó ðMð<+à˜t™ð+ð ˜t™ð+ð ˜d™
ð	+ð
 ð+ð 'ð+ð �t‘ð+ð ð+ð 
ó+ðZ+¨ð +°ó +ð(Àð È'Ï,É,ó ðFÀð FÈWÏ\É\ð FÐ^bó Fð à#ðð ˜$‘Jðð 
ˆs�Cˆx‰˜4Ñ	ó	ð.Tà#ðTð ˜$‘JðTð 
ˆs�C˜ s¨C°$©JÐ6Ñ	7¸$Ñ	>ó	Tð6
h¸uð 
hÈÈsÐTWÐZ^ÑT^ÈÑI_ó 
hð#¨Cð #°Ló #ð&3à-°Ñ4ð3ð ˜$‘Jð3ð $ð	3ð
 
ˆs�C˜$‘JˆÑ	ó3ð.àðð $ðð  # T™zð	ð
 
óðBÈeð ÐX\ó ð&DàðDð $ðDð  # T™zð	Dð
 
óDð6à-°Ñ4ðð ˜$‘Jðð %Ø3ñ
ð	ð 
ˆs�Cˆx‰óð&¸ð À$ó ð$ !Ø%)Ø&*Ø>BØ(-ñH à˜‘*ðH ð !ðH ð ˜d™
ð	H ð
 ðH ð �t‘ðH ð ˜4‘ZðH ð ðH ð �T‰zðH ð ˜d™
ðH ð ˜t™ðH ð $ OÑ4°tÑ;ðH ð "&ðH ð 
ˆs�T‰z˜3ˆÑ	óH ðj 49Ø%+Ø(-ñA
àðA
ð ˜4‘ZðA
ð ˜d™
ð	A
ð
 ˜d™
ðA
ð ˜t™ðA
ð 5°tÑ;ðA
ð �t‘ðA
ð %Ð%LÑMðA
ð ˜‘*ðA
ð &*¨D¡[ðA
ð #ðA
ð "&ðA
ð 
ˆs�T‰z˜3ˆÑ	óA
ðF0à-°Ñ4ð0ð ˜$‘Jð0ð $ð	0ð
 ð0ð 
ˆs�Cˆx‰ó0ðd5à-°Ñ4ð5ð ˜$‘Jð5ð $ð	5ð
 ð5ð 
ˆs�Cˆx‰ó5ðv $ñ	w.à-°Ñ4ðw.ð ˜$‘Jðw.ð ð	w.ð
 
ˆs�Cˆx‰ów.ðr|Ià-°Ñ4ð|Ið ˜$‘Jð|Ið 
ˆs�Cˆx‰ó	|Ið|à-°Ñ4ðð ˜$‘Jðð %Ø3ñ
ð	ð 
ˆs�Cˆx‰óð&	 s¨T¡zð 	À$ÈÁ+ð 	ÐRVó 	ð ð
¨dð 
°s¸T±zò 
ó ð
ð ð
°$ð 
¸3À¹:ò 
ó ð
ð ð
¨tð 
¸¸d¹
ò 
ó ð
ð ð
°4ð 
¸CÀ$¹Jò 
ó ð
ð( ð
°tð 
ÀÀdÁ
ò 
ó ð
ð& ð¨G°C¸°KÑ,@ð ÀSÈ4ÁZò ó ðð ð
°G¸CÀ¸KÑ4Hð 
ÈSÐSWÉZò 
ó ô
r/   r   )'Ú__doc__r¶   rU   rO   r)   Úcollections.abcr   Útypingr   r   r   r   Úurllib.parser   r5   Úlitellm._loggingr	   Ú#litellm.litellm_core_utils.asyncifyr
   Ú&litellm.llms.custom_httpx.http_handlerr   Úlitellm.secret_managers.mainr   Úlitellm.types.llms.vertex_air   r   Úcommon_utilsr   r   r   r   r   r   Ú__annotations__r¿   r   ÚGoogleCredentialsObjectr   r   r�   r/   r.   ú<module>rM     so   ðòó Û Û 	Û Ý #ß 5Ó 5Ý !ã Ý +Ý 8Ý CÝ 7ß X÷õ ð xð ˜Uó ñ ÝNÞ2à!Ð÷`
ò `
r/   