Ë
    tPêjm˜  ã                   ól  — d dl Z d dlZd dlmZmZ d dlmZmZmZmZm	Z	 d dl
mZ d dlm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 d dlmZ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) erd dl*m+Z, d dl-m.Z/ e,ez  Z+e/Z.neZ+eZ.de0de1fd„Z2 G d„ de«      Z3 G d„ de«      Z4y)é    N)ÚdatetimeÚ	timedelta)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚNoReturn)Ú	BaseModel)Ú	TypedDict)Ú	DualCacheÚEmbeddingResponseÚModelResponseÚTextCompletionResponse©Úverbose_proxy_logger)ÚRateLimitType)ÚCustomLogger)Ú!_get_parent_otel_span_from_kwargs)ÚCommonProxyErrorsÚCurrentItemRateLimitÚUserAPIKeyAuth)Úget_key_model_rpm_limitÚget_key_model_tpm_limit)Úthrottled_limit)ÚProxyRateLimitError)Ú#resolve_llm_provider_for_rate_limit)ÚUsage)ÚSpan)ÚInternalUsageCacheÚresponse_objÚreturnc                 ó�   — t        | t        t        t        f«      syt	        | dd «      }t        |t
        «      r|j                  S dS )Nr   Úusage)Ú
isinstancer   r   r   Úgetattrr   Útotal_tokens)r    Úresponse_usages     úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/hooks/parallel_request_limiter.pyÚ_response_total_tokensr)   %   sA   € Ü�l¤]Ô4EÔG]Ð$^Ô_ØÜ# L°'¸4Ó@€NÜ*4°^ÄUÔ*Kˆ>×&Ñ&ÐRÐQRÐRó    c                   ón   — e Zd ZU edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   y)ÚCacheObjectNÚcurrent_global_requestsÚrequest_count_api_keyÚrequest_count_api_key_modelÚrequest_count_user_idÚrequest_count_team_idÚrequest_count_end_user_id)Ú__name__Ú
__module__Ú__qualname__ÚdictÚ__annotations__© r*   r(   r,   r,   ,   s>   … Ø! D™[Ó(Ø $™;Ó&Ø!%¨¡Ó,Ø $™;Ó&Ø $™;Ó&Ø# d™{Ô*r*   r,   c                   óf  ‡ — e Zd Zdefd„Zd„ Zdededede	de
d	e
d
e
dedz  de	ded   deeeef      defd„Zdefd„Z	 	 	 d%de	dz  dedz  de	dz  defd„Z	 d&de	dz  de	dz  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dededede	fd„Zdefd „Zd!„ Zd"e	dededz  fd#„Zdedefˆ fd$„Zˆ xZS )'Ú!_PROXY_MaxParallelRequestsHandlerÚinternal_usage_cachec                 ó   — || _         y ©N)r;   )Úselfr;   s     r(   Ú__init__z*_PROXY_MaxParallelRequestsHandler.__init__7   s
   € Ø$8ˆÕ!r*   c                 ó†   — 	 t        j                  |«       t        j                  rt	        |«       y y # t
        $ r Y y w xY wr=   )r   ÚdebugÚlitellmÚset_verboseÚprintÚ	Exception)r>   Úprint_statements     r(   Úprint_verbosez/_PROXY_MaxParallelRequestsHandler.print_verbose:   s=   € ð	Ü ×&Ñ& Ô7Ü×"Ò"Ü�oÕ&ð #øäò 	Ùð	ús   ‚04 ´	A ¿A Úuser_api_key_dictÚcacheÚdataÚ	call_typeÚmax_parallel_requestsÚ	tpm_limitÚ	rpm_limitÚcurrentNr.   Úrate_limit_type)ÚkeyÚmodel_per_keyÚuserÚcustomerÚteamÚvalues_to_update_in_cacher!   c              ƒ   ó@  K  — t        j                  d|
|«       |€³|dk(  s
|dk(  s|dk(  r‰|dk(  rt        j                  }n&|dk(  rt        j                  }nt        j
                  }| j                  t        j                  j                  › d|
› d|› d|› d|› �	||r|j                  d«      nd ¬«       d	dd	d
œ}|j                  |	|f«       �nt        |d   «      |k  r9|d   |k  r1|d   |k  r)|d   d	z   |d   |d   d	z   d
œ}|j                  |	|f«       nÐt        |d   «      |k\  rt        j                  }n)|d   |k\  rt        j                  }nt        j
                  }|r|j                  d«      nd }t        |«      \  }}t        d|
