Ë
    tPêjB  ã                   ó   — U d Z ddlZddlZddlmZ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 ddlmZmZ dd	lmZ erdd
lmZ dZeed<   dZeed<   dedededz  fd„Zdee ef   deddfd„Z! G d„ de«      Z"y)zÂ
Compression Interception Handler

CustomLogger that compresses inbound Anthropic Messages requests and fulfills
litellm_content_retrieve tool calls server-side via the typed agentic loop plan.
é    N)ÚTYPE_CHECKINGÚAnyÚClassVarÚFinalÚcast)Úverbose_logger)Úcompress)ÚCustomLogger)ÚCompressionInterceptionConfigÚCompressionSavingsMetadata)ÚAgenticLoopPlanÚAgenticLoopRequestPatch)Ú	CallTypes)ÚLoggingÚlitellm_content_retrieveÚ"LITELLM_CONTENT_RETRIEVE_TOOL_NAMEi„  Ú_CACHE_TTL_SECONDSÚoriginal_tokensÚcompressed_tokensÚreturnc                 óÀ   — t        | t        «      st        | t        «      sy t        |t        «      st        |t        «      sy |dk  s| |k  ry t        | || |z
  d¬«      S )Nr   Úcompression_interception)Útokens_beforeÚtokens_afterÚtokens_savedÚsource)Ú
isinstanceÚboolÚintr   ©r   r   s     úz/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/compression_interception/handler.pyÚ _compression_savings_from_countsr"       se   € ô �/¤4Ô(´
¸?ÌCÔ0PØÜÐ#¤TÔ*´*Ð=NÔPSÔ2TØØ˜1Ò Ð2CÒ CØÜ%Ø%Ø&Ø$Ð'8Ñ8Ø)ô	ð ó    ÚkwargsÚsavingsc                 ó`   — | j                  d«      }t        |t        «      r||d<   yd|i| d<   y)aÕ  
    Attach savings to the request's litellm metadata so they land in the
    SpendLog row's metadata JSON under ``compression_savings``.

    ``/v1/messages`` requests carry proxy metadata under ``litellm_metadata``
    (the ``metadata`` key is Anthropic's own API field). The existing dict is
    updated in place because the proxy and the logging object hold references
    to the same object; replacing it would orphan writes made through those
    references.
    Úlitellm_metadataÚcompression_savingsN)Úgetr   Údict)r$   r%   Úexistings      r!   Ú_record_compression_savingsr,   1   s;   € ð —j‘jÐ!3Ó4€HÜ�(œDÔ!Ø*1ˆÐ&Ñ'ØØ"7¸Ð!A€FÐÒr#   c                   ó¦  ‡ — e Zd ZU dZ eeh«      Zeee      e	d<   	 	 	 	 	 d,de
dededz  dedz  deeef   dz  f
ˆ fd	„Zed
edd fd„«       Zedeeef   deeef   dd fd„«       Zdeeef   dedz  dedz  fd„Zdededee   dee   dz  de
dededee
ef   fd„Zdededee   dedededdde
dedefd„Zd-d„Zd edz  deeef   fd!„Zdedeeef   dedz  fd"„Zd#eeef   d$eeef   defd%„Zdedeeeeef      eeeef      f   fd&„Zdeeef   deeef   fd'„Z dede
fd(„Z!d)eeeef      dz  d*eeeef      deeeef      fd+„Z"ˆ xZ#S ).ÚCompressionInterceptionLoggeraŠ  
    CustomLogger that implements transparent prompt compression + retrieval loops.

    Flow:
    1. Compress inbound /v1/messages requests in pre-call hook.
    2. Inject litellm_content_retrieve tool and persist compressed cache by call_id.
    3. Detect retrieval tool_use blocks in first model response.
    4. Build typed rerun plan with tool_result blocks from the compressed cache.
    Úserver_fulfilled_tool_namesNÚenabledÚcompression_triggerÚcompression_targetÚembedding_modelÚembedding_model_paramsc                 óv   •— t         ‰| �  «        || _        || _        || _        || _        || _        i | _        y ©N)ÚsuperÚ__init__r0   r1   r2   r3   r4   Ú_compression_cache_by_call_id)Úselfr0   r1   r2   r3   r4   Ú	__class__s         €r!   r8   z&CompressionInterceptionLogger.__init__P   s?   ø€ ô 	‰ÑÔØˆŒØ#6ˆÔ Ø"4ˆÔØ.ˆÔØ&<ˆÔ#ØVXˆÕ*r#   Úconfigr   c           	      óÚ   —  | t        |j                  dd«      «      t        |j                  dd«      «      |j                  d«      |j                  d«      |j                  d«      ¬«      S )	Nr0   Tr1   é@ r2   r3   r4   )r0   r1   r2   r3   r4   )r   r)   r   )Úclsr<   s     r!   Úfrom_config_yamlz.CompressionInterceptionLogger.from_config_yaml`   s]   € áÜ˜Ÿ™ I¨tÓ4Ó5Ü # F§J¡JÐ/DÀgÓ$NÓ OØ%Ÿz™zÐ*>Ó?Ø"ŸJ™JÐ'8Ó9Ø#)§:¡:Ð.FÓ#Gô
