Ë
    uPêj5Ë  ã            	       óÈ  — U 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mZm	Z	m
Z
mZ ddlmZmZmZmZmZ ddl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 ddl 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-m.Z.m/Z/m0Z0 erddl1m2Z3 ddl4m5Z5 ddl(m6Z6 neZ3 ed«      Z7ddl8m9Z9 ddl:m;Z;  G d„ de«      Z< e«       Z=ee>d<   de?e@eAf   de?e@eAf   fd„ZBde?deCfd„ZDde?e@eAf   deCfd„ZEd d!dee@eAf   fd"„ZF eG«       ZHeeGd#      e>d$<   d%e	g ed   f   ddfd&„ZId%e	g ed   f   dd#fd'„ZJdee@ef   de@dz  fd(„ZK G d)„ d*«      ZL	 d/d+e	d,eMeAd-f   dz  de?e@eAf   fd.„ZNy)0aê  
This contains LLMCachingHandler

This exposes two methods:
    - async_get_cache
    - async_set_cache

This file is a wrapper around caching.py

This class is used to handle caching logic specific for LLM API requests (completion / embedding / text_completion / transcription etc)

It utilizes the (RedisCache, s3Cache, RedisSemanticCache, QdrantSemanticCache, InMemoryCache, DiskCache) based on what the user has setup

In each method it will call the appropriate method from caching.py
é    N)ÚAsyncGeneratorÚAsyncIteratorÚ	AwaitableÚCallableÚ	GeneratorÚMapping)ÚTYPE_CHECKINGÚAnyÚFinalÚOptionalÚTypeVar)Ú	BaseModel)Úprint_verboseÚverbose_logger)ÚInMemoryCache)ÚS3Cache)Ú*CACHE_WRITE_SHUTDOWN_FLUSH_TIMEOUT_SECONDS)Úupdate_response_metadata)Ú1_assemble_complete_response_from_streaming_chunks)ÚCachedEmbedding)ÚResponsesAPIResponse)ÚRerankResponse)ÚCachingDetailsÚ	CallTypesÚ	EmbeddingÚEmbeddingResponseÚModelResponseÚTextCompletionResponseÚTranscriptionResponseÚUsage)ÚLogging©Ú"AnthropicMessagesStreamCacheWriter©ÚPromptTokensDetailsWrapperÚ_StreamResultT©Ú!_get_parent_otel_span_from_kwargs)ÚCustomStreamWrapperc                   óH   — e Zd ZU dZdZedz  ed<   dZedz  ed<   dZ	e
ed<   y)ÚCachingHandlerResponsea  
    This is the response object for the caching handler. We need to separate embedding cached responses and (completion / text_completion / transcription) cached responses

    For embeddings there can be a cache hit for some of the inputs in the list and a cache miss for others
    NÚcached_resultÚfinal_embedding_cached_responseFÚ embedding_all_elements_cache_hit)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r
   Ú__annotations__r-   r   r.   Úbool© ó    úd/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/caching/caching_handler.pyr+   r+   E   s3   … ñð !%€M�3˜‘:Ó$Ø@DÐ#Ð%6¸Ñ%=ÓDØ-2Ð$ dÔ2r6   r+   Úin_memory_cache_objÚrequest_kwargsÚreturnc                 ón   — d| vr| S | j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}S c c}}w )a  
    The caching handler is stored on the Logging object
    (``logging_obj._llm_caching_handler``), so keeping ``litellm_logging_obj``
    inside ``request_kwargs`` closes a reference cycle
    (Logging -> LLMCachingHandler -> kwargs -> Logging) that keeps the full
    request payload (messages included) alive until a generational GC pass
    instead of being freed by refcount when the request ends. Nothing in the
    caching layer reads the logging object from these kwargs; cache-key
    generation ignores litellm-internal params.
    Úlitellm_logging_obj)Úitems)r9   ÚkÚvs      r7   Ú_drop_logging_obj_from_kwargsr@   T   s?   € ð  NÑ2ØÐØ+×1Ñ1Ó3×R‘T�Q˜°qÐ<QÓ7QˆAˆq‰DÓRÐRùÓRs   š1¨1r,   c                 óÔ   — | j                  d«      }t        |t        «      r|j                  d«      ry| j                  d«      }t        |t        «      r|j                  d«      S d| v S )NÚidÚchatcmplTÚobjectzchat.completionÚchoices)ÚgetÚ
isinstanceÚstrÚ
startswith)r,   Ú	cached_idÚobjs      r7   Ú_is_chat_completion_cached_dictrL   d   sa   € Ø$×(Ñ(¨Ó.€IÜ�)œSÔ! i×&:Ñ&:¸:Ô&FØØ×"Ñ" 8Ó,€CÜ�#”sÔØ�~‰~Ð/Ó0Ð0Ø˜Ð%Ð%r6   Úkwargsc                 ó*   — | j                  dd«      du S )a®  
    When stream=True, do not run success callbacks at cache-hit time.

    Cached chat/text completion replay uses CustomStreamWrapper; cached Responses
    replay uses CachedResponsesAPIStreamingIterator; cached Anthropic Messages
    replay uses CachedAnthropicMessagesStreamIterator. All invoke logging success
    handlers when the stream finishes; firing them here too would double-count
    spend and callback records.
    ÚstreamFT©rF   ©rM   s    r7   Ú+_should_defer_streaming_cache_hit_callbacksrR   n   s   € ð �:‰:�h Ó&¨$Ð.Ð.r6   Údetailsr%   c                 óB   — t        | d«      r| j                  d¬«      S i S )zXDump prompt token details to an opaque field mapping, tolerating non-pydantic stand-ins.Ú