› dt        j                  j                  › d|d   › d|› d|d   › d|› d|d   › d|› �dt        | j!                  «       «      i|||¬«      ‚| j"                  j%                  |d|j&                  d¬«      ƒ d {  –—†  |S 7 Œ­w)Nz&Current Usage of %s in this minute: %sr   z. Hit limit for z). Current limits: max_parallel_requests: z, tpm_limit: z, rpm_limit: Úmodel)Úadditional_detailsrP   Úrequested_modelé   ©Úcurrent_requestsÚcurrent_tpmÚcurrent_rpmr]   r^   r_   z1LiteLLM Rate Limit Handler for rate limit type = z. z. current rpm: z, rpm limit: z, current tpm: z, tpm limit: z!, current max_parallel_requests: z, max_parallel_requests: úretry-after©ÚdetailÚheadersrP   rX   Úllm_provideré<   T)Ú
cache_listÚttlÚlitellm_parent_otel_spanÚ
local_only)r   Úinfor   ÚCONCURRENT_REQUESTSÚTOKENSÚREQUESTSÚraise_rate_limit_errorr   Ú"max_parallel_request_limit_reachedÚvalueÚgetÚappendÚintr   r   ÚstrÚtime_to_next_minuter;   Úasync_batch_set_cacheÚparent_otel_span)r>   rH   rI   rJ   rK   rL   rM   rN   rO   r.   rP   rV   Útriggered_typeÚnew_valrZ   Úresolved_modelrd   s                    r(   Úcheck_key_in_limitsz5_PROXY_MaxParallelRequestsHandler.check_key_in_limitsB   s@  è ø€ ô 	×!Ñ!Ð"JÈOÐ]dÔeØˆ?Ø$¨Ò)¨Y¸!ª^¸yÈAº~ð )¨AÒ-Ü%2×%FÑ%F‘NØ !’^Ü%2×%9Ñ%9‘Nä%2×%;Ñ%;�NØ×+Ñ+Ü*;×*^Ñ*^×*dÑ*dÐ)eÐeuð  wFð  vGð  Gpð  qFð  pGð  GTð  U^ð  T_ð  _lð  mvð  lwð  (xØ$2Ù9= D§H¡H¨WÔ$5À4ð ,ô ð %&Ø Ø ñˆGð
 &×,Ñ,Ð.CÀWÐ-MÖNä�Ð*Ñ+Ó,Ð/DÒDØ˜Ñ&¨Ò2Ø˜Ñ&¨Ò2ð %,Ð,>Ñ$?À!Ñ$CØ& }Ñ5Ø& }Ñ5¸Ñ9ñˆGð
 &×,Ñ,Ð.CÀWÐ-MÕNô �7Ð-Ñ.Ó/Ð3HÒHÜ!.×!BÑ!B‘Ø˜Ñ'¨9Ò4Ü!.×!5Ñ!5‘ä!.×!7Ñ!7�Ù:> T§X¡X¨gÔ%6ÀDˆOÜ+NÈÓ+_Ñ(ˆN˜LÜ%ØJÈ?ÐJ[Ð[]Ô^o÷  _Sñ  _S÷  _Yñ  _Yð  ^Zð  Zið  jqð  rñ  j@ð  iAð  ANð  OXð  NYð  Yhð  ipð  q~ñ  ið  h@ð  @Mð  NWð  MXð  Xyð  zAð  BTñ  zUð  yVð  Voð  pEð  oFð  GØ&¬¨D×,DÑ,DÓ,FÓ(GÐHØ .Ø$Ø)ôð ð ×'Ñ'×=Ñ=Ø0ØØ%6×%GÑ%GØð	 >ó 