ð 	
r#   Úlitellm_settingsÚcallback_specific_paramsc                 ó˜   — i }d| v r| d   }n*d|v r&t        |d   t        «      rt        t        |d   «      }t        j                  |«      S )NÚcompression_interception_paramsr   )r   r*   r   r   r.   r@   )rA   rB   Úcompression_paramss      r!   Úinitialize_from_proxy_configz:CompressionInterceptionLogger.initialize_from_proxy_configj   sh   € ð
 =?ÐØ,Ð0@Ñ@Ø!1Ð2SÑ!TÑØ'Ð+CÑCÌ
Ø$Ð%?Ñ@Ä$ôI
ô "&Ü-Ø(Ð)CÑDó"Ðô -×=Ñ=Ð>PÓQÐQr#   r$   Ú	call_typec           	   ƒ   ó   K  — | j                   sy |�|t        j                  k7  ry t        |j	                  dd«      xs d«      dkD  ry |j	                  d«      }|j	                  d«      }t        |t        «      rt        |t        «      sy | j                  |j	                  d«      «      ry | j                  «        t        ||t        j                  | j                  | j                  | j                  | j                  ¬«      }t        t         t        t        f   |j	                  di «      «      }t        t        d z  |j	                  d«      «      }t        t        t         t        t"        f      |j	                  dg «      «      }|�r9|d   |d<   |rJ| j%                  t        t        t         t        t"        f      d z  |j	                  d«      «      |¬	«      |d<   t        t        d z  |j	                  d
«      «      }	|	s"t        t'        j(                  «       «      }	|	|d
<   |t+        j*                  «       f| j,                  |	<   t/        |j	                  d«      |j	                  d«      ¬«      }
|
�t1        ||
¬«       t3        j4                  d|	|j	                  d«      |j	                  d«      t7        |«      «       |S |�6t3        j4                  d||j	                  d«      |j	                  d«      «       |S ­w)NÚ_agentic_loop_depthr   ÚmessagesÚmodelÚtools)rJ   rK   rG   r1   r2   r3   r4   ÚcacheÚcompression_skipped_reason)Úexisting_toolsÚcompressed_toolsÚlitellm_call_idr   r   r    )r$   r%   zaCompressionInterception: compressed request [call_id=%s original=%d compressed=%d cached_keys=%d]zRCompressionInterception: compression skipped [reason=%s original=%d compressed=%d])r0   r   Úanthropic_messagesr   r)   r   ÚlistÚstrÚ_has_retrieval_toolÚ_prune_expired_cacher	   r1   r2   r3   r4   r   r*   r   Ú_merge_toolsÚuuidÚuuid4Útimer9   r"   r,   r   ÚdebugÚlen)r:   r$   rG   rJ   rK   Ú
compressedrM   Úskip_reasonrP   Úcall_idr%   s              r!   Úasync_pre_call_deployment_hookz<CompressionInterceptionLogger.async_pre_call_deployment_hook{   sš  è ø€ Ø�|Š|ØØÐ  Y´)×2NÑ2NÒ%NØÜˆv�z‰zÐ/°Ó3Ò8°qÓ9¸AÒ=Øà Ÿ*™* ZÓ0ˆØ—z‘z 'Ó*ˆÜ˜(¤DÔ)´¸EÄ3Ô1GØà×#Ñ# F§J¡J¨wÓ$7Ô8Øà×!Ñ!Ô#ä$ØØÜ×2Ñ2Ø $× 8Ñ 8Ø#×6Ñ6Ø ×0Ñ0Ø#'×#>Ñ#>ô
ˆ
ô œD¤¤c ™N¨J¯N©N¸7ÀBÓ,GÓHˆÜ!¤#¨¡*¨j¯n©nÐ=YÓ.ZÓ[ˆÜ"&¤t¬D´´c°©NÑ';¸Z¿^¹^ÈGÐUWÓ=XÓ"YÐò Ø!+¨JÑ!7ˆF�:ÑÙØ"&×"3Ñ"3Ü#'¬¬T´#´s°(©^Ñ(<¸tÑ(CÀVÇZÁZÐPWÓEXÓ#YØ%5ð #4ó #��w‘ô œ3 ™: v§z¡zÐ2CÓ'DÓEˆGÙÜœdŸj™j›lÓ+�Ø,3�Ð(Ñ)Ø;@Ä$Ç)Á)Ã+Ð:NˆD×.Ñ.¨wÑ7Ü=Ø *§¡Ð/@Ó AØ",§.¡.Ð1DÓ"EôˆGð Ð"Ü+°6À7ÕKÜ× Ñ ØsØØ—‘Ð0Ó1Ø—‘Ð2Ó3Ü�E“
ôð ˆð Ð$Ü× Ñ ØdØØ—‘Ð0Ó1Ø—‘Ð2Ó3ô	ð ˆùs   ‚K<K>ÚresponserK   rJ   rL   ÚstreamÚcustom_llm_providerc              ƒ   óš   K  — | j                   sdi fS | j                  |«      sdi fS | j                  |¬«      \  }}	|sdi fS d||	ddœfS ­w)NF)ra   TÚcompression_retrieval)Ú
tool_callsÚthinking_blocksÚ	tool_type)r0   rU   Ú_extract_retrieval_tool_calls)
r:   ra   rK   rJ   rL   rb   rc   r$   rf   rg   s
             r!   Úasync_should_run_agentic_loopz;CompressionInterceptionLogger.async_should_run_agentic_loopÃ   sr   è ø€ ð �|Š|Ø˜"�9ÐØ×'Ñ'¨Ô.Ø˜"�9Ðà&*×&HÑ&HÐRZÐ&HÓ&[Ñ#ˆ
�OÙØ˜"�9ÐàØ$Ø.Ø0ñ
ð 
ð 	
ùs   ‚A	AÚ"anthropic_messages_provider_configÚ*anthropic_messages_optional_request_paramsÚlogging_objzLiteLLMLoggingObj | Nonec
              ƒ   óx  K  — | j                  «        t        t        t        t        t
        f      |j                  dg «      «      }
