Ë
    uPêj®j  ã                   óÚ   — d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	m
Z
mZmZ ddl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mZmZ d	dlmZ e	rddlm Z   G d„ de«      Z!y)a—  
Redis Semantic Cache implementation for LiteLLM

The RedisSemanticCache provides semantic caching functionality using Redis as a backend.
This cache stores responses based on the semantic similarity of prompts rather than
exact matching, allowing for more flexible caching of LLM responses.

This implementation uses RedisVL's SemanticCache to find semantically similar prompts
and their cached responses.
é    N)ÚCallableÚMapping)ÚTYPE_CHECKINGÚAnyÚFinalÚcast)Úprint_verboseÚverbose_logger)Ú(SEMANTIC_CACHE_EMBEDDING_TIMEOUT_SECONDS)Úget_str_from_messages)ÚEmbeddingResponseé   )Úbuild_router_embedding_metadataÚ"resolve_embedding_max_input_tokensÚresolve_embedding_routerÚresolve_embedding_timeoutÚtruncate_embedding_input)Ú	BaseCache)ÚRouterc                   ó  — e Zd ZU dZdZeed<   dZeed<   dZe	dz  ed<   e
Zeed<   	 	 	 	 	 	 	 	 	 d6d	edz  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fd„Zedefd„«       Zej"                  deddfd„«       Zdefd„Zedeeef   fd„«       Zdedef   dedededef
d„Zdedeeef   fd„Zdedefd„Zdeeef   dedefd „Zde	dz  fd!„Zededz  fd"„«       Zeded#e e   ddfd$„«       Z!e"dedefd%„«       Z#d&ed'd(defd)„Z$d7d&ed*eeef   dz  de e   fd+„Z%d,edefd-„Z&dededdfd.„Z'dedefd/„Z(d7d&ed*eeef   dz  de e   fd0„Z)dededdfd1„Z*dedefd2„Z+deeef   fd3„Z,d4e e-eef      deddfd5„Z.y)8ÚRedisSemanticCachea  
    Redis-backed semantic cache for LLM responses.

    This cache uses vector similarity to find semantically similar prompts that have been
    previously sent to the LLM, allowing for cache hits even when prompts are not identical
    but carry similar meaning.
    Úlitellm_semantic_cache_indexÚDEFAULT_REDIS_INDEX_NAMEÚlitellm_cache_keyÚCACHE_KEY_FIELD_NAMENÚembedding_max_input_tokensÚembedding_timeoutÚhostÚportÚpasswordÚ	redis_urlÚsimilarity_thresholdÚembedding_modelÚ
index_nameÚkwargsc
                 ó  — |€| j                   }t        d|› �«       |€t        d«      ‚|| _        d|z
  | _        || _        || _        t        |	«      | _        |€Q	 |xs t        j                  d   }|xs t        j                  d   }|xs t        j                  d   }d|› d|› d|› �}t        d|› �«       || _        || _        d| _        y# t        $ r'}|j                  d   }t        d	|› d
|› d�«      |‚d}~ww xY w)a}  
        Initialize the Redis Semantic Cache.

        Args:
            host: Redis host address
            port: Redis port
            password: Redis password
            redis_url: Full Redis URL (alternative to separate host/port/password)
            similarity_threshold: Threshold for semantic similarity (0.0 to 1.0)
                where 1.0 requires exact matches and 0.0 accepts any match
            embedding_model: Model to use for generating embeddings
            index_name: Name for the Redis index
            embedding_max_input_tokens: Truncate prompts to this many tokens before
                embedding; defaults to the Router deployment's configured max_input_tokens
            embedding_timeout: Seconds a cache lookup may spend embedding the prompt before it
                gives up and lets the request continue to the LLM
            ttl: Default time-to-live for cache entries in seconds
            **kwargs: Additional arguments passed to the Redis client

        Raises:
            Exception: If similarity_threshold is not provided or required Redis
                connection information is missing
        Nz*Redis semantic-cache initializing index - z2similarity_threshold must be provided, passed Noner   Ú
