
    AHjp                         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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)StandardAuditLogPayloadStandardLoggingPayload   )CustomBatchLoggerc            +       T   e Zd Zdddddddddddddddeeddd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ded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dededef&dZ
d Zd Zdeddf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d(edee   fd)Zd*ede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_prefixs3_strip_base64_filess3_use_key_prefixs3_use_virtual_hosted_stylec                    	 t        j                  dt        j                          | j	                  ||||||||	|
|||||||||||       t        j                  d|        t        j                  d| j
                          t        t        j                  d| j
                  i      | _	        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 )r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   	s3_configr   r)   r*   r+   r,   zs3 logger using endpoint url z8s3_v2 logger creating async httpx client with s3_verify=
ssl_verify)llm_providerparamszs3 flush interval: z, s3 batch size: )
flush_lockflush_interval
batch_sizez Got exception on init s3 client )r   debuglitellms3_callback_params_init_s3_paramsr   r   r   LoggingCallbackasync_httpx_clientasynciocreate_taskperiodic_flushLockr2   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)   r*   r+   r,   kwargses                            R/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/integrations/s3_v2.pyr?   zS3Logger.__init__   s|   4<	  9':T:T9UV
   ---%# /%9)A%9$7$7!1*C$7##5&;"3,G) ! ,   #@@Q!RS   J4>>JZ[ '=1AA$dnn5'D#
  3 3 56%llnDO  %&7%88I-Y &&??0(	 ;=DN % 	<SVHEFG	s   EE
 
	E1E,,E1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       t         j                  j                  dd      n|| _        t         j                  j                  d      t         j                  j                  d      n|| _        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 || _        t1        t         j                  j                  dd            xs || _        t1        t         j                  j                  d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   NTr   r   r   r    r!   r"   r#   r$   r%   r&   r.   r   r)   Fr+   r*   r,   )r6   r7   items
isinstancerB   
startswith
get_secretgetr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r.   r   boolr)   r+   r*   r,   )rC   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r.   r   r)   r*   r+   r,   keyvalues                          rF   r8   zS3Logger._init_s3_paramsw   s   4 &-%?%?%E2"!44::< 	LJC%%%*:*:=*I292D2DU2K**3/	L
 &&**+;<N 	 &&**+;<N 	 &&**+;<N 	
 ))--l;G &&**<> 	 ))--k:F &&**;7 	 &&**+<=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 "! 	 ++//0CUKL !  	 ++//0GOP %$ 	" ++//0MuUV +* 	(
 	    c                 J   K   | j                  ||||       d {    y 7 wN)rD   response_obj
start_timeend_time_async_log_event_baserC   rD   rS   rT   rU   s        rF   async_log_success_eventz S3Logger.async_log_success_event   s/     ((%!	 ) 
 	
 	
   #!#c                 J   K   | j                  ||||       d {    y 7 wrR   rV   rX   s        rF   async_log_failure_eventz S3Logger.async_log_failure_event   s9     ((%!	 ) 
 	
 	
 		
rZ   	audit_logreturnc                   K   	 ddl m} t        j                  |j                        }|j	                  dd      }t        t        t           | j                        xs d}|r|j                  d      dz   nd}| d|j                  d       d|j                  d	       d
| d}t        t        |      |d| d      }| j                  j                  |       t        | j                        | j                   k\  r| j#                          d{    yy7 # t$        $ r }t'        j(                  d|       Y d}~yd}~ww xY ww)z;Batch audit logs and upload to S3 under audit_logs/ prefix.r   )timezoneidunknown /zaudit_logs/z%Y-%m-%dz%H-%M-%S_.jsonzaudit-payloads3_object_keys3_object_download_filenameNzS3 audit log error: %s)r   r`   nowutcrL   r   r   rB   r   rstripstrftimer   dictr@   appendlenr4   flush_queuerA   r   	exception)	rC   r]   r`   rk   audit_log_idr   ri   elementrE   s	            rF   async_log_audit_log_eventz"S3Logger.async_log_audit_log_event   s'    	B),,x||,C$==y9L8C=$,,7=2G3:gnnS)C/G );<<
+,A<<
+,Al^5B  ,Y+.4\N%,HG NN!!'*4>>"doo5&&((( 6( 	B$$%=qAA	BsA   EDD DD ED 	E!D<7E<EEc                 2  K   	 t        j                  d|        | j                  ||j                  dd             }|'t        j                  d|j                  dd             y t        j                  d|       | j                  j                  |       t        j                  dt        | j                        | j                         y # t        $ r=}t        j                  d	t        |              | j                  d
       Y d }~y d }~ww xY ww)Nz/s3 Logging - Enters logging function for model standard_logging_object)rT   standard_logging_payloadzHs3 Logging - skipping event, no standard_logging_object for call_type=%s	call_typerb   z!
