Ë
    tPêjr4  ã                   óÊ   — U d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZmZmZ d dlmZmZ d dlmZmZ d dl­ d d	lmZmZ erd d
lmZ neZdZeed<    G d„ de	«      Zy)é    N)ÚTYPE_CHECKINGÚAnyÚFinal)Úverbose_logger)ÚCustomBatchLogger)Úcreate_mock_gcs_clientÚmock_vertex_auth_methodsÚshould_use_gcs_mock)Úencode_gcs_object_name_for_urlÚ"split_configured_cloud_bucket_name)Úget_async_httpx_clientÚhttpxSpecialProvider)Ú*)ÚStandardCallbackDynamicParamsÚStandardLoggingPayload©Ú
VertexBaseÚIAM_AUTHÚIAM_AUTH_KEYc            	       ó"  ‡ — e Zd Zddedz  ddfˆ fd„Z	 ddedz  dedz  deeef   fd„Zdeeef   fd„Zded	ede	eef   fd
„Z
i fdeeef   dz  defd„Zdedz  defd„Zdedz  defd„Zd	efd„Zd	efd„Zdeeef   ded	edeez  fd„Zˆ xZS )ÚGCSBucketBaseNÚbucket_nameÚreturnc                 óF  •— t        «       | _        | j                  rt        «        t        «        t	        t
        j                  ¬«      | _        t        j                  d«      }|xs t        j                  d«      }|| _
        || _        i | _        t        ‰| �8  di |¤Ž y )N)Úllm_providerÚGCS_PATH_SERVICE_ACCOUNTÚGCS_BUCKET_NAME© )r
   Úis_mock_moder	   r   r   r   ÚLoggingCallbackÚasync_httpx_clientÚosÚgetenvÚpath_service_account_jsonÚBUCKET_NAMEÚvertex_instancesÚsuperÚ__init__)Úselfr   ÚkwargsÚ_path_service_accountÚ_bucket_nameÚ	__class__s        €út/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/gcs_bucket/gcs_bucket_base.pyr(   zGCSBucketBase.__init__   sƒ   ø€ Ü/Ó1ˆÔà×ÒÜ$Ô&Ü"Ô$ä"8ÔFZ×FjÑFjÔ"kˆÔÜ')§y¡yÐ1KÓ'LÐØ)ÒI¬R¯Y©YÐ7HÓ-IˆØ5JˆÔ&Ø'3ˆÔØ79ˆÔÜ‰ÑÑ"˜6Ó"ó    Úservice_account_jsonÚvertex_instancec              ƒ   óÞ   K  — ddl m} |€|}|j                  |d d¬«      ƒ d {  –—† \  }}|j                  d|||d d d dd ¬«	      \  }}t	        j
                  d|d u«       d|› �d	d
œ}|S 7 ŒF­w)Nr   ©Úvertex_chat_completionÚ	vertex_ai©ÚcredentialsÚ
project_idÚcustom_llm_providerú
gcs-bucket©	ÚmodelÚauth_headerÚvertex_credentialsÚvertex_projectÚvertex_locationÚgemini_api_keyÚstreamr9   Úapi_baseú constructed auth_header [set=%s]úBearer úapplication/json©ÚAuthorizationzContent-Type)Úlitellmr4   Ú_ensure_access_token_asyncÚ_get_token_and_urlr   Údebug)	r)   r0   r1   r4   Ú_auth_headerr?   r=   Ú_Úheaderss	            r.   Úconstruct_request_headersz'GCSBucketBase.construct_request_headers.   s®   è ø€ õ
 	3àÐ"Ø4ˆOà-<×-WÑ-WØ,ØØ +ð .Xó .
÷ (
Ñ$ˆ�nð )×;Ñ;ØØ$Ø3Ø)Ø ØØØ +Øð <ó 

‰ˆ�Qô 	×ÑÐ?ÀÐTXÐAXÔYà& { mÐ4Ø.ñ
ˆð
 ˆð/(
ús   ‚"A-¤A+¥AA-c                 ó  — ddl m} t        j                  d«      }|j	                  | j
                  |d¬«      \  }}|j                  d|| j
                  |ddddd¬«	      \  }}t        j                  d	|du«       d
|› �ddœ}|S )z=
        Construct request headers for GCS API calls
        r   r3   Ú GOOGLE_SECRET_MANAGER_PROJECT_IDr5   r6   r:   Nr;   rD   rE   rF   rG   )	rI   r4   r"   r#   Ú_ensure_access_tokenr$   rK   r   rL   )r)   r4   r8   rM   r?   r=   rN   rO   s           r.   Úsync_construct_request_headersz,GCSBucketBase.sync_construct_request_headersQ   s³   € õ 	3ô
 ŸI™IÐ&HÓIˆ
