
    j`                         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            )       8   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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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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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_prefixc                    	 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*   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Lockr0   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*   kwargses                           s/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/integrations/s3_v2.pyr=   zS3Logger.__init__   sy   2;	  9':T:T9UV
   ---%# /%9)A%9$7$7!1*C$7##5&;"3' ! *   #@@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	 		E0E++E0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 || _        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)   )r4   r5   items
isinstancer@   
startswith
get_secretgetr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r,   r   boolr(   r*   r)   )rA   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r,   r   r(   r)   r*   keyvalues                         rD   r6   zS3Logger._init_s3_paramsu   sl   2 &-%?%?%E2"!44::<JC%%%*:*:=*I292D2DU2K**3/ =
 &&**+;<N 	 &&**+;<N 	 &&**+;<N 	 CJB\B\B`B`amBnBzG&&**<>  AK 	 <C;U;U;Y;YZe;f;rG&&**;7  yB 	 &&**+<=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 "! 	 W//334GOP %$ 	 ++//0GOP %$ 	"
 	    c                 J   K   | j                  ||||       d {    y 7 wN)rB   response_obj
start_timeend_time_async_log_event_baserA   rB   rQ   rR   rS   s        rD   async_log_success_eventz S3Logger.async_log_success_event   s/     ((%!	 ) 
 	
 	
   #!#c                 J   K   | j                  ||||       d {    y 7 wrP   rT   rV   s        rD   async_log_failure_eventz S3Logger.async_log_failure_event   s9     ((%!	 ) 
 	
 	
 		
rX   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        |              | j                  d	       Y d }~y d }~ww xY ww)
Nz/s3 Logging - Enters logging function for model standard_logging_object)rR   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   callback_name)r   r3   create_s3_batch_logging_elementrJ   
ValueErrorr>   appendlenr2   r?   	exceptionr@   handle_callback_failure)rA   rB   rQ   rR   rS   s3_batch_logging_elementrC   s          rD   rU   zS3Logger._async_log_event_base   s     	C  A&J (,'K'K%)/4Mt)T (L ($
 (/ !CDD  46N NN!!":;  <DNN#
  	C$$'8Q%AB((z(BB	Cs/   C;B-B2 1C;2	C8;3C3.C;3C88C;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                  r8| j.                  r,| j0                  dz   | j.                  z   dz   |j*                  z   }	t3        |j4                        }
|j7                  |
j9                  d            j;                         }d|dd|j<                   ddd}|j?                  d|	|
|      }|jA                         } ||jB                  |jD                  |jF                  |jH                        }| jK                  | j                        } ||d|      jM                  |       tO        |jH                  jQ                               }| jR                  jU                  |	|
|       d {   }|jW                          y # t        $ r t        d      w xY w7 7 0# tX        $ r=}t'        jZ                  dt]        |              | j_                  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//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   rt   s3Error uploading to s3: r   r^   )0hashlibrequestsbotocore.authrj   botocore.awsrequestrl   ImportError#litellm.litellm_core_utils.asyncifyro   get_credentialsr   r   r    r   r!   r"   r#   r$   r%   r   r3   s3_object_keyr   r   r   r   payloadsha256encode	hexdigests3_object_download_filenameRequestpreparer   r   bodyr   )get_aws_region_name_for_non_llm_api_callsadd_authdictrF   r8   putraise_for_statusr?   rd   r@   re   )rA   rg   r   r   rj   rl   ro   asyncified_get_credentialscredentialsr   json_stringcontent_hashr   reqpreppedaws_requestrt   signed_headersresponserC   s                       rD   async_upload_data_to_s3z S3Logger.async_upload_data_to_s3  s    	Y/6J	CD)1$2F2F)G& :"&";";&*&C&C"&";"; $ 3 3!%!9!9!%!9!9"33'+'E'E!%!9!9
! 
K   89N9\9\8]^   4T^^4DE
 T001d6I6I5J/ZoZ}Z}Y~C##(;(;(())*  ,99	:  %%:%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 %%'S  	YWXX	Y
@  	C$$'>s1vh%GH((z(BB	Cse   K<J BJ3 J. G J3  J1J3 K<J++K<.J3 1J3 3	K9<3K4/K<4K99K<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   r3   rc   r>   r9   r:   r   )rA   r   s     rD   async_send_batchzS3Logger.async_send_batchb  s[      	?DNN@S?TUV~~ ~~G < <W EF &s   A/A1rR   r]   returnc                    |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_aliasr~    z(Creating s3 file with prefix_components=z,prefix_path=z and )r   prefixrR   s3_file_namezs3_object_key=ztime-z%Y-%m-%dT%H-%M-%S-%f_idz.json)r   r   r   )r)    _strip_base64_from_messages_syncr(   rJ   rb   r*   joinr4   utilsget_logging_idr   r3   r   r   r   r@   r   strftimer   r   )
rA   rR   r]   prefix_components
team_aliasr   prefix_pathr   r   r   s
             rD   r`   z(S3Logger.create_s3_batch_logging_elementw  s     $+%%'+'L'LMe'f$ ""155j"EIIJceijJ!((4!!!9!=!=j"!M!Q!QRfhl!m!!(();< hh013K MM((5MNTRT 	 	GHYGZZghsgtty  {G  zH  I  	J)#5;!%	
 	~m_=>(-j.A.ABX.Y-ZZ[\tuy\z[{  |A  'B#$12'(C
 	
rN   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$                  r8| j"                  r,| j$                  dz   | j"                  z   dz   |j                  z   }t'        |j(                        }	|j+                  |	j-                  d            j/                         }
d|
dd|j0                   ddd}|j3                  d||	|      }|j5                         } ||j6                  |j8                  |j:                  |j<                        }| j?                  | j                         } ||d|      jA                  |       tC        |j<                  jE                               }tG        | jH                  d| jH                  ind       }|jK                  ||	|      }|jM                          y # t        $ r t        d      w xY w# tN        $ r=}t        jP                  dtS        |              | jU                  d       Y d }~y d }~ww xY w)Nr   ri   rk   )Credentialsrm   rz   )rq   rr   rs   rt   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r-   )r/   r   r   r^   )+r   r   r   rj   r   rl   botocore.credentialsr   r   r   r3   r   r   r   r   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rF   r   r   r   r   r?   rd   r@   re   )rA   rg   r   r   rj   rl   r   r   r   r   r   r   r   r   r   rt   r   httpx_clientr   rC   s                       rD   upload_data_to_s3zS3Logger.upload_data_to_s3  s   	Y/68?	C  89N9\9\8]^ (,';';"&";";&*&C&C"&";"; $ 3 3	 (< (K T001d6I6I5J/ZoZ}Z}Y~C##(;(;(())*  ,99	:  %%:%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,9=9Sdnn5Y]L $''+~'VH%%'}  	YWXX	Y~  	C$$'>s1vh%GH((z(BB	Cs#   H> H I >I	J3JJr   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,                  dz   | j*                  z   dz   |z   }	|j/                  d      j1                         }
d|
i}|j3                  d|	|      }|j5                         } ||j6                  |j8                  |j:                        } ||d| j                        j=                  |       t?        |j:                  jA                               }| jB                  jE                  |	|       d{   }|jF                  dk7  r!t'        jH                  d|jJ                         y|jM                         S # t        $ r t        d      w xY w7 7 _# tN        $ r+}t'        jH                  dtQ        |              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   Nri   rk   z2Missing boto3 to call S3. Run 'pip install boto3'.rn   rp   z*s3_v2 logger - downloading data from s3 - r{   r|   r}   r~   rN   r   GET)r   )r   r   r   r      z"S3 object not found, saw response=zError downloading from S3: ))r   r   r   rj   r   rl   r   r   ro   r   r   r   r    r   r!   r"   r#   r$   r%   r   r3   r   r   r   r   r   r   r   r   r   r   r   rF   r8   rJ   status_coderd   textjsonr?   r@   )rA   r   r   r   rj   rl   ro   r   r   r   empty_string_hashr   r   r   r   r   r   rC   s                     rD   _download_object_from_s3z!S3Logger._download_object_from_s3  sz    	T/6C	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##(;(;(())*  $	$  !(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(--  ==?"E  	TRSS	T
b V  	$$'B3q6(%KL	sq   JH0 BI I EI +I,3I J I /J0IJI I 	J!I<7J<JJ
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   r?   r   rd   r@   )rA   r   downloaded_objectrC   s       rD   :get_proxy_server_request_from_cold_storage_with_object_keyzCS3Logger.get_proxy_server_request_from_cold_storage_with_object_keyU  sb      	&*&C&CJ&O O$$ !P 	$$*:,6J3q6(S 		s6   A! ! A! 	A$AAAA)NNNTNNNNNNNNNNNNFFF)__name__
__module____qualname__r
   r	   r   r@   rK   intr=   r6   rW   rZ   rU   r   r   r   r   r   r`   r   r   r   r    rN   rD   r   r      s@    )-!%(,(,$()-.226.2-1-1*.37-1+L'<#(&+"'-T T #T !	T
 !T T D>T "#T 'smT #+3-T 'smT &c]T &c]T #3-T $,C=T  &c]!T" $C=#T$  }%T( !)T*  $+T,  -Tp )-(,(,$()-.226.2-1-1*.37-1!%#(&+"')g g !g !	g
 g D>g "#g 'smg #+3-g 'smg &c]g &c]g #3-g $,C=g &c]g" ##g$ !%g&  $'g(  )gR
C8UC%:UCnG*9
9
 #++A"B9
 
'	(	9
vIC7L ICVVC VHTN Vp 
$rN   r   )__doc__r9   r   typingr   r   r   r4   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   rN   rD   <module>r      sQ      ' '  : V 5 A 8 
 C 6 2O	 * O	rN   