Ë
    tPêj†o  ã                   ó  — d Z ddlZddlZddlmZ ddlmZ ddlmZmZ ddl	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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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)ÚMapping)Údatetime)ÚFinalÚcast)Úquote)Úprint_verboseÚverbose_logger)ÚDEFAULT_S3_BATCH_SIZEÚ!DEFAULT_S3_FLUSH_INTERVAL_SECONDS)Úget_s3_object_keyÚresolve_sse_params)Úget_aws_dns_suffix)Ú
safe_dumps)ÚSensitiveDataMasker)Ú
BaseAWSLLM)Ú_get_httpx_clientÚget_async_httpx_clientÚhttpxSpecialProvider)Ús3BatchLoggingElement)ÚStandardAuditLogPayloadÚStandardLoggingPayloadé   )ÚCustomBatchLoggerc            2       óÂ  — 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dddfdedz  dedz  dedz  dedz  ded	edz  d
edz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedededededz  dedz  dedz  f0d„Z		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d2dedz  dedz  dedz  ded	edz  d
edz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedz  dedededededz  dedz  dedz  f,d„Z
ded efd!„Zd eeef   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dz  d edz  fd-„Zd(efd.„Zded edz  fd/„Zd0ed edz  fd1„Zy)3Ú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_styleÚs3_server_side_encryptionÚs3_sse_kms_key_idÚs3_callback_params_overridec                 óv  — 	 t        «       }|�/t        j                  d|j                  t	        |«      «      «       n@t        j                  d|j                  t	        t
        j                  xs i «      «      «       | j                  |||||||||	|
