Ë
    uPêjŽ7  ã                   ó  — d Z ddlZddlZddlZddlmZ ddl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mZ ddlm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mZ  edd¬«       G d„ d«      «       Z  G d„ de«      Z!y)aè  
Valkey Semantic Cache implementation for LiteLLM

Backs semantic caching with Valkey (for example AWS ElastiCache for Valkey)
running the valkey-search module.

RedisVL cannot drive valkey-search: it gates on a RediSearch module version
that valkey-search does not report, and its SemanticCache index uses a TEXT
field that valkey-search does not implement. This backend therefore talks to
valkey-search directly over redis-py, building a vector index from the field
types valkey-search does support (TAG for cache-key isolation and VECTOR for
the prompt embedding) and running KNN queries for retrieval. Prompt extraction,
embedding generation, and cached-response parsing are reused from
RedisSemanticCache since those are backend agnostic.
é    N)Ú	dataclass)ÚAnyÚFinal)ÚRedis)ÚTagFieldÚVectorField)ÚIndexDefinitionÚ	IndexType)ÚQuery)Úprint_verbose)Úuuid)Úbuild_valkey_urlÚpack_vectoré   )Úresolve_embedding_timeout)ÚRedisSemanticCacheT)ÚfrozenÚslotsc                   ó"   — e Zd ZU eed<   eed<   y)Ú_ValkeyCacheHitÚresponseÚdistanceN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__Úfloat© ó    új/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/caching/valkey_semantic_cache.pyr   r   %   s   … àƒMØ„Or    r   c                   ó  — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed	<   d
Z
eed<   	 	 	 	 	 	 	 	 	 	 	 	 	 d;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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fd„Zed<dedz  dedz  dedz  dedef
d„«       Zededefd„«       Zedee   defd „«       Zd!edeeef   fd"„Zdefd#„Zed$edefd%„«       Z ed&e!dedz  fd'„«       Z"d&e!d!eddfd(„Z#d!eddfd)„Z$d!eddfd*„Z%dedefd+„Z&deded,edee   de!f
d-„Z'dede(fd.„Z)ed/ede*dz  fd0„«       Z+d1e*dz  dededefd2„Z,ded3ededdfd4„Z-dededefd5„Z.ded3ededdfd6„Z/dededefd7„Z0d8eeeef      deddfd9„Z1de!fd:„Z2y)=ÚValkeySemanticCachez/Valkey-backed semantic cache for LLM responses.Úlitellm_semantic_cache_indexÚDEFAULT_VALKEY_INDEX_NAMEÚ	embeddingÚEMBEDDING_FIELD_NAMEÚpromptÚPROMPT_FIELD_NAMEr   ÚRESPONSE_FIELD_NAMEÚvector_distanceÚDISTANCE_FIELD_NAMENÚhostÚportÚpasswordÚ	redis_urlÚsimilarity_thresholdÚembedding_modelÚ
index_nameÚsslÚstartup_nodesÚsync_clientÚasync_clientÚembedding_max_input_tokensÚembedding_timeoutÚkwargsc                 óÆ  — |€t        d«      ‚|	rt        d«      ‚|| _        || _        || _        t	        |«      | _        |xs | j                  | _        | j                  › d�| _        d | _	        d }|
�|€|xs | j                  ||||«      }|
�|
nt        j                  |«      | _        |�|nt        j                  |«      | _        t!        d| j                  › �«       y )Nz2similarity_threshold must be provided, passed Nonea…  valkey-semantic does not support cluster-mode-enabled (multi-shard) endpoints. The async cluster client cannot route the FT.* search commands reliably. Point it at a cluster-mode-disabled endpoint instead (a primary with replicas is fine; only horizontal sharding is unsupported), or pass a single redis_url. On AWS, vector search needs ElastiCache for Valkey 8.2+ on a node-based cluster.ú:z+Valkey semantic-cache initializing index - )Ú
ValueErrorr1   r2   r8   r   r9   r%   r3   Ú
key_prefixÚ
_index_dimÚ_build_valkey_urlr   Úfrom_urlr6   Ú
AsyncRedisr7   r   )Úselfr-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   Úresolved_urls                   r!   Ú__init__zValkeySemanticCache.__init__4   sõ   € ð"  Ð'ÜÐQÓRÐRáÜðMóð ð %9ˆÔ!Ø.ˆÔØ*DˆÔ'Ü!:Ð;LÓ!MˆÔØ$ÒF¨×(FÑ(FˆŒØ!Ÿ_™_Ð-¨QÐ/ˆŒØ&*ˆŒàˆØÐ ,Ð"6Ø$ÒY¨×(>Ñ(>¸tÀTÈ8ÐUXÓ(YˆLØ*5Ð*A™;ÄuÇ~Á~ÐVbÓGcˆÔØ,8Ð,D™LÌ*×J]ÑJ]Ð^jÓJkˆÔäÐCÀDÇOÁOÐCTÐUÕVr    Úreturnc                 óÖ  — | xs@ t         j                  j                  d«      xs t         j                  j                  d«      }|xs@ t         j                  j                  d«      xs t         j                  j                  d«      }|xs@ t         j                  j                  d«      xs t         j                  j                  d«      }|r|st        d«      ‚t	        ||||¬«      S )	NÚVALKEY_HOSTÚ
REDIS_HOSTÚVALKEY_PORTÚ
REDIS_PORTÚVALKEY_PASSWORDÚREDIS_PASSWORDzmMissing required Valkey configuration. Provide host and port (or VALKEY_HOST/VALKEY_PORT), or pass redis_url.)r-   r.   r/   r4   )ÚosÚenvironÚgetr=   r   )r-   r.   r/   r4   Úresolved_hostÚresolved_portÚresolved_passwords          r!   r@   z%ValkeySemanticCache._build_valkey_urlb   s´   € à#Òd¤r§z¡z§~¡~°mÓ'DÒdÌÏ
É
ÏÉÐWcÓHdˆØ#Òd¤r§z¡z§~¡~°mÓ'DÒdÌÏ
É
ÏÉÐWcÓHdˆØ#+Ò#t¬r¯z©z¯~©~Ð>OÓ/PÒ#tÔTV×T^ÑT^×TbÑTbÐcsÓTtÐá¡MÜðCóð ô
   ]¸ÐQbÐhkÔlÐlr    Úkeyc                 óx   — t        j                  t        |«      j                  d«      «      j	                  «       S )Nzutf-8)ÚhashlibÚsha256r   ÚencodeÚ	hexdigest)ÚclsrT   s     r!   Ú