÷ 	
ð 	
ð ˆð	
ús   ‚HHÈHÈHc                 ó”   — t        j                  «       }|t        d¬«      z   j                  dd¬«      }||z
  j	                  «       }|S )Nr[   )Úminutesr   )ÚsecondÚmicrosecond)r   Únowr   ÚreplaceÚtotal_seconds)r>   r€   Únext_minuteÚseconds_to_next_minutes       r(   ru   z5_PROXY_MaxParallelRequestsHandler.time_to_next_minute“   sK   € ä—\‘\“^ˆð "¤I°aÔ$8Ñ8×AÑAÈÐXYÐAÓZˆð *5°sÑ):×(IÑ(IÓ(KÐà%Ð%r*   rY   rZ   c                 ó¬   — d}|�|dz   |z   }t        |«      \  }}t        |dt        | j                  «       «      i|xs t        j
                  ||¬«      ‚)u  
        Raise a 429 with a retry-after header for litellm-proxy parallel-request limits.

        Always raises :class:`ProxyRateLimitError` â€” never returns. Annotated
        ``NoReturn`` so type-checkers know callers after this invocation are
        unreachable. The raised exception is both a
        :class:`litellm.RateLimitError` (so callers can catch by category) and a
        :class:`fastapi.HTTPException` (so the FastAPI dispatcher serializes it
        correctly with status 429 and the supplied headers).

        ``rate_limit_type`` defaults to ``CONCURRENT_REQUESTS`` because every
        existing internal caller of this helper hits the parallel-request cap
        (the global-limit branch in ``async_pre_call_hook`` and the
        all-zeros base case in ``check_key_in_limits``). Callers that know
        the dimension exactly should pass it explicitly.

        ``requested_model`` is resolved via :func:`get_llm_provider` so the
        raised exception carries ``llm_provider`` (and a stripped ``model``)
        for downstream loggers (Prometheus failure metric, observability
        callbacks). Falls back to ``llm_provider="litellm_proxy"`` when the
        model is missing or unparseable â€” see
        :func:`resolve_llm_provider_for_rate_limit`.
        z"Max parallel request limit reachedú r`   ra   )r   r   rt   ru   r   rk   )r>   rY   rP   rZ   Úerror_messagerz   rd   s          r(   rn   z8_PROXY_MaxParallelRequestsHandler.raise_rate_limit_errorŸ   si   € ð@ =ˆØÐ)Ø)¨CÑ/Ð2DÑDˆMÜ'JÈ?Ó'[Ñ$ˆ˜Ü!Ø Ø"¤C¨×(@Ñ(@Ó(BÓ$CÐDØ+ÒP¬}×/PÑ/PØ Ø%ô
ð 	
r*   r-   r/   r0   r1   r2   rw   c           	   ƒ   óÔ   K  — ||||||g}| j                   j                  ||¬«      ƒ d {  –—† }	|	€t        d d d d d d ¬«      S t        |	d   |	d   |	d   |	d   |	d   |	d   ¬«      S 7 Œ:­w)	N)Úkeysrw   )r-   r.   r/   r0   r1   r2   r   r[   é   é   é   é   )r;   Úasync_batch_get_cacher,   )
r>   r-   r.   r/   r0   r1   r2   rw   r‰   Úresultss
             r(   Úget_all_cache_objectsz7_PROXY_MaxParallelRequestsHandler.get_all_cache_objectsË   s®   è ø€ ð $Ø!Ø'Ø!Ø!Ø%ð
ˆð  $×8Ñ8×NÑNØØ-ð  Oó  
÷ 
ˆð
 ˆ?ÜØ(,Ø&*Ø,0Ø&*Ø&*Ø*.ôð ô Ø$+¨A¡JØ")¨!¡*Ø(/°©
Ø")¨!¡*Ø")¨!¡*Ø&-¨a¡jô
ð 	
ð
ús   ‚)A(«A&¬;A(c              ƒ   óÎ  K  — | j                  d«       |j                  }|j                  }|€t        j                  }|€i }|j                  di «      j                  dd «      }t        |dd «      }t        t        |dt        j                  «      |«      }	|	€t        j                  }	t        t        |dt        j                  «      |«      }
|
€t        j                  }
g }d }|�™d}| j                  j                  |d|j                  ¬«      ƒ d {  –—† }|€d	}||k\  r-| j                  d
|› d|› �|r|j                  d«      nd ¬«       n1| j                  j                  |d	d|j                  ¬«      ƒ d {  –—†  |j                  dd «      }t        j                  «       j                  d«      }t        j                  «       j                  d«      }t        j                  «       j                  d«      }|› d|› d|› �}| j!                  |�dnd |�|› d|› d�nd |�|�|› d|› d|› d�nd |j"                  �|j"                  › d|› d�nd |j$                  �|j$                  › d|› d�nd |j&                  �|j&                  › d|› d�nd |j                  ¬«      ƒ d {  –—† }|�/|› d|› d�}| j)                  ||||||d   ||	|
d|¬«      ƒ d {  –—†  |j                  dd «      }t+        ||¬«      }t-        ||¬«      }|€|�Ó|› d|› d|› d�}d }d }|�&|r|j                  |«      }|r|j                  |«      }| j)                  ||||t        j                  |d   ||xs t        j                  |xs t        j                  d|¬«      ƒ d {  –—† }d }d }|r|�||d   z
  }|�||d   z
  }d|› �|d|› �|i}d|vri |d<   |d   j/                  |«       |j"                  }|�y|j0                  }|j2                  }|€t        j                  }|€t        j                  }|› d|› d�}| j)                  ||||t        j                  |d    |||d!|¬«      ƒ d {  –—†  |j$                  } | �y|j4                  }!|j6                  }"|!€t        j                  }!|"€t        j                  }"| › d|› d�}| j)                  ||||t        j                  |d"   ||!|"d#|¬«      ƒ d {  –—†  |j&                  r¡t        |d$t        j                  «      }#t        |d%t        j                  «      }$|#€t        j                  }#|$€t        j                  }$|j&                  › d|› d�}| j)                  ||||t        j                  ||d&   |#|$d'|¬(«      ƒ d {  –—†  t9        j:                  | j                  j=                  |d)|j                  ¬*«      «       y 7 �Œ½7 �ŒY7 �Œ67 �Œ7 �ŒK7 �Œ„7 Œÿ7 ŒT­w)+Nz)Inside Max Parallel Request Pre-Call HookÚmetadataÚglobal_max_parallel_requestsÚbudget_throttle_pctrM   rN   T©rQ   ri   rh   r[   zHit Global Limit: Limit=z, current: rX   )rY   rZ   ©rQ   rp   ri   rh   ú%Y-%m-%dú%Hú%Mú-ú::ú::request_count)r-   r.   r/   r0   r1   r2   rw   r.   rQ   )rH   rI   rJ   rK   rL   rO   r.   rM   rN   rP   rV   ©Ú