s3 Logger - Logging payload = %sz*s3 logging: queue length %s, batch size %szs3 Layer Error - r   callback_name)r   r5   create_s3_batch_logging_elementrL   r@   rp   rq   r4   rA   rs   rB   handle_callback_failure)rC   rD   rS   rT   rU   s3_batch_logging_elementrE   s          rF   rW   zS3Logger._async_log_event_base  s	    	C  A&J (,'K'K%)/4Mt)T (L ($ (/$$^JJ{I6   46N NN!!":;  <DNN#
  	C$$'8Q%AB((z(BB	Cs<   DA#C 'D(A%C D	D3D
DDDbatch_logging_elementc                   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*                          t'        j(                  d| j,                          d	| j.                   d
| j                   d|j*                   }	| j0                  r| j.                  r| j2                  rl| j0                  j5                  d	d      j5                  dd      }
| j0                  j7                  d	      rd	nd}| | j.                   d|
 d|j*                   }	n,| j0                  dz   | j.                  z   dz   |j*                  z   }	t9        |j:                        }|j=                  |j?                  d            jA                         }d|dd|jB                   ddd}|jE                  d|	||      }|jG                         } ||jH                  |jJ                  |jL                  |jN                        }| jQ                  | j                        } ||d|      jS                  |       tU        |jN                  jW                               }| jX                  j[                  |	||       d {   }|j]                          y # t        $ r t        d      w xY w7 7 0# t^        $ r=}t'        j`                  dtc        |              | je                  d       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 - z"s3_v2 logger - s3_verify setting: https://.s3..amazonaws.com/rc   http://.rd   utf-8application/jsoneninline; filename=""0private, immutable, max-age=31536000, s-maxage=0zContent-Typex-amz-content-sha256zContent-LanguagezContent-DispositionzCache-ControlPUTdataheadersmethodurlr   r   r   s3Error uploading to s3: r   r{   )3hashlibrequestsbotocore.authr   botocore.awsrequestr   ImportError#litellm.litellm_core_utils.asyncifyr   get_credentialsr   r    r!   r   r"   r#   r$   r%   r&   r   r5   ri   r   r   r   r,   replacerJ   r   rh   sha256encode	hexdigestrj   Requestpreparer   r   bodyr   )get_aws_region_name_for_non_llm_api_callsadd_authro   rH   r:   putraise_for_statusrA   rs   rB   r~   )rC   r   r   r   r   r   r   asyncified_get_credentialscredentialsr   endpoint_hostprotocoljson_stringcontent_hashr   reqpreppedaws_requestr   signed_headersresponserE   s                         rF   async_upload_data_to_s3z S3Logger.async_upload_data_to_s3=  s|    	Y/6U	CD)1$2F2F)G& :"&";";&*&C&C"&";"; $ 3 3!%!9!9!%!9!9"33'+'E'E!%!9!9
! 
K   89N9\9\8]^   #EdnnEU!VW T001d6I6I5J/ZoZ}Z}Y~C##(;(;33$($8$8$@$@"B%gi, "
  //:::F #& 
 &Jt':':&;1]O1MbMpMpLqrC ,,--.  0==	>  %%:%B%BCK #>>+*<*<W*EFPPRL !3(4$();<Q<m<m;nno'p!SG ""5#K"QCkkmG %~~KK\\	K #LL $ 3 3 M O k49BB;O "+"5"5";";"=>N "4488+~ 9  H %%'i  	YWXX	Y