model_dumpT)Úexclude_none)ÚhasattrrU   )rS   s    r7   Ú!_prompt_tokens_details_as_mappingrX   {   s%   € ä4;¸GÀ\Ô4Rˆ7×Ñ¨4ÐÓ0ÐZÐXZÐZr6   zasyncio.Task[None]Ú_PENDING_CACHE_WRITESÚwrite_factoryc              ƒ   ó  K  — 	  | «       ƒ d {  –—†  y 7 Œ# t         j                  $ rX 	 t        j                   | «       t        ¬«      ƒ d {  –—†7   ‚ # t        $ r }t        j                  d|«       Y d }~‚ d }~ww xY ww xY w­w)N)ÚtimeoutzHLiteLLM Cache: pending cache write failed during event loop shutdown: %s)ÚasyncioÚCancelledErrorÚwait_forr   Ú	Exceptionr   Úwarning)rZ   Úflush_errors     r7   Ú*_complete_cache_write_despite_cancellationrc   ƒ   s}   è ø€ ð	Ù‹o×ÒùÜ×!Ñ!ò ð	Ü×"Ñ"¡=£?Ô<fÔg×gÑgð
 	øô	 ò 	Ü×"Ñ"ØZÐ\g÷ð ð 	ûð		úðüsZ   ‚B„
 Ž� “B” –Bª#AÁAÁAÁBÁ	A=ÁA8Á3BÁ8A=Á=BÂBc                 óª   — t        j                  t        | «      «      }t        j	                  |«       |j                  t        j                  «       |S ©N)r]   Úcreate_taskrc   rY   ÚaddÚadd_done_callbackÚdiscard)rZ   Útasks     r7   Úcreate_cache_write_taskrk   �   sA   € Ü×%Ñ%Ô&PÐQ^Ó&_Ó`€DÜ×Ñ˜dÔ#Ø×ÑÔ0×8Ñ8Ô9Ø€Kr6   c                 ó&   — | j                  dd«      S )z>Read the caller-supplied ``cache_key`` off the request kwargs.Ú	cache_keyNrP   )r9   s    r7   Ú_request_cache_keyrn   —   s   € à×Ñ˜k¨4Ó0Ð0r6   c                   ó$  — e Zd Zdedeeef   dej                  fd„Z	 d4dedede	dej                  ded	eee
f   d
eedf   dz  dedz  fd„Z	 d4dedede	dej                  ded	eee
f   d
eedf   dz  defd„Zd	eeef   dee   fd„Zdeeeef      dedz  fd„Zdedz  deedz     d	eee
f   de	dej                  dedeedz  ef   fd„Zdededefd„Zded   ded   ded   fd„Zdededej                  dej                  def
d„Zde	de
dej                  dej                  d ef
d!„Zded	eeef   d
eedf   de
dz  fd"„Z	 d4de
ded	eeef   de	ded
eedf   d#edz  deez  ez  e z  e!z  e"z  dz  fd$„Z#de
dede	dede"f
d%„Z$	 d4d&e
ded	eee
f   d
eedf   dz  fd'„Z%	 d4d&e
d	eeef   d
eedf   dz  fd(„Z&ded	eee
f   defd)„Z'd&e(dedd*fd+„Z)dedefd,„Z*d-efd.„Z+d-efd/„Z,	 	 	 d5de	ded	eee
f   de
d0ed1ed#edz  d2e-dz  fd3„Z.y)6ÚLLMCachingHandlerÚoriginal_functionr9   Ú
start_timec                 óH  — ddl m}m} g | _        g | _        t        |«      | _        d | _        || _        || _	        t        j                  �Pt        t        j                  j                  |«      r, |t        j                  j                  t        ¬«      | _        y d | _        y )Nr   )Ú	DualCacheÚ
RedisCache)Úredis_cacheÚin_memory_cache)Úlitellm.cachingrt   ru   Úasync_streaming_chunksÚsync_streaming_chunksr@   r9   Úpreset_cache_keyrq   rr   ÚlitellmÚcacherG   r8   Ú
dual_cache)Úselfrq   r9   rr   rt   ru   s         r7   Ú__init__zLLMCachingHandler.__init__�   s}   € ÷ 	:à;=ˆÔ#Ø:<ˆÔ"Ü;¸NÓKˆÔØ,0ˆÔØ!2ˆÔØ$ˆŒÜ�=‰=Ð$¬´G·M±M×4GÑ4GÈÔ)TÙ09Ü#ŸM™M×/Ñ/Ü 3ô1ˆD�Oð
 #ˆD�Or6   NÚmodelÚlogging_objÚ	call_typerM   Úargs.r:   c              ƒ   ó’  K  — |j                  dd«      €t        j                  €|j                  dd«      du �r	|j                  di «      j                  dd«      du�rä|xs d}d}d}	d}
|j                  «       }t	        j
                  «       }d}t        |«      }||d<   t        j                  ��n| j                  |¬	«      �r[t        j                  d
«       | j                  |||¬«      ƒ d{  –—† }
t	        j
                  «       }|
��…t        |
t        «      �stt        j                  d«       d}t        j                  j                  «       }t        j                  ||j                  dd«      |j                  dd«      |j                  dd«      ¬«      \  }}}}||z
  dz  }| j!                  ||||
d||¬«       |j"                  }| j%                  |
|||||j                  dd«      |¬«      }
t'        |¬«      s| j)                  ||
|||¬«       | j*                  xsF | j,                  j                  d«      xs) t        j                  j.                  di | j,                  ¤Ž}t1        |
d«      r||
j2                  d<   t5        |
¬«      S |t6        j8                  j:                  k(  rq|
�ot        |
t        «      r_t        j                  �Ot        t        j                  j                  t<        «      s'| j?                  ||
||||¬«      \  }}	t5        ||	¬«      S t        j                  d|
«       t5        |
|¬«      S y7 �ŒS­w)aC  
        Internal method to get from the cache.
        Handles different call types (embeddings, chat/completions, text_completion, transcription)
        and accordingly returns the cached response

        Args:
            model: str:
            original_function: Callable:
            logging_obj: LiteLLMLoggingObj:
            start_time: datetime.datetime:
            call_type: str:
            kwargs: Dict[str, Any]:
            args: Optional[Tuple[Any, ...]] = None:


        Returns:
            CachingHandlerResponse:
        Raises:
            None
        ÚcachingNFTr}   zno-cacher5   Úparent_otel_span©rq   zChecking Async Cache)rƒ   rM   r„   z
Cache Hit!Úcustom_llm_providerÚapi_baseÚapi_key©r�   r‰   rŠ   r‹   éè  )r‚   r�   rM   r,   Úis_asyncr‰   Úcache_duration_ms©r,   rƒ   rM   r‚   r�   r‰   r„   rQ   ©r‚   r,   rr   Úend_timeÚ	cache_hitrm   Ú_hidden_params©r,   )r-   r,   rM   r‚   rr   r�   )r-   r.   zCACHE RESULT: %s)r,   r-   ) rF   r|   r}   ÚcopyÚtimeÚperf_counterr(   Ú _is_call_type_supported_by_cacher   ÚdebugÚ_retrieve_from_cacherG   ÚlistÚdatetimeÚnowÚget_llm_providerÚ'_update_litellm_logging_obj_environmentr/   Ú(_convert_cached_result_to_model_responserR   Ú!_async_log_cache_hit_on_callbacksr{   r9   Úget_cache_keyrW   r”   r+   r   Ú
aembeddingÚvaluer   Ú(_process_async_embedding_cached_response)r   r�   rq   r‚   rr   rƒ   rM   r„   r-   r.   r,   Úcache_check_start_timeÚcache_check_end_timer‡   r“   r’   r‰   Ú_r�   rm   s                       r7   Ú_async_get_cachez"LLMCachingHandler._async_get_cache³   sg  è ø€ ð@ �Z‰Z˜	 4Ó(Ð0´W·]±]Ð5NÐSY×S]ÑS]Ð^gÐinÓSoÐswÒSwà�J‰J�w Ó#×'Ñ'¨
°EÓ:À$ÒFà’:˜2ˆDØHLÐ+Ø5:Ð,Ø(,ˆMØ—[‘[“]ˆFô -1×,=Ñ,=Ó,?Ð"Ø15Ð ä&GÈÓ&OÐØ)9ˆFÐ%Ñ&ä�}‰}Ñ(¨T×-RÑ-RÐevÐ-RÕ-wÜ×$Ñ$Ð%;Ô<Ø&*×&?Ñ&?Ø'Ø!Øð '@ó '÷ !�ô
 (,×'8Ñ'8Ó':Ð$à Ñ,´ZÀÌtÕ5TÜ"×(Ñ(¨Ô6Ø'+�IÜ&.×&7Ñ&7×&;Ñ&;Ó&=�HÜ7>×7OÑ7OØ#Ø,2¯J©JÐ7LÈdÓ,SØ!'§¡¨J¸Ó!=Ø &§
¡
¨9°dÓ ;ô	8Ñ4�EÐ.°°1ð 1EÐG]Ñ0]ÐaeÑ/eÐ%Ø×@Ñ@Ø$/Ø#Ø%Ø&3Ø!%Ø,?Ø*;ð Aô ð !2× :Ñ :�Ià$(×$QÑ$QØ&3Ø"+Ø%Ø$/Ø#Ø,2¯J©JÐ7LÈdÓ,SØ!ð %Ró %�Mô GÈfÕUà×>Ñ>Ø(3Ø*7Ø'1Ø%-Ø&/ð ?ô ð ×-Ñ-ò NØ×.Ñ.×2Ñ2°;Ó?òNä"Ÿ=™=×6Ñ6ÑM¸×9LÑ9LÑMð ô
 ˜}Ð.>Ô?ØDM˜×4Ñ4°[ÑAÜ1ÀÔNÐNà¤×!5Ñ!5×!;Ñ!;Ò;Ø%Ð1Ü" =´$Ô7ÜŸ™Ð1Ü&¤w§}¡}×':Ñ':¼GÔDð
 ×EÑEØ8WØ&3Ø%Ø$/Ø#-Ø#ð Fó ñØ7Ø8ô 2Ø8WØ9Yôð ô
 × Ñ Ð!3°]ÔCÜ)Ø+Ø0Oôð ð
 ðk!ûs   ‚C/MÃ1MÃ2IMc                 óÔ  — d }t         j                  ��J| j                  |¬«      �r7|xs d}|j                  «       }	|	j	                  t        | j                  |«      «       |	j                  d«      €|	j                  dd «       |	j                  d«      du r&d|	vr"t        j                  j                  di |	¤Ž|	d<   t        |	«      | _        t        d«       t        j                  j                  di |	¤Ž}|��cd|v r�n]|j                  }| j                  ||||||j                  d	d «      |¬