t        t        t        t        t
        f      |j                  dg «      «      }| j                  ||	¬«      }| j                  |¬«      }|
D �cg c]  }| j                  ||«      ‘Œ }}d||
D �cg c]<  }d|j                  d«      |j                  dt        «      |j                  d	i «      d
œ‘Œ> c}z   dœ}dt        t        |
«      «      D �cg c]  }d|
|   j                  d«      ||   dœ‘Œ c}dœ}|||gz   }t        t        d z  |j                  d«      xs |	j                  d«      «      }|j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}|}|�<|j                  j                  di «      }t        t        |j                  d|«      «      }t!        ||||| j#                  |	¬«      ¬«      }t%        d|d|xs ddœ¬«      S c c}w c c}w c c}w c c}}w ­w)Nrf   rg   )rm   r$   )r_   Ú	assistantÚtool_useÚidÚnameÚinput)Útyperq   rr   rs   )ÚroleÚcontentÚuserÚtool_result)rt   Útool_use_idrv   Ú
max_tokensÚagentic_loop_paramsrK   )r$   )rK   rJ   rz   Úoptional_paramsr$   Tre   Ú )rh   r_   )Úrun_agentic_loopÚrequest_patchÚmetadata)rV   r   rS   r*   rT   r   r)   Ú_resolve_call_idÚ
_get_cacheÚ_resolve_retrieval_contentr   Úranger\   r   ÚitemsÚmodel_call_detailsr   Ú_prepare_followup_kwargsr   )r:   rL   rK   rJ   ra   rk   rl   rm   rb   r$   rf   rg   r_   rM   ÚtcÚretrieval_resultsÚassistant_messageÚiÚuser_messageÚfollow_up_messagesrz   ÚkÚvÚ"optional_params_without_max_tokensÚfull_model_nameÚagentic_paramsr   s                              r!   Úasync_build_agentic_loop_planz;CompressionInterceptionLogger.async_build_agentic_loop_planÜ   sg  è ø€ ð 	×!Ñ!Ô#Ü ¤¤d¬3´¨8¡nÑ!5°u·y±yÀÈrÓ7RÓSˆ
Ü!%¤d¬4´´S°©>Ñ&:¸E¿I¹IÐFWÐY[Ó<\Ó!]ˆà×.Ñ.¸;ÈvÐ.ÓVˆØ—‘¨w�Ó7ˆØYcÖ#dÐSU D×$CÑ$CÀBÈÕ$NÐ#dÐÐ#dð  Ø&ð %öð ð 'ØŸ&™& ›,ØŸF™F 6Ô+MÓNØŸV™V G¨RÓ0ó	òñ	ñ$
Ðð ô œs :›Ó/öð ð	 *Ø#-¨a¡=×#4Ñ#4°TÓ#:Ø0°Ñ3óòñ