V  	C$$'>s1vh%GH((z(BB	Cse   M4L BL+ L& IL+ 8L)9L+ M4L##M4&L+ )L+ +	M143M,'M4,M11M4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   r5   rq   r@   r;   r<   r   )rC   rh   s     rF   async_send_batchzS3Logger.async_send_batch  sb      	?DNN@S?TUV~~ ~~ 	GG < <W EF	Gs   A/A1rT   ry   c                    |y| j                   r| j                  |      }g }| j                  r5|j                  di       j                  dd      }|r|j	                  |       | j
                  r5|j                  di       j                  dd      }|r|j	                  |       dj                  |      }|r|dz  }t        j                  j                  ||      xs d}t        j                  d| d| d	|        t        t        t        t           | j                         xs d|||
      }t        j                  d|        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user_api_key_aliasrd   rc   z(Creating s3 file with prefix_components=z,prefix_path=z and )r   prefixrT   s3_file_namezs3_object_key=ztime-z%Y-%m-%dT%H-%M-%S-%fre   ra   rf   rg   )r*    _strip_base64_from_messages_syncr)   rL   rp   r+   joinr6   utilsget_logging_idr   r5   r   r   r   rB   r   rn   r   ro   )
rC   rT   ry   prefix_components
team_aliasr   prefix_pathr   ri   rj   s
             rF   r}   z(S3Logger.create_s3_batch_logging_element  s     $+%%'+'L'L(($
 ""155j"EII)4J !((4!!!9!=!=j"!M!Q!Q$d" "!(();< hh013K MM((5MNTRT 	 	67H6IWbVcchiuhvw	
 *#5;!%	
 	~m_=>(-j.A.ABX.Y-ZZ[\tuy\z[{  |A  'B#$12'(C
 	
rP   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"                  r| j&                  rl| j$                  j)                  dd      j)                  dd      }	| j$                  j+                  d      rdnd}
|
 | j"                   d|	 d|j                   }n,| j$                  dz   | j"                  z   dz   |j                  z   }t-        |j.                        }|j1                  |j3                  d            j5                         }d|dd|j6                   ddd}|j9                  d|||      }|j;                         } ||j<                  |j>                  |j@                  |jB                        }| jE                  | j                         } ||d|      jG                  |       tI        |jB                  jK                               }tM        | jN                  d| jN                  ind       }|jQ                  |||      }|jS                          y # t        $ r t        d      w xY w# tT        $ r=}t        jV                  dtY        |              | j[                  d       Y d }~y d }~ww xY w) Nr   r   r   )Credentialsr   r   )r   r   r   r   r   r   r   rc   r   r   rd   r   r   r   r   r   r   r   r   r   r   r   r   r/   )r1   r   r   r{   ).r   r   r   r   r   r   botocore.credentialsr   r   r   r5   ri   r   r   r    r!   r   r   r   r,   r   rJ   r   rh   r   r   r   rj   r   r   r   r   r   r   r   r   ro   rH   r   r   r   r   rA   rs   rB   r~   )rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   httpx_clientr   rE   s                         rF   upload_data_to_s3zS3Logger.upload_data_to_s3  s+   	Y/68N	C  89N9\9\8]^ (,';';"&";";&*&C&C"&";"; $ 3 3	 (< (K T001d6I6I5J/ZoZ}Z}Y~C##(;(;33$($8$8$@$@"B%gi, "
  //:::F #& 
 &Jt':':&;1]O1MbMpMpLqrC ,,--.  0==	>  %%:%B%BCK #>>+*<*<W*EFPPRL !3(4$();<Q<m<m;nno'p!SG ""5#K"QCkkmG %~~KK\\	K #LL $ 3 3 M O k49BB;O "+"5"5";";"=>N,>>- %dnn5L $''+~'VH%%'[  	YWXX	Y\  	C$$'>s1vh%GH((z(BB	Cs#   J6 JK 6K	L3LLri   c                   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|        d	| j*                   d