«      }d}
t         j                   j#                  «       }t        j$                  |xs d|j                  d	d «      |j                  dd «      |j                  dd «      ¬«      \  }}}}| j'                  ||› d|› �||d¬«       t)        |¬«      s|j+                  ||||
¬«       | j,                  xsF | j                  j                  d«      xs) t        j                  j                  di | j                  ¤Ž}t/        |d«      r||j0                  d<   t3        |¬«      S t3        |¬«      S )Nrˆ   r5   ÚmetadatarO   Trm   zChecking Sync CacheÚdetailr‰   r�   Ú rŠ   r‹   rŒ   ú/F)r‚   r�   rM   r,   rŽ   rQ   ©Úresultrr   r’   r“   r”   r•   )r|   r}   r™   r–   ÚupdateÚconvert_args_to_kwargsrq   rF   Úpopr£   r@   r9   r   Ú	get_cacher/   r¡   r�   rž   rŸ   r    rR   Ú-handle_sync_success_callbacks_for_async_callsr{   rW   r”   r+   )r   r�   rq   r‚   rr   rƒ   rM   r„   r,   Ú
new_kwargsr“   r’   r‰   Údynamic_api_keyrŠ   rm   s                   r7   Ú_sync_get_cachez!LLMCachingHandler._sync_get_cache>  sw  € ð %)ˆô �=‰=Ñ$¨×)NÑ)NÐarÐ)NÕ)sØ’:˜2ˆDà &§¡£ˆJØ×ÑÜ&Ø×*Ñ*Øóôð �~‰~˜jÓ)Ð1Ø—‘˜z¨4Ô0Ø�~‰~˜hÓ'¨4Ñ/°KÀzÑ4QÜ*1¯-©-×*EÑ*EÑ*SÈ
Ñ*S�
˜;Ñ'Ü"?À
Ó"KˆDÔÜÐ/Ô0Ü#ŸM™M×3Ñ3ÑA°jÑAˆMØÑ(Ø˜}Ñ,áà 1× :Ñ :�IØ$(×$QÑ$QØ&3Ø"+Ø%Ø$/Ø#Ø,2¯J©JÐ7LÈdÓ,SØ!ð %Ró %�Mð (,�IÜ&.×&7Ñ&7×&;Ñ&;Ó&=�Hô  ×0Ñ0Ø#šk rØ,2¯J©JÐ7LÈdÓ,SØ!'§¡¨J¸Ó!=Ø &§
¡
¨9°dÓ ;ô	ñØØ+Ø'Ø ð ×@Ñ@Ø$/Ø!4Ð 5°Q°u°gÐ>Ø%Ø&3Ø!&ð Aô ô GÈfÕUØ#×QÑQØ#0Ø'1Ø%-Ø&/ð	 Rô ð ×-Ñ-ò NØ×.Ñ.×2Ñ2°;Ó?òNä"Ÿ=™=×6Ñ6ÑM¸×9LÑ9LÑMð ô
 ˜}Ð.>Ô?ØDM˜×4Ñ4°[ÑAÜ1ÀÔNÐNÜ%°MÔBÐBr6   c                 óz   — t        |d   t        «      r|d   gS t        |d   t        «      r|d   S t        d«      ‚)zO
        Handles the input of kwargs['input'] being a list or a string
        Úinputú input must be a string or a list)rG   rH   rœ   Ú
ValueError)r   rM   s     r7   Úhandle_kwargs_input_list_or_strz1LLMCachingHandler.handle_kwargs_input_list_or_str“  sC   € ô �f˜W‘o¤sÔ+Ø˜7‘OÐ$Ð$Ü˜˜w™¬Ô.Ø˜'‘?Ð"äÐ?Ó@Ð@r6   Únon_null_listc                 ój   — |D ].  \  }}t        |t        «      sŒ|j                  d«      sŒ)|d   c S  y)a	  
        Helper method to extract the model name from cached results.

        Args:
            non_null_list: List of (idx, cr) tuples where cr is the cached result dict

        Returns:
            Optional[str]: The model name if found, None otherwise
        r�   N)rG   ÚdictrF   )r   r¿   r©   Úcrs       r7   Ú"_extract_model_from_cached_resultsz4LLMCachingHandler._extract_model_from_cached_resultsž  s:   € ð #ò 	#‰EˆAˆrÜ˜"œdÕ#¨¯©¨w­Ø˜'‘{Ò"ð	#ð r6   r-   r,   c           	      ó  — d}g }g }	| j                  |«      }
