Ë
    uPêjf  ã                   ó~   — d 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 ddl	m
Z
 ddlmZmZ ddlmZ  G d	„ d
e«      Zy)z£
S3 Cache implementation

Has 4 methods:
    - set_cache
    - get_cache
    - async_set_cache (uses run_in_executor)
    - async_get_cache (uses run_in_executor)
é    N)ÚdatetimeÚ	timedeltaÚtimezone)Úpartial)ÚFinal)Úprint_verboseÚverbose_loggeré   )Ú	BaseCachec                   ón   — e Zd Z	 	 	 	 	 	 	 	 	 	 ddedz  fd„Zdedefd„Zd„ Zd„ Zd	„ Z	d
„ Z
d„ Zd„ Zd„ Zy)ÚS3CacheNÚ
s3_use_sslc                 ó˜   — dd l }|| _        |r|j                  d«      dz   nd| _         |j                  	 d||||||||	|
dœ	|¤Ž| _        y )Nr   ú/Ú )	Úregion_nameÚendpoint_urlÚapi_versionÚuse_sslÚverifyÚaws_access_key_idÚaws_secret_access_keyÚaws_session_tokenÚconfig)Ús3)Úboto3Úbucket_nameÚrstripÚ
key_prefixÚclientÚ	s3_client)ÚselfÚs3_bucket_nameÚs3_region_nameÚs3_api_versionr   Ú	s3_verifyÚs3_endpoint_urlÚs3_aws_access_key_idÚs3_aws_secret_access_keyÚs3_aws_session_tokenÚ	s3_configÚs3_pathÚkwargsr   s                 ú]/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/caching/s3_cache.pyÚ__init__zS3Cache.__init__   si   € ó 	à)ˆÔÙ7>˜'Ÿ.™.¨Ó-°Ò3ÀBˆŒð &˜Ÿ™Øð
à&Ø(Ø&ØØØ2Ø":Ø2Øñ
ð ñ
ˆ�ó    ÚkeyÚreturnc                 ó@   — | j                   |j                  dd«      z   S )zConvert cache key to S3 keyú:r   )r   Úreplace)r"   r1   s     r.   Ú
_to_s3_keyzS3Cache._to_s3_key;   s   € à�‰ §¡¨S°#Ó!6Ñ6Ð6r0   c                 ó  — 	 t        d|› d|› �«       |j                  dd «      }t        j                  |«      }| j	                  |«      }|�jd|› d|› �}t        j                  t        j                  «      t        |¬«      z   }| j                  j                  | j                  ||||ddd	|› d
�¬«       y d}| j                  j                  | j                  |||ddd	|› d
�¬«       y # t        $ r}t        d|› �«       Y d }~y d }~ww xY w)NzLiteLLM SET Cache - S3. Key=z. Value=Úttlzimmutable, max-age=z, s-maxage=)Úsecondszapplication/jsonÚenzinline; filename="z.json")ÚBucketÚKeyÚBodyÚExpiresÚCacheControlÚContentTypeÚContentLanguageÚContentDispositionz.immutable, max-age=31536000, s-maxage=31536000)r;   r<   r=   r?   r@   rA   rB   z1S3 Caching: set_cache() - Got exception from S3: )r   ÚgetÚjsonÚdumpsr6   r   Únowr   Úutcr   r!   Ú
put_objectr   Ú	Exception)	r"   r1   Úvaluer-   r8   Úserialized_valueÚcache_controlÚexpiration_timeÚes	            r.   Ú	set_cachezS3Cache.set_cache?   s)  € ð$	SÜÐ8¸¸¸XÀeÀWÐMÔNØŸ™ E¨4Ó0ˆCä&*§j¡j°Ó&7ÐØ—/‘/ #Ó&ˆCàˆØ"5°c°U¸+ÀcÀUÐ K�ô *2¯©´h·l±lÓ)CÄiÐX[ÔF\Ñ)\�à—‘×)Ñ)Ø×+Ñ+ØØ)Ø+Ø!.Ø 2Ø$(Ø);¸C¸5ÀÐ'Gð *õ 	ð !Q�à—‘×)Ñ)Ø×+Ñ+ØØ)Ø!.Ø 2Ø$(Ø);¸C¸5ÀÐ'Gð *õ øô ò 	SÜÐMÈaÈSÐQ×RÑRûð	Sús   ‚B4C* Â72C* Ã*	DÃ3DÄDc              ‹   ó$  K  — 	 t        j                  d||«       t        j                  «       }t	        | j
                  ||fi |¤Ž}|j                  d|«      ƒ d{  –—†  y7 Œ# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)z‡
        Asynchronously set cache using run_in_executor to avoid blocking the event loop.
        Compatible with Python 3.8+.
        z$Set ASYNC S3 Cache: Key=%s. Value=%sNz9S3 Caching: async_set_cache() - Got exception from S3: %s)	r	   ÚdebugÚasyncioÚget_event_loopr   rO   Úrun_in_executorrI   Úerror)r"   r1   rJ   r-   ÚloopÚfuncrN   s          r.   Úasync_set_cachezS3Cache.async_set_cachef   s€   è ø€ ð
	aÜ× Ñ Ð!GÈÈeÔTÜ!×0Ñ0Ó2ˆDÜ! $§.¡.°#°uÑGÀÑGˆDØ×&Ñ& t¨TÓ2×2Ò2ùÜò 	aÜ× Ñ Ð!\Ð^_×`Ñ`ûð	aüsA   ‚B„AA$ ÁA"ÁA$ Á!BÁ"A$ Á$	BÁ-BÂBÂBÂBc                 ó&  — dd l }	 | j                  |«      }t        d|› �«       | j                  j	                  | j
                  |¬«      }|�fd|v r*|d   }t        j                  |j                  «      }||kD  ry |d   j                  «       j                  d«      }	 t        j                  |«      }t!        |t"        «      st#        |«      }t%        j&                  d||t)        |«      «       |S # t        $ r t        j                  |«      }Y Œ^w xY w# |j*                  j,                  $ r:}|j.                  d   d	   d
