Ë
    tPêj<  ã                   óø   — d dl Z d dlZd dlZd dlZd dlZd dlmZmZm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 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 d dl­ d dlmZ e	rd dlm Z  ne
Z  G d„ dee«      Z!y)é    N)ÚdatetimeÚ	timedeltaÚtimezone)ÚTYPE_CHECKINGÚAnyÚFinal)Úverbose_logger)Úuuid)ÚLITELLM_ASYNCIO_QUEUE_MAXSIZE)ÚAdditionalLoggingUtils)ÚGCSBucketBase)Úsanitize_cloud_object_component)ÚCommonProxyErrors)ÚIntegrationHealthCheckStatus)Ú*)ÚStandardLoggingPayload)Ú
VertexBasec            	       ó¦  ‡ — e Zd Zd'dedz  ddfˆ fd„Zd„ Zd„ Zdee   fd„Z	ded	edefd
„Z
deeef   defd„Zdedefd„Zdee   deeee   f   fd„Zdee   defd„Zdee   dedeeef   fd„Zdee   ddfd„Zdeddfd„Zd„ Zdedededefd„Zdededz  dedz  dedz  fd„Zdededefd „Zdedefd!„Zd"edefd#„Zd$„ Zd%„ Zde fd&„Z!ˆ xZ"S )(ÚGCSBucketLoggerNÚbucket_nameÚreturnc                 óô  •— ddl m} t        ‰| �  |¬«       t	        t        j                  dt        «      «      | _        t	        t        j                  dt        «      «      | _
        t        j                  dt        t        «      j                  «       «      j                  «       dk(  | _        t        j                   «       | _        t        ‰| �  | j"                  | j                  | j                  ¬«       t        j$                  t&        ¬	«      | _        t        j*                  | j-                  «       «       t/        j                  | «       |d
ur&t1        dt2        j4                  j6                  › �«      ‚y )Nr   ©Úpremium_user)r   ÚGCS_BATCH_SIZEÚGCS_FLUSH_INTERVALÚGCS_USE_BATCHED_LOGGINGÚtrue)Ú
flush_lockÚ
batch_sizeÚflush_interval)ÚmaxsizeTúCGCS Bucket logging is a premium feature. Please upgrade to use it. )Úlitellm.proxy.proxy_serverr   ÚsuperÚ__init__ÚintÚosÚgetenvÚGCS_DEFAULT_BATCH_SIZEr    Ú"GCS_DEFAULT_FLUSH_INTERVAL_SECONDSr!   ÚstrÚGCS_DEFAULT_USE_BATCHED_LOGGINGÚlowerÚuse_batched_loggingÚasyncioÚLockr   ÚQueuer   Ú	log_queueÚcreate_taskÚperiodic_flushr   Ú
ValueErrorr   Únot_premium_userÚvalue)Úselfr   r   Ú	__class__s      €úo/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/gcs_bucket/gcs_bucket.pyr&   zGCSBucketLogger.__init__   s$  ø€ Ý;ä‰Ñ [ÐÔ1äœbŸi™iÐ(8Ô:PÓQÓRˆŒÜ!¤"§)¡)Ð,@ÔBdÓ"eÓfˆÔä�I‰IÐ/´Ô5TÓ1U×1[Ñ1[Ó1]Ó^×dÑdÓfÐjpÑpð 	Ô ô "Ÿ,™,›.ˆŒÜ‰ÑØ—‘Ø—‘Ø×.Ñ.ð 	ô 	
ô
 :A¿¹ÔOlÔ9mˆŒÜ×Ñ˜D×/Ñ/Ó1Ô2Ü×'Ñ'¨Ô-à˜tÑ#ÜØUÔVg×VxÑVx×V~ÑV~ÐUð  Aóð ð $ó    c              ƒ   óü  K  — ddl m} |dur&t        dt        j                  j
                  › �«      ‚	 t        j                  d||«       |j                  dd «      }|€t        d«      ‚| j                  j                  «       r| j                  «       ƒ d {  –—†  | j                  j                  t        |||¬«      «      ƒ d {  –—†  y 7 Œ47 Œ# t        $ r }t        j                  d	|«       Y d }~y d }~ww xY w­w)
Nr   r   Tr#   zHGCS Logger: async_log_success_event logging kwargs: %s, response_obj: %sÚstandard_logging_objectú+standard_logging_object not found in kwargs©ÚpayloadÚkwargsÚresponse_objúGCS Bucket logging error: %s)r$   r   r6   r   r7   r8   r	   ÚdebugÚgetr3   ÚfullÚflush_queueÚputÚGCSLogQueueItemÚ	ExceptionÚ	exception)r9   rB   rC   Ú
start_timeÚend_timer   Úlogging_payloadÚes           r;   Úasync_log_success_eventz'GCSBucketLogger.async_log_success_event7   sñ   è ø€ Ý;à˜tÑ#ÜØUÔVg×VxÑVx×V~ÑV~ÐUð  Aóð ð	HÜ× Ñ ØZØØôð
 EKÇJÁJÐOhÐjnÓDoˆOØÐ&Ü Ð!NÓOÐOà�~‰~×"Ñ"Ô$Ø×&Ñ&Ó(×(Ð(Ø—.‘.×$Ñ$¤_¸_ÐU[ÐjvÔ%wÓx×xÑxð )øØxùäò 	HÜ×$Ñ$Ð%CÀQ×GÑGûð	HüsS   ‚1C<´A#C ÂCÂ.C ÃCÃC ÃC<ÃC ÃC Ã	C9ÃC4Ã/C<Ã4C9Ã9C<c              ƒ   óœ  K  — 	 t        j                  d||«       |j                  dd «      }|€t        d«      ‚| j                  j                  «       r| j                  «       ƒ d {  –—†  | j                  j                  t        |||¬«      «      ƒ d {  –—†  y 7 Œ47 Œ# t        $ r }t        j                  d|«       Y d }~y d }~ww xY w­w)NzHGCS Logger: async_log_failure_event logging kwargs: %s, response_obj: %sr>   r?   r@   rD   )r	   rE   rF   r6   r3   rG   rH   rI   rJ   rK   rL   )r9   rB   rC   rM   rN   rO   rP   s          r;   Úasync_log_failure_eventz'GCSBucketLogger.async_log_failure_eventO   s¾   è ø€ ð	HÜ× Ñ ØZØØôð EKÇJÁJÐOhÐjnÓDoˆOØÐ&Ü Ð!NÓOÐOà�~‰~×"Ñ"Ô$Ø×&Ñ&Ó(×(Ð(Ø—.‘.×$Ñ$¤_¸_ÐU[ÐjvÔ%wÓx×xÑxð )øØxùäò 	HÜ×$Ñ$Ð%CÀQ×GÑGûð	HüsS   ‚C„A#B  Á'BÁ(.B  ÂBÂB  ÂCÂB  ÂB  Â 	C	Â)CÂ?CÃC	Ã	Cc                 óô   — g }t        |«      | j                  k  rC	 |j                  | j                  j	                  «       «       t        |«      | j                  k  rŒC|S # t
        j                  $ r Y |S w xY w)a  
        Drain items from the queue (non-blocking), respecting batch_size limit.

        This prevents unbounded queue growth when processing is slower than log accumulation.

        Returns:
            List of items to process, up to batch_size items
        )Úlenr    Úappendr3   Ú
get_nowaitr0   Ú
QueueEmpty)r9   Úitems_to_processs     r;   Ú_drain_queue_batchz"GCSBucketLogger._drain_queue_batchb   sx   € ð :<ÐÜÐ"Ó# d§o¡oÒ5ðØ ×'Ñ'¨¯©×(AÑ(AÓ(CÔDô Ð"Ó# d§o¡oÓ5ð
  Ðøô ×%Ñ%ò ØØÐðús   œ)A  Á A7Á6A7Údate_strÚbatch_idc                 ó   — |› d|› d�S )zm
        Generate object name for a batched log file.
        Format: {date}/batch-{batch_id}.ndjson
        z/batch-z.ndjson© )r9   r[   r\   s      r;   Ú_generate_batch_object_namez+GCSBucketLogger._generate_batch_object_names   s   € ð
 �˜7 8 *¨GÐ4Ð4r<   rB   c                 óÌ   — |j                  dd«      xs i }|j                  dd«      xs | j                  xs d}|j                  dd«      xs | j                  xs d}|› d|› �S )a†  
        Extract a synchronous grouping key from kwargs to group items by GCS config.
        This allows us to batch items with the same bucket/credentials together.

        Returns a string key that uniquely identifies the GCS config combination.
        This key may contain sensitive information (bucket names, paths) - use _sanitize_config_key()
        for logging purposes.
        Ú standard_callback_dynamic_paramsNÚgcs_bucket_nameÚdefaultÚgcs_path_service_accountú|)rF   ÚBUCKET_NAMEÚpath_service_account_json)r9   rB   ra   r   Úpath_service_accounts        r;   Ú_get_config_keyzGCSBucketLogger._get_config_keyz   sƒ   € ð 39·*±*Ð=_ÐaeÓ2fÒ2lÐjlÐ(à6×:Ñ:Ð;LÈdÓSÒtÐW[×WgÑWgÒtÐktˆà,×0Ñ0Ð1KÈTÓRò Ø×-Ñ-òàð 	ð �˜aÐ 4Ð5Ð6Ð6r<   Ú
config_keyc                 óv   — t        j                  |j                  d«      «      }d|j                  «       dd › �S )zÙ
        Create a sanitized version of the config key for logging.
        Uses a hash to avoid exposing sensitive bucket names or service account paths.

        Returns a short hash prefix for safe logging.
        zutf-8zconfig-Né   )ÚhashlibÚsha256ÚencodeÚ	hexdigest)r9   rj   Úhash_objs      r;   Ú_sanitize_config_keyz$GCSBucketLogger._sanitize_config_keyŽ   s;   € ô "Ÿ.™.¨×):Ñ):¸7Ó)CÓDˆØ˜×+Ñ+Ó-¨b¨qÐ1Ð2Ð3Ð3r<   Úitemsc                 óz   — i }|D ]3  }| j                  |d   «      }||vrg ||<   ||   j                  |«       Œ5 |S )zã
        Group items by their GCS config (bucket + credentials).
        This ensures items with different configs are processed separately.

        Returns a dict mapping config_key -> list of items with that config.
        rB   )ri   rV   )r9   rs   ÚgroupedÚitemrj   s        r;   Ú_group_items_by_configz&GCSBucketLogger._group_items_by_config˜   sX   € ð <>ˆØò 	-ˆDØ×-Ñ-¨d°8©nÓ=ˆJØ Ñ(Ø&(�˜
Ñ#Ø�JÑ×&Ñ& tÕ,ð		-ð
 ˆr<   c                 óš   — g }|D ]4  }|d   }t        j                  |t        d¬«      }|j                  |«       Œ6 dj	                  |«      S )z¡
        Combine multiple log payloads into newline-delimited JSON (NDJSON) format.
        Each line is a valid JSON object representing one log entry.
        rA   F)rc   Úensure_asciiú
)ÚjsonÚdumpsr,   rV   Újoin)r9   rs   Úlinesrv   rO   Ú	json_lines         r;   Ú_combine_payloads_to_ndjsonz+GCSBucketLogger._combine_payloads_to_ndjson§   sP   € ð
 ˆØò 	$ˆDØ" 9™oˆOÜŸ