t        |«      D ]/  \  }}|€|j                  |
|   «       Œ|	j                  ||f«       Œ1 ||d<   t        |	«      dkD  �r]| j	                  |	«      }|s|j                  d«      }t        |dgt        |
«      z  ¬«      }d|j                  d<   d}d}|	D ]Þ  }|\  }}|€Œ|j                  d	«      }|�t        ||d	¬
«      |j                  |<   |j                  d«      }|�||z  }n)t        |
|   t        «      rddlm} | ||
|   d¬«      z  }|j                  d«      }|sŒ�|€i }|j                  «       D ]9  \  }}t        |t        t         f«      r|j                  |d«      |z   ||<   Œ5|||<   Œ; Œà ddlm} d}|r		  |di |¤Ž}t)        |d||¬«      }||_        t        |«      dk(  r¢d}d}t,        j,                  j/                  «       }t1        j2                  ||j                  dd«      |j                  dd«      |j                  dd«      ¬«      \  }}}}| j5                  ||||dd|¬«       | j7                  |||||¬«       ||fS ||fS # t&        $ r d}Y Œ×w xY w)a¡  
        Returns the final embedding cached response and a boolean indicating if all elements in the list have a cache hit

        For embedding responses, there can be a cache hit for some of the inputs in the list and a cache miss for others
        This function processes the cached embedding responses and returns the final embedding cached response and a boolean indicating if all elements in the list have a cache hit

        Args:
            final_embedding_cached_response: Optional[EmbeddingResponse]:
            cached_result: List[Optional[Dict[str, Any]]]:
            kwargs: Dict[str, Any]:
            logging_obj: LiteLLMLoggingObj:
            start_time: datetime.datetime:
            model: str:

        Returns:
            Tuple[Optional[EmbeddingResponse], bool]:
            Returns the final embedding cached response and a boolean indicating if all elements in the list have a cache hit


        FNr»   r   r�   )r�   ÚdataTr“   Ú	embedding)rÆ   ÚindexrD   Úprompt_tokens)Útoken_counter)ÚtextÚcount_response_tokensÚprompt_tokens_detailsr$   ©rÈ   Úcompletion_tokensÚtotal_tokensrÌ   r‰   rŠ   r‹   rŒ   )r‚   r�   rM   r,   rŽ   Úis_embeddingr‰   r‘   r5   )r¾   Ú	enumerateÚappendÚlenrÃ   rF   r   r”   r   rÅ   rG   rH   Úlitellm.utilsrÉ   r=   ÚintÚfloatÚlitellm.types.utilsr%   r`   r    Úusager�   rž   r|   rŸ   r    r¢   )r   r-   r,   rM   r‚   rr   r�   r.   Úremaining_listr¿   Úkwargs_input_as_listÚidxrÂ   Ú
model_namerÈ   Úaggregated_detailsÚvalÚembedding_dataÚcached_prompt_tokensrÉ   Úitem_detailsÚkeyr¥   r%   rÌ   rØ   r“   r’   r‰   r¸   rŠ   s                                  r7   r¦   z:LLMCachingHandler._process_async_embedding_cached_response­  s6  € ð: 27Ð(Ø "ˆØ!ˆØ&*×&JÑ&JÈ6Ó&RÐÜ  Ó/ò 	0‰GˆC�ØˆzØ×%Ñ%Ð&:¸3Ñ&?Õ@à×$Ñ$ c¨2 YÕ/ð		0ð
 )ˆˆw‰Üˆ}Ó Ó!à×@Ñ@ÀÓOˆJÙØ#ŸZ™Z¨Ó0�
Ü.?Ø Ø�VœcÐ"6Ó7Ñ7ô/Ð+ð KOÐ+×:Ñ:¸;ÑGàˆMØ.2ÐØ$ò @�Ø‘��RØ‘>Ø%'§V¡V¨KÓ%8�NØ%Ð1ÜDMØ&4Ø"%Ø#.ôEÐ7×<Ñ<¸SÑAð
 ,.¯6©6°/Ó+BÐ(Ø+Ð7Ø%Ð)=Ñ=™Ü#Ð$8¸Ñ$=¼sÔCÝ?à%©Ð<PÐQTÑ<UÐmqÔ)rÑr˜à#%§6¡6Ð*AÓ#B�LÚ#Ø-Ð5Ø13Ð.Ø*6×*<Ñ*<Ó*>ò @™J˜C Ü)¨%´#´u°Ô>Ø:L×:PÑ:PÐQTÐVWÓ:XÐ[`Ñ:`Ð 2°3Ò 7à:?Ð 2°3Ò 7ñ	@ð-@õ: GàGKÐ!Ù!ð1Ù,FÑ,\ÐI[Ñ,\Ð)ô !Ø+Ø"#Ø*Ø&;ô	ˆEð 5:Ð+Ô1Üˆ~Ó !Ò#à#ˆIØ/3Ð,Ü&×/Ñ/×3Ñ3Ó5ˆHô ×(Ñ(ØØ$*§J¡JÐ/DÀdÓ$KØŸ™ J°Ó5ØŸ
™
 9¨dÓ3ô	ñØØ#ØØð ×8Ñ8Ø'ØØØ=ØØ!Ø$7ð 9ô ð ×2Ñ2Ø'Ø=Ø%Ø!Ø#ð 3ô ð 3Ð4TÐTÐTØ.Ð0PÐPÐPøôW !ò 1Ø,0Ò)ð1ús   Æ(I: É:JÊJÚusage1Úusage2c           	      óò   — t        |j                  |j                  z   |j                  |j                  z   |j                  |j                  z   | j	                  |j
                  |j
                  «      ¬«      S )NrÍ   )r    rÈ   rÎ   rÏ   Ú_merge_prompt_tokens_detailsrÌ   )r   rã   rä   s      r7   Úcombine_usagezLLMCachingHandler.combine_usage1  sk   € ÜØ ×.Ñ.°×1EÑ1EÑEØ$×6Ñ6¸×9QÑ9QÑQØ×,Ñ,¨v×/BÑ/BÑBØ"&×"CÑ"CØ×,Ñ,Ø×,Ñ,ó#ô	
ð 	
r6   Údetails1r%   Údetails2c                 ó^  — |€|€y|€|S |€|S t        |«      }t        |«      }i }t        |j                  «       «      t        |j                  «       «      z  D �]1  }|j                  |d«      }|j                  |d«      }t	        |t
        t        f«      rt	        |t
        t        f«      r	||z   ||<   Œ]t	        |t        «      r·t	        |t        «      r§i }	t        |j                  «       «      t        |j                  «       «      z  D ]h  }
|j                  |
d«      }|j                  |
d«      }t	        |t
        t        f«      rt	        |t
        t        f«      r	||z   |	|
<   Œ\|r||	|
<   Œd||	|
<   Œj |	||<   �Œ$|r|||<   �Œ-|||<   �Œ4 |syddlm	} 	  |di |¤ŽS # t        $ r Y yw xY w)zGMerge two PromptTokensDetailsWrapper objects by summing numeric fields.Nr   r$   r5   )rX   ÚsetÚkeysrF   rG   rÕ   rÖ   rÁ   r×   r%   r`   )r   rè   ré   Údict1Údict2Úmergedrâ   Úv1Úv2ÚnestedÚnkÚnv1Únv2r%   s                 r7   ræ   z.LLMCachingHandler._merge_prompt_tokens_details<  sž  € ð Ð Ð 0ØØÐØˆOØÐØˆOä8¸ÓBˆÜ8¸ÓBˆà ˆÜ�u—z‘z“|Ó$¤s¨5¯:©:«<Ó'8Ñ8ó 	!ˆCØ—‘˜3 Ó"ˆBØ—‘˜3 Ó"ˆBÜ˜"œs¤E˜lÔ+´
¸2ÄÄU¸|Ô0LØ  2™g��s’Ü˜B¤Ô%¬*°R¼Ô*>à!�Ü˜bŸg™g›i›.¬3¨r¯w©w«y«>Ñ9ò )�BØŸ&™&  Q›-�CØŸ&™&  Q›-�CÜ! #¬¬U |Ô4¼ÀCÌ#ÌuÈÔ9VØ%(¨3¡Y˜˜rš
ÙØ%(˜˜rš
à%(˜˜rš
ð)ð %��s“ÙØ ��s“à ��s“ð+	!ñ. ØåBð	Ù-Ñ7°Ñ7Ð7øÜò 	Ùð	ús   ÆF  Æ 	F,Æ+F,Ú_caching_handler_responseÚembedding_responser’   c                 ó\  — |j                   €|S d}g }|j                   j                  D ]E  }|€0|j                  �$|j                  |j                  |   «       |dz  }Œ5|j                  |«       ŒG ||j                   _        d|j                   j                  d<   ||z
  j	                  «       dz  |j                   _        |j                   j                  �L|j                  �@| j                  |j                   j                  |j                  ¬«      |j                   _        |j                   S )aÑ  
        Combines the cached embedding response with the API EmbeddingResponse

        For caching there can be a cache hit for some of the inputs in the list and a cache miss for others
        This function combines the cached embedding response with the API EmbeddingResponse

        Args:
            caching_handler_response: CachingHandlerResponse:
            embedding_response: EmbeddingResponse:

        Returns:
            EmbeddingResponse:
        r   é   Tr“   r�   )rã   rä   )r-   rÅ   rÒ   r”   Útotal_secondsÚ_response_msrØ   rç   )r   rö   r÷   rr   r’   rÛ   Úfinal_data_listÚitems           r7   Ú2_combine_cached_embedding_response_with_api_resultzDLLMCachingHandler._combine_cached_embedding_response_with_api_resultn  s3  € ð( %×DÑDÐLØ%Ð%àˆØ!#ˆØ-×MÑM×RÑRò 	-ˆDØˆ|Ð 2× 7Ñ 7Ð CØ×&Ñ&Ð'9×'>Ñ'>¸sÑ'CÔDØ�q‘‘à×&Ñ& tÕ,ð	-ð JYÐ!×AÑAÔFØ`dÐ!×AÑA×PÑPÐQ\Ñ]à�zÑ!ß
‰-‹/˜DñR!Ð!×AÑAÔNð &×EÑE×KÑKÐWØ"×(Ñ(Ð4àNR×N`ÑN`Ø0×PÑP×VÑVØ)×/Ñ/ð Oaó OÐ%×EÑEÔKð
 )×HÑHÐHr6   r“   c                 ó„   — ddl m} |j                  |j                  ||||¬«      ¬«       |j	                  ||||¬«       y)a�  
        Helper function to log the success of a cached result on callbacks

        Args:
            logging_obj (LiteLLMLoggingObj): The logging object.
            cached_result: The cached result.
            start_time (datetime): The start time of the operation.
            end_time (datetime): The end time of the operation.
            cache_hit (bool): Whether it was a cache hit.
        r   )ÚGLOBAL_LOGGING_WORKERr°   )Úasync_coroutineN)Ú)litellm.litellm_core_utils.logging_workerr   Úensure_initialized_and_enqueueÚasync_success_handlerr¶   )r   r‚   r,   rr   r’   r“   r   s          r7   r¢   z3LLMCachingHandler._async_log_cache_hit_on_callbacks   s\   € õ$ 	Tà×<Ñ<Ø'×=Ñ=Ø$Ø%Ø!Ø#ð	 >ó ð 	=ô 	
