Ë
    uPêj‚&  ã                   óÂ   — d Z ddlZddlZddlmZmZ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 erddlmZ dd	lmZ eZeez  ZneZeZ G d
„ de	«      Z G d„ d«      Zy)zf
Wrapper around router cache. Meant to store model id when prompt caching supported prompt is called.
é    N)ÚTYPE_CHECKINGÚAnyÚFinalÚcast)Ú	TypedDict)Ú	DualCache)ÚInMemoryCache)ÚAllMessageValuesÚChatCompletionToolParam)ÚSpan)ÚRouterc                   ó   — e Zd ZU eed<   y)ÚPromptCachingCacheValueÚmodel_idN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__© ó    ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/router_utils/prompt_caching_cache.pyr   r      s   … Ø„Mr   r   c                   óX  — e Zd Zdefd„Zededefd„«       Zedee	   dee	   fd„«       Z
edee	   dz  d	ee   dz  dedz  fd
„«       Zdedee	   dz  d	ee   dz  ddfd„Zdedee	   dz  d	ee   dz  ddfd„Zdee	   dz  d	ee   dz  dedz  fd„Zdee	   dz  d	ee   dz  dedz  fd„Zy)ÚPromptCachingCacheÚcachec                 ó0   — || _         t        «       | _        y ©N)r   r	   Úin_memory_cache)Úselfr   s     r   Ú__init__zPromptCachingCache.__init__    s   € ØˆŒ
Ü,›ˆÕr   ÚobjÚreturnc                 óJ  — t        | d«      r| j                  «       S t        | t        «      rt        j                  | dd¬«      S t        | t
        «      r#| D �cg c]  }t        j                  |«      ‘Œ c}S t        | t        t        t        f«      r| S t        | «      S c c}w )zSHelper function to serialize Pydantic objects, dictionaries, or fallback to string.ÚdictT©ú,ú:©Ú	sort_keysÚ
separators)Úhasattrr$   Ú
isinstanceÚjsonÚdumpsÚlistr   Úserialize_objectÚintÚfloatÚboolr   )r!   Úitems     r   r0   z#PromptCachingCache.serialize_object$   sƒ   € ô �3˜Ôà—8‘8“:ÐÜ˜œTÔ"ä—:‘:˜c¨T¸jÔIÐIä˜œTÔ"àJMÖNÀ$Ô&×7Ñ7¸Õ=ÒNÐNÜ˜œc¤5¬$Ð/Ô0ØˆJÜ�3‹xˆùò Os   ÁB Úmessagesc           
      óî  — | s| S d}d}t        | «      D ]Ä  \  }}|j                  d«      }|j                  d«      }|�(t        |t        «      r|j                  d«      dk(  r|}d}t        |t        «      sŒct        |«      D ]T  \  }}t        |t        «      sŒ|j                  d«      }	|	€Œ+t        |	t        «      sŒ<|	j                  d«      dk(  sŒQ|}|}ŒV ŒÆ |€g S g }
