
    AHj                     ~    d Z ddl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	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)partial)Optional)datetimetimezone	timedelta)print_verboseverbose_logger   )	BaseCachec                   n    e Zd Z	 	 	 	 	 	 	 	 	 	 ddee   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                 P/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/caching/s3_cache.py__init__zS3Cache.__init__   si     	)7>'..-3B &
&(&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=. 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@   rA   rB   rC   z1S3 Caching: set_cache() - Got exception from S3: )r   getjsondumpsr6   r   nowr   utcr   r!   
put_objectr   	Exception)	r"   r1   valuer-   r9   serialized_valuecache_controlexpiration_timees	            r.   	set_cachezS3Cache.set_cache?   s)   $	S8XeWMN**UD)C#zz%0//#&C"5cU+cU K #+,,x||"<yQT?U"U))++)+!. 2$();C5'G * 	 !Q))++)!. 2$();C5'G *   	SMaSQRR	Ss   B4C* 72C* *	D3DDc                 0  K   	 t        j                  d| 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=r8   Nz7S3 Caching: async_set_cache() - Got exception from S3: )	r	   debugasyncioget_event_loopr   rP   run_in_executorrJ   error)r"   r1   rK   r-   loopfuncrO   s          r.   async_set_cachezS3Cache.async_set_cachef   s     
	  #;C5!PQ))+D4>>3@@D&&tT222 	  I!M 	sA   BAA(  A&!A( %B&A( (	B1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| d| d	t)        |              |S # t        $ r t        j                  |      }Y dw xY w# |j*                  j,                  $ r=}|j.                  d
   d   dk(  rt%        j&                  d| 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: z, cached_response z. Type Response ErrorCode	NoSuchKeyzS3 Cache: The specified key 'z"' does not exist in the S3 bucket.z1S3 Caching: get_cache() - Got exception from S3: )botocorer6   r   r!   
get_objectr   r   rG   tzinforeaddecoderE   loadsrJ   astliteral_eval
isinstancedictr	   rR   type
exceptionsClientErrorresponserV   )r"   r1   r-   r^   cached_responseexpires_timecurrent_timerO   s           r.   	get_cachezS3Cache.get_cacheu   s   ,	//#&C/u56"nn77''S 8 O */#29#=L#+<<0C0C#DL#l2# $F+00299'B  H&*jj''O
 ot4"&"7  %cU*<_<MM]^bcr^s]tu #" ! H&)&6&6&GOH "".. 	zz'"6*k9$$3C58Z[ 	 :  	  CA3G 	sO   A5D <"D C8 4AD 8DD DD F5.E--F9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: Nz7S3 Caching: async_get_cache() - Got exception from S3: )	r	   rR   rS   rT   r   ro   rU   rJ   rV   )r"   r1   r-   rW   rX   resultrO   s          r.   async_get_cachezS3Cache.async_get_cache   s     

	  #<SE!BC))+D4>>39&9D//d;;FM < 	  I!M 		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rt   ru   rv   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
   )appendrY   rS   gather)r"   
cache_listr-   tasksvals        r.   async_set_cache_pipelinez S3Cache.async_set_cache_pipeline   sW      	ICLL---c!fc!fGGH	Inne$$$s   AA
AA)
NNTNNNNNNN)__name__
__module____qualname__r   boolr/   strr6   rP   rY   ro   rr   rw   ry   r   ru   r0   r.   r   r      so     %)!!%!!

 TN!
F7c 7c 7%SN/b"%r0   r   )__doc__rd   rS   rE   	functoolsr   typingr   r   r   r   litellm._loggingr   r	   
base_cacher   r   ru   r0   r.   <module>r      s5         2 2 : !j%i j%r0   