ˆð %-Ð0AÀ<Ð/PÑ$PÐä Ü�$‰JØ6×:Ñ:¸<ÓHÒdÈFÏJÉJÐWcÓLdó
ˆ
ð
 H×MÑMÓO÷5
Ù�Q˜ÐSTÐXdÓSdˆAˆq‰Dð5
Ð*ñ 5
ð  ˆØÐ"Ø$/×$BÑ$B×$FÑ$FÐG\Ð^`Ó$aˆNÜ"¤3¨×(:Ñ(:¸7ÀEÓ(JÓKˆOä6Ø!Ø'Ø!Ø>Ø×0Ñ0¸Ð0Ó?ô 
ˆô Ø!Ø'Ø#:ÀwÂ}ÐRTÑUô
ð 	
ùòc $eùò
ùòùó5
ùs?   ‚B"H:Â$H%Â=H:ÃAH*ÄH:Ä$"H/ÅAH:ÆH4Æ(H4Æ-BH:c                 óÆ   — t        j                   «       }| j                  j                  «       D ���ci c]  \  }\  }}||z
  t        k  r|||f“Œ c}}}| _        y c c}}}w r6   )rZ   r9   r…   r   )r:   Únowr_   rM   Ú
created_ats        r!   rV   z2CompressionInterceptionLogger._prune_expired_cache%  sj   € Ü—Y‘Y“[ˆð ×3Ñ3×9Ñ9Ó;÷.
ð .
ñ�ñ ØØà�ZÑÔ#5Ò5ð �e˜ZÐ(Ñ(ô.
ˆÕ*ùô .
s   ³Ar_   c                 óR   — |si S | j                   j                  |«      }|€i S |d   S )Nr   )r9   r)   )r:   r_   Úcache_entrys      r!   r‚   z(CompressionInterceptionLogger._get_cache0  s5   € ÙØˆIØ!×?Ñ?×CÑCÀGÓLˆØÐØˆIØ˜1‰~Ðr#   c                 ó¼   — |�!t        |dd «      }t        |t        «      r|r|S |j                  d«      }t	        t        d z  t        |t        «      r|«      S d «      S )NrQ   )Úgetattrr   rT   r)   r   )r:   rm   r$   Úlogging_call_idÚkwargs_call_ids        r!   r�   z.CompressionInterceptionLogger._resolve_call_id8  s[   € ØÐ"Ü%,¨[Ð:KÈTÓ%RˆOÜ˜/¬3Ô/±OØ&Ð&Ø &§
¡
Ð+<Ó =ˆÜ”C˜$‘J´*¸^ÌSÔ2Q Ó\Ð\ÐW[Ó\Ð\r#   Ú	tool_callrM   c                 ó¬   — |j                  di «      }d}t        |t        «      rt        |j                  dd«      xs d«      }|sy||v r||   S d|› d�S )Nrs   r}   ÚkeyzNo retrieval key provided.z[compressed content key 'z' not found])r)   r   r*   rT   )r:   r�   rM   Ú	raw_inputrŸ   s        r!   rƒ   z8CompressionInterceptionLogger._resolve_retrieval_content@  sa   € Ø$Ÿ=™=¨°"Ó5ˆ	ØˆÜ�i¤Ô&Ü�i—m‘m E¨2Ó.Ò4°"Ó5ˆCÙØ/Ø�%‰<Ø˜‘:ÐØ*¨3¨%¨|Ð<Ð<r#   c                 ó0  — t        |t        «      r|j                  dg «      }nt        |dg «      xs g }t        |t        «      sg g fS g }g }|D �]A  }t        |t        «      r}|j                  d«      }|j                  d«      }|dv r|j                  |«       |dk(  sŒQ|t        k(  sŒ[|j                  |j                  d«      d||j                  di «      dœ«       Œ‘t        |dd «      }t        |dd «      }|d	k(  r,|j                  d	t        |d	d
«      t        |dd
«      dœ«       n$|dk(  r|j                  dt        |dd
«      dœ«       |dk(  s�Œ|t        k(  s�Œ|j                  t        |dd «      d|t        |di «      xs i dœ«       �ŒD ||fS )Nrv   rt   rr   )ÚthinkingÚredacted_thinkingrp   rq   rs   )rq   rt   rr   rs   r¢   r}   Ú	signature)rt   r¢   r¤   r£   Údata)rt   r¥   )r   r*   r)   rš   rS   Úappendr   )r:   ra   rv   rf   rg   ÚblockÚ
block_typeÚ
block_names           r!   ri   z;CompressionInterceptionLogger._extract_retrieval_tool_callsK  s²  € Ü�h¤Ô%Ø—l‘l 9¨bÓ1‰Gä˜h¨	°2Ó6Ò<¸"ˆGä˜'¤4Ô(Ø�r�6ˆMà24ˆ
Ø79ˆàó )	ˆEÜ˜%¤Ô&Ø"ŸY™Y vÓ.�
Ø"ŸY™Y vÓ.�
ØÐ!BÑBØ#×*Ñ*¨5Ô1Ø Ó+°
Ô>`Ó0`Ø×%Ñ%à"'§)¡)¨D£/Ø$.Ø$.Ø%*§Y¡Y¨w¸Ó%;ñ	õô % U¨F°DÓ9�
Ü$ U¨F°DÓ9�
Ø Ò+Ø#×*Ñ*à$.Ü(/°°zÀ2Ó(FÜ)0°¸ÀRÓ)Hñõð  Ð#6Ò6Ø#×*Ñ*à$7Ü$+¨E°6¸2Ó$>ñôð  Ô+°
Ô>`Ô0`Ø×%Ñ%ä")¨%°°tÓ"<Ø$.Ø$.Ü%,¨U°G¸RÓ%@Ò%FÀBñ	öðE)	ðV ˜?Ð*Ð*r#   c                 óŠ   — dh}|j                  «       D ��ci c]  \  }}|j                  d«      rŒ||vsŒ||“Œ! c}}S c c}}w )NÚlitellm_logging_objÚ_compression_interception)r…   Ú
startswith)r:   r$   Úinternal_keysrŽ   r�   s        r!   r‡   z6CompressionInterceptionLogger._prepare_followup_kwargs„  sJ   € Ø 5Ð6ˆà#Ÿ\™\›^÷
Ù�Q˜°1·<±<Ð@[Õ3\ÐabÐjwÒawˆAˆq‰Dó
ð 	
ùó 
s   —?±?¶?c                 óR  — t        |t        «      sy|D ]‘  }t        |t        «      sŒ|j                  d«      }|j                  d«      dk(  r*t        |t        «      r|j                  d«      t        k(  r y|j                  d«      dk(  sŒx|j                  d«      t        k(  sŒ‘ y y)NFÚfunctionrt   rr   TÚcustom)r   rS   r*   r)   r   )r:   rL   Útoolr°   s       r!   rU   z1CompressionInterceptionLogger._has_retrieval_toolŠ  s’   € Ü˜%¤Ô&ØØò 	ˆDÜ˜d¤DÔ)ØØ—x‘x 
Ó+ˆHØ�x‰x˜Ó :Ò-´*¸XÄtÔ2LØ—<‘< Ó'Ô+MÒMÙØ�x‰x˜Ó 8Ó+°·±¸Ó0@ÔDfÓ0fÙð	ð r#   rO   rP   c                 ól   — t        |xs g «      }| j                  |«      r|S |j                  |«       |S r6   )rS   rU   Úextend)r:   rO   rP   Úmergeds       r!   rW   z*CompressionInterceptionLogger._merge_tools˜  s8   € ô
 ˜^Ò1¨rÓ2ˆØ×#Ñ# FÔ+ØˆMØ�‰Ð&Ô'Øˆr#   )Tr>   NNN)r   N)$Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	frozensetr   r/   r   rT   Ú__annotations__r   r   r*   r   r8   Úclassmethodr   r@   ÚstaticmethodrF   r   r`   rS   Útuplerj   r   r“   rV   r‚   r�   rƒ   ri   r‡   rU   rW   Ú__classcell__)r;   s   @r!   r.   r.   C   sD  ø… ññ =FÐGiÐFjÓ<kÐ ¨)°C©.Ñ!9Ókð Ø#*Ø)-Ø&*Ø8<ñYàðYð !ðYð   $™Jð	Yð
 ˜t™ðYð !% S¨# X¡°Ñ 5õYð  ð