t        | «      D ]†  \  }}||k  r|
j                  |«       Œ||k(  rc|j                  d«      }t        |t        «      r0|�.t        t        i |¥d|d|dz    i¥«      }|
j                  |«       Œs|
j                  |«       Œ… |
S  |
S )aß  
        Extract the cacheable prefix from messages.

        The cacheable prefix is everything UP TO AND INCLUDING the LAST content block
        (across all messages) that has cache_control. This includes ALL blocks before
        the last cacheable block (even if they don't have cache_control).

        Args:
            messages: List of messages to extract cacheable prefix from

        Returns:
            List of messages containing only the cacheable prefix
        NÚcontentÚcache_controlÚtypeÚ	ephemeralé   )Ú	enumerateÚgetr,   r$   r/   Úappendr   r
   )r5   Úlast_cacheable_message_idxÚlast_cacheable_content_idxÚmsg_idxÚmessager7   Úmessage_level_cache_controlÚcontent_idxÚcontent_blockr8   Úcacheable_prefixÚmessage_copys               r   Úextract_cacheable_prefixz+PromptCachingCache.extract_cacheable_prefix5   sË  € ñ" ØˆOð &*Ð"Ø%)Ð"ä )¨(Ó 3ò 	AÑˆG�WØ—k‘k )Ó,ˆGð
 +2¯+©+°oÓ*FÐ'à+Ð7ÜÐ:¼DÔAØ/×3Ñ3°FÓ;¸{ÒJà-4Ð*ð .2Ð*ô ˜g¤tÔ,Øä.7¸Ó.@ò 	AÑ*�˜]Ü˜m¬TÕ2Ø$1×$5Ñ$5°oÓ$F�Mà%Ñ1Ü& }´dÕ;Ø)×-Ñ-¨fÓ5¸ÓDà5<Ð2Ø5@Ñ2ñ	Að+	AðB &Ð-ØˆIð #%Ðä )¨(Ó 3ò 	ÑˆG�WØÐ3Ò3à ×'Ñ'¨Õ0ØÐ6Ò6à!Ÿ+™+ iÓ0�Ü˜g¤tÔ,Ð1KÐ1Wä#'Ü(ðØ%ðà% wÐ/OÐ1KÈaÑ1OÐ'Pñó$�Lð %×+Ñ+¨LÕ9ð %×+Ñ+¨GÕ4ð àÐð1	ð0  Ðr   NÚtoolsc                 óV  — | €|€y d }| �t         j                  | «      }|sy i }|�t         j                  |«      }||d<   |�t         j                  |«      }||d<   t        j                  |dd¬«      }t        j                  |j                  «       «      j                  «       }d|› d�S )Nr5   rI   Tr%   r(   zdeployment:z:prompt_caching)	r   rH   r0   r-   r.   ÚhashlibÚsha256ÚencodeÚ	hexdigest)r5   rI   Úcacheable_messagesÚdata_to_hashÚserialized_messagesÚserialized_toolsÚdata_to_hash_strÚhashed_datas           r   Úget_prompt_caching_cache_keyz/PromptCachingCache.get_prompt_caching_cache_keyŽ   sÌ   € ð
 Ð  Øð "ÐØÐÜ!3×!LÑ!LÈXÓ!VÐá%Øð !ˆØÐ)Ü);×)LÑ)LÐM_Ó)`ÐØ':ˆL˜Ñ$ØÐÜ&8×&IÑ&IÈ%Ó&PÐØ$4ˆL˜Ñ!ô #'§*¡*ØØØ!ô#
Ðô %Ÿ^™^Ð,<×,CÑ,CÓ,EÓF×PÑPÓRˆØ˜[˜M¨Ð9Ð9r   r   c                 ó�   — |€|€y t         j                  ||«      }|€y | j                  j                  |t	        |¬«      d¬«       y ©N)r   i,  )Úttl)r   rU   r   Ú	set_cacher   ©r   r   r5   rI   Ú	cache_keys        r   Úadd_model_idzPromptCachingCache.add_model_id²   sP   € ð Ð  Øä-×JÑJÈ8ÐUZÓ[ˆ	àÐØà�
‰
×Ñ˜YÔ(?ÈÔ(RÐX[ÐÔ\Ør   c              ƒ   ó¬   K  — |€|€y t         j                  ||«      }|€y | j                  j                  |t	        |¬«      d¬«      ƒ d {  –—†  y 7 Œ­wrW   )r   rU   r   Úasync_set_cacher   rZ   s        r   Úasync_add_model_idz%PromptCachingCache.async_add_model_idÃ   sj   è ø€ ð Ð  Øä-×JÑJÈ8ÐUZÓ[ˆ	àÐØà�j‰j×(Ñ(ØÜ#¨XÔ6Øð )ó 
÷ 	
ð 	
ð
 	ð	
ús   ‚A
AÁAÁAc              ƒ   ó–   K  — |€|€yt         j                  ||«      }|€y| j                  j                  |¬«      ƒ d{  –—† }|S 7 Œ­w)a1  
        Get model ID from cache using the cacheable prefix.

        The cache key is based on the cacheable prefix (everything up to and including
        the last cache_control block), so requests with the same cacheable prefix but
        different user messages will have the same cache key.
        N)Úkey)r   rU   r   Úasync_get_cache)r   r5   rI   r[   Úcache_results        r   Úasync_get_model_idz%PromptCachingCache.async_get_model_idØ   s[   è ø€ ð Ð  Øô .×JÑJÈ8ÐUZÓ[ˆ	ØÐØð %)§J¡J×$>Ñ$>À9Ð$>Ó$M×MˆØÐð Nús   ‚>A	Á AÁA	c                 ót   — |€|€y t         j                  ||«      }|€y | j                  j                  |«      S r   )r   rU   r   Ú	get_cache)r   r5   rI   r[   s       r   Úget_model_idzPromptCachingCache.get_model_idð   sB   € ð
 Ð  Øä-×JÑJÈ8ÐUZÓ[ˆ	àÐØà�z‰z×#Ñ# IÓ.Ð.r   )r   r   r   r   r    Ústaticmethodr   r0   r/   r
   rH   r   r   rU   r\   r_   r   rd   rg   r   r   r   r   r      s¨  „ ð/˜ió /ð ð˜cð  cò ó ðð  ðV ØÐ'Ñ(ðV à	ÐÑ	òV ó ðV ðp ð!:ØÐ'Ñ(¨4Ñ/ð!:àÐ+Ñ,¨tÑ3ð!:ð 
ˆt‰ò!:ó ð!:ðFàðð Ð'Ñ(¨4Ñ/ðð Ð+Ñ,¨tÑ3ð	ð
 
óð"àðð Ð'Ñ(¨4Ñ/ðð Ð+Ñ,¨tÑ3ð	ð
 
óð*àÐ'Ñ(¨4Ñ/ðð Ð+Ñ,¨tÑ3ðð 
! 4Ñ	'ó	ð0/àÐ'Ñ(¨4Ñ/ð/ð Ð+Ñ,¨tÑ3ð/ð 
! 4Ñ	'ô	/r   r   )Ú__doc__rK   r-   Útypingr   r   r   r   Útyping_extensionsr   Úlitellm.caching.cachingr   Úlitellm.caching.in_memory_cacher	   Úlitellm.types.llms.openair
   r   Úopentelemetry.tracer   Ú_SpanÚlitellm.routerr   Úlitellm_routerr   r   r   r   r   ú<module>rs      s]   ðñó Û ß 2Ó 2å 'å -Ý 9ß OáÝ1å%à€NØ�3‰;�Dà€DØ€Nô˜iô ÷^/ò ^/r   