REDIS_HOSTÚ
REDIS_PORTÚREDIS_PASSWORDr   z&Missing required Redis configuration: z
. Provide z or redis_url.z	redis://:ú@ú:z Redis semantic-cache redis_url: )r   r	   Ú
ValueErrorr"   Údistance_thresholdr#   r   r   r   ÚosÚenvironÚKeyErrorÚargsÚ_index_nameÚ
_redis_urlÚ	_llmcache)Úselfr   r   r    r!   r"   r#   r$   r   r   r%   ÚeÚmissing_vars                úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/caching/redis_semantic_cache.pyÚ__init__zRedisSemanticCache.__init__6   s?  € ðH ÐØ×6Ñ6ˆJäÐBÀ:À,ÐOÔPð  Ð'ÜÐQÓRÐRð %9ˆÔ!ð
 #$Ð&:Ñ":ˆÔØ.ˆÔØ*DˆÔ'Ü!:Ð;LÓ!MˆÔð Ðð
àÒ7œrŸz™z¨,Ñ7�ØÒ7œrŸz™z¨,Ñ7�Ø#ÒC¤r§z¡zÐ2BÑ'C�ð $ H :¨Q¨t¨f°A°d°VÐ<ˆIäÐ8¸¸ÐDÔEð &ˆÔØ#ˆŒØˆ�øô# ò à%&§V¡V¨A¡Y�Ü Ø<¸[¸MÈÐT_ÐS`Ð`nÐoóàðûðús   ÁAC Ã	D Ã"C;Ã;D Úreturnc                 ó^   — t        | dd «      €| j                  «       | _        | j                  S )Nr4   )ÚgetattrÚ_build_llmcacher4   )r5   s    r8   ÚllmcachezRedisSemanticCache.llmcacheˆ   s+   € ä�4˜ dÓ+Ð3Ø!×1Ñ1Ó3ˆDŒNØ�~‰~Ðó    Úvaluec                 ó   — || _         y ©N)r4   )r5   r@   s     r8   r>   zRedisSemanticCache.llmcacheŽ   s	   € àˆ�r?   c                 óâ   — ddl m} ddlm} 	  || j                  «      }| j                  || j                  | j                  |¬«      S # t        $ r}t        j                  d|«       ‚ d }~ww xY w)Nr   )ÚSemanticCache)ÚCustomTextVectorizer)Úsemantic_cache_clsr$   r!   Úcache_vectorizerz+Redis semantic-cache index build failed: %s)Úredisvl.extensions.llmcacherD   Úredisvl.utils.vectorizerE   Ú_get_embeddingÚ_init_semantic_cacher2   r3   Ú	Exceptionr
   Úerror)r5   rD   rE   rG   r6   s        r8   r=   z"RedisSemanticCache._build_llmcache’   su   € õ 	>Ý@ð
	Ù&:¸4×;NÑ;NÓ&OÐØ×,Ñ,Ø#0Ø×+Ñ+ØŸ/™/Ø!1ð	 -ó ð øô ò 	Ü× Ñ Ð!NÐPQÔRØûð	ús   Ž:A	 Á		A.ÁA)Á)A.c                 ó    — | j                   ddœS )NÚtag)ÚnameÚtype)r   )Úclss    r8   Ú_cache_key_filterable_fieldz.RedisSemanticCache._cache_key_filterable_field¥   s   € ð ×,Ñ,Øñ
ð 	
r?   rF   .rG   c           
      óØ  — dt         dt        fd„}	  ||||| j                  | j                  «       gd¬«      S # t         $ r§} ||«      s‚ |› d�}t	        d|› �«       	  ||||| j                  | j                  «       gd¬«      cY d }~S # t         $ rM} ||«      s‚ t	        d|› �«        ||||| j                  | j                  «       gd	¬«      cY d }~cY d }~S d }~ww xY wd }~ww xY w)