Ð&Cð 
ÐHgò 
ó ð
ð ðRØ˜s C˜x™.ðRà"& s¨C x¡.ðRð 
)òRó ðRð F¸4ÀÀSÀ¹>ð FÐV_ÐbfÑVfð FÐkoÐrvÑkvó FðP
àð
ð ð
ð �t‘*ð	
ð
 �D‰z˜DÑ ð
ð ð
ð !ð
ð ð
ð 
ˆt�TˆzÑ	ó
ð2G
àðG
ð ðG
ð �t‘*ð	G
ð
 ðG
ð -0ðG
ð 59ðG
ð 0ðG
ð ðG
ð ðG
ð 
óG
óR	
ð #¨¡*ð °°c¸3°h±ó ð]¨Cð ]¸¸cÀ3¸h¹ð ]ÈCÐRVÉJó ]ð	=°D¸¸c¸±Nð 	=È4ÐPSÐUXÐPXÉ>ð 	=Ð^aó 	=ð7+°cð 7+¸eÀDÈÈcÐSVÈhÉÑDXÐZ^Ð_cÐdgÐilÐdlÑ_mÑZnÐDnÑ>oó 7+ðr
¨t°C¸°H©~ð 
À$ÀsÈCÀxÁ.ó 
ð¨ð °ó ð	à˜T # s (™^Ñ,¨tÑ3ð	ð ˜t C¨ H™~Ñ.ð	ð 
ˆd�3˜�8‰nÑ	÷		r#   r.   )#r¹   rZ   rX   Útypingr   r   r   r   r   Úlitellm._loggingr   Úlitellm.compressionr	   Ú"litellm.integrations.custom_loggerr
   Ú3litellm.types.integrations.compression_interceptionr   r   Ú(litellm.types.integrations.custom_loggerr   r   Úlitellm.types.utilsr   Ú*litellm.litellm_core_utils.litellm_loggingr   ÚLiteLLMLoggingObjr   r»   r   Úobjectr"   r*   rT   r,   r.   © r#   r!   ú<module>rË      s¥   ðòó Û ß <Õ <å +Ý (Ý ;÷÷õ *áÝWà,FÐ " EÓ FØ#Ð �EÓ #ðØðØ06ðà $Ñ&óð"B¨¨S°&¨[Ñ(9ð BÐD^ð BÐcgó Bô$^ Lõ ^r#   