model_namer/   rR   r^   r_   zlitellm-key-remaining-tokens-zlitellm-key-remaining-requests-r0   rS   r1   rU   Úend_user_tpm_limitÚend_user_rpm_limitr2   rT   )rH   rI   rJ   rK   rL   r.   rO   rM   rN   rP   rV   re   ©rf   rg   rh   )rG   Úapi_keyrL   ÚsysÚmaxsizerq   r%   r   r;   Úasync_get_cacherw   rn   Úasync_increment_cacher   r€   Ústrftimer�   Úuser_idÚteam_idÚend_user_idr{   r   r   ÚupdateÚuser_tpm_limitÚuser_rpm_limitÚteam_tpm_limitÚteam_rpm_limitÚasyncioÚcreate_taskrv   )%r>   rH   rI   rJ   rK   r¢   rL   r“   Úthrottle_pctrM   rN   rV   ry   Ú_keyr-   Ú_modelÚcurrent_dateÚcurrent_hourÚcurrent_minuteÚprecise_minuteÚcache_objectsr.   Ú_tpm_limit_for_key_modelÚ_rpm_limit_for_key_modelÚtpm_limit_for_modelÚrpm_limit_for_modelÚ_remaining_tokensÚ_remaining_requestsÚ_remaining_limits_datar¨   r¬   r­   r©   r®   r¯   rŸ   r    s%                                        r(   Úasync_pre_call_hookz5_PROXY_MaxParallelRequestsHandler.async_pre_call_hookõ   sL  è ø€ ð 	×ÑÐFÔGØ*×2Ñ2ˆØ 1× GÑ GÐØ Ð(Ü$'§K¡KÐ!Øˆ<ØˆDØ.2¯h©h°zÀ2Ó.F×.JÑ.JÐKiÐkoÓ.pÐ$Ü%Ð&7Ð9NÐPTÓUˆÜ#¤GÐ,=¸{ÌCÏKÉKÓ$XÐZfÓgˆ	ØÐÜŸ™ˆIÜ#¤GÐ,=¸{ÌCÏKÉKÓ$XÐZfÓgˆ	ØÐÜŸ™ˆIð ð 	"ð  $ˆà'Ð3à8ˆDØ,0×,EÑ,E×,UÑ,UØØØ):×)KÑ)Kð -Vó -÷ 'Ð#ð 'Ð.Ø*+Ð'à&Ð*FÒFØ×+Ñ+Ø)AÐB^ÐA_Ð_jð  lCð  kDð  (EÙ9= D§H¡H¨WÔ$5À4ð ,õ ð ×/Ñ/×EÑEØØØ#Ø->×-OÑ-Oð	 Fó ÷ ð ð —‘˜' 4Ó(ˆä&Ÿl™l›n×5Ñ5°jÓAˆÜ&Ÿl™l›n×5Ñ5°dÓ;ˆÜ (§¡£× 7Ñ 7¸Ó =ˆØ#/ .°°,°¸qÀÐ@PÐ Qˆà26×2LÑ2Là2NÐ2ZÑ.Ð`dàT[ÐTg g Y¨b°Ð0@ÀÑ#PÐmqð Ð&¨6Ð+=ð �)˜2˜f˜X R¨Ð'7°ÑGàð %×,Ñ,Ð8ð %×,Ñ,Ð-¨R°Ð/?¸ÑOàð %×,Ñ,Ð8ð %×,Ñ,Ð-¨R°Ð/?¸ÑOàð %×0Ñ0Ð<ð %×0Ñ0Ð1°°NÐ3CÀ?ÑSàà.×?Ñ?ð3 3Mó 3
÷ -
ˆð6 ÐØ'. i¨r°.Ð1AÀÐ$QÐ!à×*Ñ*Ø"3ØØØ#Ø&;Ø%Ð&=Ñ>Ø&;Ø#Ø#Ø %Ø*Cð +ó ÷ ð ð —‘˜' 4Ó(ˆÜ*AÐBSÐ`fÔ*gÐ Ü*AÐBSÐ`fÔ*gÐ Ø#Ð/Ð3KÐ3WØ'. i¨r°&°¸¸NÐ;KÈ?Ð$[Ð!Ø"&ÐØ"&ÐàÐ!Ù+Ø*B×*FÑ*FÀvÓ*NÐ'á+Ø*B×*FÑ*FÀvÓ*NÐ'à ×4Ñ4Ø"3ØØØ#Ü&)§k¡kØ%Ð&CÑDØ&;Ø-Ò<´·±Ø-Ò<´·±Ø /Ø*Cð 5ó ÷ ˆGð !%ÐØ"&ÐáØ&Ð2Ø(;¸gÀmÑ>TÑ(TÐ%Ø&Ð2Ø*=ÀÈÑ@VÑ*VÐ'ð 0°¨xÐ8Ð:KØ1°&°Ð:Ð<Oð-Ð"ð
  Ñ%Ø#%��ZÑ Ø�Ñ×#Ñ#Ð$:Ô;ð +×2Ñ2ˆØÐØ.×=Ñ=ˆNØ.×=Ñ=ˆNØÐ%Ü!$§¡�ØÐ%Ü!$§¡�à'. i¨r°.Ð1AÀÐ$QÐ!à×*Ñ*Ø"3ØØØ#Ü&)§k¡kØ%Ð&=Ñ>Ø&;Ø(Ø(Ø &Ø*Cð +ó ÷ ð ð  +×2Ñ2ˆØÐØ.×=Ñ=ˆNØ.×=Ñ=ˆNàÐ%Ü!$§¡�ØÐ%Ü!$§¡�à'. i¨r°.Ð1AÀÐ$QÐ!à×*Ñ*Ø"3ØØØ#Ü&)§k¡kØ%Ð&=Ñ>Ø&;Ø(Ø(Ø &Ø*Cð +ó ÷ ð ð  ×(Ò(Ü!(Ð):Ð<PÔRU×R]ÑR]Ó!^ÐÜ!(Ð):Ð<PÔRU×R]ÑR]Ó!^Ðà!Ð)Ü%(§[¡[Ð"Ø!Ð)Ü%(§[¡[Ð"ð (9×'DÑ'DÐ&EÀRÈÐGWÐWfÐ$gÐ!ð ×*Ñ*Ø"3ØØØ#Ü&)§k¡kØ&;Ø%Ð&AÑBØ,Ø,Ø *Ø*Cð +ó ÷ ð ô 	×ÑØ×%Ñ%×;Ñ;Ø4ØØ):×)KÑ)Kð <ó õ	
ðW'ùð ùð-
ùð<ùð<ùðVùð8øð:ús—   ‚DW%ÄWÄA&W%Å9WÅ:D%W%ÊWÊ 0W%ËWËB?W%ÎWÎC	W%ÑWÑBW%Ó!W!Ó"B,W%ÖW#ÖAW%×W%×W%×W%×W%×W%×!W%×#W%r    c              ƒ   ó¤	  K  — ddl m} t        |¬«      }	 | j                  d«       |d   d   j	                  dd «      }|d   d   d   }|d   d   j	                  d	d «      }	|d   d   j	                  d
d «      }
|d   d   j	                  dd «      }|j	                  d«      }|d   d   j	                  di «      xs i }|d   d   j	                  dd «      }t        ||||¬«      }|�)d}| j                  j                  |dd|¬«      ƒ d {  –—†  t        j                  «       j                  d«      }t        j                  «       j                  d«      }t        j                  «       j                  d«      }|› d|› d|› �}t        |«      }g }|�~|› d|› d�}| j                  j                  ||¬«      ƒ d {  –—† xs ddddœ}t        |d   dz
  d«      |d   |z   |d   dœ}| j                  d|› d |› �«       |j                  ||f«        ||«      }|�t        ||¬!«      nd }|�t!        ||¬!«      nd }|�‘|��d"|v s