NÚexcr:   c                 ó^   ‡— t        | «      j                  «       Št        ˆfd„dD «       «      S )Nc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrB   © )Ú.0ÚphraseÚerror_messages     €r8   ú	<genexpr>zWRedisSemanticCache._init_semantic_cache.<locals>._is_schema_mismatch.<locals>.<genexpr>µ   s   øè ø€ Òg°6�v Ô.Ñgùs   ƒ)zschema does not matchzindex schema)ÚstrÚlowerÚany)rU   r[   s    @r8   Ú_is_schema_mismatchzDRedisSemanticCache._init_semantic_cache.<locals>._is_schema_mismatch³   s%   ø€ Ü#& s£8§>¡>Ó#3ˆMÜÓgÐ=fÔgÓgÐgr?   F)rP   r!   Ú
vectorizerr-   Úfilterable_fieldsÚ	overwriteÚ	_isolatedzSRedis semantic-cache existing index schema is not isolated; using isolated index - zQRedis semantic-cache isolated index schema is stale; recreating isolated index - T)r,   Úboolr-   rS   r	   )	r5   rF   r$   r!   rG   r`   rU   Úisolated_index_nameÚisolated_excs	            r8   rK   z'RedisSemanticCache._init_semantic_cache¬   s4  € ð	h¤Zð 	h´Dó 	hð*	Ù%ØØ#Ø+Ø#'×#:Ñ#:Ø#'×#CÑ#CÓ#EÐ"FØôð øô ò !	Ù& sÔ+Øà,6¨<°yÐ)AÐÜð*Ø*=Ð)>ð@ôðÙ)Ø,Ø'Ø/Ø'+×'>Ñ'>Ø'+×'GÑ'GÓ'IÐ&JØ#ôõ øô ò Ù*¨<Ô8Øäð3Ø3FÐ2GðIôñ *Ø,Ø'Ø/Ø'+×'>Ñ'>Ø'+×'GÑ'GÓ'IÐ&JØ"ô÷ ò ûðþð%!	úsK   ’&9 ¹	C)ÁC$Á&BÂC)Â	C!Â=CÃC!ÃC$ÃC)ÃC!Ã!C$Ã$C)Úkeyc                 ó0   — | j                   t        |«      iS rB   )r   r]   )r5   rh   s     r8   Ú_get_cache_filtersz%RedisSemanticCache._get_cache_filtersã   s   € Ø×)Ñ)¬3¨s«8Ð4Ð4r?   c                 óJ   — ddl m}  || j                  «      t        |«      k(  S )Nr   )ÚTag)Úredisvl.query.filterrl   r   r]   )r5   rh   rl   s      r8   Ú _get_cache_key_filter_expressionz3RedisSemanticCache._get_cache_key_filter_expressionæ   s   € Ý,á�4×,Ñ,Ó-´°S³Ñ9Ð9r?   Ú	cache_hitc                 ó´   — |j                  | j                  «      }t        |t        «      r|j	                  d«      }|d uxr t        |«      t        |«      k(  S )Núutf-8)Úgetr   Ú
isinstanceÚbytesÚdecoder]   )r5   ro   rh   Ú
cached_keys       r8   Ú_cache_hit_matches_keyz)RedisSemanticCache._cache_hit_matches_keyë   sO   € ð —]‘] 4×#<Ñ#<Ó=ˆ
Ü�j¤%Ô(Ø#×*Ñ*¨7Ó3ˆJØ Ð%ÒE¬#¨j«/¼SÀ»XÑ*EÐEr?   c                 óB   — |j                  d«      }|�t        |«      }|S )a  
        Get the TTL (time-to-live) value for cache entries.

        Args:
            **kwargs: Keyword arguments that may contain a custom TTL

        Returns:
            Optional[int]: The TTL value in seconds, or None if no TTL should be applied
        Úttl)rr   Úint)r5   r%   ry   s      r8   Ú_get_ttlzRedisSemanticCache._get_ttló   s%   € ð �j‰j˜ÓˆØˆ?Ü�c“(ˆCØˆ
r?   c                 óØ   — |j                  d«      }|rt        |«      S d|vryg }| j                  |j                  d«      |«       dj                  |«      j	                  «       }|xs dS )z\
        Extract a semantic-cache prompt from chat or Responses API request kwargs.
        ÚmessagesÚinputNú
)rr   r   Ú_collect_responses_input_textÚjoinÚstrip)rR   r%   r}   Úprompt_partsÚprompts        r8   Ú_get_prompt_from_kwargsz*RedisSemanticCache._get_prompt_from_kwargs  sj   € ð
 !Ÿ*™* ZÓ0ˆÙÜ(¨Ó2Ð2à˜&Ñ Øà)+ˆØ×)Ñ)¨&¯*©*°WÓ*=¸|ÔLØŸ	™	 ,Ó/×5Ñ5Ó7ˆØŠ~˜Ðr?   rƒ   c                 óÖ  — | j                  |«      }|€y t        |t        «      r$|j                  «       }|r|j	                  |«       y t        |t
        t        f«      r|D ]  }| j                  ||«       Œ y t        |t        «      ru|j                  d«      }|�| j                  ||«       y dD ]I  }|j                  |«      }t        |t        «      sŒ%|j                  «       }|sŒ8|j	                  |«        y  y t        |dd «      }|�| j                  ||«       y dD ]E  }t        ||d «      }t        |t        «      sŒ!|j                  «       }|sŒ4|j	                  |«        y  y )NÚcontent)ÚtextÚoutputÚ
input_textÚoutput_text)Ú_coerce_response_input_valuers   r]   r‚   ÚappendÚlistÚtupler€   Údictrr   r<   )	rR   r@   rƒ   Ústripped_valueÚitemr‡   Útext_keyÚ
text_valueÚstripped_texts	            r8   r€   z0RedisSemanticCache._collect_responses_input_text  sd  € à×0Ñ0°Ó7ˆØˆ=Øä�eœSÔ!Ø$)§K¡K£MˆNÙØ×#Ñ# NÔ3Øä�eœd¤E˜]Ô+Øò F�Ø×1Ñ1°$¸ÕEðFàä�eœTÔ"Ø—i‘i 	Ó*ˆGØÐ"Ø×1Ñ1°'¸<ÔHØàKò �Ø"ŸY™Y xÓ0�
Ü˜j¬#Õ.Ø$.×$4Ñ$4Ó$6�MÚ$Ø$×+Ñ+¨MÔ:Ùðð ä˜% ¨DÓ1ˆØÐØ×-Ñ-¨g°|ÔDØàGò 	ˆHÜ  ¨°$Ó7ˆJÜ˜*¤cÕ*Ø *× 0Ñ 0Ó 2�Ú Ø ×'Ñ'¨Ô6Ùñ	r?   c                 ó‚   — t        | dd «      }t        |«      r |«       S t        | dd «      }t        |«      r |«       S | S )NÚ
model_dumpr�   )r<   Úcallable)r@   r—   Údict_methods      r8   rŒ   z/RedisSemanticCache._coerce_response_input_value@  sC   € ä# E¨<¸Ó>ˆ
Ü�JÔÙ“<ÐÜ$ U¨F°DÓ9ˆÜ�KÔ Ù“=Ð Øˆr?   r„   ÚrouterzRouter | Nonec           	      ón   — t        || j                  t        | j                  | j                  |«      «      S rB   )r   r#   r   r   )r5   r„   rš   s      r8   Ú_embedding_inputz#RedisSemanticCache._embedding_inputJ  s5   € Ü'ØØ× Ñ Ü.¨t×/NÑ/NÐPT×PdÑPdÐflÓmó
ð 	
r?   Úmetadatac                 ó°  — 	 ddl m}m} t	        | j
                  ||«      }| j                  ||«      }|�Ft        t        |j                  | j
                  |dddœt        |«      | j                  d¬«      «      }n?t        t        t        j                  | j
                  |dddœ| j                  d¬«      «      }|d   d   d	   S # t        $ r d}d}Y ŒÊw xY w)
zí
        Routes through the proxy Router when the embedding model is a Router
        deployment so per-deployment auth (e.g. Bedrock aws_role_name) applies,
        mirroring ``_get_async_embedding``; otherwise embeds directly.
        r   ©Úllm_model_listÚ
llm_routerNT©zno-storezno-cache©Úmodelr~   Úcacher�   ÚtimeoutÚnum_retries©r¤   r~   r¥   r¦   r§   ÚdataÚ	embedding)Úlitellm.proxy.proxy_serverr    r¡   ÚImportErrorr   r#   rœ   r   r   rª   r   r   Úlitellm)r5   r„   r�   r    r¡   rš   Úembedding_inputÚembedding_responses           r8   rJ   z!RedisSemanticCache._get_embeddingQ  sò   € ð	ßMô
 1°×1EÑ1EÀzÐSaÓbˆØ!%×!6Ñ!6°v¸vÓ!FˆØÐÜ!%Ü!Ø× Ñ Ø×.Ñ.Ø)Ø'+¸Ñ>Ü<¸XÓFØ ×2Ñ2Ø !ð !ó ó
"Ñô "&Ü!Ü×!Ñ!Ø×.Ñ.Ø)Ø'+¸Ñ>Ø ×2Ñ2Ø !ôó	"Ðð " &Ñ)¨!Ñ,¨[Ñ9Ð9øô; ò 	Ø!ˆNØŠJð	ús   ‚C ÃCÃCÚcached_responsec                 ó2  — |€|S t        |t        «      r|j                  d«      }	 t        j                  |«      }|S # t        j
                  $ rE 	 t        j                  |«      }Y |S # t        t        f$ r}t        d|› �«       Y d}~Y yd}~ww xY ww xY w)zÞ
        Process the cached response to prepare it for use.

        Args:
            cached_response: The raw cached response

        Returns:
            The processed cache response, or None if input was None
        Nrq   zError parsing cached response: )rs   rt   ru   ÚjsonÚloadsÚJSONDecodeErrorÚastÚliteral_evalr,   ÚSyntaxErrorr	   )r5   r°   r6   s      r8   Ú_get_cache_logicz#RedisSemanticCache._get_cache_logicx  s¥   € ð Ð"Ø"Ð"ô �o¤uÔ-Ø-×4Ñ4°WÓ=ˆOð	Ü"Ÿj™j¨Ó9ˆOð Ðøô ×#Ñ#ò 	ðÜ"%×"2Ñ"2°?Ó"C‘ð
 Ðøô	 ¤Ð,ò ÜÐ ?À¸sÐCÔDÝûðúð	ús-   §> ¾BÁA*Á*BÁ9BÂBÂBÂBc                 ó¾  — t        d|› �«       d}	  | j                  d
i |¤Ž}|€t        d«       yt        |«      }| j                  ||j	                  d«      ¬«      }|| j                  |«      dœ} | j                  d
i |¤Ž}|�t        |«      |d<    | j                  j                  ||fi |¤Ž y# t        $ r}	t        d|xs |› d	|	› �«       Y d}	~	yd}	~	ww xY w)a=  
        Store a value in the semantic cache.

        Args:
            key: The cache key used to isolate semantic cache entries
            value: The response value to cache
            **kwargs: Additional arguments including 'messages' for the prompt
                and optional 'ttl' for time-to-live
        z(Redis semantic-cache set_cache, kwargs: Nú'No prompt provided for semantic cachingr�   ©r�   ©ÚvectorÚfiltersry   zError setting z in the Redis semantic cache: rX   )r	   r…   r]   rJ   rr   rj   r{   rz   r>   ÚstorerL   )
r5   rh   r@   r%   Ú	value_strr„   Úprompt_embeddingÚstore_kwargsry   r6   s
             r8   Ú	set_cachezRedisSemanticCache.set_cache•  sþ   € ô 	Ð@ÀÀÐIÔJà $ˆ	ð	bØ8˜D×8Ñ8ÑB¸6ÑBˆFØˆ~ÜÐGÔHØä˜E›
ˆIà&*×&9Ñ&9¸&È6Ï:É:ÐV`ÓKaÐ&9Ó&bÐð +Ø×2Ñ2°3Ó7ñ3ˆLð '˜Ÿ™Ñ0¨Ñ0ˆCØˆÜ&)¨#£h�˜UÑ#ØˆD�M‰M×Ñ ¨	ÑB°\ÓBøÜò 	bÜ˜N¨9Ò+=¸Ð*>Ð>\Ð]^Ð\_Ð`×aÑaûð	bús   ’B4 ²BB4 Â4	CÂ=CÃCc           
      ó  — t        d|› �«       	  | j                  di |¤Ž}|€!t        d«       d|j                  di «      d<   y| j                  ||j	                  d«      ¬«      }||| j                  |«      dœ} | j                  j                  di |¤Ž}|sd|j                  di «      d<   y|d	   }| j                  ||¬