™
 ?¼CÈeÔTˆIØ�L‰L˜Õ#ð	$ð �y‰y˜ÓÐr<   c              ƒ   ó´  K  — |sy|d   d   }	 | j                  |«      ƒ d{  –—† }| j                  |d   |d   ¬«      ƒ d{  –—† }|d   }| j                  t        j                  t
        j                  «      «      }t        t        j                  «       d	z  «      › d
t        j                  «       j                  dd › �}| j                  ||«      }	| j                  |«      }
| j                  |||	|
¬«      ƒ d{  –—†  t        |«      }d}||fS 7 Œñ7 ŒÒ7 Œ# t         $ r1}d}t        |«      }t#        j$                  d|«       ||fcY d}~S d}~ww xY w­w)z‚
        Send a batch of items that share the same GCS config.

        Returns:
            (success_count, error_count)
        )r   r   r   rB   NÚvertex_instancerh   ©r‚   Úservice_account_jsonr   iè  ú-rl   ©Úheadersr   Úobject_namerO   z8GCS Bucket error logging batch payload to GCS bucket: %s)Úget_gcs_logging_configÚconstruct_request_headersÚ_get_object_date_from_datetimer   Únowr   Úutcr'   Útimer
   Úuuid4Úhexr_   r€   Ú_log_json_data_on_gcsrU   rK   r	   rL   )r9   rs   rj   Úfirst_kwargsÚgcs_logging_configr‡   r   Úcurrent_dater\   rˆ   Úcombined_payloadÚsuccess_countÚerror_countrP   s                 r;   Ú_send_grouped_batchz#GCSBucketLogger._send_grouped_batch³   sz  è ø€ ñ Øà# A™h xÑ0ˆð	0Ø@D×@[Ñ@[Ð\hÓ@i×:iÐà#'×#AÑ#AØ 2Ð3DÑ EØ%7Ð8NÑ%Oð $Bó $÷ ˆGð "4°MÑ!BˆKà"&×"EÑ"EÄhÇlÁlÔS[×S_ÑS_ÓF`Ó"aˆLÜ!$¤T§Y¡Y£[°4Ñ%7Ó!8Ð 9¸¼4¿:¹:»<×;KÑ;KÈBÈQÐ;OÐ:PÐQˆHØ!%×!AÑ!AÀ,ÐPXÓ!YˆKØ&*×&FÑ&FÀuÓ&MÐà×,Ñ,ØØ'Ø'Ø 0ð	 -ó ÷ ð ô   ›JˆMØˆKØ! ;Ð/Ð/ð- ;jøðøðùô ò 	0ØˆMÜ˜e›*ˆKÜ×$Ñ$Ð%_ÐabÔcØ! ;Ð/Õ/ûð		0üsi   ‚E�D £D¤ D ÁDÁB:D Ã?DÄ D ÄEÄD ÄD ÄD Ä	EÄ$&EÅ