| j                   d| }	| j,                  r| j*                  r| j.                  rb| j,                  j1                  d	d      j1                  dd      }
| j,                  j3                  d	      rd	nd}| | j*                   d|
 d| }	n"| j,                  dz   | j*                  z   dz   |z   }	|j5                  d      j7                         }d|i}|j9                  d|	|      }|j;                         } ||j<                  |j>                  |j@                        } ||d| j                        jC                  |       tE        |j@                  jG                               }| jH                  jK                  |	|       d{   }|jL                  dk7  r!t'        jN                  d|jP                         y|jS                         S # t        $ r t        d      w xY w7 7 _# tT        $ r+}t'        jN                  dtW        |              Y d}~yd}~ww xY ww)z
        Download and parse JSON object from S3.

        Args:
            s3_object_key: The S3 object key to download

        Returns:
            Optional[dict]: The parsed JSON object or None if not found/error
        r   Nr   r   z2Missing boto3 to call S3. Run 'pip install boto3'.r   r   z*s3_v2 logger - downloading data from s3 - r   r   r   rc   r   r   rd   rP   r   GET)r   )r   r   r   r      z"S3 object not found, saw response=zError downloading from S3: ),r   r   r   r   r   r   r   r   r   r   r   r    r!   r   r"   r#   r$   r%   r&   r   r5   r   r   r,   r   rJ   r   r   r   r   r   r   r   r   ro   rH   r:   rL   status_coders   textjsonrA   rB   )rC   ri   r   r   r   r   r   r   r   r   r   r   empty_string_hashr   r   r   r   r   r   rE   s                       rF   _download_object_from_s3z!S3Logger._download_object_from_s3P  s    	T/6P	D *2$2F2F)G& :"&";";&*&C&C"&";"; $ 3 3!%!9!9!%!9!9"33'+'E'E!%!9!9
! 
K   <]OL
 T001d6I6I5J/ZgYhiC##(;(;33$($8$8$@$@"B%gi, "
  //:::F #& 
 &Jt':':&;1]O1]O\C ,,--.  (	(  !(s 3 = = ?&(9G ""5#w"?CkkmG %~~KKK
 k4)<)<=FF{S "+"5"5";";"=>N "4488n8UUH##s*((8(--  ==?"_  	TRSS	T
| V  	$$'B3q6(%KL	sq   K2J BJ; J6 F9J; J93J; K2J; K2J33K26J; 9J; ;	K/!K*%K2*K//K2
object_keyc           	         K   	 | j                  |       d{   }|S 7 # t        $ r.}t        j                  d| dt	        |              Y d}~yd}~ww xY ww)a  
        Get the proxy server request from cold storage

        Allows fetching a dict of the proxy server request from s3 or GCS bucket.

        Args:
            request_id: The unique request ID to search for
            start_time: The start time of the request (datetime or ISO string)

        Returns:
            Optional[dict]: The request data dictionary or None if not found
        NzError retrieving object z from cold storage: )r   rA   r   rs   rB   )rC   r   downloaded_objectrE   s       rF   :get_proxy_server_request_from_cold_storage_with_object_keyzCS3Logger.get_proxy_server_request_from_cold_storage_with_object_key  sb      	&*&C&CJ&O O$$ !P 	$$*:,6J3q6(S 		s6   A! ! A! 	A$AAAA)NNNTNNNNNNNNNNNNFFFF)__name__
__module____qualname__r
   r	   r   rB   rM   intr?   r8   rY   r\   r   rv   rW   r   r   r   r   r   r}   r   ro   r   r    rP   rF   r   r      sz    )-!%(,(,$()-.226.2-1-1*.37-1+L'<#(&+"',1/V V #V !	V
 !V V D>V "#V 'smV #+3-V 'smV &c]V &c]V #3-V $,C=V  &c]!V" $C=#V$  }%V( !)V*  $+V,  -V. &*/Vt )-(,(,$()-.226.2-1-1*.37-1!%#(&+"',1+q q !q !	q
 q D>q "#q 'smq #+3-q 'smq &c]q &c]q #3-q $,C=q &c]q" ##q$ !%q&  $'q(  )q* &*+qf
B0B	B@ CD`C%:`CDG*@
@
 #++A"B@
 
'	(	@
DXC7L XCtcC cHTN cJ 
$rP   r   ) __doc__r;   r   typingr   r   r   r6   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   r   custom_batch_loggerr   r   r   rP   rF   <module>r      sQ      ' '  : V 5 A 8 
 C O 2o
 * o
rP   