à'=×'RÑ'RØ×6Ñ6Ø!Ø +ð (Só (
Ñ$ˆ�nð 0×BÑBØØ$Ø#×=Ñ=Ø)Ø ØØØ +Øð Có 

‰ˆ�Qô 	×ÑÐ?ÀÐTXÐAXÔYà& { mÐ4Ø.ñ
ˆð
 ˆr/   Úobject_namec                 ó@   — t        |«      \  }}|r|› d|› �}||fS ||fS )a  
        Handles when the user passes a bucket name with a folder postfix


        Example:
            - Bucket name: "my-bucket/my-folder/dev"
            - Object name: "my-object"
            - Returns: bucket_name="my-bucket", object_name="my-folder/dev/my-object"

        ú/)r   )r)   r   rU   Úprefixs       r.   Ú_handle_folders_in_bucket_namez,GCSBucketBase._handle_folders_in_bucket_nameu   s=   € ô AÀÓMÑˆ�VÙØ#˜H A k ]Ð3ˆKØ Ð+Ð+Ø˜KÐ'Ð'r/   r*   c              ƒ   ó  K  — |€i }|j                  dd«      }|�—t        j                  d«       t        j                  d|«       |j                  dd«      xs | j                  }|j                  dd«      xs | j                  }|€t        d«      ‚|}|}| j                  |¬«      ƒ d{  –—† }nI| j                  €t        d«      ‚| j                  }| j                  }| j                  |¬«      ƒ d{  –—† }t        |||¬	«      S 7 Œ\7 Œ­w)
a  
        This function is used to get the GCS logging config for the GCS Bucket Logger.
        It checks if the dynamic parameters are provided in the kwargs and uses them to get the GCS logging config.
        If no dynamic parameters are provided, it uses the default values.
        NÚ standard_callback_dynamic_paramszUsing dynamic GCS loggingz$standard_callback_dynamic_params: %sÚgcs_bucket_nameÚgcs_path_service_accountz“GCS_BUCKET_NAME is not set in the environment, but GCS Bucket is being used as a logging callback. Please set 'GCS_BUCKET_NAME' in the environment.)r7   )r   r1   Úpath_service_account)Úgetr   rL   r%   r$   Ú
ValueErrorÚget_or_create_vertex_instanceÚGCSLoggingConfig)r)   r*   r[   r,   r+   r   r^   r1   s           r.   Úget_gcs_logging_configz$GCSBucketBase.get_gcs_logging_configŠ   sH  è ø€ ð ˆ>ØˆFàX^×XbÑXbØ.°óY
Ð(ð ,Ð7Ü× Ñ Ð!<Ô=Ü× Ñ Ð!GÐIiÔjà'G×'KÑ'KÐL]Ð_cÓ'dÒ'xÐhl×hxÑhxˆLà0×4Ñ4Ð5OÐQUÓVÒxÐZ^×ZxÑZxð "ð Ð#Ü ð jóð ð 'ˆKØ#8Ð Ø$(×$FÑ$FÐSgÐ$FÓ$h×h‰Oð ×ÑÐ'Ü ð jóð ð ×*Ñ*ˆKØ#'×#AÑ#AÐ Ø$(×$FÑ$FÐSgÐ$FÓ$h×hˆOäØ#Ø+Ø!5ô
ð 	
ð iøð iús%   ‚B*DÂ,D	Â-A	DÃ6DÃ7DÄDr7   c              ƒ   óÚ   K  — ddl m} | j                  |«      }|| j                  vr2 |«       }|j	                  |dd¬«      ƒ d{  –—†  || j                  |<   | j                  |   S 7 Œ"­w)zÕ
        This function is used to get the Vertex instance for the GCS Bucket Logger.
        It checks if the Vertex instance is already created and cached, if not it creates a new instance and caches it.
        r   r   Nr5   r6   )Ú&litellm.llms.vertex_ai.vertex_llm_baser   Ú&_get_in_memory_key_for_vertex_instancer&   rJ   )r)   r7   r   Ú_in_memory_keyr1   s        r.   ra   z+GCSBucketBase.get_or_create_vertex_instance¹   s€   è ø€ õ
 	Fà $× KÑ KÈKÓ XˆØ ×!6Ñ!6Ñ6Ù%/£\ˆOØ!×<Ñ<Ø'ØØ$/ð =ó ÷ ð ð
 5DˆD×!Ñ! .Ñ1Ø×$Ñ$ ^Ñ4Ð4ðús   ‚AA+ÁA)Á#A+c                 ó   — |xs t         S )aH  
        Returns key to use for caching the Vertex instance in-memory.

        When using Vertex with Key based logging, we need to cache the Vertex instance in-memory.

        - If a credentials string is provided, it is used as the key.
        - If no credentials string is provided, "IAM_AUTH" is used as the key.
        )r   )r)   r7   s     r.   rf   z4GCSBucketBase._get_in_memory_key_for_vertex_instanceË   s   € ð Ò*œlÐ*r/   c              ‹   ój  K  — 	 | j                  |¬«      ƒ d{  –—† }| j                  |d   |d   ¬«      ƒ d{  –—† }|d   }| j                  ||¬«      \  }}t        |«      }d|› d	|› d
