
    hF                         d Z ddlZddlmZ ddlmZmZmZ ddlZddlm	Z	m
Z
 ddlmZ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 ddlmZ ddlmZ ddlmZ  G d dee      Zy)a  
s3 Bucket Logging Integration

async_log_success_event: Processes the event, stores it in memory for DEFAULT_S3_FLUSH_INTERVAL_SECONDS seconds or until DEFAULT_S3_BATCH_SIZE and then flushes to s3 
async_log_failure_event: Processes the event, stores it in memory for DEFAULT_S3_FLUSH_INTERVAL_SECONDS seconds or until DEFAULT_S3_BATCH_SIZE and then flushes to s3 
NOTE 1: S3 does not provide a BATCH PUT API endpoint, so we create tasks to upload each element individually
    N)datetime)ListOptionalcast)print_verboseverbose_logger)DEFAULT_S3_BATCH_SIZE!DEFAULT_S3_FLUSH_INTERVAL_SECONDS)get_s3_object_key)
safe_dumps)
BaseAWSLLM)_get_httpx_clientget_async_httpx_clienthttpxSpecialProvider)s3BatchLoggingElement)StandardLoggingPayload   )CustomBatchLoggerc            %          e Zd Zdddddddddddddddeeddfdee   dee   dee   dee   ded	ee   d
ee   dee   dee   dee   dee   dee   dee   dee   dee   dee   dee   def$dZ		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#dee   dee   dee   ded	ee   d
ee   dee   dee   dee   dee   dee   dee   dee   dee   dee   def dZ
d Zd Zd ZdefdZd Zdedee   d ee   fd!Zdefd"Zy)$S3LoggerNTFs3_bucket_names3_paths3_region_names3_api_version
s3_use_ssl	s3_verifys3_endpoint_urls3_aws_access_key_ids3_aws_secret_access_keys3_aws_session_tokens3_aws_session_names3_aws_profile_names3_aws_role_names3_aws_web_identity_tokens3_aws_sts_endpoints3_flush_intervals3_batch_sizes3_use_team_prefixc                    	 t        j                  dt        j                          t	        t
        j                        | _        | j                  ||||||||	|
||||||||       t        j                  d|        t        j                  | j                                t        j                         | _        t        j                  d| d|        t        j                  | | j                  ||       g | _        t#        j                  |        y # t$        $ r}t'        dt)        |              |d }~ww xY w)	Nz'in init s3 logger - s3_callback_params )llm_provider)r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   	s3_configr   r(   zs3 logger using endpoint url zs3 flush interval: z, s3 batch size: )
flush_lockflush_interval
batch_sizez Got exception on init s3 client )r   debuglitellms3_callback_paramsr   r   LoggingCallbackasync_httpx_client_init_s3_paramsasynciocreate_taskperiodic_flushLockr,   r   __init__	log_queuer   	Exceptionr   str)selfr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r+   r(   kwargses                         V/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/integrations/s3_v2.pyr9   zS3Logger.__init__   sF   .4	  9':T:T9UV '=1AA'D#   ---%# /%9)A%9$7$7!1*C$7##5# ! &   #@@Q!RS 3 3 56%llnDO  %&7%88I-Y &&??0(	 ;=DN % 	<SVHEFG	s   DD 	D?!D::D?c                    t         j                  xs i t         _        t         j                  j                         D ]N  \  }}t        |t              s|j                  d      s)t        j                  |      t         j                  |<   P t         j                  j                  d      xs || _        t         j                  j                  d      xs || _	        t         j                  j                  d      xs || _
        t         j                  j                  dd      xs || _        t         j                  j                  d      xs || _        t         j                  j                  d      xs || _        t         j                  j                  d	      xs || _        t         j                  j                  d
      xs || _        t         j                  j                  d      xs |	| _        t         j                  j                  d      xs |
| _        t         j                  j                  d      xs || _        t         j                  j                  d      xs || _        t         j                  j                  d      xs || _        t         j                  j                  d      xs || _        t         j                  j                  d      xs || _        t         j                  j                  d      xs || _        t1        t         j                  j                  dd            xs || _        y)zD
        Initialize the s3 params for this logging callback
        zos.environ/r   r   r   r   Tr   r   r   r   r    r!   r"   r#   r$   r%   r+   r   r(   FN)r0   r1   items