d#|v s|€|€|��|› d|› d|› d�}| j                  j                  ||¬«      ƒ d {  –—† xs ddddœ}t        |d   dz
  d«      |d   |z   |d   dœ}| j                  d|› d |› �«       |j                  ||f«       |	�‰t        |«      }|	› d|› d�}| j                  j                  ||¬«      ƒ d {  –—† xs d|ddœ}t        |d   dz
  d«      |d   |z   |d   dœ}| j                  d|› d |› �«       |j                  ||f«       |
�‰t        |«      }|
› d|› d�}| j                  j                  ||¬«      ƒ d {  –—† xs d|ddœ}t        |d   dz
  d«      |d   |z   |d   dœ}| j                  d|› d |› �«       |j                  ||f«       |�‰t        |«      }|› d|› d�}| j                  j                  ||¬«      ƒ d {  –—† xs d|ddœ}t        |d   dz
  d«      |d   |z   |d   dœ}| j                  d|› d |› �«       |j                  ||f«       | j                  j#                  |d$|¬%«      ƒ d {  –—†  y 7 �ŒŠ7 �ŒÞ7 �Œ$7 �Œœ7 �Œ7 Œ‹7 Œ# t$        $ r}| j                  |«       Y d }~y d }~ww xY w­w)&Nr   )Ú#get_model_group_from_litellm_kwargs©Úkwargsz5INSIDE parallel request limiter ASYNC SUCCESS LOGGINGÚlitellm_paramsr’   r“   Úuser_api_keyÚuser_api_key_user_idÚuser_api_key_team_idÚuser_api_key_model_max_budgetrS   Úuser_api_key_metadataÚuser_api_key_team_metadata)r¢   r’   Úmodel_max_budgetÚteam_metadataéÿÿÿÿTr–   r—   r˜   r™   rš   r›   rœ   ©rQ   rh   r[   r\   r]   r^   r_   zupdated_value in success call: z, precise_minute: r�   Úmodel_rpm_limitÚmodel_tpm_limitre   r¡   )Ú)litellm.proxy.common_utils.callback_utilsrÃ   r   rG   rq   r   r;   r¦   r   r€   r§   r)   r¥   Úmaxrr   r   r   rv   rE   )r>   rÅ   r    Ú