ð 	×AÑAØ Ø!ØØð	 	Bõ 	
r6   c              ƒ   óÈ  K  — t         j                  €y|j                  «       }|j                  t	        | j
                  |«      «       |j                  d«      €|j                  dd«       |j                  d«      du r&d|vr"t        j                  j                  di |¤Ž|d<   t        |«      | _
        d}|t        j                  j                  k(  rôt        |d   t        «      r
|d   g|d<   nt        |d   t         «      st#        d«      ‚g }t%        |d   «      D ]d  \  }}t        j                  j                  di i |¥d|i¥¤Ž}	|j'                  t         j                  j)                  |	| j*                  ¬«      «       Œf t-        j.                  |Ž ƒ d{  –—† }|�$t        |t         «      rt1        d	„ |D «       «      rd}|S |j                  «       }
t3        |
«      }|
j                  dd«       t         j                  j5                  «       du rh|xs t        j                  j                  di |
¤Ž| _        t        j                  j(                  d| j*                  | j6                  d
œ|
¤Žƒ d{  –—† }|S |xs t        j                  j                  di |
¤Ž| _        t        j                  j8                  d| j*                  | j6                  d
œ|
¤Ž}|S 7 �ŒB7 Œi­w)a�  
        Internal method to
        - get cache key
        - check what type of cache is used - Redis, RedisSemantic, Qdrant, S3
        - async get cache value
        - return the cached value

        Args:
            call_type: str:
            kwargs: Dict[str, Any]:
            args: Optional[Tuple[Any, ...]] = None:

        Returns:
            Optional[Any]:
        Raises:
            None
        Nr¬   rO   Trm   r»   r¼   )rm   Údynamic_cache_objectc              3   ó$   K  — | ]  }|d u –— Œ
 y ­wre   r5   )Ú.0r±   s     r7   ú	<genexpr>z9LLMCachingHandler._retrieve_from_cache.<locals>.<genexpr>ú  s   è ø€ ÒB¨&�v ”~ÑBùs   ‚)r  rm   r5   )r|   r}   r–   r²   r³   rq   rF   r´   r£   r@   r9   r   r¤   r¥   rG   rH   rœ   r½   rÑ   rÒ   Úasync_get_cacher~   r]   ÚgatherÚallrn   Ú_supports_asyncr{   rµ   )r   rƒ   rM   r„   r·   r,   ÚtasksrÛ   Úir{   r9   Úrequest_cache_keys               r7   r›   z&LLMCachingHandler._retrieve_from_cacheÄ  s°  è ø€ ô( �=‰=Ð Øà"ŸK™K›Mˆ
Ø×ÑÜ"Ø×&Ñ&Øóô	
ð �>‰>˜*Ó%Ð-Ø�N‰N˜: tÔ,Ø�>‰>˜(Ó# tÑ+°À:Ñ0MÜ&-§m¡m×&AÑ&AÑ&OÀJÑ&OˆJ�{Ñ#Ü;¸JÓGˆÔØ$(ˆØœ	×,Ñ,×2Ñ2Ò2Ü˜* WÑ-¬sÔ3Ø'1°'Ñ':Ð&;�
˜7Ò#Ü 
¨7Ñ 3´TÔ:Ü Ð!CÓDÐDØˆEÜ# J¨wÑ$7Ó8ò ‘��QÜ#*§=¡=×#>Ñ#>Ñ#\ÐA[ÀJÐA[ÐPWÐYZÑA[Ñ#\Ð Ø—‘Ü—M‘M×1Ñ1Ø"2Ø-1¯_©_ð 2ó õðô #*§.¡.°%Ð"8×8ˆMàÐ(¬Z¸ÄtÔ-LäÑB°MÔBÔBØ$(�Mð( Ðð% %/§O¡OÓ$5ˆNÜ'9¸.Ó'IÐØ×Ñ˜{¨DÔ1Ü�}‰}×,Ñ,Ó.°$Ñ6à(9Ò(j¼W¿]¹]×=XÑ=XÑ=jÐ[iÑ=j�Ô%Ü&-§m¡m×&CÑ&Cð 'Ø)-¯©Ø"×3Ñ3ñ'ð %ñ'÷ !�ð Ðð ):Ò(j¼W¿]¹]×=XÑ=XÑ=jÐ[iÑ=j�Ô%Ü '§¡× 7Ñ 7ð !Ø)-¯©Ø"×3Ñ3ñ!ð %ñ!�ð
 Ðð3 9ùð!ús&   ‚FK"ÆKÆCK"É6K É7A'K"Ë K"r‰   c           	      ó*  — ddl m} |t        j                  j                  k(  s|t        j
                  j                  k(  rLt        |t        «      r<|j                  dd«      du r| j                  ||||¬«      }n ||t        «       ¬«      }|t        j                  j                  k(  s|t        j                  j                  k(  rHt        |t        «      r8|j                  dd«      du r| j                  ||||¬«      }�n™t        di |¤Ž}�nŒ|t        j                  j                  k(  s|t        j                  j                  k(  r%t        |t        «      r ||t!        «       d¬	«      }�n-|t        j"                  j                  k(  s|t        j$                  j                  k(  rt        |t        «      r ||d
d¬	«      }�nÖ|t        j&                  j                  k(  s|t        j(                  j                  k(  r,t        |t        «      rd|ddœ}	 ||t+        «       d|	¬«      }�np|t        j,                  j                  k(  s|t        j.                  j                  k(  r#t        |t        «      rddlm}
  |
|||¬«      }�n|dk(  s|dk(  �rt        |t        «      røt5        |«      }|rv|j                  dd«      du rO|dk(  rt        j                  j                  nt        j
                  j                  }| j                  ||||¬«      }nˆ ||t        «       ¬«      }nuddlm} t;        di |¤Ž}t=        |d«      r5|j>                  �)t        |j>                  t        «      rd|j>                  d<   |j                  dd«      du r |||||¬«      }n|}t=        |d«      r5|j>                  �)t        |j>                  t        «      rd|j>                  d<   tA        ||||| jB                  tD        jD                  jG                  «       ¬«       |S )aH  
        Internal method to process the cached result

        Checks the call type and converts the cached result to the appropriate model response object
        example if call type is text_completion -> returns TextCompletionResponse object

        Args:
            cached_result: Any:
            call_type: str:
            kwargs: Dict[str, Any]:
            logging_obj: LiteLLMLoggingObj:
            model: str:
            custom_llm_provider: Optional[str] = None:
            args: Optional[Tuple[Any, ...]] = None:

        Returns:
            Optional[Any]:
        r   )Ú convert_to_model_response_objectrO   FT)r,   rƒ   r‚   r�   )Úresponse_objectÚmodel_response_objectrÆ   )r  r  Úresponse_typeNÚrerankz	whisper-1)r�   r‰   r“   Úaudio_transcription)r  r  r  Úhidden_params)Ú(convert_cached_anthropic_messages_result)r,   r‚   rM   Ú