�}| j                  j                  ||¬«      ƒ d{  –—† }|j                  dk7  r*t        j                  dt        |j                  «      «       yt        j                  d|j                  «       |j                  S 7 ŒÞ7 Œ¿7 Œm# t        $ r)}t        j                  dt        |«      «       Y d}~yd}~ww xY w­w)z†
        Download an object from GCS.

        https://cloud.google.com/storage/docs/downloading-objects#download-object-json
        ©r*   Nr1   r^   ©r1   r0   r   ©r   rU   ú,https://storage.googleapis.com/storage/v1/b/ú/o/z
?alt=media©ÚurlrO   éÈ   úGCS object download error: %sz,GCS object download response status code: %s)rc   rP   rY   r   r!   r_   Ústatus_coder   ÚerrorÚstrÚtextrL   ÚcontentÚ	Exception©	r)   rU   r*   Úgcs_logging_configrO   r   rp   ÚresponseÚes	            r.   Údownload_gcs_objectz!GCSBucketBase.download_gcs_objectÖ   sO  è ø€ ð	Ø@D×@[Ñ@[ÐciÐ@[Ó@j×:jÐØ#'×#AÑ#AØ 2Ð3DÑ EØ%7Ð8NÑ%Oð $Bó $÷ ˆGð -¨]Ñ;ˆKØ'+×'JÑ'JØ'Ø'ð (Kó (Ñ$ˆK˜ô 9¸ÓEˆKàGÈÀ}ÐTWÐXcÐWdÐdnÐoˆCð %)×$;Ñ$;×$?Ñ$?ÀCÐQXÐ$?Ó$Y×YˆHà×#Ñ# sÒ*Ü×$Ñ$Ð%DÄcÈ(Ï-É-ÓFXÔYØä× Ñ Ð!OÐQY×QeÑQeÔfð ×#Ñ#Ð#ð1 ;køðøð Zùô ò 	Ü× Ñ Ð!@Ä#ÀaÃ&ÔIÜûð	üsm   ‚D3„C> ™C8š C> ºC:»AC> ÂC<Â<C> ÃD3Ã+C> Ã7D3Ã8C> Ã:C> Ã<C> Ã>	D0ÄD+Ä&D3Ä+D0Ä0D3c              ‹   ó´  K  — 	 | j                  |¬«      ƒ d{  –—† }| j                  |d   |d   ¬«      ƒ d{  –—† }|d   }| j                  ||¬«      \  }}t        |«      }d|› d	|› �}| j                  j                  ||¬
«      ƒ d{  –—† }|j                  dk7  s|j                  dk7  r5t        j                  dt        |j                  «      |j                  «       yt        j                  d|j                  |j                  «       |j                  S 7 �Œ7 Œä7 Œ“# t        $ r)}t        j                  dt        |«      «       Y d}~yd}~ww xY w­w)z,
        Delete an object from GCS.
        rj   Nr1   r^   rk   r   rl   rm   rn   ro   rq   éÌ   z,GCS object delete error: %s, status code: %sz8GCS object delete response status code: %s, response: %srr   )rc   rP   rY   r   r!   Údeleters   r   rt   ru   rv   rL   rx   ry   s	            r.   Údelete_gcs_objectzGCSBucketBase.delete_gcs_objectû   so  è ø€ ð%	Ø@D×@[Ñ@[ÐciÐ@[Ó@j×:jÐØ#'×#AÑ#AØ 2Ð3DÑ EØ%7Ð8NÑ%Oð $Bó $÷ ˆGð -¨]Ñ;ˆKØ'+×'JÑ'JØ'Ø'ð (Kó (Ñ$ˆK˜ô 9¸ÓEˆKàGÈÀ}ÐTWÐXcÐWdÐeˆCð %)×$;Ñ$;×$BÑ$BÀsÐT[Ð$BÓ$\×\ˆHà×$Ñ$¨Ò+°×1EÑ1EÈÒ1LÜ×$Ñ$ØBÜ˜Ÿ™Ó&Ø×(Ñ(ôð
 ä× Ñ ØJØ×$Ñ$Ø—‘ôð —=‘=Ð ðA ;kùðøð ]ùô& ò 	Ü× Ñ Ð!@Ä#ÀaÃ&ÔIÜûð	üsn   ‚E„D# ™Dš D# ºD»AD# ÂD!ÂAD# Ã$EÃ%6D# ÄEÄD# ÄD# Ä!D# Ä#	EÄ,EÅEÅEÅErO   Úlogging_payloadc              ƒ   ó@  K  — t        |t        «      r|}nt        j                  |t        ¬«      }| j	                  ||¬«      \  }}t        |«      }| j                  j                  |d|› d|› �|¬«      ƒ d{  –—† }|j                  dk7  r)t        j                  dt        |j                  «      «       t        j                  d	|«       t        j                  d
|j                  «       t        j                  d|j                  «       |j                  «       S 7 Œ¢­w)z]
        Helper function to make POST request to GCS Bucket in the specified bucket.
        )Údefaultrl   z3https://storage.googleapis.com/upload/storage/v1/b/z/o?uploadType=media&name=)rO   rp   ÚdataNrq   zGCS Bucket logging error: %szGCS Bucket response %szGCS Bucket status code %szGCS Bucket response.text %s)Ú
isinstanceru   ÚjsonÚdumpsrY   r   r!   Úpostrs   r   rt   rv   rL   )r)   rO   r   rU   r‚   Újson_logged_payloadÚencoded_object_namer{   s           r.   Ú_log_json_data_on_gcsz#GCSBucketBase._log_json_data_on_gcs&  s  è ø€ ô �o¤sÔ+Ø"1Ñä"&§*¡*¨_ÄcÔ"JÐà#'×#FÑ#FØ#Ø#ð $Gó $
Ñ ˆ�[ô &DÀKÓ%PÐà $× 7Ñ 7× <Ñ <ØØEÀkÀ]ÐRkÐlð  lAð  BØ$ð !=ó !
÷ 
ˆð ×Ñ 3Ò&Ü× Ñ Ð!?ÄÀXÇ]Á]ÓASÔTä×ÑÐ5°xÔ@Ü×ÑÐ8¸(×:NÑ:NÔOÜ×ÑÐ:¸H¿M¹MÔJà�}‰}‹Ðð
ús   ‚A7DÁ9DÁ:B#D)N)Ú__name__Ú
__module__Ú__qualname__ru   r(   r   ÚdictrP   rT   ÚtuplerY   r   rb   rc   ra   rf   r}   r�   r   rŒ   Ú__classcell__)r-   s   @r.   r   r      s:  ø„ ñ# C¨$¡Jð #ÀDõ #ð$ .2ñ!à! D™jð!ð $ dÑ*ð!ð 
ˆc�3ˆh‰ó	!ðF"°°S¸#°X±ó "ðH(àð(ð ð(ð 
ˆs�Cˆx‰ó	(ð* LNñ -
°4¸¸S¸±>ÀDÑ3Hð -
ÐRbó -
ð^5¸sÀT¹zð 5Èjó 5ð$	+À#ÈÁ*ð 	+ÐQTó 	+ð#°Só #ðJ)°3ó )ðV"à�c˜3�h‘ð"ð ð"ð ð	"ð
 0°#Ñ5÷"r/   r   )r‡   r"   Útypingr   r   r   Úlitellm._loggingr   Ú(litellm.integrations.custom_batch_loggerr   Ú6litellm.integrations.gcs_bucket.gcs_bucket_mock_clientr   r	   r
   Ú1litellm.litellm_core_utils.cloud_storage_securityr   r   Ú&litellm.llms.custom_httpx.http_handlerr   r   Ú%litellm.types.integrations.gcs_bucketÚlitellm.types.utilsr   r   re   r   r   Ú__annotations__r   r   r/   r.   ú<module>rœ      sW   ðÜ Û 	ß ,Ñ ,å +Ý F÷ñ ÷
÷ô 4ß UáÞAà€JØ €ˆeÓ  ôjÐ%õ jr/   