start_timeÚend_timerÃ   rh   r“   rÇ   rÈ   rÉ   rÊ   Úuser_api_key_end_user_idrË   rÌ   rH   r³   rµ   r¶   r·   r¸   r&   rV   r.   rO   ry   Úmodel_groupÚ_success_tpm_limitÚ_success_rpm_limitÚes                                 r(   Úasync_log_success_eventz9_PROXY_MaxParallelRequestsHandler.async_log_success_eventë  sÃ  è ø€ õ	
ô 8YÐ`fÔ7gÐ ðE	"Ø×ÑÐVÔWà28Ð9IÑ2JÈ:Ñ2V×2ZÑ2ZØ.°ó3Ð(ð #)Ð)9Ñ":¸:Ñ"FÀ~Ñ"VˆLØ*0Ð1AÑ*BÀ:Ñ*N×*RÑ*RÐSiÐkoÓ*pÐ Ø*0Ð1AÑ*BÀ:Ñ*N×*RÑ*RÐSiÐkoÓ*pÐ Ø39Ð:JÑ3KÈJÑ3W×3[Ñ3[Ø/°ó4Ð)ð /5¯j©j¸Ó.@Ð$à+1Ð2BÑ+CÀJÑ+O×+SÑ+SÐTkÐmoÓ+pÒ+vÐtvÐ!Ø)/Ð0@Ñ)AÀ*Ñ)M×)QÑ)QÐRnÐptÓ)uÐ&Ü'5Ø$Ø.Ø!>Ø8ô	(Ðð ,Ð7à<�à×/Ñ/×EÑEØØØ#Ø-Eð	 Fó ÷ ð ô #+§,¡,£.×"9Ñ"9¸*Ó"EˆLÜ"*§,¡,£.×"9Ñ"9¸$Ó"?ˆLÜ$,§L¡L£N×$;Ñ$;¸DÓ$AˆNØ'3 n°A°l°^À1À^ÐDTÐ$UˆNä 6°|Ó DˆLð JLÐ%àÐ'Ø+7¨.¸¸>Ð:JÈ/Ð(ZÐ%à04×0IÑ0I×0YÑ0YØ-Ø-Eð 1Zó 1÷ +ò +ð )*Ø#$Ø#$ñð ô ),¨GÐ4FÑ,GÈ!Ñ,KÈQÓ(OØ#*¨=Ñ#9¸LÑ#HØ#*¨=Ñ#9ñ�ð ×"Ñ"Ð%DÀWÀIÐM_Ð`nÐ_oÐ#pÔqØ)×0Ñ0Ð2GÈÐ1QÔRñ
 "EÀVÓ!LˆKàVaÐVmÔ'Ð(9ÀkÕRÐswð ð WbÐVmÔ'Ð(9ÀkÕRÐswð ð Ð(ØÐ+à%Ð)>Ñ>Ø(Ð,AÑAØ4Ð@Ø)Ð5Ø)Ð5ð ,8¨.¸¸;¸-ÀrÈ.ÐIYÐYhÐ(iÐ%à $× 9Ñ 9× IÑ IØ-Ø-Eð !Jó !÷ ò ð )*Ø#$Ø#$ñð ô ),¨GÐ4FÑ,GÈ!Ñ,KÈQÓ(OØ#*¨=Ñ#9¸LÑ#HØ#*¨=Ñ#9ñ�ð ×"Ñ"Ð%DÀWÀIÐM_Ð`nÐ_oÐ#pÔqØ)×0Ñ0Ð2GÈÐ1QÔRð
 $Ð/Ü5°lÓC�à+?Ð*@ÀÀ>ÐBRÐRaÐ(bÐ%à $× 9Ñ 9× IÑ IØ-Ø-Eð !Jó !÷ ò ð )*Ø#/Ø#$ñð ô ),¨GÐ4FÑ,GÈ!Ñ,KÈQÓ(OØ#*¨=Ñ#9¸LÑ#HØ#*¨=Ñ#9ñ�ð ×"Ñ"Ð%DÀWÀIÐM_Ð`nÐ_oÐ#pÔqØ)×0Ñ0Ð2GÈÐ1QÔRð
 $Ð/Ü5°lÓC�à+?Ð*@ÀÀ>ÐBRÐRaÐ(bÐ%à $× 9Ñ 9× IÑ IØ-Ø-Eð !Jó !÷ ò ð )*Ø#/Ø#$ñð ô ),¨GÐ4FÑ,GÈ!Ñ,KÈQÓ(OØ#*¨=Ñ#9¸LÑ#HØ#*¨=Ñ#9ñ�ð ×"Ñ"Ð%DÀWÀIÐM_Ð`nÐ_oÐ#pÔqØ)×0Ñ0Ð2GÈÐ1QÔRð
 (Ð3Ü5°lÓC�à+CÐ*DÀBÀ~ÐFVÐVeÐ(fÐ%à $× 9Ñ 9× IÑ IØ-Ø-Eð !Jó !÷ ò ð )*Ø#/Ø#$ñð ô ),¨GÐ4FÑ,GÈ!Ñ,KÈQÓ(OØ#*¨=Ñ#9¸LÑ#HØ#*¨=Ñ#9ñ�ð ×"Ñ"Ð%DÀWÀIÐM_Ð`nÐ_oÐ#pÔqØ)×0Ñ0Ð2GÈÐ1QÔRà×+Ñ+×AÑAØ4ØØ)Að Bó ÷ ñ ðAùð.+ùðRùð4ùð4ùð4øð$ùô
 ò 	"Ø×Ñ˜q×!Ñ!ûð	"üs³   ‚S–C6R) ÄRÄB.R) Æ;RÆ<B<R) É8RÉ9B
R) ÌRÌB
R) ÎR"ÎB
R) ÐR%ÐA6R) ÒR'ÒR) ÒSÒR) ÒR) ÒR) ÒR) Ò"R) Ò%R) Ò'R) Ò)	SÒ2SÓSÓSÓSc              ƒ   óT  K  — 	 | j                  d«       t        |¬«      }|d   j                  di «      xs i }|j                  dd «      }|j                  dd «      }| j                  d|d u› d�«       |€y t        j                  j
                  t        |d	   «      v ry |�Od}	| j                  j                  |	d