_scope_tagzValkeySemanticCache._scope_tagp   s)   € ô �~‰~œc #›hŸo™o¨gÓ6Ó7×AÑAÓCÐCr    c                 ó   — t        | «      S ©N)r   )r&   s    r!   Ú_embedding_to_bytesz'ValkeySemanticCache._embedding_to_bytesx   s   € ä˜9Ó%Ð%r    Údimc           	      ób   — t        | j                  «      t        | j                  dd|ddœ«      fS )NÚHNSWÚFLOAT32ÚCOSINE)ÚTYPEÚDIMÚDISTANCE_METRIC)r   ÚCACHE_KEY_FIELD_NAMEr   r'   )rC   r_   s     r!   Ú_index_schemaz!ValkeySemanticCache._index_schema|   s8   € ä�T×.Ñ.Ó/ÜØ×)Ñ)ØØ"¨3À8ÑLóð
ð 	
r    c                 óN   — t        | j                  gt        j                  ¬«      S )N)ÚprefixÚ
index_type)r	   r>   r
   ÚHASH©rC   s    r!   Ú_index_definitionz%ValkeySemanticCache._index_definition†   s   € Ü t§¡Ð&7ÄIÇNÁNÔSÐSr    Úexcc                 ó8   — dt        | «      j                  «       v S )Nzalready exists)r   Úlower)ro   s    r!   Ú_is_index_exists_errorz*ValkeySemanticCache._is_index_exists_error‰   s   € à¤3 s£8§>¡>Ó#3Ð3Ð3r    Úinfoc           
      óP  — | j                  d«      xs g D ]ˆ  }t        |t        t        f«      sŒ|D ��cg c]$  }t        |t        t        f«      r|n|gD ]  }|‘Œ Œ& }}}t	        |«      D ]0  \  }}|dv sŒ|dz   t        |«      k  sŒt        ||dz      «      c c S  ŒŠ y c c}}w )NÚ
