
    g9/                     b    d Z ddlZddlZddlZddlmZ ddlZddlmZ ddl	m
Z
  G d de
      Zy)	z
Redis Semantic Cache implementation

Has 4 methods:
    - set_cache
    - get_cache
    - async_set_cache
    - async_get_cache
    N)Any)print_verbose   )	BaseCachec                   R    e Zd Z	 	 	 	 	 	 	 ddZdefdZd Zd Zd Zd Z	d	 Z
d
 Zy)RedisSemanticCacheNc                    ddl m}	 t        d       |t        d      || _        || _        ddddd	d
igddddddgdd}
|_|||Hdd l}|j                  d      }|j                  d      }|j                  d      }|||t        d      d|z   dz   |z   dz   |z   }t        d|        |du rP|	j                  |
      | _	        | j                  j                  |       	 | j                  j                  d       y |du r<d |
d!   d	<   |	j                  |
      | _	        | j                  j                  |d"       y y # t        $ r!}t        dt        |              Y d }~y d }~ww xY w)#Nr   )SearchIndexzFredis semantic-cache initializing INDEX - litellm_semantic_cache_indexz2similarity_threshold must be provided, passed Nonelitellm_semantic_cache_indexlitellmhash)nameprefixstorage_typer   responselitellm_embeddingi   cosineflatfloat32)r   dimsdistance_metric	algorithmdatatype)textvector)indexfields
REDIS_HOST
REDIS_PORTREDIS_PASSWORDz/Redis host, port, and password must be providedz	redis://:@:z redis semantic-cache redis_url: F)	redis_url	overwrite-Got exception creating semantic cache index: T"litellm_semantic_cache_index_asyncr   )r#   	use_async)redisvl.indexr
   r   	Exceptionsimilarity_thresholdembedding_modelosgetenv	from_dictr   connectcreatestr)selfhostportpasswordr#   r+   r(   r,   kwargsr
   schemar-   es                Y/var/www/openai/venv/lib/python3.12/site-packages/litellm/caching/redis_semantic_cache.py__init__zRedisSemanticCache.__init__   s    	.T	
  'PQQ$8!. 7# & !*-. !4 $+3%+$-
& |t|x/?yy.yy.99%56<4<83C#$UVV#h.4t;cADHI8DE$..v6DJJJ3X

!!E!2 $&JF7OF#$..v6DJJJdC   X McRSfXVWWXs   )E 	E1E,,E1cached_responsec                     ||S t        |t              r|j                  d      }	 t        j                  |      }|S # t
        $ r t        j                  |      }Y |S w xY w)z[
        Common 'get_cache_logic' across sync + async redis client implementations
        zutf-8)
isinstancebytesdecodejsonloadsr*   astliteral_eval)r3   r<   s     r:   _get_cache_logicz#RedisSemanticCache._get_cache_logicY   st     """ ou--44W=O	@"jjO
   	@!..?O	@s   > A A c                    dd l }t        d|        |d   }dj                  d |D              }t        j                  | j
                  |ddd      }|d	   d   d
   }|j                  ||j                        j                         }	t        |      }t        |t              sJ |||	dg}
| j                  j                  |
       y )Nr   z(redis semantic-cache set_cache, kwargs: messages c              3   &   K   | ]	  }|d      ywcontentN .0messages     r:   	<genexpr>z/RedisSemanticCache.set_cache.<locals>.<genexpr>s        D8+8   Tzno-storezno-cachemodelinputcachedata	embeddingdtyper   promptr   )numpyr   joinr   rY   r,   arrayr   tobytesr2   r>   r   load)r3   keyvaluer7   nprG   r]   embedding_responserY   embedding_bytesnew_datas              r:   	set_cachezRedisSemanticCache.set_cachel   s    @IJ *%D8DD %..&&#6
 'v.q1+>	 ((9BJJ(?GGIE
%%%% &W

 	

!    c           
      X   t        d|        ddlm} |d   }dj                  d |D              }t	        j
                  | j                  |ddd	      }|d
   d   d   } ||dg dd      }| j                  j                  |      }	|	y t        |	t              rt        |	      dk(  ry |	d   d   }
t        |
      }
d|
z
  }|	d   d   }t        d| j                   d| d| d|        || j                  kD  r.|	d   d   }t        d| d| d|        | j                  |      S y )Nz-sync redis semantic-cache get_cache, kwargs: r   VectorQueryrG   rH   c              3   &   K   | ]	  }|d      ywrJ   rL   rM   s     r:   rP   z/RedisSemanticCache.get_cache.<locals>.<genexpr>   rQ   rR   TrS   rT   rX   rY   r   r   r]   vector_distancer   )r   vector_field_namereturn_fieldsnum_resultsrp   r]   &semantic cache: similarity threshold: , similarity: 
, prompt: , closest_cached_prompt: r   got a cache hit, similarity: , Current prompt: , cached_prompt: r<   )r   redisvl.queryrm   r_   r   rY   r,   r   queryr>   listlenfloatr+   rE   )r3   rc   r7   rm   rG   r]   rf   rY   r}   resultsrp   
similaritycached_promptcached_values                 r:   	get_cachezRedisSemanticCache.get_cache   s   EfXNO- *%D8DD %..&&#6
 'v.q1+>	1C	
 **""5)?gt$7|q !!*%670(

8, 	4T5N5N4O~^h]iistzs{  |U  Vc  Ud  e	
 111"1:j1L/
|;MfXUfgtfuv (((FF rj   c                   K   dd l }ddlm}m} 	 | j                  j                  d       d {    t        d|        |d   }dj                  d	 |D              }	||D 
cg c]  }
|
d
   	 c}