«      s!t        d«       d|j                  di «      d<   yt        |d   «      }d|z
  }	|d   }
|d   }|	|j                  di «      d<   t        d| j                  › d|	› d|› d|
› �«       | j                  |¬«      S # t        $ r-}t        d|› �«       d|j                  di «      d<   Y d}~yd}~ww xY w)aM  
        Retrieve a semantically similar cached response.

        Args:
            key: The cache key used to isolate semantic cache entries
            **kwargs: Additional arguments including 'messages' for the prompt

        Returns:
            The cached response if a semantically similar prompt is found, else None
        z(Redis semantic-cache get_cache, kwargs: Nú,No prompt provided for semantic cache lookupç        r�   úsemantic-similarityr»   ©r„   r½   Úfilter_expressionr   ©ro   rh   ú6Redis semantic-cache hit did not match cache key scopeÚvector_distancer   r„   Úresponseú!Cache hit: similarity threshold: ú, actual similarity: ú, current prompt: ú, cached prompt: ©r°   z,Error retrieving from Redis semantic cache: rX   )r	   r…   Ú
setdefaultrJ   rr   rn   r>   Úcheckrw   Úfloatr"   r¸   rL   ©r5   rh   r%   r„   rÁ   Úcheck_kwargsÚresultsro   rÌ   Ú
similarityÚcached_promptr°   r6   s                r8   Ú	get_cachezRedisSemanticCache.get_cache¹  sè  € ô 	Ð@ÀÀÐIÔJð3	KØ8˜D×8Ñ8ÑB¸6ÑBˆFØˆ~ÜÐLÔMØKN�×!Ñ! *¨bÓ1Ð2GÑHØð '+×&9Ñ&9¸&È6Ï:É:ÐV`ÓKaÐ&9Ó&bÐà Ø*Ø%)×%JÑ%JÈ3Ó%Oñ9ˆLð
 1˜TŸ]™]×0Ñ0Ñ@°<Ñ@ˆGñ ØKN�×!Ñ! *¨bÓ1Ð2GÑHØð  ' q™zˆIØ×.Ñ.¸ÈÐ.ÔLÜÐVÔWØKN�×!Ñ! *¨bÓ1Ð2GÑHØÜ%*¨9Ð5FÑ+GÓ%HˆOð
 !" OÑ 3ˆJà#,¨XÑ#6ˆMØ%.¨zÑ%:ˆOð HRˆF×Ñ˜j¨"Ó-Ð.CÑDäØ3°D×4MÑ4MÐ3Nð O&Ø&0 \ð 2#Ø#) (ð +"Ø"/ ð2ôð ×(Ñ(¸Ð(ÓIÐIøÜò 	KÜÐHÈÈÐLÔMØGJˆF×Ñ˜j¨"Ó-Ð.CÖDûð	Kús+   �4E ÁA*E Â08E Ã)A$E Å	FÅ#E?Å?Fc              ƒ   ó0  K  — 	 ddl m}m} t	        | j
                  ||«      }| j                  ||«      }|�7|j                  | j
                  |dddœt        |«      | j                  d¬«      n0t        j                  | j
                  |dddœ| j                  d¬«      }	 t        j                  || j                  «      ƒ d{  –—† }|d   d   d	   S # t        $ r d}d}Y ŒÖw xY w7 Œ"# t        $ r"}	t        d