attributes)s
   dimensionsÚ
dimensionsr   )rP   Ú
isinstanceÚlistÚtupleÚ	enumerateÚlenÚint)rs   ÚfieldÚitemÚsubÚflatÚiÚmarkers          r!   Ú_extract_index_dimz&ValkeySemanticCache._extract_index_dim�   s³   € ð
 —X‘X˜lÓ+Ò1¨rò 	,ˆEÜ˜e¤d¬E ]Ô3ØØ$)×k˜D¼jÈÔPTÔV[È}Ô>]±dÐdhÐciÒk¨c’CÐk�CÐkˆDÑkÜ& t›_ò ,‘	��6ØÐ:Ò:¸qÀ1¹uÄsÈ4ÃyÓ?PÜ˜t A¨¡E™{Ó+Ô+ñ,ð		,ð ùó	 ls   µ)B"c           	      ót   — | j                  |«      }|�%||k7  rt        d| j                  › d|› d|› d�«      ‚y y )NzValkey semantic-cache index 'z*' already exists with embedding dimension z8, but the configured embedding model produced dimension zN. Use a different valkey_semantic_cache_index_name or drop the existing index.)rƒ   r=   r3   )rC   rs   r_   Úexisting_dims       r!   Ú_assert_dim_matchesz'ValkeySemanticCache._assert_dim_matches›   sa   € Ø"×5Ñ5°dÓ;ˆØÐ#¨¸Ò(;ÜØ/°·±Ð/@ð A'Ø'3 nð 5,Ø,/¨5ð 1OðPóð ð )<Ð#r    c                 ó¾  — | j                   |k(  ry 	 | j                  j                  | j                  «      j	                  | j                  |«      | j                  «       ¬«       || _         y # t        $ rf}| j                  |«      s‚ | j                  | j                  j                  | j                  «      j                  «       |«       Y d }~|| _         y d }~ww xY w©N)Ú
definition)r?   r6   Úftr3   Úcreate_indexrh   rn   Ú	Exceptionrr   r†   rs   )rC   r_   ro   s      r!   Ú_ensure_index_syncz&ValkeySemanticCache._ensure_index_sync¥   s¿   € Ø�?‰?˜cÒ!Øð	WØ×Ñ×Ñ §¡Ó0×=Ñ=Ø×"Ñ" 3Ó'°D×4JÑ4JÓ4Lð >ô ð ˆ�øô	 ò 	WØ×.Ñ.¨sÔ3ØØ×$Ñ$ T×%5Ñ%5×%8Ñ%8¸¿¹Ó%I×%NÑ%NÓ%PÐRU×VÐVØˆ�ûð		Wús   ’AA- Á-	CÁ6ACÃCc              ƒ   óð  K  — | j                   |k(  ry 	 | j                  j                  | j                  «      j	                  | j                  |«      | j                  «       ¬«      ƒ d {  –—†  || _         y 7 Œ# t        $ rq}| j                  |«      s‚ | j                  j                  | j                  «      j                  «       ƒ d {  –—†7  }| j                  ||«       Y d }~|| _         y d }~ww xY w­wrˆ   )r?   r7   rŠ   r3   r‹   rh   rn   rŒ   rr   rs   r†   )rC   r_   ro   rs   s       r!   Ú_ensure_index_asyncz'ValkeySemanticCache._ensure_index_async²   sÙ   è ø€ Ø�?‰?˜cÒ!Øð	0Ø×#Ñ#×&Ñ& t§¡Ó7×DÑDØ×"Ñ" 3Ó'°D×4JÑ4JÓ4Lð Eó ÷ ð ð ˆ�ðùô ò 	0Ø×.Ñ.¨sÔ3ØØ $× 1Ñ 1× 4Ñ 4°T·_±_Ó E× JÑ JÓ L×LÐLˆDØ×$Ñ$ T¨3×/Ð/Øˆ�ûð	0üsN   ‚C6”AA9 Á*A7Á+A9 Á/C6Á7A9 Á9	C3ÂAC.Ã
CÃC.Ã"C6Ã.C3Ã3C6c                 ój   — | j                   › | j                  |«      › dt        j                  «       › �S )Nr<   )r>   r[   r   Úuuid4)rC   rT   s     r!   Ú_doc_keyzValkeySemanticCache._doc_keyÀ   s,   € Ø—/‘/Ð" 4§?¡?°3Ó#7Ð"8¸¼$¿*¹*»,¸ÐHÐHr    Ú	value_strc           
      ó¢   — | j                   | j                  |«      | j                  || j                  || j                  | j                  |«      iS r]   )rg   r[   r)   r*   r'   r^   )rC   rT   r(   r“   r&   s        r!   Ú_doc_mappingz ValkeySemanticCache._doc_mappingÃ   sL   € à×%Ñ% t§¡°sÓ';Ø×"Ñ" FØ×$Ñ$ iØ×%Ñ% t×'?Ñ'?À	Ó'Jð	