|||||||||||||¬«       t        j                  d|«       t        j                  d| j                  «       t        t        j                  d| j                  i¬«      | _        t        j                  | j                  «       «       t        j                   «       | _        t        j                  d||«       t%        j&                  | | j"                  ||¬	«       g | _        t+        j&                  | «       y # t,        $ r}t/        d
|› �«       |‚d }~ww xY w)Nz'in init s3 logger (audit override) - %sz)in init s3 logger - s3_callback_params %s)Úparams_sourcer   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   Ú	s3_configr   r-   r.   r/   r0   r1   r2   zs3 logger using endpoint url %sz:s3_v2 logger creating async httpx client with s3_verify=%sÚ
ssl_verify)Úllm_providerÚparamsz(s3 flush interval: %s, s3 batch size: %s)Ú
flush_lockÚflush_intervalÚ
batch_sizez Got exception on init s3 client )r   r	   ÚdebugÚ	mask_dictÚdictÚlitellmÚs3_callback_paramsÚ_init_s3_paramsr!   r   r   ÚLoggingCallbackÚasync_httpx_clientÚasyncioÚcreate_taskÚperiodic_flushÚLockr:   r   Ú__init__Ú	log_queuer   Ú	Exceptionr   )Úselfr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r6   r-   r.   r/   r0   r1   r2   r3   ÚkwargsÚ_maskerÚes                                ú_/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/s3_v2.pyrI   zS3Logger.__init__$   s¬  € ð:B	Ü0Ó2ˆGØ*Ð6Ü×$Ñ$Ø=¸w×?PÑ?PÔQUÐVqÓQrÓ?sõô ×$Ñ$Ø?Ø×%Ñ%¤d¬7×+EÑ+EÒ+KÈÓ&LÓMôð × Ñ Ø9Ø-Ø-Ø-Ø%Ø#Ø /Ø%9Ø)AØ%9Ø$7Ø$7Ø!1Ø*CØ$7Ø#ØØ#5Ø&;Ø"3Ø,GØ*CØ"3ð/ !ô ô2 × Ñ Ð!BÀOÔTô × Ñ Ð!]Ð_c×_mÑ_mÔnÜ&<Ü1×AÑAØ$ d§n¡nÐ5ô'ˆDÔ#ô
 ×Ñ × 3Ñ 3Ó 5Ô6Ü%Ÿl™l›nˆDŒOä× Ñ Ð!KÐM^Ð`mÔnä×&Ñ&ØØŸ?™?Ø0Ø(õ	ð ;=ˆDŒNô ×Ñ Õ%øäò 	ÜÐ<¸Q¸CÐ@ÔAØˆGûð	ús   ‚FF Æ	F8Æ#F3Æ3F8r5   c           	      ó
  — |€t         j                  xs i }|j                  «       D ��ci c]>  \  }}|t        |t        «      r&|j                  d«      rt        j                  |«      n|“Œ@ }}}|j                  d«      xs || _        |j                  d«      xs || _	        |j                  d«      xs || _
        |j                  d«      �|j                  dd«      n|| _        |j                  d«      �|j                  d«      n|| _        |j                  d	«      xs || _        |j                  d
«      xs || _        |j                  d«      xs || _        |j                  d«      xs |	| _        |j                  d«      xs |
| _        |j                  d«      xs || _        |j                  d«      xs || _        |j                  d«      xs || _        |j                  d«      xs || _        |j                  d«      xs || _        |j                  d«      xs || _        t1        |j                  dd«      «      xs || _        t1        |j                  dd«      «      xs || _        t1        |j                  dd«      «      xs || _        t1        |j                  dd«      «      xs || _        t;        |j                  d«      xs ||j                  d«      xs |«      \  | _        | _        yc c}}w )aB  
        Initialize the s3 params for this logging callback. Reads from
        `params_source` if given (e.g. `s3_audit_callback_params` for the
        audit-log instance), otherwise falls back to `litellm.s3_callback_params`.
        Resolves `os.environ/X` markers into a local dict; never mutates the source.
        Nzos.environ/r   r   r   r    Tr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r6   r   r-   Fr/   r.   r0   r1   r2   ) r@   rA   ÚitemsÚ
isinstanceÚstrÚ
startswithÚ
get_secretÚgetr   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r6   r   Úboolr-   r/   r.   r0   r   r1   r2   )rL   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r6   r   r-   r.   r/   r0   r1   r2   r5   ÚkeyÚvaluer9   s                              rP   rB   zS3Logger._init_s3_params…   sÄ  € ð@ Ð Ü#×6Ñ6Ò<¸"ˆMð ,×1Ñ1Ó3÷
á��Uð ¬z¸%ÄÔ/EÈ%×JZÑJZÐ[hÔJi”'×$Ñ$ UÔ+ÐotÑtð
ˆñ 
ð
 %Ÿj™jÐ)9Ó:ÒL¸nˆÔØ$Ÿj™jÐ)9Ó:ÒL¸nˆÔØ$Ÿj™jÐ)9Ó:ÒL¸nˆÔØ<B¿J¹JÀ|Ó<TÐ<`˜&Ÿ*™* \°4Ô8ÐfpˆŒØ4:·J±J¸{Ó4KÐ4W˜Ÿ™ KÔ0Ð]fˆŒØ%Ÿz™zÐ*;Ó<ÒOÀˆÔØ$*§J¡JÐ/EÓ$FÒ$^ÐJ^ˆÔ!à(.¯
©
Ð3MÓ(NÒ(jÐRjˆÔ%à$*§J¡JÐ/EÓ$FÒ$^ÐJ^ˆÔ!à#)§:¡:Ð.CÓ#DÒ#[ÐH[ˆÔ à#)§:¡:Ð.CÓ#DÒ#[ÐH[ˆÔ à &§
¡
Ð+=Ó >Ò RÐBRˆÔà)/¯©Ð4OÓ)PÒ)mÐTmˆÔ&à#)§:¡:Ð.CÓ#DÒ#[ÐH[ˆÔ àŸ™ KÓ0Ò=°IˆŒØ—z‘z )Ó,Ò7°ˆŒÜ"& v§z¡zÐ2FÈÓ'NÓ"OÒ"eÐSeˆÔä!% f§j¡jÐ1DÀeÓ&LÓ!MÒ!bÐQbˆÔä%)¨&¯*©*Ð5LÈeÓ*TÓ%UÒ%nÐYnˆÔ"ô �—‘Ð9¸5ÓAÓBÒaÐFað 	Ô(ô BTØ�J‰JÐ2Ó3ÒPÐ7PØ�J‰JÐ*Ó+Ò@Ð/@óB
Ñ>ˆÔ&¨Õ(>ùóO
s   ªAK?Ús3_object_keyÚreturnc                 óÌ  — t        |d¬«      }| j                  r—| j                  r‹| j                  ra| j                  j	                  dd«      j	                  dd«      }| j                  j                  d«      rdnd}|› | j                  › d|› d|› �S | j                  › d| j                  › d|› �S d| j                  › d| j                  › dt        | j                  «      › d|› �S )an  
        Build the exact URL that is both signed and sent, with the key percent-encoded once.

        S3SigV4Auth signs the path verbatim while S3 canonicalizes the received path with reserved
        characters encoded, so an unencoded `=`, `+`, `&`, `#`, `?`, `%` or space in the key makes
        the two signatures disagree (403 SignatureDoesNotMatch).
        ú/)Úsafezhttps://Ú zhttp://ú.z.s3.)r   r"   r   r0   ÚreplacerU   r   r   )rL   r[   Úencoded_keyÚendpoint_hostÚprotocols        rP   Ú_build_object_urlzS3Logger._build_object_urlÓ   sô   € ô # =°sÔ;ˆØ×Ò D×$7Ò$7Ø×/Ò/Ø'+×';Ñ';×'CÑ'CÀJÐPRÓ'S×'[Ñ'[Ð\eÐgiÓ'j�Ø04×0DÑ0D×0OÑ0OÐPZÔ0[¡*Ðaj�Ø"˜ D×$7Ñ$7Ð#8¸¸-¸ÈÈ+ÈÐWÐWØ×*Ñ*Ð+¨1¨T×-@Ñ-@Ð,AÀÀ;À-ÐPÐPà�t×*Ñ*Ð+¨4°×0CÑ0CÐ/DÀAÜ! $×"5Ñ"5Ó6Ð7°q¸¸ðGð	