|¬«      ƒ d {  –—†  | j                  j                  |	dd
|¬«      ƒ d {  –—†  t        j                  «       j                  d«      }
t        j                  «       j                  d«      }t        j                  «       j                  d«      }|
› d|› d|› �}|› d|› d�}| j                  j                  ||¬«      ƒ d {  –—† xs ddddœ}t        |d   dz
  d«      |d   |d   dœ}| j                  d|› �«       | j                  j                  ||d|¬«      ƒ d {  –—†  y 7 �Œ,7 �Œ7 Œj7 Œ# t        $ r }t!        j"                  d|«       Y d }~y d }~ww xY w­w)Nz(Inside Max Parallel Request Failure HookrÄ   rÆ   r’   r“   rÇ   zuser_api_key: [set=ú]Ú	exceptionTr•   rÏ   r–   r—   r˜   r™   rš   r›   rœ   rÐ   r[   r   r\   r]   r^   r_   zupdated_value in failure call: re   )rg   rh   z;Inside Parallel Request Limiter: An exception occurred - %s)rG   r   rq   r   ro   rp   rt   r;   r¥   r¦   r   r€   r§   rÔ   Úasync_set_cacherE   r   rß   )r>   rÅ   r    rÕ   rÖ   rh   Ú	_metadatar“   rÇ   r³   rµ   r¶   r·   r¸   r.   rO   ry   rÛ   s                     r(   Úasync_log_failure_eventz9_PROXY_MaxParallelRequestsHandler.async_log_failure_event¸  s‡  è ø€ ðE	mØ×ÑÐIÔJÜ;\ÐdjÔ;kÐ$Ø%Ð&6Ñ7×;Ñ;¸JÈÓKÒQÈrˆIØ2;·-±-Ð@^Ð`dÓ2eÐ(Ø"+§-¡-°ÀÓ"EˆLØ×ÑÐ!4°\ÈÐ5MÐ4NÈaÐPÔQØÐ#Øô !×CÑC×IÑIÌSÐQWÐXcÑQdÓMeÑeØð 0Ð;à"@�Dà"×7Ñ7×GÑGØ $Ø'+Ø5Mð Hó ÷ ð ð ×3Ñ3×IÑIØ Ø Ø#'Ø1Ið	 Jó ÷ ð ô '/§l¡l£n×&=Ñ&=¸jÓ&I�Ü&.§l¡l£n×&=Ñ&=¸dÓ&C�Ü(0¯©«×(?Ñ(?ÀÓ(E�Ø+7¨.¸¸,¸ÀqÈÐHXÐ(Y�à2>°¸rÀ.ÐAQÐQ`Ð/aÐ%ð
 (,×'@Ñ'@×'PÑ'PØ-Ø-Eð (Qó (÷ "ò "ð )*Ø#$Ø#$ñð ô ),¨GÐ4FÑ,GÈ!Ñ,KÈQÓ(OØ#*¨=Ñ#9Ø#*¨=Ñ#9ñ"�ð ×"Ñ"Ð%DÀWÀIÐ#NÔOØ×/Ñ/×?Ñ?Ø)ØØØ-Eð	 @ó ÷ ñ ðQùðùð""øð ùô ò 	mÜ ×*Ñ*Ð+hÐjk×lÑlûð	müs‘   ‚H(„A3G< Á7H(Á8(G< Â H(Â!%G< ÃG2Ã&G< Ã-G5Ã.BG< ÆG8ÆAG< Ç,G:Ç-G< Ç1H(Ç2G< Ç5G< Ç8G< Ç:G< Ç<	H%ÈH ÈH(È H%È%H(r¨   c              ƒ   ó&  K  — ddl m} ddlm} ddlm} 	  |||| j                  j                  d|j                  d¬«      ƒ d{  –—† }|€y|j                  «       S 7 Œ# t        $ r&} |j                  dt        |«      «       Y d}~yd}~ww xY w­w)	a?  
        Helper to get the 'Internal User Object'

        It uses the `get_user_object` function from `litellm.proxy.auth.auth_checks`

        We need this because the UserApiKeyAuth object does not contain the rpm/tpm limits for a User AND there could be a perf impact by additionally reading the UserTable.
        r   r   )Úget_user_object)Úprisma_clientFN)r¨   rå   Úuser_api_key_cacheÚuser_id_upsertrw   Úproxy_logging_objz3Parallel Request Limiter: Error getting user object)Úlitellm._loggingr   Úlitellm.proxy.auth.auth_checksrä   Úlitellm.proxy.proxy_serverrå   r;   Ú
dual_cacherw   Ú
model_dumprE   rA   rt   )r>   r¨   rH   r   rä   rå   Ú_user_id_rate_limitsrÛ   s           r(   Úget_internal_user_objectz:_PROXY_MaxParallelRequestsHandler.get_internal_user_object   s˜   è ø€ õ 	:ÝBÝ<ð	Ù0?ØØ+Ø#'×#<Ñ#<×#GÑ#GØ$Ø!2×!CÑ!CØ"&ô1÷ +Ð ð $Ð+Øà'×2Ñ2Ó4Ð4ð+ùô ò 	Ø&Ð ×&Ñ&Ð'\Ô^aÐbcÓ^dÔeÜûð	üsL   ‚B–/A ÁAÁA ÁBÁA ÁBÁA Á	BÁ(B	ÂBÂ	BÂBc              ƒ   ó¸  •K  — |j                   }t        j                  «       j                  d«      }t        j                  «       j                  d«      }t        j                  «       j                  d«      }|› d|› d|› �}|› d|› d�}	| j                  j                  |	|j                  ¬«      ƒ d{  –—† }
d}d}d}d}|
�T|j                  �|j                  |
d	   z
  }|j                  }|j                  �|j                  |