|	› �«       t        d|	› �«      |	‚d}	~	ww xY w­w)a#  
        Asynchronously generate an embedding for the given prompt.

        Args:
            prompt: The text to generate an embedding for
            metadata: Request metadata forwarded to the Router embedding call

        Returns:
            List[float]: The embedding vector
        r   rŸ   NTr¢   r£   r¨   r©   rª   z"Error generating async embedding: zFailed to generate embedding: )r«   r    r¡   r¬   r   r#   rœ   Ú
aembeddingr   r   r­   ÚasyncioÚwait_forrL   r	   r,   )
r5   r„   r�   r    r¡   rš   r®   Úembedding_callr¯   r6   s
             r8   Ú_get_async_embeddingz'RedisSemanticCache._get_async_embeddingû  s?  è ø€ ð	ßMô
 1°×1EÑ1EÀzÐSaÓbˆØ!%×!6Ñ!6°v¸vÓ!Fˆð Ð!ð ×ÑØ×*Ñ*Ø%Ø#'°TÑ:Ü8¸ÓBØ×.Ñ.Øð ô ô ×#Ñ#Ø×*Ñ*Ø%Ø#'°TÑ:Ø×.Ñ.Øôð 	ð$	JÜ.5×.>Ñ.>¸~Èt×OeÑOeÓ.f×(fÐØ% fÑ-¨aÑ0°Ñ=Ð=øô5 ò 	Ø!ˆNØŠJð	úð2 )gùäò 	JÜÐ>¸q¸cÐBÔCÜÐ=¸a¸SÐAÓBÈÐIûð	Jüs^   ‚D„C ŒBDÂ #C( ÃC&ÃC( ÃDÃC#Ã DÃ"C#Ã#DÃ&C( Ã(	DÃ1DÄDÄDc              ‹   óÊ  K  — t        d|› �«       	  | j                  d	i |¤Ž}|€t        d«       yt        |«      }| j                  ||j	                  d«      ¬«      ƒ d{  –—† }|| j                  |«      dœ} | j                  d	i |¤Ž}|�||d<    | j                  j                  ||fi |¤Žƒ d{  –—†  y7 ŒX7 Œ# t        $ r}	t        d|	› �«       Y d}	~	yd}	~	ww xY w­w)