ó    c                 óŽ   — | j                   | j                  dœ}|j                  «       D ��ci c]  \  }}|sŒ	||“Œ c}}S c c}}w )N)zx-amz-server-side-encryptionz+x-amz-server-side-encryption-aws-kms-key-id)r1   r2   rR   )rL   Ú
candidatesrY   rZ   s       rP   Ú_sse_headerszS3Logger._sse_headersç   sD   € à,0×,JÑ,JØ;?×;QÑ;Qñ
ˆ
ð .8×-=Ñ-=Ó-?×I™z˜s EÂ5��U‘
ÓIÐIùÓIs
   ­
A¸Ac              ƒ   óJ   K  — | j                  ||||¬«      ƒ d {  –—†  y 7 Œ­w©N)rM   Úresponse_objÚ
start_timeÚend_time©Ú_async_log_event_base©rL   rM   rm   rn   ro   s        rP   Úasync_log_success_eventz S3Logger.async_log_success_eventî   ó/   è ø€ Ø×(Ñ(ØØ%Ø!Øð	 )ó 
÷ 	
ò 	
úó   ‚#›!œ#c              ƒ   óJ   K  — | j                  ||||¬«      ƒ d {  –—†  y 7 Œ­wrl   rp   rr   s        rP   Úasync_log_failure_eventz S3Logger.async_log_failure_eventö   rt   ru   Ú	audit_logc              ƒ   ó„  K  — 	 ddl m} t        j                  |j                  «      }|j	                  dd«      }t        t        dz  | 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ÚunknownNr`   r^   zaudit_logs/z%Y-%m-%dz%H-%M-%SÚ_ú.jsonzaudit-©Úpayloadr[   Ús3_object_download_filenamezS3 audit log error: %s)r   rz   ÚnowÚutcrW   r   rT   r   ÚrstripÚstrftimer   r?   rJ   ÚappendÚlenr<   Úflush_queuerK   r	   Ú	exception)	rL   rx   rz   r‚   Úaudit_log_idr   r[   ÚelementrO   s	            rP   Úasync_log_audit_log_eventz"S3Logger.async_log_audit_log_eventþ   s&  è ø€ ð	BÝ)ä!Ÿ™ h§l¡lÓ3ˆCØ"+§-¡-°°iÓ"@ˆLäœ3 ™: t§|¡|Ó4Ò:¸ˆGÙ3:�g—n‘n SÓ)¨CÒ/ÀˆGð �)˜; s§|¡|°JÓ'?Ð&@ÀÀ#Ç,Á,ÈzÓBZÐA[Ð[\Ð]iÐ\jÐjoÐpð ô 3Ü˜Y›Ø+Ø.4°\°NÀ%Ð,HôˆGð �N‰N×!Ñ! 'Ô*ä�4—>‘>Ó" d§o¡oÒ5Ø×&Ñ&Ó(×(Ñ(ð 6Ø(ùÜò 	BÜ×$Ñ$Ð%=¸q×AÑAûð	BüsA   ‚E „DD ÄDÄD ÄE ÄD Ä	D=ÄD8Ä3E Ä8D=Ä=E c              ƒ   ó  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        $ r2}t        j                  d	|«       | j                  d
¬«       Y d }~y d }~ww xY w­w)Nz1s3 Logging - Enters logging function for model %sÚstandard_logging_object)rn   Ústandard_logging_payloadzHs3 Logging - skipping event, no standard_logging_object for call_type=%sÚ	call_typer|   z!
s3 Logger - Logging payload = %sz*s3 logging: queue length %s, batch size %szs3 Layer Error - %sr   ©Úcallback_name)r	   r=   Úcreate_s3_batch_logging_elementrW   rJ   r†   r‡   r<   rK   r‰   Úhandle_callback_failure)rL   rM   rm   rn   ro   Ús3_batch_logging_elementrO   s          rP   rq   zS3Logger._async_log_event_base  sô   è ø€ ð	CÜ× Ñ Ð!TÐV\Ô]à.2×.RÑ.RØ%Ø)/¯©Ð4MÈtÓ)Tð /Só /Ð$ð (Ð/Ü×$Ñ$Ø^Ø—J‘J˜{¨IÓ6ôð ä× Ñ Ð!EÐG_Ô`à�N‰N×!Ñ!Ð":Ô;Ü× Ñ Ø<Ü�D—N‘NÓ#Ø—‘õøô
 ò 	CÜ×$Ñ$Ð%:¸AÔ>Ø×(Ñ(°zÐ(×BÑBûð	Cüs<   ‚D
„A!C Á%D
Á&A%C ÃD
Ã	DÃ(DÃ=D
ÄDÄD
Úbatch_logging_elementc              ƒ   óZ  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,                  «       | j/                  |j*                  «      }	t1        |j2                  «      }
|j5                  |
j7                  d	«      «      j9                  «       }|j;                  |j=                  |
j7                  d	«      d
¬«      j?                  «       «      jA                  «       }d||dd|jB                  › d�ddœ| jE                  «       ¥} |d|	|
|¬«      }| jG                  | j                  ¬«      } ||d|«      jI                  |«       tK        |jL                  jO                  «       «      }d}tQ        |«      D ]£  }| jR                  jU                  |	|
|¬«      ƒ d {  –—† }|jV                  dv r\||dz
  k  rTd|z  }t'        jX                  d|jV                  ||dz   ||j*                  «       t[        j\                  |«      ƒ d {  –—†  Œ“|j_                  «         y  y # t        $ r t        d«      ‚w xY w7 �ŒG7 Œ�7 Œ6# t`        $ r2}t'        jb                  d|«       | je                  d¬«       Y d }~y d }~ww xY w­w)Nr   ©ÚS3SigV4Auth©Ú
AWSRequestú7Missing 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 - %sz$s3_v2 logger - s3_verify setting: %súutf-8F©Úusedforsecurityúapplication/jsonÚenúinline; filename="ú"ú0private, immutable, max-age=31536000, s-maxage=0©zContent-TypezContent-MD5úx-amz-content-sha256zContent-LanguagezContent-DispositionzCache-ControlÚPUT©ÚmethodÚurlÚdataÚheaders©r£   Ús3é   ©r¸   r¹   ©iô  i÷  r   é   ú=S3 upload returned %s, retrying in %ss (attempt %s/%s) key=%súError uploading to s3: %sr   r‘   )3Úbase64ÚhashlibÚbotocore.authr™   Úbotocore.awsrequestr›   ÚImportErrorÚ#litellm.litellm_core_utils.asyncifyrž   Úget_credentialsr#   r$   r%   r   r&   r'   r(   r)   r*   r	   r=   r[   r!   rf   r   r€   Úsha256ÚencodeÚ	hexdigestÚ	b64encodeÚmd5ÚdigestÚdecoder�   rj   Ú)get_aws_region_name_for_non_llm_api_callsÚadd_authr?   r¹   rR   ÚrangerD   ÚputÚstatus_codeÚwarningrE   ÚsleepÚraise_for_statusrK   r‰   r”   )rL   r–   rÂ   rÃ   r™   r›   rž   Úasyncified_get_credentialsÚcredentialsr·   Újson_stringÚcontent_hashÚcontent_md5r¹   Úaws_requestr£   Úsigned_headersÚmax_retriesÚattemptÚresponseÚ	wait_timerO   s                         rP   Úasync_upload_data_to_s3z S3Logger.async_upload_data_to_s38  s  è ø€ ð	YÛÛå1Ý6ðE	CÝDá08¸×9MÑ9MÓ0NÐ&Ù'AØ"&×";Ñ";Ø&*×&CÑ&CØ"&×";Ñ";Ø $× 3Ñ 3Ø!%×!9Ñ!9Ø!%×!9Ñ!9Ø"×3Ñ3Ø'+×'EÑ'EØ!%×!9Ñ!9ô
(÷ 
"ˆKô × Ñ Ð!KÐMb×MpÑMpÔqÜ× Ñ Ð!GÈÏÉÔXà×/Ñ/Ð0E×0SÑ0SÓTˆCô ",Ð,A×,IÑ,IÓ!JˆKð #*§.¡.°×1CÑ1CÀGÓ1LÓ"M×"WÑ"WÓ"YˆLØ!'×!1Ñ!1Ø—‘˜K×.Ñ.¨wÓ7È�ÓO×VÑVÓXó"ç‰f‹hð ð !3Ø*Ø(4Ø$(Ø);Ð<Q×<mÑ<mÐ;nÐnoÐ'pØ!Sñð ×#Ñ#Ó%ðˆGñ ",°5¸cÈÐ]dÔ!eˆKØ%)×%SÑ%SÐdh×dwÑdwÐ%SÓ%xˆOÙ˜ T¨?Ó;×DÑDÀ[ÔQô %)¨×)<Ñ)<×)BÑ)BÓ)DÓ$EˆNð "#ˆKÜ  Ó-ò �Ø!%×!8Ñ!8×!<Ñ!<¸SÀ{Ð\jÐ!<Ó!k×k�Ø×'Ñ'¨:Ñ5¸'ÀKÐRSÁOÒ:SØ ! 7¡
�IÜ"×*Ñ*ØWØ ×,Ñ,Ø!Ø !™Ø#Ø-×;Ñ;ôô "Ÿ-™-¨	Ó2×2Ð2ØØ×)Ñ)Ô+Ùñøôk ò 	YÜÐWÓXÐXð	Yúð
"ùð` løð 3ùô ò 	CÜ×$Ñ$Ð%@À!ÔDØ×(Ñ(°zÐ(×BÑBûð	Cüs„   ‚L+„K ™BK- ÂK&Â F+K- ÉK)ÉA(K- Ê4K+Ê5K- ËL+ËK- ËL+ËK#Ë#L+Ë&K- Ë)K- Ë+K- Ë-	L(Ë6(L#ÌL+Ì#L(Ì(L+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 %sN)r	   r=   r‡   rJ   rE   rF   rã   )rL   r€   s     rP   Úasync_send_batchzS3Logger.async_send_batchˆ  s\   è ø€ ô 	×ÑÐAÄ3ÀtÇ~Á~ÓCVÔWØ�~Š~Øð —~‘~ò 	GˆGÜ×Ñ × <Ñ <¸WÓ EÕFñ	Gùs   ‚A-A/rn   r�   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|||«       t        t        t        dz  | 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^   r`   z@Creating s3 file with prefix_components=%s,prefix_path=%s and %s)r   Úprefixrn   Ús3_file_namezs3_object_key=%sztime-z%Y-%m-%dT%H-%M-%S-%fr}   r{   r~   r   )r.   Ú _strip_base64_from_messages_syncr-   rW   r†   r/   Újoinr@   ÚutilsÚget_logging_idr	   r=   r   r   rT   r   r…   r   r?   )
rL   rn   r�   Úprefix_componentsÚ
team_aliasré   Úprefix_pathrë   r[   r�   s
             rP   r“   z(S3Logger.create_s3_batch_logging_element�  sŠ  € ð  $Ð+Øà×%Ò%Ø'+×'LÑ'LÐMeÓ'fÐ$ð $&ÐØ×"Ò"Ø 8× <Ñ <¸ZÈÓ L× PÑ PÐQjÐlpÓ qˆJÙØ!×(Ñ(¨Ô4Ø×!Ò!Ø(@×(DÑ(DÀZÐQSÓ(T×(XÑ(XÐYmÐosÓ(tÐÙ!Ø!×(Ñ(Ð);Ô<ð —h‘hÐ0Ó1ˆÙØ˜3ÑˆKä%Ÿm™m×:Ñ:¸:ÐG_Ó`ÒfÐdfˆÜ×ÑØNØØØô		
ô  1Üœ˜t™ T§\¡\Ó2Ò8°bØØ!Ø%ô	 
ˆô 	×ÑÐ/°Ô?ð �J×'Ñ'Ð(>Ó?Ð@ÀÐBZÐ[_ÑB`ÐAaÐafÐgð 	$ô %ÜÐ1Ó2Ø'Ø(Cô
ð 	
rg   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                   ¬«      }| j#                  |j                  «      }t%        |j&                  «      }	|j)                  |	j+                  d«      «      j-                  «       }
|j/                  |j1                  |	j+                  d«      d	¬
«      j3                  «       «      j5                  «       }d||
dd|j6                  › d�ddœ| j9                  «       ¥} |d||	|¬«      }| j;                  | j                   ¬«      } ||d|«      j=                  |«       t?        |j@                  jC                  «       «      }tE        | jF                  �d| jF                  ind ¬«      }d}tI        |«      D ]‰  }|jK                  ||	|¬«      }|jL                  dv rT||dz
  k  rLd|z  }t        jN                  d|jL                  ||dz   ||j                  «       tQ        jR                  |«       Œy|jU                  «         y  y # t        $ r t        d«      ‚w xY w# tV        $ r2}t        jX                  d|«       | j[                  d¬«       Y d }~y d }~ww xY w) Nr   r˜   rš   )ÚCredentialsrœ   r©   )r    r¡   r¢   r£   rª   Fr«   r­   r®   r¯   r°   r±   r²   r´   rµ   rº   r»   r7   )r9   r¼   r½   r¾   r   r¿   rÀ   rÁ   r   r‘   ).rÂ   rÃ   rÄ   r™   rÅ   r›   Úbotocore.credentialsrô   rÆ   r	   r=   r[   rÈ   r#   r$   r%   r   rf   r   r€   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rÏ   r�   rj   rÐ   rÑ   r?   r¹   rR   r   r!   rÒ   rÓ   rÔ   rÕ   ÚtimerÖ   r×   rK   r‰   r”   )rL   r–   rÂ   rÃ   r™   r›   rô   rÙ   r·   rÚ   rÛ   rÜ   r¹   rÝ   r£   rÞ   Úhttpx_clientrß   rà   rá   râ   rO   s                         rP   Úupload_data_to_s3zS3Logger.upload_data_to_s3Ü  s¼  € ð	YÛÛå1Ý6Ý8ð>	CÜ× Ñ Ð!KÐMb×MpÑMpÔqØ.2×.BÑ.BØ"&×";Ñ";Ø&*×&CÑ&CØ"&×";Ñ";Ø $× 3Ñ 3ð	 /Có /ˆKð ×/Ñ/Ð0E×0SÑ0SÓTˆCô ",Ð,A×,IÑ,IÓ!JˆKð #*§.¡.°×1CÑ1CÀGÓ1LÓ"M×"WÑ"WÓ"YˆLØ!'×!1Ñ!1Ø—‘˜K×.Ñ.¨wÓ7È�ÓO×VÑVÓXó"ç‰f‹hð ð !3Ø*Ø(4Ø$(Ø);Ð<Q×<mÑ<mÐ;nÐnoÐ'pØ!Sñð ×#Ñ#Ó%ðˆGñ ",°5¸cÈÐ]dÔ!eˆKØ%)×%SÑ%SÐdh×dwÑdwÐ%SÓ%xˆOÙ˜ T¨?Ó;×DÑDÀ[ÔQô %)¨×)<Ñ)<×)BÑ)BÓ)DÓ$EˆNä"3Ø:>¿.¹.Ð:T˜ t§~¡~Ñ6ÐZ^ô#ˆLð "#ˆKÜ  Ó-ò �Ø'×+Ñ+¨C°kÈ>Ð+ÓZ�Ø×'Ñ'¨:Ñ5¸'ÀKÐRSÁOÒ:SØ ! 7¡