ð 	
r    c           	      óú   — | j                  |«      }d| j                  › d|› d| j                  › d| j                  › d�	}t	        |«      j                  | j                  | j                  «      j                  d«      S )Nz(@z:{z})=>[KNN 1 @z	 $vec AS ú]é   )r[   rg   r'   r,   r   Úreturn_fieldsr*   Údialect)rC   rT   ÚscopeÚquery_strings       r!   Ú
_knn_queryzValkeySemanticCache._knn_queryË   s‚   € Ø—‘ sÓ+ˆà�×*Ñ*Ð+¨3¨u¨gð 6Ø×2Ñ2Ð3°9¸T×=UÑ=UÐ<VÐVWðYð 	ô �\Ó"×0Ñ0°×1IÑ1IÈ4×KcÑKcÓd×lÑlÐmnÓoÐor    Úsearch_resultc           	      óº   — t        |dg «      }|sy |d   }t        t        t        || j                  «      «      t	        t        || j
                  «      «      ¬«      S )NÚdocsr   )r   r   )Úgetattrr   r   r*   r   r,   )rZ   rž   r    Údocs       r!   Ú
_first_hitzValkeySemanticCache._first_hitÓ   sV   € ä˜m¨V°RÓ8ˆÙØØ˜!‘WˆÜÜœ  c×&=Ñ&=Ó>Ó?Üœ7 3¨×(?Ñ(?Ó@ÓAô
ð 	
r    Úhitc                 óÒ   — |€d|j                  di «      d<   y d|j                  z
  }||j                  di «      d<   || j                  k  ry | j                  |j                  ¬«      S )Nç        Úmetadataúsemantic-similarityr   )Úcached_response)Ú