d
   z
  }|j                  }t        |d«      rt        |d«      }nd}|�Ÿt        |t        «      st        |t        «      r~t        |t        «      r|j                  «       }|j                  di «      xs i }|�||d<   |�||d<   |�||d<   |�||d<   t!        |di |¥d|i¥«       t"        ‰| �I  |||«      ƒ d{  –—† S yy7 �Œ 7 Œ	­w)z;
        Retrieve the key's remaining rate limits.
        r—   r˜   r™   rš   r›   rœ   rÐ   Nr_   r^   Ú_hidden_paramsÚadditional_headerszx-ratelimit-remaining-requestszx-ratelimit-limit-requestszx-ratelimit-remaining-tokenszx-ratelimit-limit-tokens)r¢   r   r€   r§   r;   r¥   rw   rN   rM   Úhasattrr%   r$   r
   r6   rí   rq   ÚsetattrÚsuperÚasync_post_call_success_hook)r>   rJ   rH   Úresponser¢   rµ   r¶   r·   r¸   r.   rO   Úkey_remaining_rpm_limitÚkey_rpm_limitÚkey_remaining_tpm_limitÚkey_tpm_limitrñ   Ú_additional_headersÚ	__class__s                    €r(   rö   z>_PROXY_MaxParallelRequestsHandler.async_post_call_success_hook"  s,  øè ø€ ð +×2Ñ2ˆÜ&Ÿl™l›n×5Ñ5°jÓAˆÜ&Ÿl™l›n×5Ñ5°dÓ;ˆÜ (§¡£× 7Ñ 7¸Ó =ˆØ#/ .°°,°¸qÀÐ@PÐ QˆØ*1¨°"°^Ð4DÀOÐ'TÐØ<@×<UÑ<U×<eÑ<eØ%Ø%6×%GÑ%Gð =fó =
÷ 7
ˆð
 /3ÐØ$(ˆØ.2ÐØ$(ˆØÐØ ×*Ñ*Ð6Ø*;×*EÑ*EÈÐP]ÑH^Ñ*^Ð'Ø 1× ;Ñ ;�Ø ×*Ñ*Ð6Ø*;×*EÑ*EÈÐP]ÑH^Ñ*^Ð'Ø 1× ;Ñ ;�ä�8Ð-Ô.Ü$ XÐ/?Ó@‰Nà!ˆNØÐ%¬:°nÄiÔ+PÔT^Ð_mÔosÔTtÜ˜.¬)Ô4Ø!/×!:Ñ!:Ó!<�à)7×);Ñ);Ð<PÐRTÓ)UÒ)[ÐY[Ðà&Ð2ØH_Ð#Ð$DÑEØÐ(ØDQÐ#Ð$@ÑAØ&Ð2ØF]Ð#Ð$BÑCØÐ(ØBOÐ#Ð$>Ñ?äØØ ØM�>ÐMÐ#7Ð9LÑMôô ™Ñ=¸dÐDUÐW_Ó`×`Ð`ð+ UuÐ%ð+7
ùðT aús%   ƒB2GÂ5GÂ6DGÇGÇGÇG)NNNr=   )r3   r4   r5   r   r?   rG   r   r   r6   rt   rs   r   ÚlistÚtupler   r{   Úfloatru   r   r	   rn   r   r,   r�   rÁ   ÚobjectrÜ   râ   rï   rö   Ú__classcell__)rý   s   @r(   r:   r:   5   s  ø„ ð9Ð-?ó 9òðOà)ðOð ðOð ð	Oð
 ðOð  #ðOð ðOð ðOð ˜‘ðOð  #ðOð !Ð!SÑTðOð $(¨¨c°3¨h©Ñ#8ðOð 
óOðb
& Uó 
&ð *.Ø04Ø&*ñ	*
à $™Jð*
ð '¨Ñ-ð*
ð ˜t™ð	*
ð
 
ó*
ðh )-ñ(
à!$ t¡ð(
ð  # T™zð(
ð &)¨4¡Zð	(
ð
  # T™zð(
ð  # T™zð(
ð $'¨¡:ð(
ð  ™+ð(
ð 
ó(
ðTt
à)ðt
ð ðt
ð ð	t
ð
 ót
ðlK"À&ó K"òZFmðP àð ð *ð ð 
�‰ó	 ðD4a°tð 4aÐP^÷ 4añ 4ar*   r:   )5r°   r£   r   r   Útypingr   r   r   r   r	   Úpydanticr
   Útyping_extensionsr   rB   r   r   r   r   ré   r   Úlitellm.exceptionsr   Ú"litellm.integrations.custom_loggerr   Ú'litellm.litellm_core_utils.core_helpersr   Úlitellm.proxy._typesr   r   r   Úlitellm.proxy.auth.auth_utilsr   r   Ú"litellm.proxy.auth.budget_throttler   Ú1litellm.proxy.common_utils.proxy_rate_limit_errorr   Ú&litellm.proxy.hooks.rate_limiter_utilsr   Úlitellm.types.utilsr   Úopentelemetry.tracer   Ú_SpanÚlitellm.proxy.utilsr   Ú_InternalUsageCacher  rs   r)   r,   r:   r8   r*   r(   ú<module>r     s�   ðÛ Û 
ß (ß ?Õ ?å Ý 'ã ß WÓ WÝ 1Ý ,Ý ;Ý Uß XÑ X÷õ ?Ý QÝ VÝ %áÝ1åMà�3‰;€DØ,Ñà€DØÐðS¨ð S°Có Sô+�)ô +ôaa¨õ aar*   