�IÜ"×*Ñ*ØWØ ×,Ñ,Ø!Ø !™Ø#Ø-×;Ñ;ôô —J‘J˜yÔ)ØØ×)Ñ)Ô+Ùñøô] ò 	YÜÐWÓXÐXð	Yûô| ò 	CÜ×$Ñ$Ð%@À!ÔDØ×(Ñ(°zÐ(×BÑBûð	Cús)   ‚I0 �IJ É.J É0JÊ	KÊ(J>Ê>Kc              ƒ   óÖ  K  — 	 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)                  |«      }|j+                  d	«      j-                  «       }	d
|	i}
 |d||
¬«      } ||d| j                  «      j/                  |«       t1        |j2                  j5                  «       «      }| j6                  j9                  ||¬«      ƒ d{  –—† }|j:                  dk7  r!t%        j<                  d|j>                  «       y|jA                  «       S # t
        $ r t        d«      ‚w xY w7 �Œ7 Œ_# tB        $ r }t%        j<                  d|«       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 - %srg   r³   ÚGET)r¶   r·   r¹   r»   )r¹   éÈ   z"S3 object not found, saw response=zError downloading from S3: %s)"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¹   rR   rD   rW   rÔ   r‰   ÚtextÚjsonrK   )rL   r[   rÃ   r™   r›   rž   rØ   rÙ   r·   Úempty_string_hashr¹   rÝ   rÞ   rá   rO   s                  rP   Ú_download_object_from_s3z!S3Logger._download_object_from_s3&  sÆ  è ø€ ð	TÛå1Ý6ð.	ÝDñ 19¸×9MÑ9MÓ0NÐ&Ù'AØ"&×";Ñ";Ø&*×&CÑ&CØ"&×";Ñ";Ø $× 3Ñ 3Ø!%×!9Ñ!9Ø!%×!9Ñ!9Ø"×3Ñ3Ø'+×'EÑ'EØ!%×!9Ñ!9ô