ng }|| j                  |v rq|j                  di       j                  dd      }|j                  | j                  |	ddd|d|j                  di       j                  dd       d       d {   }n-t        j                  | j                  |	ddd       d {   }|d   d   d   }|j                  ||j                        j!                         }t        |      }t#        |t              sJ ||	|dg}| j                  j%                  |       d {    y 7 s# t        $ r"}t        dt        |              Y d }~d }~ww xY wc c}
w 7 7 7 ?w)Nr   llm_model_list
llm_routerFr$   r&   z.async redis semantic-cache set_cache, kwargs: rG   rH   c              3   &   K   | ]	  }|d      ywrJ   rL   rM   s     r:   rP   z5RedisSemanticCache.async_set_cache.<locals>.<genexpr>   rQ   rR   
model_namemetadatauser_api_keyTrS   trace_idr   zsemantic-cache-embeddingr   rU   rV   rW   r   rT   rX   rY   rZ   r\   )r^   litellm.proxy.proxy_serverr   r   r   acreater*   r   r2   r_   r,   get
aembeddingr   r`   r   ra   r>   aload)r3   rc   rd   r7   re   r   r   r9   rG   r]   mrouter_model_namesr   rf   rY   rg   rh   s                    r:   async_set_cachez"RedisSemanticCache.async_set_cache   s    I	T**$$u$555 	FvhOP *%D8DD ) '55nQ|_n5 	
 !d&:&:>P&P!::j"599."ML'1'<'<**#'T:$004 &

:r : > >z4 P	 (= 	( 	" (/'9'9**#'T:( " 'v.q1+>	 ((9BJJ(?GGIE
%%%% &W

 jjx(((a 6 	TI#a&RSS	T 6	""& 	)s{   GF% F"F% 1G%G1B G1G2-GG A<GGG"F% %	G.GGG	GGGc                 V  K   t        d|        ddlm} ddlm}m} |d   }dj                  d |D              }||D cg c]  }|d   	 c}ng }	|| j                  |	v rq|j                  d	i       j                  d
d      }
|j                  | j                  |ddd|
d|j                  d	i       j                  dd       d       d {   }n-t        j                  | j                  |ddd       d {   }|d   d   d   } ||dg d      }| j                  j                  |       d {   }|d|j                  d	i       d<   y t        |t              r$t!        |      dk(  rd|j                  d	i       d<   y |d   d   }t#        |      }d|z
  }|d   d   }t        d| j$                   d| d| d|        ||j                  d	i       d<   || j$                  kD  r.|d   d   }t        d | d!| d"|        | j'                  |#      S y c c}w 7 S7 (7 w)$Nz.async redis semantic-cache get_cache, kwargs: r   rl   r   rG   rH   c              3   &   K   | ]	  }|d      ywrJ   rL   rM   s     r:   rP   z5RedisSemanticCache.async_get_cache.<locals>.<genexpr>  rQ   rR   r   r   r   TrS   r   r   r   rT   rX   rY   r   ro   )r   rq   rr   g        zsemantic-similarityrp   r   r]   rt   ru   rv   rw   r   rx   ry   rz   r{   )r   r|   rm   r   r   r   r_   r,   r   r   r   r   aquery
setdefaultr>   r~   r   r   r+   rE   )r3   rc   r7   rm   r   r   rG   r]   r   r   r   rf   rY   r}   r   rp   r   r   r   s                      r:   async_get_cachez"RedisSemanticCache.async_get_cache   s    FvhOP-I *%D8DD ) '55nQ|_n5 	
 !d&:&:>P&P!::j"599."ML'1'<'<**#'T:$004 &

:r : > >z4 P	 (= 	( 	" (/'9'9**#'T:( " 'v.q1+>	1C

 

))%00?GJFj"-.CDgt$7|q KN!!*b12GH!!*%670(

8, 	4T5N5N4O~^h]iistzs{  |U  Vc  Ud  e	

 DN*b)*?@111"1:j1L/
|;MfXUfgtfuv (((FF  6	"" 1sD   A H)HB H)H!-H)<H$=:H)7H'8C*H)$H)'H)c                 R   K   | j                   j                          d {   S 7 w)N)r   ainfo)r3   s    r:   _index_infozRedisSemanticCache._index_infoJ  s     ZZ%%''''s   '%'c                    K   g }|D ]+  }|j                   | j                  |d   |d   fi |       - t        j                  |  d {    y 7 w)Nr   r   )appendr   asynciogather)r3   
cache_listr7   tasksvals        r:   async_set_cache_pipelinez+RedisSemanticCache.async_set_cache_pipelineM  sP     CLL---c!fc!fGGH nne$$$s   AA
AA)NNNNNFztext-embedding-ada-002)__name__
__module____qualname__r;   r   rE   ri   r   r   r   r   r   rL   rj   r:   r   r      sO     !0?DD &B5n6pL\(%rj   r   )__doc__rC   r   rA   typingr   r   litellm._loggingr   
base_cacher   r   rL   rj   r:   <module>r      s/         * !{% {%rj   