aresponsesÚ	responses)Ú#CachedResponsesAPIStreamingIteratorr”   r“   )Úresponser‚   Úrequest_datarƒ   )r±   r‚   r�   rM   rr   r’   r5   )$rÔ   r  r   Úacompletionr¥   Ú
completionrG   rÁ   rF   Ú_convert_cached_stream_responser   Úatext_completionÚtext_completionr   r¤   rÆ   r   Úarerankr  ÚatranscriptionÚtranscriptionr   Úanthropic_messagesÚaanthropic_messagesÚHlitellm.llms.anthropic.experimental_pass_through.messages.response_cacher  rL   Ú$litellm.responses.streaming_iteratorr  r   rW   r”   r   rr   r�   rž   )r   r,   rƒ   rM   r‚   r�   r„   r‰   r  r  r  Úuse_chat_completion_cacheÚbridge_call_typer  Úresponse_objs                  r7   r¡   z:LLMCachingHandler._convert_cached_result_to_model_response  s×  € õH 	Càœ×.Ñ.×4Ñ4Ò4¸	ÄY×EYÑEY×E_ÑE_Ò8_ÔeoØœ4ôf
ð �z‰z˜( EÓ*¨dÑ2Ø $× DÑ DØ"/Ø'Ø +Øð	 !Eó !‘ñ !AØ$1Ü*7«/ô!�ð
 œ×3Ñ3×9Ñ9Ò9¸YÌ)×JcÑJc×JiÑJiÒ=iÜ˜¬Ô-Ø�z‰z˜( EÓ*¨dÑ2Ø $× DÑ DØ"/Ø'Ø +Øð	 !Eó !’ô !7Ñ G¸Ñ G’Øœ9×/Ñ/×5Ñ5Ò5¸Äi×FYÑFY×F_ÑF_Ò9_ÔeoØœ4ôf
ñ =Ø -Ü&7Ó&9Ø)ôŠMð œ9×,Ñ,×2Ñ2Ò2°iÄ9×CSÑCS×CYÑCYÒ6YÔ_iØœ4ô`
ñ =Ø -Ø&*Ø&ôŠMð
 œ9×3Ñ3×9Ñ9Ò9¸YÌ)×JaÑJa×JgÑJgÒ=gÔmwØœ4ôn
ð %Ø':Ø!ñ$ˆMñ
 =Ø -Ü&;Ó&=Ø3Ø+ô	ŠMð œ×5Ñ5×;Ñ;Ò;¸yÌI×LiÑLi×LoÑLoÒ?oÜ˜¬Ô-õñ EØ+Ø'ØôŠMð
 ˜<Ò'¨9¸Ó+CÌÐTaÔcgÔIhÜ/NÈ}Ó/]Ð%Ù(Ø—:‘:˜h¨Ó.°$Ñ6à7@ÀLÒ7Pœ	×-Ñ-×3Ò3ÔV_×VjÑVj×VpÑVpð %ð %)×$HÑ$HØ&3Ø"2Ø$/Ø#ð	 %Ió %‘Mñ %EØ(5Ü.;«oô%‘Mõ
ô ';Ñ&K¸]Ñ&K�ä˜LÐ*:Ô;Ø$×3Ñ3Ð?Ü" <×#>Ñ#>ÄÔEà?C�L×/Ñ/°Ñ<à—:‘:˜h¨Ó.°$Ñ6Ù$GØ!-Ø$/Ø%+Ø"+ô	%‘Mð %1�Mô �MÐ#3Ô4Ø×,Ñ,Ð8Ü˜=×7Ñ7¼Ô>à8<ˆM×(Ñ(¨Ñ5ô
 	!Ø Ø#ØØØ—‘Ü×&Ñ&×*Ñ*Ó,õ	
ð Ðr6   c                 óÈ   — ddl m}m}m} |t        j
                  j                  k(  s|t        j                  j                  k(  r
 ||¬«      }n	 ||¬«      } |||d|¬«      S )Nr   )r)   Úconvert_to_streaming_responseÚ#convert_to_streaming_response_async)r  Úcached_response)Úcompletion_streamr�   r‰   r‚   )rÔ   r)   r/  r0  r   r  r¥   r"  )	r   r,   rƒ   r‚   r�   r)   r/  r0  Ú_stream_cached_results	            r7   r!  z1LLMCachingHandler._convert_cached_stream_responseº  so   € ÷	
ñ 	
ð œ	×-Ñ-×3Ñ3Ò3°yÄI×D^ÑD^×DdÑDdÒ7dÙ$GØ -ô%Ñ!ñ %BØ -ô%Ð!ñ #Ø3ØØ 1Ø#ô	
ð 	
r6   r±   c              ƒ   ó   ‡ ‡‡‡‡	K  — ddl m} t        j                  €yt        j                  Š|j	                  «       Š‰j                  t        ||«      «        |‰«      }|‰d<   ‰ j                  |‰¬«      rÓt        ‰t        j                  «      sJt        ‰t        j                  «      s0t        ‰t        «      s t        ‰t        «      st        ‰t        «      r^t        ‰t        «      r,t        ‰j                  t        «      st        ˆˆˆˆ fd„«       y‰j!                  «       Š	t        ˆˆˆ	ˆ fd„«       yt        ˆˆˆfd„«       yy­w)	ah  
        Internal method to check the type of the result & cache used and adds the result to the cache accordingly

        Args:
            result: Any:
            original_function: Callable:
            kwargs: Dict[str, Any]:
            args: Optional[Tuple[Any, ...]] = None:

        Returns:
            None
        Raises:
            None
        r   r'   Nr‡   ©rq   rM   c                  óB   •—  ‰ j                   ‰fd‰j                  i‰¤ŽS ©Nr  )Úasync_add_cache_pipeliner~   )r}   r·   r±   r   s   €€€€r7   ú<lambda>z3LLMCachingHandler.async_set_cache.<locals>.<lambda>  s,   ø€ Ð > × >Ñ >Ø"ñ!Ø9=¿¹ð!ØLVñ!€ r6   c                  óB   •—  ‰ j                   ‰fd‰j                  i‰¤ŽS r7  )Úasync_add_cacher~   )r}   r·   Úresult_jsonr   s   €€€€r7   r9  z3LLMCachingHandler.async_set_cache.<locals>.<lambda>  s.   ø€ Ð 5 × 5Ñ 5Ø'ñ!à15·±ð!ð )ñ!€ r6   c                  ó*   •—  ‰ j                   ‰fi ‰¤ŽS re   )r;  )r}   r·   r±   s   €€€r7   r9  z3LLMCachingHandler.async_set_cache.<locals>.<lambda>  s   ø€ Ð0E°×0EÑ0EÀfÑ0[ÐPZÑ0[€ r6   )Ú'litellm.litellm_core_utils.core_helpersr(   r|   r}   r–   r²   r³   Ú_should_store_result_in_cacherG   r   r   r   r   r   r   rk   Úmodel_dump_json)
r   r±   rq   rM   r„   r(   r‡   r}   r·   r<  s
   ``     @@@r7   Úasync_set_cachez!LLMCachingHandler.async_set_cache×  s  üè ø€ õ*	
ô �=‰=Ð ØÜ—}‘}ˆà"ŸK™K›Mˆ
Ø×ÑÜ"Ø!Øóô	
ñ #DÀJÓ"OÐØ)9ˆ
Ð%Ñ&à×-Ñ-Ð@QÐZdÐ-Ôeä˜6¤7×#8Ñ#8Ô9Ü˜f¤g×&?Ñ&?Ô@Ü˜fÔ&;Ô<Ü˜f¤nÔ5Ü˜fÔ&:Ô;ô ˜vÔ'8Ô9Ü& u§{¡{´GÔ<ä+öõð *0×)?Ñ)?Ó)A�KÜ+öõô (Õ([Õ\ð7 fùs   ‡EEc                 ó
  — |j                  «       }|j                  t        | j                  |«      «       t        j
                  €y| j                  | j                  |¬«      r t	        j
                  j                  |fi |¤Ž y)zE
        Sync internal method to add the result to the cache
        Nr5  )r–   r²   r³   rq   r|   r}   r?  Ú	add_cache)r   r±   rM   r„   r·   s        r7   Úsync_set_cachez LLMCachingHandler.sync_set_cache  st   € ð #ŸK™K›Mˆ
Ø×ÑÜ"Ø×&Ñ&Øóô	
ô �=‰=Ð Øà×-Ñ-À×@VÑ@VÐ_iÐ-ÔjÜ�M‰M×#Ñ# FÑ9¨jÒ9àr6   c                 ó  — t         j                  duxrs t         j                  j                  duxrU t        |j                  «      t         j                  j                  v xr$ |j                  di «      j                  dd«      duS )zÂ
        Helper function to determine if the result should be stored in the cache.

        Returns:
            bool: True if the result should be stored in the cache, False otherwise.
        Nr}   zno-storeFT)r|   r}   Úsupported_call_typesrH   r/   rF   )r   rq   rM   s      r7   r?  z/LLMCachingHandler._should_store_result_in_cache4  sy   € ô �]‰] $Ð&ò MÜ—‘×2Ñ2¸$Ð>òMäÐ&×/Ñ/Ó0´G·M±M×4VÑ4VÐVòMð —‘˜G RÓ(×,Ñ,¨Z¸Ó?ÀtÐKð		
r6   z3_StreamResultT | AnthropicMessagesStreamCacheWriterc                 ó(  — |t         j                  j                  t         j                  j                  fvr|S t        j
                  �'| j                  | j                  | j                  ¬«      s|S t        |t        «      s|S ddlm}  ||| ¬«      S )Nr5  r   r"   )rO   Úcaching_handler)r   r'  r¥   r(  r|   r}   r?  rq   r9   rG   r   r)  r#   )r   r±   rƒ   r#   s       r7   Úwrap_streaming_result_for_cachez1LLMCachingHandler.wrap_streaming_result_for_cacheB  s�   € ð Ü×(Ñ(×.Ñ.Ü×)Ñ)×/Ñ/ð
ñ 
ð ˆMÜ�=‰=Ð ¨×(JÑ(JØ"×4Ñ4¸T×=PÑ=Pð )Kô )
ð ˆMÜ˜&¤-Ô0ØˆMõ	
ñ 2¸ÐQUÔVÐVr6   c                 ó¸   — t         j                  �Jt         j                  j                  �0t        |j                  «      t         j                  j                  v ryy)aO  
        Helper function to determine if the call type is supported by the cache.

        call types are acompletion, aembedding, atext_completion, atranscription, arerank

        Defined on `litellm.types.utils.CallTypes`

        Returns:
            bool: True if the call type is supported by the cache, False otherwise.
        TF)r|   r}   rF  rH   r/   )r   rq   s     r7   r™   z2LLMCachingHandler._is_call_type_supported_by_cacheV  sB   € ô �M‰MÐ%Ü—‘×2Ñ2Ð>ÜÐ%×.Ñ.Ó/´7·=±=×3UÑ3UÑUàØr6   Úprocessed_chunkc              ƒ   ó  K  — t        || j                  t        j                  j                  «       | j                  | j
                  d¬«      }|�1| j                  || j                  | j                  ¬«      ƒ d{  –—†  yy7 Œ­w)zð
        Internal method to add the streaming response to the cache


        - If 'streaming_chunk' has a 'finish_reason' then assemble a litellm.ModelResponse object
        - Else append the chunk to self.async_streaming_chunks

        T©r±   rr   r’   r9   Ústreaming_chunksrŽ   N)r±   rq   rM   )r   rr   r�   rž   r9   ry   rA  rq   ©r   rK  Úcomplete_streaming_responses      r7   Ú _add_streaming_response_to_cachez2LLMCachingHandler._add_streaming_response_to_cachel  sŠ   è ø€ ô >Ø&ØŸ?™?Ü!×*Ñ*×.Ñ.Ó0Ø#×2Ñ2Ø!%×!<Ñ!<Øôð 	$ð 'Ð2Ø×&Ñ&Ø2Ø"&×"8Ñ"8Ø×*Ñ*ð 'ó ÷ ñ ð 3ðús   ‚A9BÁ;BÁ<Bc                 óÚ   — t        || j                  t        j                  j                  «       | j                  | j
                  d¬«      }|�| j                  || j                  ¬«       yy)zQ
        Sync internal method to add the streaming response to the cache
        FrM  N)r±   rM   )r   rr   r�   rž   r9   rz   rD  rO  s      r7   Ú%_sync_add_streaming_response_to_cachez7LLMCachingHandler._sync_add_streaming_response_to_cacheˆ  sn   € ô
 >Ø&ØŸ?™?Ü!×*Ñ*×.Ñ.Ó0Ø#×2Ñ2Ø!%×!;Ñ!;Øôð 	$ð 'Ð2Ø×ÑØ2Ø×*Ñ*ð  õ ð 3r6   rŽ   rÐ   r�   c	                 ó^  — |j                  dd«      ||j                  dd«      |j                  di «      |j                  di «      |j                  dd«      |j                  di «      |d	œ}	t        j                  �#t        j                  j                  di |¤Ž|	d
<   nd|	d
<   |j	                  ||j                  dd«      i |	|s|j                  dd«      n|j                  dd«      |j                  dd«      t        |«      d|j                  dd«      |¬«
       t        d|¬«      |_        y)a‚  
        Helper function to update the LiteLLMLoggingObj environment variables.

        Args:
            logging_obj (LiteLLMLoggingObj): The logging object to update.
            model (str): The model being used.
            kwargs (Dict[str, Any]): The keyword arguments from the original function call.
            cached_result (Any): The cached result to log.
            is_async (bool): Whether the call is asynchronous or not.
            is_embedding (bool): Whether the call is for embeddings or not.
            custom_llm_provider (Optional[str]): The custom llm provider being used.

        Returns:
            None
        Ú	logger_fnNrŠ   r®   r¬   Ú
model_infoÚproxy_server_requestÚstream_response)rU  r  rŠ   r¬   rV  rW  rX  r‰   r{   ÚuserÚmessagesr»   r‹   rO   F)
r�   rY  Úoptional_paramsÚlitellm_paramsr»   r‹   Úoriginal_responseÚadditional_argsrO   r‰   T)r“   r�   r5   )rF   r|   r}   Ú!_get_preset_cache_key_from_kwargsÚupdate_environment_variablesrH   r   Úcaching_details)
r   r‚   r�   rM   r,   rŽ   rÐ   r‰   r�   r\  s
             r7   r    z9LLMCachingHandler._update_litellm_logging_obj_environmentž  s$  € ð6  Ÿ™ K°Ó6Ø#ØŸ
™
 :¨rÓ2ØŸ
™
 :¨rÓ2Ø Ÿ*™* \°2Ó6Ø$*§J¡JÐ/EÀtÓ$LØ%Ÿz™zÐ*;¸RÓ@Ø#6ñ	!
ˆô �=‰=Ð$Ü18·±×1`Ñ1`Ñ1jÐciÑ1jˆNÐ-Ò.à15ˆNÐ-Ñ.à×0Ñ0ØØ—‘˜F DÓ)ØØ)Ù5A�6—:‘:˜j¨"Ô-ÀvÇzÁzÐRYÐ[]ÓG^Ø—J‘J˜y¨$Ó/Ü! -Ó0Ø Ø—:‘:˜h¨Ó.Ø 3ð 	1ô 	
ô '5ØØ/ô'
ˆÕ#r6   re   )FNN)/r/   r0   r1   r   rÁ   rH   rD   r�   r€   ÚLiteLLMLoggingObjr
   Útupler+   rª   r¹   rœ   r¾   rÕ   r   rÃ   r   r4   r¦   r    rç   r   ræ   rþ   r¢   r›   r   r   r   r   r)   r¡   r!  rA  rD  r?  r&   rI  r™   rQ  rS  rÖ   r    r5   r6   r7   rp   rp   œ   s„  „ ð#à#ð#ð ˜S &˜[Ñ)ð#ð ×%Ñ%ó	#ð< +/ñIàðIð $ðIð 'ð	Ið
 ×%Ñ%ðIð ðIð �S˜#�X‘ðIð �F˜C�KÑ  4Ñ'ðIð 
  $Ñ	&óIðf +/ñSCàðSCð $ðSCð 'ð	SCð
 ×%Ñ%ðSCð ðSCð �S˜#�X‘ðSCð �F˜C�KÑ  4Ñ'ðSCð 
 óSCðj	A°d¸3À¸;Ñ6Gð 	AÈDÐQTÉIó 	AðÀÀUÈ3ÐP_ÐK_ÑE`Ñ@að ÐfiÐlpÑfpó ðBQà):¸TÑ)AðBQð ˜O¨dÑ2Ñ3ðBQð �S˜#�X‘ð	BQð
 'ðBQð ×%Ñ%ðBQð ðBQð 