EÅEÅEÅEc              ƒ   óP   K  — |D ]  }| j                  |«      ƒ d{  –—†  Œ y7 Œ­w)z–
        Send each log individually as separate GCS objects (legacy behavior).
        This is used when GCS_USE_BATCHED_LOGGING is disabled.
        N)Ú_send_single_log_item)r9   rs   rv   s      r;   Ú_send_individual_logsz%GCSBucketLogger._send_individual_logsÞ   s.   è ø€ ð
 ò 	3ˆDØ×,Ñ,¨TÓ2×2Ñ2ñ	3Ø2ús   ‚&œ$�&rv   c              ƒ   óp  K  — 	 | j                  |d   «      ƒ d{  –—† }| j                  |d   |d   ¬«      ƒ d{  –—† }|d   }| j                  |d   |d   |d   ¬	«      }| j                  ||||d   ¬
«      ƒ d{  –—†  y7 Œh7 ŒI7 Œ	# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)zH
        Send a single log item to GCS as an individual object.
        rB   Nr‚   rh   rƒ   r   rA   rC   )rB   rO   rC   r†   z=GCS Bucket error logging individual payload to GCS bucket: %s)r‰   rŠ   Ú_get_object_namer‘   rK   r	   rL   )r9   rv   r“   r‡   r   rˆ   rP   s          r;   rš   z%GCSBucketLogger._send_single_log_itemæ   sô   è ø€ ð	iØ@D×@[Ñ@[Ð\`ÐaiÑ\jÓ@k×:kÐà#'×#AÑ#AØ 2Ð3DÑ EØ%7Ð8NÑ%Oð $Bó $÷ ˆGð "4°MÑ!BˆKà!%×!6Ñ!6Ø˜H‘~Ø $ Y¡Ø! .Ñ1ð "7ó "ˆKð ×,Ñ,ØØ'Ø'Ø $ Y¡ð	 -ó ÷ ñ ð ;løðøðùô ò 	iÜ×$Ñ$Ð%dÐfg×hÑhûð	iüsa   ‚B6„B
 ›Bœ B
 ¼B½AB
 Á>BÁ?B
 ÂB6ÂB
 ÂB
 ÂB
 Â
	B3ÂB.Â)B6Â.B3Â3B6c              ƒ   ó  K  — | j                  «       }|sy| j                  rD| j                  |«      }|j                  «       D ]  \  }}| j	                  ||«      ƒ d{  –—†  Œ! y| j                  |«      ƒ d{  –—†  y7 Œ!7 Œ­w)aQ  
        Process queued logs - sends logs to GCS Bucket.

        If `GCS_USE_BATCHED_LOGGING` is enabled (default), batches multiple log payloads
        into single GCS object uploads (NDJSON format), dramatically reducing API calls.

        If disabled, sends each log individually as separate GCS objects (legacy behavior).
        N)rZ   r/   rw   rs   r˜   r›   )r9   rY   Úgrouped_itemsrj   Úgroup_itemss        r;   Úasync_send_batchz GCSBucketLogger.async_send_batch  s�   è ø€ ð #'×"9Ñ"9Ó";ÐáØà×#Ò#Ø#'×#>Ñ#>Ð?OÓ#PˆMà+8×+>Ñ+>Ó+@ò HÑ'�
˜KØ×.Ñ.¨{¸JÓG×GÑGñHð ×,Ñ,Ð-=Ó>×>Ñ>ð Høà>ús$   ‚ABÁB ÁBÁ:BÁ;BÂBrO   rC   c                 óâ  — | j                  t        j                  t        j                  «      «      }|j                  dd«      �| j                  |¬«      }n#| j                  ||j                  dd«      ¬«      }|j                  dd«      xs i }|j                  dd«      xs i }d	|v rDt        |j                  d	«      d¬
«      }|r&|› dt        j                  «       j                  › d|› �}|S )zD
        Get the object name to use for the current payload
        Ú	error_strN)Úrequest_date_strÚidÚ ©r¤   Úresponse_idÚlitellm_paramsÚmetadataÚ
gcs_log_id)Úfallbackz/custom-r…   )r‹   r   rŒ   r   r�   rF   Ú_generate_failure_object_nameÚ_generate_success_object_namer   r
   r�   r�   )	r9   rB   rO   rC   r”   rˆ   Ú_litellm_paramsÚ	_metadataÚsafe_log_ids	            r;   r�   z GCSBucketLogger._get_object_name  sï   € ð #×AÑAÄ(Ç,Á,ÌxÏ|É|ÓB\Ó]ˆØ×Ñ˜{¨DÓ1Ð=Ø×<Ñ<Ø!-ð =ó ‰Kð ×<Ñ<Ø!-Ø(×,Ñ,¨T°2Ó6ð =ó ˆKð "(§¡Ð,<¸dÓ!CÒ!IÀrˆØ*×.Ñ.¨z¸4Ó@ÒFÀBˆ	Ø˜9Ñ$Ü!@ÀÇÁÈ|ÓA\ÐgiÔ!jˆKÙØ!- ¨h´t·z±z³|×7GÑ7GÐ6HÈÈ+ÈÐW�àÐr<   Ú
request_idÚstart_time_utcÚend_time_utcc              ƒ   óˆ  K  — |€t        d«      ‚||t        d¬«      z   |t        d¬«      z
  g}d}|D ]\  }	 | j                  |¬«      }| j                  ||¬«      }| j	                  |«      ƒ d{  –—† }|�t        j                  |«      }	|	c S Œ^ y7 Œ"# t        $ r!}
t        j                  d||
«       Y d}
~
Œ‡d}
~
ww xY w­w)z 
        Get the request and response payload for a given `request_id`
        Tries current day, next day, and previous day until it finds the payload
        Nz@start_time_utc is required for getting a payload from GCS Bucketé   )Údays)Údatetime_objr§   z'Failed to fetch payload for date %s: %s)
r6   r   r‹   r®   Údownload_gcs_objectr{   ÚloadsrK   r	   rE   )r9   r²   r³   r´   Údates_to_tryr[   Údaterˆ   ÚresponseÚloaded_responserP   s              r;   Úget_request_response_payloadz,GCSBucketLogger.get_request_response_payload1  sò   è ø€ ð Ð!ÜÐ_Ó`Ð`ð ØœY¨AÔ.Ñ.ØœY¨AÔ.Ñ.ð
ˆð
 ˆØ ò 	ˆDðØ×>Ñ>ÈDÐ>ÓQ�Ø"×@Ñ@Ø%-Ø *ð Aó �ð "&×!9Ñ!9¸+Ó!F×F�àÐ'Ü&*§j¡j°Ó&:�OØ*Ò*ð (ð	ð  ð Gùô
 ò Ü×$Ñ$Ð%NÐPXÐZ[Ô\Üûðüs@   ‚4C·9BÁ0BÁ1BÂCÂBÂ	B?ÂB:Â5CÂ:B?Â?Cr¤   r¨   c                 ó   — |› d|› �S )Nú/r^   )r9   r¤   r¨   s      r;   r®   z-GCSBucketLogger._generate_success_object_nameV  s   € ð
 #Ð# 1 [ MÐ2Ð2r<   c                 óH   — |› dt        j                  «       j                  › �S )Nz	/failure-)r
   r�   r�   )r9   r¤   s     r;   r­   z-GCSBucketLogger._generate_failure_object_name]  s#   € ð #Ð# 9¬T¯Z©Z«\×-=Ñ-=Ð,>Ð?Ð?r<   r¸   c                 ó$   — |j                  d«      S )Nz%Y-%m-%d)Ústrftime)r9   r¸   s     r;   r‹   z.GCSBucketLogger._get_object_date_from_datetimec  s   € Ø×$Ñ$ ZÓ0Ð0r<   c              ƒ   ór   K  — | j                  «       ƒ d{  –—†  t        j                  «       | _        y7 Œ­w)zB
        Override flush_queue to work with asyncio.Queue.
        N)r¡   rŽ   Úlast_flush_time©r9   s    r;   rH   zGCSBucketLogger.flush_queuef  s-   è ø€ ð ×#Ñ#Ó%×%Ð%Ü#Ÿy™y›{ˆÕð 	&ús   ‚7–5—7c              ƒ   óÔ   K  — 	 t        j                  | j                  «      ƒ d{  –—†  t        j                  d| j                  «       | j                  «       ƒ d{  –—†  Œ`7 Œ=7 Œ­w)zE
        Override periodic_flush to work with asyncio.Queue.
        Nz*GCS Bucket periodic flush after %s seconds)r0   Úsleepr!   r	   rE   rH   rÇ   s    r;   r5   zGCSBucketLogger.periodic_flushm  sX   è ø€ ð Ü—-‘- × 3Ñ 3Ó4×4Ð4Ü× Ñ Ð!MÈt×ObÑObÔcØ×"Ñ"Ó$×$Ð$ð Ø4øà$ús!   ‚$A(¦A$§7A(ÁA&ÁA(Á&A(c              ƒ   ó    K  — t        d«      ‚­w)Nz(GCS Bucket does not support health check)ÚNotImplementedErrorrÇ   s    r;   Úasync_health_checkz"GCSBucketLogger.async_health_checkv  s   è ø€ Ü!Ð"LÓMÐMùs   ‚)N)#Ú__name__Ú
__module__Ú__qualname__r,   r&   rQ   rS   ÚlistrJ   rZ   r_   Údictr   ri   rr   rw   r€   Útupler'   r˜   r›   rš   r¡   r   r�   r   r¿   r®   r­   r‹   rH   r5   r   rÌ   Ú__classcell__)r:   s   @r;   r   r      sä  ø„ ñ C¨$¡Jð ¸$õ ò4Hò0Hð&  D¨Ñ$9ó  ð"5°Cð 5À3ð 5È3ó 5ð7 d¨3°¨8¡nð 7¸ó 7ð(4¨sð 4°só 4ð¨D°Ñ,Að ÀdÈ3ÐPTÐUdÑPeÐKeÑFfó ð
 °°oÑ1Fð 
 È3ó 
 ð)0¨t°OÑ/Dð )0ÐRUð )0ÐZ_Ð`cÐehÐ`hÑZió )0ðV3°°oÑ1Fð 3È4ó 3ði°ð iÀDó iò8?ð, tð Ð>Tð Ðdgð Ðloó ð2#àð#ð ! 4™ð#ð  ‘oð	#ð
 
�‰ó#ðJ3àð3ð ð3ð 
ó	3ð@àð@ð 
ó@ð1¸8ð 1Èó 1ò+ò%ðNÐ*F÷ Nr<   r   )"r0   rm   r{   r(   rŽ   r   r   r   Útypingr   r   r   Úlitellm._loggingr	   Úlitellm._uuidr
   Úlitellm.constantsr   Ú-litellm.integrations.additional_logging_utilsr   Ú/litellm.integrations.gcs_bucket.gcs_bucket_baser   Ú1litellm.litellm_core_utils.cloud_storage_securityr   Úlitellm.proxy._typesr   Ú,litellm.types.integrations.base_health_checkr   Ú%litellm.types.integrations.gcs_bucketÚlitellm.types.utilsr   Ú&litellm.llms.vertex_ai.vertex_llm_baser   r   r^   r<   r;   ú<module>rà      s`   ðÛ Û Û Û 	Û ß 2Ñ 2ß ,Ñ ,å +Ý Ý ;Ý PÝ Iõõ 3Ý UÜ 3Ý 6áÞAà€Jô[N�mÐ%;õ [Nr<   