setdefaultr   r1   Ú_get_cache_logicr   )rC   r¤   rT   r:   Ú
similaritys        r!   Ú_resolve_hitz ValkeySemanticCache._resolve_hitÞ   sq   € Øˆ;ØGJˆF×Ñ˜j¨"Ó-Ð.CÑDØà §¡Ñ,ˆ
ØCMˆ×Ñ˜* bÓ)Ð*?Ñ@à˜×1Ñ1Ò1ØØ×$Ñ$°S·\±\Ð$ÓBÐBr    Úvaluec           
      óô  — t        d|› �«       	  | j                  di |¤Ž}|€t        d«       y | j                  |«      }| j                  t	        |«      «       | j                  |«      }| j                  j                  || j                  ||t        |«      |«      ¬«        | j                  di |¤Ž}|�| j                  j                  ||«       y y # t        $ r}t        d|› �«       Y d }~y d }~ww xY w)Nz)Valkey semantic-cache set_cache, kwargs: ú'No prompt provided for semantic caching©Úmappingz*Error in Valkey semantic-cache set_cache: r   )r   Ú_get_prompt_from_kwargsÚ_get_embeddingr�   r{   r’   r6   Úhsetr•   r   Ú_get_ttlÚexpirerŒ   ©	rC   rT   r®   r:   r(   r&   Údoc_keyÚttlÚes	            r!   Ú	set_cachezValkeySemanticCache.set_cacheê   sø   € ÜÐAÀ&ÀÐJÔKð	LØ8˜D×8Ñ8ÑB¸6ÑBˆFØˆ~ÜÐGÔHØà#×2Ñ2°6Ó:ˆIØ×#Ñ#¤C¨	£NÔ3à!Ÿ]™]¨3Ó/ˆGØ×Ñ×!Ñ! '°4×3DÑ3DÀSÈ&ÔRUÐV[ÓR\Ð^gÓ3hÐ!ÔiØ&˜Ÿ™Ñ0¨Ñ0ˆCØˆØ× Ñ ×'Ñ'¨°Õ5ð øäò 	LÜÐFÀqÀcÐJ×KÑKûð	Lús   �C °B$C Ã	C7ÃC2Ã2C7c                 ó.  — t        d|› �«       	  | j                  di |¤Ž}|€d|j                  di «      d<   y | j                  |«      }| j	                  t        |«      «       | j                  j                  | j                  «      j                  | j                  |«      d| j                  |«      i¬«      } | j                  | j                  |«      |fi |¤ŽS # t        $ r-}t        d|› �«       d|j                  di «      d<   Y d }~y d }~ww xY w)	Nz)Valkey semantic-cache get_cache, kwargs: r¦   r§   r¨   Úvec©Úquery_paramsz*Error in Valkey semantic-cache get_cache: r   )r   r³   rª   r´   r�   r{   r6   rŠ   r3   Úsearchr�   r^   r­   r£   rŒ   ©rC   rT   r:   r(   r&   rž   r»   s          r!   Ú	get_cachezValkeySemanticCache.get_cacheý   s  € ÜÐAÀ&ÀÐJÔKð	KØ8˜D×8Ñ8ÑB¸6ÑBˆFØˆ~ØKN�×!Ñ! *¨bÓ1Ð2GÑHØà#×2Ñ2°6Ó:ˆIØ×#Ñ#¤C¨	£NÔ3à#'×#3Ñ#3×#6Ñ#6°t·±Ó#G×#NÑ#NØ—‘ Ó$Ø# T×%=Ñ%=¸iÓ%HÐIð $Oó $ˆMð %�4×$Ñ$ T§_¡_°]Ó%CÀSÑSÈFÑSÐSøÜò 	KÜÐFÀqÀcÐJÔKØGJˆF×Ñ˜j¨"Ó-Ð.CÖDûð	Kús   �)C ºB#C Ã	DÃ'#DÄDc           
   ‹   ón  K  — t        d|› �«       	  | j                  di |¤Ž}|€t        d«       y | j                  ||j                  d«      ¬«      ƒ d {  –—† }| j	                  t        |«      «      ƒ d {  –—†  | j                  |«      }| j                  j                  || j                  ||t        |«      |«      ¬«      ƒ d {  –—†   | j                  di |¤Ž}|�%| j                  j                  ||«      ƒ d {  –—†  y y 7 Œ±7 Œ‘7 ŒB7 Œ# t        $ r}t        d|› �«       Y d }~y d }~ww xY w­w)Nz/Async Valkey semantic-cache set_cache, kwargs: r°   r§   ©r§   r±   z0Error in async Valkey semantic-cache set_cache: r   )r   r³   Ú_get_async_embeddingrP   r�   r{   r’   r7   rµ   r•   r   r¶   r·   rŒ   r¸   s	            r!   Úasync_set_cachez#ValkeySemanticCache.async_set_cache  s:  è ø€ ÜÐGÈÀxÐPÔQð	RØ8˜D×8Ñ8ÑB¸6ÑBˆFØˆ~ÜÐGÔHØà%)×%>Ñ%>¸vÐPV×PZÑPZÐ[eÓPfÐ%>Ó%g×gˆIØ×*Ñ*¬3¨y«>Ó:×:Ð:à!Ÿ]™]¨3Ó/ˆGØ×#Ñ#×(Ñ(¨¸$×:KÑ:KÈCÐQWÔY\Ð]bÓYcÐenÓ:oÐ(Óp×pÐpØ&˜Ÿ™Ñ0¨Ñ0ˆCØˆØ×'Ñ'×.Ñ.¨w¸Ó<×<Ñ<ð ð  høØ:øð qøð =ùÜò 	RÜÐLÈQÈCÐP×QÑQûð	Rüs�   ‚D5’D ±D5²%D ÁD	Á!D Á9DÁ:AD Ã
DÃ7D ÄDÄD ÄD5Ä	D ÄD ÄD ÄD Ä	D2ÄD-Ä(D5Ä-D2Ä2D5c              ‹   ó”  K  — t        d|› �«       	  | j                  d	i |¤Ž}|€d|j                  di «      d<   y | j                  ||j	                  d«      ¬«      ƒ d {  –—† }| j                  t        |«      «      ƒ d {  –—†  | j                  j                  | j                  «      j                  | j                  |«      d| j                  |«      i¬«      ƒ d {  –—† } | j                  | j                  |«      |fi |¤ŽS 7 Œ§7 Œ‡7 Œ+# t        $ r-}t        d|› �«       d|j                  di «      d<   Y d }~y d }~ww xY w­w)
Nz/Async Valkey semantic-cache get_cache, kwargs: r¦   r§   r¨   rÅ   r¾   r¿   z0Error in async Valkey semantic-cache get_cache: r   )r   r³   rª   rÆ   rP   r�   r{   r7   rŠ   r3   rÁ   r�   r^   r­   r£   rŒ   rÂ   s          r!   Úasync_get_cachez#ValkeySemanticCache.async_get_cache$  sM  è ø€ ÜÐGÈÀxÐPÔQð	KØ8˜D×8Ñ8ÑB¸6ÑBˆFØˆ~ØKN�×!Ñ! *¨bÓ1Ð2GÑHØà%)×%>Ñ%>¸vÐPV×PZÑPZÐ[eÓPfÐ%>Ó%g×gˆIØ×*Ñ*¬3¨y«>Ó:×:Ð:à)-×):Ñ):×)=Ñ)=¸d¿o¹oÓ)N×)UÑ)UØ—‘ Ó$Ø# T×%=Ñ%=¸iÓ%HÐIð *Vó *÷ $ˆMð %�4×$Ñ$ T§_¡_°]Ó%CÀSÑSÈFÑSÐSð  høØ:øð$ùô
 ò 	KÜÐLÈQÈCÐPÔQØGJˆF×Ñ˜j¨"Ó-Ð.CÖDûð	Küso   ‚E’)D »E¼%D Á!D	Á"!D ÂDÂAD Ã!DÃ"&D ÄEÄ	D ÄD ÄD Ä	EÄ#E Ä;EÅ EÅEÚ
cache_listc              ‹   óä   K  — 	 t        j                  |D ��cg c]  \  }} | j                  ||fi |¤Ž‘Œ c}}Ž ƒ d {  –—†  y c c}}w 7 Œ# t        $ r}t	        d|› �«       Y d }~y d }~ww xY w­w)Nz9Error in Valkey semantic-cache async_set_cache_pipeline: )ÚasyncioÚgatherrÇ   rŒ   r   )rC   rÊ   r:   rT   r®   r»   s         r!   Úasync_set_cache_pipelinez,ValkeySemanticCache.async_set_cache_pipeline8  sr   è ø€ ð	[Ü—.‘.Ð`j×"kÑR\ÐRUÐW\Ð#7 4×#7Ñ#7¸¸UÑ#MÀfÓ#MÓ"kÐl×lÑlùÓ"kÐlùÜò 	[ÜÐUÐVWÐUXÐY×ZÑZûð	[üsH   ‚A0„A ˜A
¶A ¾A
¿A ÁA0ÁA Á	A-ÁA(Á#A0Á(A-Á-A0c              ƒ   ó„   K  — | j                   j                  | j                  «      j                  «       ƒ d {  –—† S 7 Œ­wr]   )r7   rŠ   r3   rs   rm   s    r!   Ú_index_infozValkeySemanticCache._index_info>  s0   è ø€ Ø×&Ñ&×)Ñ)¨$¯/©/Ó:×?Ñ?ÓA×AÐAÐAús   ‚7A ¹>ºA )NNNNNztext-embedding-ada-002NFNNNNN)F)3r   r   r   Ú__doc__r%   r   r   r'   r)   r*   r,   r   Úboolrx   r   rB   r|   r   rE   Ústaticmethodr@   Úclassmethodr[   Úbytesr^   ry   r   r   rh   r	   rn   rŒ   rr   Údictrƒ   r†   r�   r�   r’   r•   r   r�   r   r£   r­   r¼   rÃ   rÇ   rÉ   rÎ   rÐ   r   r    r!   r#   r#   +   sì  … Ù9à%CÐ˜sÓCØ +Ð˜#Ó+Ø%Ð�sÓ%Ø)Ð˜Ó)Ø0Ð˜Ó0ð  ØØ#Ø $Ø-1Ø7Ø!%ØØ%)Ø$(Ø*.Ø15Ø*.ñ,Wà�D‰jð,Wð �D‰jð,Wð ˜‘*ð	,Wð
 ˜‘:ð,Wð $ d™lð,Wð ð,Wð ˜$‘Jð,Wð ð,Wð ˜d‘{ð,Wð ˜T‘\ð,Wð ! 4Ñ'ð,Wð %(¨$¡Jð,Wð ! 4™<ð,Wð ó,Wð\ ñm  d¡
ð m°#¸±*ð mÈÈdÉ
ð mÐY]ð mÐjmò mó ðmð ðD˜Sð D Sò Dó ðDð ð& t¨E¡{ð &°uò &ó ð&ð
 ð 
¨¨x¸Ð/DÑ)Eó 
ðT ?ó Tð ð4 Ið 4°$ò 4ó ð4ð ð ð ¨#°©*ò ó ðð¨ð °3ð ¸4ó ð cð ¨dó ð¨Sð °Tó ðI˜Cð I Có Ið
 ð 
¨Sð 
¸Sð 
ÈTÐRWÉ[ð 
Ð]aó 
ðp˜cð p eó pð ð
 sð 
¨ÀÑ/Eò 
ó ð
ð
C °$Ñ 6ð 
C¸Sð 
CÈCð 
CÐTWó 
CðL˜Sð L¨ð L¸ð LÀó Lð&K˜Sð K¨Cð K°Có Kð(R¨ð R°Sð RÀCð RÈDó Rð&K¨ð K¸ð KÀó Kð([¸¸eÀCÈÀH¹oÑ9Nð [ÐZ]ð [Ðbfó [ðB 4ô Br    r#   )"rÑ   rÌ   rV   rN   Údataclassesr   Útypingr   r   Úredisr   Úredis.asynciorB   Úredis.commands.search.fieldr   r   Ú%redis.commands.search.indexDefinitionr	   r
   Úredis.commands.search.queryr   Úlitellm._loggingr   Úlitellm._uuidr   Ú litellm.llms.valkey.common_utilsr   r   Ú_embedding_routerr   Úredis_semantic_cacher   r   r#   r   r    r!   ú<module>rã      sj   ðñó  Û Û 	Ý !ß å Ý -ß =ß LÝ -å *Ý ß Jå 8Ý 4ñ �$˜dÔ#÷ð ó $ðô
TBÐ,õ TBr    