isinstancer<   
startswith
get_secretgetr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r+   r   boolr(   )r=   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r+   r   r(   keyvalues                       r@   r4   zS3Logger._init_s3_paramsl   s   . &-%?%?%E2"!44::<JC%%%*:*:=*I292D2DU2K**3/ =
 &&**+;<N 	 &&**+;<N 	 &&**+;<N 	 &&**<>L* 	 !3377DQ	&&**+<=P 	 &&**+AB $# 	! &&**+EF (' 	% &&**+AB $# 	! &&**+@AXEX 	 
 &&**+@AXEX 	 
 &&**+=>RBR 	
 &&**+FG )( 	& &&**+@AXEX 	  !3377DQ	1155i@KG ++//0DeLM "! 	
 	    c                 J   K   | j                  ||||       d {    y 7 wN)r>   response_obj
start_timeend_time_async_log_event_baser=   r>   rM   rN   rO   s        r@   async_log_success_eventz S3Logger.async_log_success_event   s/     ((%!	 ) 
 	
 	
   #!#c                 J   K   | j                  ||||       d {    y 7 wrL   rP   rR   s        r@   async_log_failure_eventz S3Logger.async_log_failure_event   s9     ((%!	 ) 
 	
 	
 		
rT   c                   K   	 t        j                  d|        | j                  ||j                  dd             }|t	        d      t        j                  d|       | j
                  j                  |       t        j                  dt        | j
                        | j                         y # t        $ r+}t        j                  dt        |              Y d }~y d }~ww xY ww)Nz/s3 Logging - Enters logging function for model standard_logging_object)rN   standard_logging_payloadz s3_batch_logging_element is Nonez!
s3 Logger - Logging payload = %sz*s3 logging: queue length %s, batch size %szs3 Layer Error - )r   r/   create_s3_batch_logging_elementrF   
ValueErrorr:   appendlenr.   r;   	exceptionr<   )r=   r>   rM   rN   rO   s3_batch_logging_elementr?   s          r@   rQ   zS3Logger._async_log_event_base   s     	  A&J (,'K'K%)/4Mt)T (L ($
 (/ !CDD  46N NN!!":;  <DNN#
  	$$'8Q%AB	s/   C)B-B2 1C)2	C&;!C!C)!C&&C)batch_logging_elementc                 8  K   	 dd l }dd l}ddlm} ddlm} 	 ddlm}  || j                        } || j                  | j                  | j                  | j                  | j                  | j                  | j                   | j"                  | j$                  	       d {   }t'        j(                  d|j*                          d| j,                   d	| j                   d
|j*                   }	| j.                  r| j.                  dz   |j*                  z   }	t1        |j2                        }
|j5                  |
j7                  d            j9                         }d|dd|j:                   ddd}|j=                  d|	|
|      }|j?                         } ||j@                  |jB                  |jD                  |jF                        } ||d| j                        jI                  |       tK        |jF                  jM                               }| jN                  jQ                  |	|
|       d {   }|jS                          y # t        $ r t        d      w xY w7 7 0# tT        $ r+}t'        jV                  dtY        |              Y d }~y d }~ww xY ww)Nr   	SigV4Auth
AWSRequest7Missing boto3 to call bedrock. Run 'pip install boto3'.)asyncify)	aws_access_key_idaws_secret_access_keyaws_session_tokenaws_region_nameaws_session_nameaws_profile_nameaws_role_nameaws_web_identity_tokenaws_sts_endpoint&s3_v2 logger - uploading data to s3 - https://.s3..amazonaws.com//utf-8application/jsoneninline; filename=""0private, immutable, max-age=31536000, s-maxage=0zContent-Typezx-amz-content-sha256zContent-LanguagezContent-DispositionzCache-ControlPUTdataheadersmethodurlr   r   s3Error uploading to s3: )-hashlibrequestsbotocore.authrc   botocore.awsrequestre   ImportError#litellm.litellm_core_utils.asyncifyrg   get_credentialsr   r   r    r   r!   r"   r#   r$   r%   r   r/   s3_object_keyr   r   r   payloadsha256encode	hexdigests3_object_download_filenameRequestpreparer   r   bodyr   add_authdictrB   r3   putraise_for_statusr;   r^   r<   )r=   r`   r   r   rc   re   rg   asyncified_get_credentialscredentialsr   json_stringcontent_hashr   reqpreppedaws_requestsigned_headersresponser?   s                      r@   async_upload_data_to_s3z S3Logger.async_upload_data_to_s3   s    	Y/6=	ID)1$2F2F)G& :"&";";&*&C&C"&";"; $ 3 3!%!9!9!%!9!9"33'+'E'E!%!9!9
! 
K   89N9\9\8]^
 T001d6I6I5J/ZoZ}Z}Y~C##**S03H3V3VV %%:%B%BCK #>>+*<*<W*EFPPRL !3(4$();<Q<m<m;nno'p!SG ""5#K"QCkkmG %~~KK\\	K k4)<)<=FF{S "+"5"5";";"=>N "4488+~ 9  H %%'{  	YWXX	Y