k(  rt%        j&                  d|«       Y d }~y Y d }~y d }~wt        $ r }t%        j0                  d|«       Y d }~y d }~ww xY w)Nr   zGet S3 Cache: key: )r;   r<   r>   r=   zutf-8z;Got S3 Cache: key: %s, cached_response %s. Type Response %sÚErrorÚCodeÚ	NoSuchKeyzAS3 Cache: The specified key '%s' does not exist in the S3 bucket.z3S3 Caching: get_cache() - Got exception from S3: %s)Úbotocorer6   r   r!   Ú
get_objectr   r   rF   ÚtzinfoÚreadÚdecoderD   ÚloadsrI   ÚastÚliteral_evalÚ
isinstanceÚdictr	   rQ   ÚtypeÚ
exceptionsÚClientErrorÚresponserU   )r"   r1   r-   r]   Úcached_responseÚexpires_timeÚcurrent_timerN   s           r.   Ú	get_cachezS3Cache.get_caches   sƒ  € Ûð%	[Ø—/‘/ #Ó&ˆCäÐ/°¨uÐ5Ô6à"Ÿn™n×7Ñ7¸t×?OÑ?OÐUXÐ7ÓYˆOàÐ*Ø Ñ/Ø*9¸)Ñ*D�LÜ*2¯,©,°|×7JÑ7JÓ*K�Là# lÒ2Ø#ð #2°&Ñ"9×">Ñ">Ó"@×"GÑ"GÈÓ"P�ðHÜ&*§j¡j°Ó&A�Oô ˜o¬tÔ4Ü"& Ó"7�Ü× Ñ ØMØØÜ�_Ó%ô	ð #Ð"øô !ò HÜ&)×&6Ñ&6°Ó&G’OðHûð ×"Ñ"×.Ñ.ò 	Ø�z‰z˜'Ñ" 6Ñ*¨kÒ9Ü×$Ñ$Ð%hÐjmÔnÜô :ûô ò 	[Ü× Ñ Ð!VÐXY×ZÑZûð	[úsN   †A5D Á<"D ÂC2 Â4=D Ã2DÄD ÄDÄD ÄFÄ/+E$Å$FÅ0FÆFc              ‹   ó"  K  — 	 t        j                  d|«       t        j                  «       }t	        | j
                  |fi |¤Ž}|j                  d|«      ƒ d{  –—† }|S 7 Œ# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)z‡
        Asynchronously get cache using run_in_executor to avoid blocking the event loop.
        Compatible with Python 3.8+.
        zGet ASYNC S3 Cache: key: %sNz9S3 Caching: async_get_cache() - Got exception from S3: %s)	r	   rQ   rR   rS   r   rn   rT   rI   rU   )r"   r1   r-   rV   rW   ÚresultrN   s          r.   Úasync_get_cachezS3Cache.async_get_cache�   sƒ   è ø€ ð
	Ü× Ñ Ð!>ÀÔDÜ!×0Ñ0Ó2ˆDÜ! $§.¡.°#Ñ@¸Ñ@ˆDØ"&×"6Ñ"6°t¸TÓ"B×BˆFØˆMð Cùäò 	Ü× Ñ Ð!\Ð^_Ô`Üûð	üsA   ‚B„AA# ÁA!ÁA# Á BÁ!A# Á#	BÁ,BÂBÂBÂBc                  ó   — y ©N© ©r"   s    r.   Úflush_cachezS3Cache.flush_cache¬   s   € Ør0   c              ƒ   ó   K  — y ­wrs   rt   ru   s    r.   Ú
disconnectzS3Cache.disconnect¯   s	   è ø€ Øùs   ‚c              ‹   ó¨   K  — g }|D ]+  }|j                   | j                  |d   |d   fi |¤Ž«       Œ- t        j                  |Ž ƒ d {  –—†  y 7 Œ­w)Nr   r
   )ÚappendrX   rR   Úgather)r"   Ú
cache_listr-   ÚtasksÚvals        r.   Úasync_set_cache_pipelinez S3Cache.async_set_cache_pipeline²   sW   è ø€ ØˆØò 	IˆCØ�L‰LÐ-˜×-Ñ-¨c°!©f°c¸!±fÑGÀÑGÕHð	Iä�n‰n˜eÐ$×$Ò$ús   ‚AAÁ
AÁA)
NNTNNNNNNN)Ú__name__Ú
__module__Ú__qualname__Úboolr/   Ústrr6   rO   rX   rn   rq   rv   rx   r   rt   r0   r.   r   r      sq   „ ð ØØ"&ØØØ!Ø!%Ø!ØØñ!
ð
 ˜4‘Kó!
ðF7˜cð 7 có 7ò%SòNaò([òTòòó%r0   r   )Ú__doc__rc   rR   rD   r   r   r   Ú	functoolsr   Útypingr   Úlitellm._loggingr   r	   Ú
base_cacher   r   rt   r0   r.   ú<module>rŠ      s5   ðñó Û Û ß 2Ñ 2Ý Ý ç :å !ô_%ˆiõ _%r0   