(÷ 
"ˆKô × Ñ Ð!OÐQ^Ô_à×/Ñ/°Ó>ˆCð (/§~¡~°cÓ':×'DÑ'DÓ'FÐà&Ð(9ðˆGñ
 ",°5¸cÈ7Ô!SˆKÙ˜ T¨4×+>Ñ+>Ó?×HÑHÈÔUô %)¨×)<Ñ)<×)BÑ)BÓ)DÓ$EˆNà$(×$;Ñ$;×$?Ñ$?ÀÈ^Ð$?Ó$\×\ˆHà×#Ñ# sÒ*Ü×(Ñ(Ð)MÈxÏ}É}Ô]Øð —=‘=“?Ð"øô[ ò 	TÜÐRÓSÐSð	Túð
"ùð< ]ùô ò 	Ü×$Ñ$Ð%DÀaÔHÜûð	üsq   ‚G)„F  •BF= ÂF8ÂB?F= ÅF;Å3F= ÆG)ÆF= ÆG)Æ F5Æ5G)Æ8F= Æ;F= Æ=	G&ÇG!ÇG)Ç!G&Ç&G)Ú
object_keyc              ƒ   ó    K  — 	 | j                  |«      ƒ d{  –—† }|S 7 Œ# t        $ r!}t        j                  d||«       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
        Nz0Error retrieving object %s from cold storage: %s)rÿ   rK   r	   r‰   )rL   r   Údownloaded_objectrO   s       rP   Ú:get_proxy_server_request_from_cold_storage_with_object_keyzCS3Logger.get_proxy_server_request_from_cold_storage_with_object_keyh  sR   è ø€ ð 	à-1×-JÑ-JÈ:Ó-V×'VÐØ$Ð$ð (Wùäò 	Ü×$Ñ$Ð%WÐYcÐefÔgÜûð	üs6   ‚A„! ˜™! žAŸ! ¡	AªAÁAÁAÁA)NNNTNNNNNNNNNNNNFFFFNNN)Ú__name__Ú