aL  
        Asynchronously store a value in the semantic cache.

        Args:
            key: The cache key used to isolate semantic cache entries
            value: The response value to cache
            **kwargs: Additional arguments including 'messages' for the prompt
                and optional 'ttl' for time-to-live
        z.Async Redis semantic-cache set_cache, kwargs: Nrº   r�   r»   r¼   ry   zError in async_set_cache: rX   )
r	   r…   r]   rá   rr   rj   r{   r>   ÚastorerL   )
r5   rh   r@   r%   r„   rÀ   rÁ   rÂ   ry   r6   s
             r8   Úasync_set_cachez"RedisSemanticCache.async_set_cache'  s  è ø€ ô 	ÐFÀvÀhÐOÔPð	<Ø8˜D×8Ñ8ÑB¸6ÑBˆFØˆ~ÜÐGÔHØä" 5›zˆIð -1×,EÑ,EÀfÐW]×WaÑWaÐblÓWmÐ,EÓ,n×&nÐð +Ø×2Ñ2°3Ó7ñ3ˆLð '˜Ÿ™Ñ0¨Ñ0ˆCØˆØ&)�˜UÑ#Ø&�$—-‘-×&Ñ&ØØñð ñ÷ ñ ð 'oøðùô
 ò 	<ÜÐ6°q°cÐ:×;Ñ;ûð	<üs]   ‚C#’B? ±C#²0B? Á"B;Á#AB? Â5B=Â6B? Â:C#Â;B? Â=B? Â?	C ÃCÃC#ÃC Ã C#c           
   ‹   ó>  K  — t        d|› �«       	  | j                  di |¤Ž}|€!t        d«       d|j                  di «      d<   y| j                  ||j	                  d«      ¬«      ƒ d{  –—† }||| j                  |«      dœ} | j                  j                  di |¤Žƒ d{  –—† }|sd|j                  di «      d<   y|d	   }| j                  ||¬