Ð  4Ñ'¨Ð-Ñ	.óBQðH	
 Eð 	
°5ð 	
¸Uó 	
ð0àÐ7Ñ8ð0ð Ð7Ñ8ð0ð 
Ð.Ñ	/ó	0ðd0Ià#9ð0Ið .ð0Ið ×%Ñ%ð	0Ið
 ×#Ñ#ð0Ið 
ó0Iðd"
à&ð"
ð ð"
ð ×%Ñ%ð	"
ð
 ×#Ñ#ð"
ð ó"
ðHKØðKØ&*¨3°¨;Ñ&7ðKØ?DÀVÈSÀ[Ñ?QðKà	ˆt‰óKðj +/ñgàðgð ðgð �S˜&�[Ñ!ð	gð
 'ðgð ðgð �F˜C�KÑ ðgð ! 4™Zðgð 	Ø
 ñ	!à
ñ	ð ñ	ð  ñ		 ð
 ñ	ð ñ	ógðR
àð
ð ð
ð 'ð	
ð
 ð
ð 
ó
ðD +/ñB]àðB]ð $ðB]ð �S˜#�X‘ð	B]ð
 �F˜C�KÑ  4Ñ'óB]ðP +/ñ	àðð �S˜&�[Ñ!ðð �F˜C�KÑ  4Ñ'ó	ð2