__module__Ú__qualname__r   r
   rT   rX   Úintr?   rI   rB   rf   r   rj   rs   rw   r   rŒ   rq   r   rã   rå   r   r   r“   rø   rÿ   r  © rg   rP   r   r   #   s  „ ð &*Ø"Ø%)Ø%)ØØ!%Ø&*Ø+/Ø/3Ø+/Ø*.Ø*.Ø'+Ø04Ø*.Ø(IØ$9ØØ#(Ø&+Ø"'Ø,1Ø04Ø(,Ø37ñ5_à˜d™
ð_ð �t‘ð_ð ˜d™
ð	_ð
 ˜d™
ð_ð ð_ð ˜$‘;ð_ð ˜t™ð_ð " D™jð_ð #&¨¡*ð_ð " D™jð_ð ! 4™Zð_ð ! 4™Zð_ð  ™*ð_ð $'¨¡:ð_ð  ! 4™Zð!_ð"  ™:ð#_ð$ ˜T‘zð%_ð( !ð)_ð*  $ð+_ð,  ð-_ð. &*ð/_ð0 $'¨¡:ð1_ð2  ™:ð3_ð4 &*¨D¡[ó5_ðF &*Ø%)Ø%)ØØ!%Ø&*Ø+/Ø/3Ø+/Ø*.Ø*.Ø'+Ø04Ø*.ØØ"Ø#(Ø&+Ø"'Ø,1Ø04Ø(,Ø%)ñ1L
à˜d™
ðL
ð ˜d™
ðL
ð ˜d™
ð	L
ð
 ðL
