
    hj"                         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
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 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DictListOptional)quote)verbose_logger)AdditionalLoggingUtils)GCSBucketBase)CommonProxyErrors)IntegrationHealthCheckStatus)*)StandardLoggingPayload)
VertexBasec            	            e Zd Zddee   ddf fdZd Zd Zd Zde	d	e
d
edefdZdedee   dee   dee   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efdZ xZS )GCSBucketLoggerNbucket_namereturnc                 6   ddl m} t        |   |       g | _        t        t        j                  dt                    | _	        t        t        j                  dt                    | _        t        j                  | j                                t        j                         | _        t        |   | j                   | j                  | j                         t#        j                  |        |dur&t%        dt&        j(                  j*                         y )	Nr   premium_user)r   GCS_BATCH_SIZEGCS_FLUSH_INTERVAL)
flush_lock
batch_sizeflush_intervalTCGCS Bucket logging is a premium feature. Please upgrade to use it. )litellm.proxy.proxy_serverr   super__init__	log_queueintosgetenvGCS_DEFAULT_BATCH_SIZEr   "GCS_DEFAULT_FLUSH_INTERVAL_SECONDSr   asynciocreate_taskperiodic_flushLockr   r   
ValueErrorr   not_premium_uservalue)selfr   r   	__class__s      f/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/integrations/gcs_bucket/gcs_bucket.pyr#   zGCSBucketLogger.__init__   s    ;[1 13bii(8:PQR!II*,NO
 	D//12!,,... 	 	

 	''-t#UVgVxVxV~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                  t        |||             y # t        $ r+}t        j                  d	t        |              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: )r!   r   r.   r   r/   r0   r   debuggetr$   appendGCSLogQueueItem	Exception	exceptionstr)r1   r:   r;   
start_timeend_timer   logging_payloades           r3   async_log_success_eventz'GCSBucketLogger.async_log_success_event2   s     ;t#UVgVxVxV~V~U  A 	L  Z
 AG

)4AO & !NOONN!!+F  	L$$'A#a&%JKK	Ls/   1C	AB C		C!C<C	CC	c                 6  K   	 t        j                  d||       |j                  dd       }|t        d      | j                  j                  t        |||             y # t        $ r+}t        j                  dt        |              Y d }~y d }~ww xY ww)NzHGCS Logger: async_log_failure_event logging kwargs: %s, response_obj: %sr6   r7   r8   r<   )
r   r=   r>   r.   r$   r?   r@   rA   rB   rC   )r1   r:   r;   rD   rE   rF   rG   s          r3   async_log_failure_eventz'GCSBucketLogger.async_log_failure_eventN   s     	L  Z AG

)4AO & !NOONN!!+F  	L$$'A#a&%JKK	Ls/   BAA" !B"	B+!BBBBc                   K   | j                   sy| j                   D ]  }|d   }|d   }|j                  dd      xs i }| j                  |       d{   }| j                  |d   |d          d{   }|d   }| j	                  |||      }	 | j                  ||||	       d{     | j                   j                          y7 x7 Y7 %# t        $ r+}	t        j                  d
t        |	              Y d}	~	d}	~	ww xY ww)aG  
        Process queued logs in batch - sends logs to GCS Bucket


        GCS Bucket does not have a Batch endpoint to batch upload logs

        Instead, we
            - collect the logs to flush every `GCS_FLUSH_INTERVAL` seconds
            - during async_send_batch, we make 1 POST request per log to GCS Bucket

        Nr9   r:   r;   vertex_instancepath_service_account)rL   service_account_jsonr   )headersr   object_namerF   z0GCS Bucket error logging payload to GCS bucket: )r$   r>   get_gcs_logging_configconstruct_request_headers_get_object_name_log_json_data_on_gcsrA   r   rB   rC   clear)
r1   log_itemrF   r:   r;   gcs_logging_configrO   r   rP   rG   s
             r3   async_send_batchz GCSBucketLogger.async_send_batche   s3     ~~H&y1Oh'F#<<=CL9=9T9T: 4 !:: 23D E%78N%O ;  G -];K//VK00# + +$3	 1   # '> 	54  ((Fs1vhO s`   AD	C D	4C5D	C*C+C/D	D	C	D!D<D	DD	r:   rF   r;   c                 d   | 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 r|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)_get_object_date_from_datetimer   nowr   utcr>   _generate_failure_object_name_generate_success_object_name)r1   r:   rF   r;   current_daterP   _litellm_params	_metadatas           r3   rS   z GCSBucketLogger._get_object_name   s     ::8<<;UV{D1=<<!- = K <<!-(,,T26 = K !**%5t<B#''
D9?R	9$#L1Kr4   
request_idstart_time_utcend_time_utcc           
        K   |t        d      ||t        d      z   |t        d      z
  g}d}|D ]i  }	 | j                  |      }| j                  ||      }t	        |d      }| j                  |       d{   }	|	t        j                  |	      }
|
c S k y7 "# t        $ r.}t        j                  d	| d
t        |              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^   r]   )safez!Failed to fetch payload for date z: )r.   r   rc   rg   r   download_gcs_objectjsonloadsrA   r   r=   rC   )r1   rk   rl   rm   dates_to_trydate_strdaterP   encoded_object_nameresponseloaded_responserG   s               r3   get_request_response_payloadz,GCSBucketLogger.get_request_response_payload   s     !R  YA..YA..

  D>>D>Q"@@%- * A  ',Kb&A#!%!9!9:M!NN'&*jj&:O** ( !&  O
  $$7zCF8L 	sA   4CAB"=B >B"C B""	C+$CCCCr[   r_   c                     | d| S )N/ )r1   r[   r_   s      r3   rg   z-GCSBucketLogger._generate_success_object_name   s    
 ##1[M22r4   c                 H    | dt        j                         j                   S )Nz	/failure-)uuiduuid4hex)r1   r[   s     r3   rf   z-GCSBucketLogger._generate_failure_object_name   s#     ##9TZZ\-=-=,>??r4   rq   c                 $    |j                  d      S )Nz%Y-%m-%d)strftime)r1   rq   s     r3   rc   z.GCSBucketLogger._get_object_date_from_datetime   s    $$Z00r4   c                     K   t        d      w)Nz(GCS Bucket does not support health check)NotImplementedError)r1   s    r3   async_health_checkz"GCSBucketLogger.async_health_check   s     !"LMMs   )N)__name__
__module____qualname__r
   rC   r#   rH   rJ   rX   r   r   r   rS   r   dictr|   rg   rf   rc   r   r   __classcell__)r2   s   @r3   r   r      s    HSM T 4L8L..`-CSV	2)) !*) x(	)
 
$)V33 3 
	3@@ 
@18 1 1N*F Nr4   r   )r*   rt   r&   r   r   r   r   typingr   r   r   r	   r
   urllib.parser   litellm._loggingr   -litellm.integrations.additional_logging_utilsr   /litellm.integrations.gcs_bucket.gcs_bucket_baser   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   r4   r3   <module>r      sS      	  2 2 ; ;  + P I 2 U 3 6AJSNm%; SNr4   