«      s!t        d«       d|j                  di «      d<   yt        |d   «      }d|z
  }	|d   }
|d   }|	|j                  di «      d<   t        d| j                  › d|	› d|› d|
› �«       | j                  |¬«      S 7 Œó7 Œ¼# t        $ r-}t        d|› �«       d|j                  di «      d<   Y d}~yd}~ww xY w­w)a\  
        Asynchronously retrieve a semantically similar cached response.

        Args:
            key: The cache key used to isolate semantic cache entries
            **kwargs: Additional arguments including 'messages' for the prompt

        Returns:
            The cached response if a semantically similar prompt is found, else None
        z.Async Redis semantic-cache get_cache, kwargs: NrÅ   rÆ   r�   rÇ   r»   rÈ   r   rÊ   rË   rÌ   r   r„   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   zError in async_get_cache: rX   )r	   r…   rÓ   rá   rr   rn   r>   Úacheckrw   rÕ   r"   r¸   rL   rÖ   s                r8   Úasync_get_cachez"RedisSemanticCache.async_get_cacheO  s  è ø€ ô 	ÐFÀvÀhÐOÔPð4	KØ8˜D×8Ñ8ÑB¸6ÑBˆFØˆ~ÜÐLÔMØKN�×!Ñ! *¨bÓ1Ð2GÑHØð -1×,EÑ,EÀfÐW]×WaÑWaÐblÓWmÐ,EÓ,n×&nÐð
 !Ø*Ø%)×%JÑ%JÈ3Ó%Oñ9ˆLð
 $8 4§=¡=×#7Ñ#7Ñ#G¸,Ñ#G×GˆGñ ØKN�×!Ñ! *¨bÓ1Ð2GÑHØà& q™zˆIØ×.Ñ.¸ÈÐ.ÔLÜÐVÔWØKN�×!Ñ! *¨bÓ1Ð2GÑHØÜ%*¨9Ð5FÑ+GÓ%HˆOð
 !" OÑ 3ˆJà#,¨XÑ#6ˆMØ%.¨zÑ%:ˆOð HRˆF×Ñ˜j¨"Ó-Ð.CÑDäØ3°D×4MÑ4MÐ3Nð O&Ø&0 \ð 2#Ø#) (ð +"Ø"/ ð2ôð ×(Ñ(¸Ð(ÓIÐIðS 'oøð HùôB ò 	KÜÐ6°q°cÐ:Ô;ØGJˆF×Ñ˜j¨"Ó-Ð.CÖDûð	Küsw   ‚F’4E$ ÁFÁ%E$ Á,E Á-8E$ Â%E"Â&E$ ÃFÃ8E$ Ã:FÃ;A$E$ ÅFÅ E$ Å"E$ Å$	FÅ-#FÆFÆFÆFc              ƒ   ó†   K  — | j                   j                  «       ƒ d{  –—† }|j                  «       ƒ d{  –—† S 7 Œ7 Œ­w)zˆ
        Get information about the Redis index.

        Returns:
            Dict[str, Any]: Information about the Redis index
        N)r>   Ú_get_async_indexÚinfo)r5   Úaindexs     r8   Ú_index_infozRedisSemanticCache._index_info’  s5   è ø€ ð #Ÿm™m×<Ñ<Ó>×>ˆØ—[‘[“]×"Ð"ð ?øØ"ús   ‚A =¡A¸?¹A¿AÚ