ð ˜$‘;ðL
ð ˜t™ðL
ð " D™jðL
ð #&¨¡*ðL
ð " D™jðL
ð ! 4™ZðL
ð ! 4™ZðL
ð  ™*ðL
ð $'¨¡:ðL
ð ! 4™ZðL
ð" �t‘ð#L
ð$ !ð%L
ð&  $ð'L
ð(  ð)L
ð* &*ð+L
ð, $'¨¡:ð-L
ð.  ™:ð/L
ð0 ˜d‘{ó1L
ð\
¨sð 
°só 
ð(J˜g c¨3 hÑ/ó Jò
ò
ðBÐ9Pð BÐUYó Bò8Cð<NCÐCXó NCò`Gð*=
àð=
ð #9¸4Ñ"?ð=
ð 
 Ñ	%ó	=
ð~HCÐ7Ló HCðT@¸Cð @ÀDÈ4ÁKó @ðDàðð 
�‰ôrg   r   ))Ú__doc__rE   rö   Úcollections.abcr   r   Útypingr   r   Úurllib.parser   r@   Úlitellm._loggingr   r	   Úlitellm.constantsr
   r   Úlitellm.integrations.s3r   r   Ú(litellm.litellm_core_utils.aws_partitionr   Ú*litellm.litellm_core_utils.safe_json_dumpsr   Ú0litellm.litellm_core_utils.sensitive_data_maskerr   Ú!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  rg   rP   ú<module>r     s]   ðñó Û Ý #Ý ß Ý ã ß :ß Vß IÝ GÝ AÝ PÝ 8÷ñ õ
 Cß Oå 2ô[	Ð  *õ [	rg   