¸xð 
ÐQUÐVYÐ[^ÐV^ÑQ_ð 
Ðdhó 
ðWØ$ðWØ14ðWà	>óWð(à#ðð 
óð,Àmó ð8À]ó ð: #Ø*.Ø*.ñ:
à&ð:
ð ð:
ð �S˜#�X‘ð	:
ð
 ð:
ð ð:
ð ð:
ð ! 4™Zð:
ð ! 4™<ô:
r6   rp   rq   r„   .c                 óÖ   — t        j                  | «      }t        |j                  j	                  «       «      }i }|r,t        |«      D ]  \  }}|t        |«      k  sŒ||   }|||<   Œ  |S re   )ÚinspectÚ	signaturerœ   Ú
parametersrì   rÑ   rÓ   )rq   r„   rf  Úparam_namesÚargs_to_kwargsrÇ   ÚargÚ
param_names           r7   r³   r³   Û  sz   € ô
 ×(Ñ(Ð):Ó;€Iô ˜i×2Ñ2×7Ñ7Ó9Ó:€Kð €NÙÜ# D›/ò 	1‰JˆE�3Ø”s˜;Ó'Ó'Ø(¨Ñ/�
Ø-0�˜zÒ*ð	1ð
 Ðr6   re   )Or2   r]   r�   re  r—   Úcollections.abcr   r   r   r   r   r   Útypingr	   r
   r   r   r   Úpydanticr   r|   Úlitellm._loggingr   r   rx   r   Úlitellm.caching.cachingr   Úlitellm.constantsr   Ú?litellm.litellm_core_utils.llm_response_utils.response_metadatar   Ú(litellm.litellm_core_utils.logging_utilsr   Úlitellm.types.cachingr   Úlitellm.types.llms.openair   Úlitellm.types.rerankr   r×   r   r   r   r   r   r   r   r    Ú*litellm.litellm_core_utils.litellm_loggingr!   rb  r)  r#   r%   r&   r>  r(   Ú,litellm.litellm_core_utils.streaming_handlerr)   r+   r8   r3   rÁ   rH   rD   r@   r4   rL   rR   rX   rë   rY   rc   rk   rn   rp   rc  r³   r5   r6   r7   ú<module>ry     sé  ðòó  Û Û Û ß b× bß ?Õ ?å ã ß :Ý )Ý +Ý Hõõõ 2Ý :Ý /÷	÷ 	ó 	ñ ÝWõö ?àÐáÐ)Ó*€õõ Mô	3˜Yô 	3ñ +›_Ð �UÓ ,ðS°$°s¸F°{Ñ2Cð SÈÈSÐRXÈ[ÑHYó Sð &°4ð &¸Dó &ð
/¸4ÀÀVÀÑ;Lð 
/ÐQUó 
/ð[Ð/Kð [ÐPWÐX[Ð]cÐXcÑPdó [ñ
 ;>»%Ð �u˜SÐ!5Ñ6Ñ7Ó ?ð
ÀHÈRÐQZÐ[_ÑQ`ÐM`ÑDað 
Ðfjó 
ð¨8°B¸	À$¹Ð4GÑ+Hð ÐMaó ð1 w¨s°C¨xÑ'8ð 1¸SÀ4¹Zó 1÷
|
ñ |
ðB" '+ñØðà
�˜�Ñ
˜tÑ
#ðð 
ˆ#ˆvˆ+Ñôr6   