h  	I$$'>s1vh%GHH	Ise   JI BI# I FI# 0I!1I# JIJI# !I# #	J,!JJJJc                    K   t        j                  dt        | j                                | j                  sy| j                  D ]&  }t	        j
                  | j                  |             ( yw)z

        Sends runs from self.log_queue

        Returns: None

        Raises: Does not raise an exception, will only verbose_logger.exception()
        z s3_v2 logger - sending batch of N)r   r/   r]   r:   r5   r6   r   )r=   r   s     r@   async_send_batchzS3Logger.async_send_batch@  s[      	?DNN@S?TUV~~ ~~G < <W EF &s   A/A1rN   rY   returnc                    |y|d   j                  d      }d}t        j                  r| j                  r|| d}t        j                  j                  ||      xs d}t        t        t        t           | j                        xs d|||      }d|j                  d      z   d	z   |d
   z   dz   }d|j                  d       d	|d
    d}t        t        |      ||      S )a  
        Helper function to create an s3BatchLoggingElement.

        Args:
            start_time (datetime): The start time of the logging event.
            standard_logging_payload (Optional[StandardLoggingPayload]): The payload to be logged.
            s3_path (Optional[str]): The S3 path prefix.

        Returns:
            Optional[s3BatchLoggingElement]: The created s3BatchLoggingElement, or None if payload is None.
        Nmetadatauser_api_key_team_alias ru   )r   team_alias_prefixrN   s3_file_nameztime-z%Y-%m-%dT%H-%M-%S-%f_idz.json)r   r   r   )rF   r0   enable_preview_featuresr(   utilsget_logging_idr   r   r   r<   r   strftimer   r   )r=   rN   rY   
team_aliasr   r   r   r   s           r@   rZ   z(S3Logger.create_s3_batch_logging_elementU  s,     $+-j9==>WX
++''&#-,a 0 MM((5MNTRT 	 *#5;/!%	
 !!"89: 't,- 	 	$ ).j.A.ABX.Y-ZZ[\tuy\z[{  |A  'B#$12'(C
 	
rJ   c                    	 dd l }dd l}ddlm} ddlm} ddlm} 	 t        j                  d|j                          | j                  | j                  | j                  | j                  | j                         }d| j"                   d	| j                    d
|j                   }| j$                  r| j$                  dz   |j                  z   }t'        |j(                        }	|j+                  |	j-                  d            j/                         }
d|
dd|j0                   ddd}|j3                  d||	|      }|j5                         } ||j6                  |j8                  |j:                  |j<                        } ||d| j                         j?                  |       tA        |j<                  jC                               }tE               }|jG                  ||	|      }|jI                          y # t        $ r t        d      w xY w# tJ        $ r+}t        jL                  dtO        |              Y d }~y d }~ww xY w)Nr   rb   rd   )Credentialsrf   rq   )rh   ri   rj   rk   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   )(r   r   r   rc   r   re   botocore.credentialsr   r   r   r/   r   r   r   r   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rB   r   r   r   r;   r^   r<   )r=   r`   r   r   rc   re   r   r   r   r   r   r   r   r   r   r   httpx_clientr   r?   s                      r@   upload_data_to_s3zS3Logger.upload_data_to_s3  s2   	Y/683	I  89N9\9\8]^ (,';';"&";";&*&C&C"&";"; $ 3 3	 (< (K T001d6I6I5J/ZoZ}Z}Y~C##**S03H3V3VV %%:%B%BCK #>>+*<*<W*EFPPRL !3(4$();<Q<m<m;nno'p!SG ""5#K"QCkkmG %~~KK\\	K k4)<)<=FF{S "+"5"5";";"=>N,.L#''+~'VH%%'g  	YWXX	Yh  	I$$'>s1vh%GHH	Is#   G4 GH 4H		I !H;;I )NNNTNNNNNNNNNNNNF)__name__
__module____qualname__r
   r	   r   r<   rG   intr9   r4   rS   rV   rQ   r   r   r   r   r   rZ   r    rJ   r@   r   r      s    )-!%(,(,$()-.226.2-1-1*.37-1+L'<#()K K #K !	K
 !K K D>K "#K 'smK #+3-K 'smK &c]K &c]K #3-K $,C=K  &c]!K" $C=#K$  }%K( !)K^ )-(,(,$()-.226.2-1-1*.37-1!%#(%Y Y !Y !	Y
 Y D>Y "#Y 'smY #+3-Y 'smY &c]Y &c]Y #3-Y $,C=Y &c]Y" ##Y$ !%Yv
:HI%:HITG*5
5
 #++A"B5
 
'	(	5
n=I7L =IrJ   r   )__doc__r5   r   typingr   r   r   r0   litellm._loggingr   r   litellm.constantsr	   r
   litellm.integrations.s3r   *litellm.litellm_core_utils.safe_json_dumpsr   !litellm.llms.bedrock.base_aws_llmr   &litellm.llms.custom_httpx.http_handlerr   r   r    litellm.types.integrations.s3_v2r   litellm.types.utilsr   custom_batch_loggerr   r   r   rJ   r@   <module>r      sS      ' '  : V 5 A 8 
 C 6 2kI * kIrJ   