cache_listc              ‹   óò   K  — 	 g }|D ]+  }|j                   | j                  |d   |d   fi |¤Ž«       Œ- t        j                  |Ž ƒ d{  –—†  y7 Œ# t        $ r}t        d|› �«       Y d}~yd}~ww xY w­w)zÄ
        Asynchronously store multiple values in the semantic cache.

        Args:
            cache_list: List of (key, value) tuples to cache
            **kwargs: Additional arguments
        r   r   Nz#Error in async_set_cache_pipeline: )r�   rä   rÞ   ÚgatherrL   r	   )r5   rí   r%   ÚtasksÚvalr6   s         r8   Úasync_set_cache_pipelinez+RedisSemanticCache.async_set_cache_pipelineœ  s�   è ø€ ð	EØˆEØ!ò M�Ø—‘Ð1˜T×1Ñ1°#°a±&¸#¸a¹&ÑKÀFÑKÕLðMä—.‘. %Ð(×(Ò(ùÜò 	EÜÐ?À¸sÐC×DÑDûð	EüsA   ‚A7„AA ÁAÁA ÁA7ÁA Á	A4ÁA/Á*A7Á/A4Á4A7)	NNNNNztext-embedding-ada-002NNNrB   )/Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r]   Ú__annotations__r   r   rz   r   r   rÕ   Úobjectr9   Úpropertyr>   Úsetterr=   Úclassmethodr�   rS   r   rK   rj   rn   r   re   rw   r{   r…   r   rŽ   r€   ÚstaticmethodrŒ   rœ   rJ   r¸   rÃ   rÛ   rá   rä   rç   rì   r�   rò   rX   r?   r8   r   r   (   s¯  … ñð %CÐ˜cÓBØ 3Ð˜#Ó3Ø-1Ð  d¡
Ó1ØGÐ�uÓGð  ØØ#Ø $Ø-1Ø7Ø!%Ø15Ø*.ñPà�D‰jðPð �D‰jðPð ˜‘*ð	Pð
 ˜‘:ðPð $ d™lðPð ðPð ˜$‘JðPð %(¨$¡JðPð ! 4™<ðPð óPðd ð˜&ò ó ðð
 ‡_�_ð˜fð ¨ò ó ðð ó ð& ð
¨D°°c°©Nò 
ó ð
ð5à$ S¨& [Ñ1ð5ð ð5ð ð	5ð
 !ð5ð 
ó5ðn5 cð 5¨d°3¸°8©nó 5ð:°Cð :¸Fó :ð
F°¸¸V¸Ñ0Dð FÈ3ð FÐSWó Fð C¨$¡Jó ð ð°#¸±*ò ó ðð  ð*°#ð *ÀTÈ#ÁYð *ÐSWò *ó ð*ðX ð¨Fð °vò ó ðð
 sð 
°Oð 
Èó 
ñ%: Sð %:°D¸¸c¸±NÀTÑ4Ið %:ÐUYÐZ_ÑU`ó %:ðN°ð ¸ó ð:"b˜Sð "b¨ð "b¸dó "bðH@K˜Sð @K¨vó @KñD*J°ð *JÀÀSÈ#ÀXÁÐQUÑ@Uð *JÐaeÐfkÑaló *JðX&<¨ð &<°Vð &<È$ó &<ðPAK¨ð AK¸6ó AKðF# 7¨3°¨;Ñ#7ó #ðE¸¸eÀCÈÀH¹oÑ9Nð EÐZ`ð EÐeiô Er?   r   )"rö   rµ   rÞ   r²   r.   Úcollections.abcr   r   Útypingr   r   r   r   r­   Úlitellm._loggingr	   r
   Úlitellm.constantsr   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr   Úlitellm.types.utilsr   Ú_embedding_routerr   r   r   r   r   Ú
base_cacher   Úlitellm.routerr   r   rX   r?   r8   ú<module>r     sY   ðñ	ó Û Û Û 	ß -ß 2Ó 2ã ß :Ý Fõõ 2÷õ õ "áÝ%ôB
E˜õ B
Er?   