Ë
    tPêj‚H  ã                   ó^  — 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	 ddl
mZm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mZmZ dd	lm Z  erdd
l!m"Z# ddl$m%Z& e#Z"e&Z% e'h d£«      Z(ee'e)      e*d<   ed   Z+ee*d<   dZ,ee*d<   dZ-ee*d<   dZ.ee*d<   dZ/ee*d<    edd¬«       G d„ d«      «       Z0ed   Z1ee*d<    edd¬«       G d„ d«      «       Z2 edd¬«       G d „ d!«      «       Z3e2e3z  Z4ee*d"<    eee5 ed¬#«      f   «      Z6ee*d$<    ee7e5e5f   «      Z8ee*d%<    ee)e9z  dz  «      Z:ee*d&<    ee5dz  «      Z;ee*d'<    ee2«      Z<ee*d(<    G d)„ d*e«      Z=d+ee)e>f   dz  d,e5dz  fd-„Z?d.e d,e7e0d/f   fd0„Z@d1e)d,e)fd2„ZA G d3„ d4e«      ZBd5e>d,eBdz  fd6„ZC G d7„ d8«      ZDy)9a†  
Enqueued-token accounting for batch submissions.

Opt-in via admin-set ``batch_enqueued_token_limit`` in key or team metadata: batch
submissions reserve their estimated token count against a long-lived
enqueued-token allowance instead of the per-minute rate-limit windows, and
the reservation is refunded when the batch reaches a terminal state
(completed, failed, expired, or cancelled).
é    N)Ú	AwaitableÚCallableÚMappingÚSequence)Ú	dataclassÚfield)ÚTYPE_CHECKINGÚ	AnnotatedÚFinalÚLiteralÚProtocolÚ	TypeAlias)Ú	BaseModelÚ
ConfigDictÚFieldÚTypeAdapterÚValidationError)Úverbose_proxy_logger)Ú'BATCH_ENQUEUED_TOKEN_LIMIT_METADATA_KEYÚ BATCH_ENQUEUED_TOKEN_TTL_SECONDS)ÚUserAPIKeyAuth)ÚSpan)ÚInternalUsageCache>   ÚfailedÚexpiredÚcompleteÚ	cancelledÚ	completedÚ
cancellingÚBATCH_ENQUEUED_REFUND_STATUSES)Úapi_keyÚteamÚScopeKeyaF  
local amount = tonumber(ARGV[1])
local ttl = tonumber(ARGV[2])
local limit = tonumber(ARGV[3])
local current = tonumber(redis.call('GET', KEYS[1]) or '0')
if current + amount > limit then
    return {0, current}
end
local updated = redis.call('INCRBY', KEYS[1], amount)
redis.call('EXPIRE', KEYS[1], ttl)
return {1, updated}
ÚRESERVE_ENQUEUED_TOKENS_SCRIPTzƒ
local updated = redis.call('DECRBY', KEYS[1], tonumber(ARGV[1]))
if updated <= 0 then
    redis.call('DEL', KEYS[1])
end
return 1
ÚREFUND_ENQUEUED_TOKENS_SCRIPTzG
redis.call('SET', KEYS[1], ARGV[1], 'EX', tonumber(ARGV[2]))
return 1
ÚSAVE_RESERVATION_SCRIPTz•
local value = redis.call('GET', KEYS[1])
if value and value ~= '' then
    redis.call('SET', KEYS[1], '', 'EX', tonumber(ARGV[1]))
end
return value
ÚPOP_RESERVATION_SCRIPTT)ÚfrozenÚslotsc                   ó,   — e Zd ZU eed<   eed<   eed<   y)ÚBatchEnqueuedTokenScopeÚkeyÚvalueÚlimitN)Ú__name__Ú
__module__Ú__qualname__r#   Ú__annotations__ÚstrÚint© ó    ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/hooks/batch_enqueued_tokens.pyr+   r+   J   s   … à	ƒMØƒJØ„Jr6   r+   )ÚredisÚmemoryÚReservationBackendc                   óz   — e Zd ZU eed<   eedf   ed<   dZeed<   dZ	e
ed<    eej                  d¬	«      Zeed
<   y)ÚBatchEnqueuedTokenReservationÚtokens.Úscopesr8   ÚbackendÚ ÚownerF)Údefault_factoryÚcompareÚreserved_at_monotonicN)r/   r0   r1   r4   r2   Útupler+   r?   r:   rA   r3   r   ÚtimeÚ	monotonicrD   Úfloatr5   r6   r7   r<   r<   T   sC   … àƒKØÐ)¨3Ð.Ñ/Ó/Ø")€GÐÓ)Ø€Eˆ3ƒOÙ#(¸¿¹ÐQVÔ#WÐ˜5ÔWr6   r<   c                   ó"   — e Zd ZU eed<   eed<   y)ÚBatchEnqueuedTokenOverLimitÚscopeÚenqueuedN)r/   r0   r1   r+   r2   r4   r5   r6   r7   rJ   rJ   ]   s   … à"Ó"Ø„Mr6   rJ   ÚBatchEnqueuedTokenOutcome)ÚgtÚ_LIMIT_ADAPTERÚ_RESERVE_RESULT_ADAPTERÚ_POPPED_VALUE_ADAPTERÚ_STORED_COUNTER_ADAPTERÚ_RESERVATION_ADAPTERc                   óD   — e Zd Zdee   deeez  ez  ez     dee	   fd„Z
y)Ú_ScriptRunnerÚkeysÚargsÚreturnc                  ó   — y ©Nr5   )ÚselfrV   rW   s      r7   Ú__call__z_ScriptRunner.__call__m   s   � r6   N)r/   r0   r1   r   r3   Úbytesr4   rH   r   Úobjectr\   r5   r6   r7   rU   rU   l   s2   „ Øp˜X c™]Ðp°(¸3À¹;ÈÑ;LÈuÑ;TÑ2UÐpÐZcÐdjÑZkÔpr6   rU   ÚmetadatarX   c                 ó¸   — | sy | j                  t        «      }|€y 	 t        j                  |«      S # t        $ r t        j                  dt        |«       Y y w xY w)Nz9Ignoring invalid %s value %r; expected a positive integer)Úgetr   rO   Úvalidate_pythonr   r   Úwarning)r_   Úraws     r7   Ú_read_metadata_limitre   p   s`   € ÙØØ—‘ÔEÓF€CØ
€{ØðÜ×-Ñ-¨cÓ2Ð2øÜò Ü×$Ñ$ØGÜ3Øô	
ñ
 ðús   �2 ²$AÁAÚuser_api_key_dict.c                 ó  — t        | j                  «      }t        | j                  «      }|�$| j                  rt	        d| j                  |¬«      nd |�$| j
                  rt	        d| j
                  |¬«      nd f}t        d„ |D «       «      S )Nr!   )r,   r-   r.   r"   c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wrZ   r5   )Ú.0rK   s     r7   ú	<genexpr>z6resolve_batch_enqueued_token_scopes.<locals>.<genexpr>Ž   s   è ø€ ÒD˜5°%Ñ2C”ÑDùs   ‚Š)re   r_   Úteam_metadatar!   r+   Úteam_idrE   )rf   Ú	key_limitÚ
team_limitÚ
candidatess       r7   Ú#resolve_batch_enqueued_token_scopesrp   �   s’   € ô ,Ð,=×,FÑ,FÓG€IÜ,Ð->×-LÑ-LÓM€Jð Ð Ð%6×%>Ò%>ô 	  IÐ5F×5NÑ5NÐV_Õ`ààÐ!Ð&7×&?Ò&?ô 	  FÐ2C×2KÑ2KÐS]Õ^àð€Jô ÑD JÔDÓDÐDr6   Úbatch_idc                 óz   — ddl m}m}m}  || «      }t	        |t
        «      rd|v sd|v r ||«      S |S  || «      S )Nr   )Ú"_is_base64_encoded_unified_file_idÚ"get_batch_id_from_unified_batch_idÚget_original_file_idÚllm_batch_idÚgeneric_response_id)Ú1litellm.proxy.openai_files_endpoints.common_utilsrs   rt   ru   Ú
isinstancer3   )rq   rs   rt   ru   Údecodeds        r7   Úcanonical_provider_batch_idr{   ‘   sM   € ÷ñ ñ 8¸ÓA€GÜ�'œ3ÔØ˜WÑ$Ð(=ÀÑ(HÙ5°gÓ>Ð>ØˆÙ Ó)Ð)r6   c                   óD   — e Zd ZU  ed¬«      Zeed<   eed<   ed   ed<   y)Ú_BatchResponseViewÚignore)ÚextraÚidÚstatusÚbatchr^   N)r/   r0   r1   r   Úmodel_configr3   r2   r   r5   r6   r7   r}   r}       s!   … Ù HÔ-€LàƒGØƒKØ�GÑÔr6   r}   Úresponsec                 óP   — 	 t         j                  | d¬«      S # t        $ r Y y w xY w)NT)Úfrom_attributes)r}   Úmodel_validater   )r„   s    r7   Úbatch_response_viewrˆ   ¨   s/   € ðÜ!×0Ñ0°È4Ð0ÓPÐPøÜò Ùðús   ‚ ™	%¤%c                   ó  — e Zd ZdZej
                  fdddeg ef   ddfd„Ze	de
defd	„«       Ze	d
edefd„«       Z	 d%dedee
df   dddefd„Zdedededee
df   def
d„Zdededede
dee
df   deeef   fd„Zdededee
df   ddfd„Zdededee
df   ddfd„Zdedee
df   dddefd„Z	 d%deddddfd„Zdeddfd„Z	 d%d
ededdddfd„Z	 d%d
edddedz  fd„Zd
edeez  dz  fd „Zd
edddefd!„Z de
dddefd"„Z!de
d#eddddfd$„Z"y)&ÚBatchEnqueuedTokenStorea³  Tracks enqueued batch tokens per scope, plus per-batch reservation records for refunds.

    Counters and records live in Redis when Redis is configured, through
    single-key Lua scripts issued one scope at a time (Redis Cluster safe: no
    cross-slot commands), with an over-limit or failing scope rolling back the
    scopes reserved before it; otherwise a single-process in-memory fallback
    guarded by one asyncio lock is used. Reservations remember which backend
    granted them, and in-memory grants also remember the granting worker, so a
    refund never debits counters the grant did not charge. Everything expires after
    ``BATCH_ENQUEUED_TOKEN_TTL_SECONDS`` so a crash between submission and the
    terminal-state refund can never leak tokens forever, and reservation records
    expire no later than the counters they would refund, so a stale record can
    never debit an allowance re-granted after its counters expired.
    Úinternal_usage_cacher   rG   rX   Nc                 óÀ  — || _         || _        t        j                  «       | _        t        j                  «       j                  | _        |j                  j                  }|�|j                  t        «      nd | _        |�|j                  t        «      nd | _        |�|j                  t         «      nd | _        |�|j                  t$        «      | _        y d | _        y rZ   )r‹   Ú
_monotonicÚasyncioÚLockÚ_lockÚuuidÚuuid4ÚhexÚ_owner_tokenÚ
dual_cacheÚredis_cacheÚasync_register_scriptr$   Ú_reserve_scriptr%   Ú_refund_scriptr&   Ú_save_scriptr'   Ú_pop_script)r[   r‹   rG   r–   s       r7   Ú__init__z BatchEnqueuedTokenStore.__init__¿   sÕ   € ð
 %9ˆÔ!Ø!*ˆŒÜ—\‘\“^ˆŒ
Ü ŸJ™J›L×,Ñ,ˆÔØ*×5Ñ5×AÑAˆàQ\ÐQhˆK×-Ñ-Ô.LÔMÐnrð 	Ôð Q\ÐPgˆK×-Ñ-Ô.KÔLÐmqð 	Ôð KVÐJaˆK×-Ñ-Ô.EÔFÐgkð 	Ôð JUÐI`ˆK×-Ñ-Ô.DÓEð 	ÕØfjð 	Õr6   rK   c                 ó:   — d| j                   › d| j                  › �S )Nzbatch_enqueued_tokens:ú:)r,   r-   )rK   s    r7   Ú_counter_keyz$BatchEnqueuedTokenStore._counter_keyÖ   s   € à'¨¯	©	 {°!°E·K±K°=ÐAÐAr6   rq   c                 ó   — d| › �S )Nz!batch_enqueued_token_reservation:r5   )rq   s    r7   Ú_record_keyz#BatchEnqueuedTokenStore._record_keyÚ   s   € à2°8°*Ð=Ð=r6   r=   r>   .Úlitellm_parent_otel_spanzSpan | Nonec              ƒ   ód  K  — |dk  s|st        t        |d«      |¬«      S | j                  }| j                  }|� |�	 | j	                  ||||¬«      ƒ d {  –—† S | j                  |||¬«      ƒ d {  –—† S 7 Œ # t
        $ r)}t        j                  dt        |«      «       Y d }~ŒKd }~ww xY w7 Œ;­w)Nr   ©r=   r>   zBRedis enqueued-token reserve failed, falling back to in-memory: %s)r=   r>   Úspan)
r<   Úmaxr˜   r™   Ú_reserve_via_redisÚ	Exceptionr   rc   r3   Ú_reserve_in_memory)r[   r=   r>   r¢   Úreserve_scriptÚrefund_scriptÚes          r7   ÚreservezBatchEnqueuedTokenStore.reserveÞ   sÂ   è ø€ ð �QŠ;™fÜ0¼¸FÀA»ÈvÔVÐVØ $× 4Ñ 4ˆØ#×2Ñ2ˆØÐ%¨-Ð*CðØ!×4Ñ4°^À]Ð[aÐjpÐ4Óq×qÐqð
 ×,Ñ,°FÀ6ÐPhÐ,Ói×iÐið rùÜò Ü$×,Ñ,ØXÔZ]Ð^_ÓZ`÷ñ ûðúð júsL   ‚;B0¾A9 ÁA7ÁA9 ÁB0Á2B.Á3B0Á7A9 Á9	B+ÂB&Â!B0Â&B+Â+B0rª   r«   c           
   ƒ   ó*  K  — | j                  «       }t        |«      D ]_  \  }}| j                  |||||d | ¬«      ƒ d {  –—† }|d   dk7  sŒ0| j                  |||d | ¬«      ƒ d {  –—†  t	        ||d   ¬«      c S  t        ||d|¬«      S 7 ŒN7 Œ(­w)N)r=   rK   Úalready_reservedr   é   r¤   ©rK   rL   r8   )r=   r>   r?   rD   )r�   Ú	enumerateÚ_run_reserve_scriptÚ_rollback_partial_reserverJ   r<   )	r[   rª   r«   r=   r>   ÚstartedÚindexrK   Úresults	            r7   r§   z*BatchEnqueuedTokenStore._reserve_via_redisñ   sÆ   è ø€ ð Ÿ™Ó*ˆÜ% fÓ-ò 
	T‰LˆE�5Ø×3Ñ3ØØØØØ!'¨¨ ð 4ó ÷ ˆFð �a‰y˜A‹~Ø×4Ñ4°]È6ÐZ`ÐagÐbgÐZhÐ4Ói×iÐiÜ2¸ÈÐPQÉÔSÒSð
	Tô -Ø &°'ÐQXô
ð 	
ðøð jús)   ‚>BÁ BÁBÁBÁ(BÁ)'BÂBr¯   c              ƒ   óô   K  — 	  || j                  |«      f|t        |j                  f«      ƒ d {  –—† }t        j	                  |«      S 7 Œ# t
        $ r | j                  |||¬«      ƒ d {  –—†7   ‚ w xY w­w)Nr¤   )rŸ   r   r.   rP   rb   r¨   r´   )r[   rª   r«   r=   rK   r¯   Ú
raw_results          r7   r³   z+BatchEnqueuedTokenStore._run_reserve_script  s�   è ø€ ð	Ù&4Ø×"Ñ" 5Ó)Ð+ØÔ9¸5¿;¹;ÐGó'÷ !ˆJô +×:Ñ:¸:ÓFÐFð	!ùô
 ò 	Ø×0Ñ0°ÀvÐVfÐ0Óg×gÑgØð	üs8   ‚A8„-A ±A²A Á
A8ÁA Á A5Á-A0Á.A5Á5A8c              ƒ   ó´   K  — 	 | j                  |||¬«      ƒ d {  –—†  y 7 Œ# t        $ r)}t        j                  dt	        |«      «       Y d }~y d }~ww xY w­w)Nr¤   z`Rollback of partially reserved enqueued tokens failed; leaked increments expire with the TTL: %s)Ú_refund_via_redisr¨   r   rc   r3   )r[   r«   r=   r>   r¬   s        r7   r´   z1BatchEnqueuedTokenStore._rollback_partial_reserve  sR   è ø€ ð	Ø×(Ñ(¨¸vÈfÐ(ÓU×UÒUùÜò 	Ü ×(Ñ(ØrÜ�A“÷ñ ûð	üs6   ‚A„# ›!œ#  A¡# £	A¬AÁAÁAÁAc              ƒ   ób   K  — |D ]$  } || j                  |«      f|f«      ƒ d {  –—†  Œ& y 7 Œ­wrZ   )rŸ   )r[   r«   r=   r>   rK   s        r7   r»   z)BatchEnqueuedTokenStore._refund_via_redis(  s<   è ø€ ð ò 	HˆEÙ ×!2Ñ!2°5Ó!9Ð ;¸f¸YÓG×GÑGñ	HØGús   ‚#/¥-¦/r¥   c           
   ƒ   óB  K  — | j                  «       }| j                  4 ƒd {  –—†  t        |D �cg c]  }| j                  ||«      ƒ d {  –—† ‘Œ c}«      }t	        ||«      D ]7  \  }}||z   |j
                  kD  sŒt        ||¬«      c cd d d «      ƒd {  –—†  S  t	        ||«      D ]#  \  }}| j                  |||z   |«      ƒ d {  –—†  Œ% d d d «      ƒd {  –—†  t        ||d| j                  |¬«      S 7 Œ×7 Œ±c c}w 7 Œk7 Œ;7 Œ+# 1 ƒd {  –—†7  sw Y   Œ;xY w­w)Nr±   r9   )r=   r>   r?   rA   rD   )
r�   r�   rE   Ú_get_local_counterÚzipr.   rJ   Ú_set_local_counterr<   r”   )r[   r=   r>   r¥   rµ   rK   ÚcurrentsÚcurrents           r7   r©   z*BatchEnqueuedTokenStore._reserve_in_memory1  s9  è ø€ ð Ÿ™Ó*ˆØ—:‘:÷ 	Mñ 	MÜ#Ð]cÖ$dÐTY¨4×+BÑ+BÀ5È$Ó+O×%OÑ%OÒ$dÓeˆHÜ"% f¨hÓ"7ò V‘��wØ˜VÑ# e§k¡kÓ1Ü6¸UÈWÔUÑU÷		M÷ 	Mñ 	MðVô #& f¨hÓ"7ò M‘��wØ×-Ñ-¨e°W¸vÑ5EÀtÓL×LÑLðM÷	M÷ 	Mô -Ø &°(À$×BSÑBSÐkrô
ð 	
ð	MøØ%OúÒ$dð	Møð Møð	Mø÷ 	M÷ 	Mñ 	Müs�   ‚!D£C;¤D§
D
±C?
ÁC=ÁC?
Á+D
Á>D
ÂDÂDÂDÂ,D
Ã
DÃD
ÃDÃDÃDÃ=C?
Ã?D
ÄDÄD
ÄDÄ
DÄDÄDÄDÚreservationc              ƒ   ó°  K  — |j                   dk  s|j                  sy |j                  dk(  r| j                  |«      ƒ d {  –—†  y |j                  | j
                  k7  rt        j                  d«       y | j                  4 ƒd {  –—†  |j                  D ]‹  }| j                  ||«      ƒ d {  –—† }||j                   z
  }|dk  r@| j                  j                  j                  j                  | j                  |«      ¬«       Œq| j                  |||«      ƒ d {  –—†  Œ� d d d «      ƒd {  –—†  y 7 Œô7 Œ±7 ŒŠ7 Œ7 Œ# 1 ƒd {  –—†7  sw Y   y xY w­w)Nr   r8   zcSkipping enqueued-token refund granted in another worker's memory; its counters expire with the TTL©r,   )r=   r>   r?   Ú_refund_redis_reservationrA   r”   r   rc   r�   r¾   r‹   r•   Úin_memory_cacheÚdelete_cacherŸ   rÀ   )r[   rÃ   r¢   rK   rÂ   Ú	remainings         r7   ÚrefundzBatchEnqueuedTokenStore.refundC  sS  è ø€ ð
 ×Ñ Ò"¨+×*<Ò*<ØØ×Ñ 'Ò)Ø×0Ñ0°Ó=×=Ð=ØØ×Ñ × 1Ñ 1Ò1Ü ×(Ñ(Øuôð Ø—:‘:÷ 	^ñ 	^Ø$×+Ñ+ò ^�Ø $× 7Ñ 7¸Ð?WÓ X×X�Ø# k×&8Ñ&8Ñ8�	Ø ’>Ø×-Ñ-×8Ñ8×HÑH×UÑUÐZ^×ZkÑZkÐlqÓZrÐUÕsà×1Ñ1°%¸ÐD\Ó]×]Ñ]ð^÷	^÷ 	^ð 	^ð >øð	^øàXøð
 ^øð	^ø÷ 	^÷ 	^ñ 	^üs€   ‚A EÁD7ÁAEÂD9ÂEÂ%EÂ0D;Â1A.EÄD=Ä EÄ&EÄ1D?Ä2EÄ9EÄ;EÄ=EÄ?EÅEÅE
ÅEÅEc              ƒ   ó$  K  — | j                   }|€t        j                  d«       y 	 | j                  ||j                  |j
                  ¬«      ƒ d {  –—†  y 7 Œ# t        $ r)}t        j                  dt        |«      «       Y d }~y d }~ww xY w­w)Nz`No Redis client for a Redis-granted enqueued-token refund; leaked increments expire with the TTLr¤   zMRedis enqueued-token refund failed; leaked increments expire with the TTL: %s)r™   r   rc   r»   r=   r>   r¨   r3   )r[   rÃ   r«   r¬   s       r7   rÆ   z1BatchEnqueuedTokenStore._refund_redis_reservation[  sˆ   è ø€ Ø#×2Ñ2ˆØÐ Ü ×(Ñ(Ørôð ð	Ø×(Ñ(¨¸{×?QÑ?QÐZe×ZlÑZlÐ(Óm×mÒmùÜò 	Ü ×(Ñ(Ø_ÔadÐefÓag÷ñ ûð	üs@   ‚%B¨+A ÁAÁA ÁBÁA Á	BÁ$BÂBÂBÂBc              ƒ   ó.  K  — t         j                  |«      j                  d«      }| j                  «       |j                  z
  }t        dt        t        j                  |«      z
  «      }| j                  �.	 | j                  | j                  |«      f||f«      ƒ d {  –—†  y | j                  j!                  | j                  |«      |||d¬«      ƒ d {  –—†  y 7 Œ=# t        $ r)}t        j                  dt        |«      «       Y d }~Œgd }~ww xY w7 Œ<­w)Nzutf-8r°   zKRedis enqueued-token reservation save failed, falling back to in-memory: %sT©r,   r-   Úttlr¢   Ú
local_only)rS   Ú	dump_jsonÚdecoder�   rD   r¦   r   ÚmathÚceilrš   r¡   r¨   r   rc   r3   r‹   Úasync_set_cache)r[   rq   rÃ   r¢   Ú
serializedÚelapsedrÎ   r¬   s           r7   Úsave_reservationz(BatchEnqueuedTokenStore.save_reservationi  s  è ø€ ô 1×:Ñ:¸;ÓG×NÑNÈwÓWˆ
ØŸ™Ó*¨[×-NÑ-NÑNˆÜ˜Ô<¼t¿y¹yÈÓ?QÑQÓRˆØ×ÑÐ(ð
Ø×'Ñ'Ø×%Ñ% hÓ/Ð1Ø Ð%ó÷ ð ð Ø×'Ñ'×7Ñ7Ø× Ñ  Ó*ØØØ%=Øð 8ó 
÷ 	
ñ 	
ðùô ò Ü$×,Ñ,ØaÔcfÐghÓci÷ñ ûðúð	
úsN   ‚A4DÁ7'C ÂCÂC Â#3DÃDÃDÃC Ã	DÃ'DÄDÄDÄDc              ƒ   ó”  K  — | j                  |«      ƒ d {  –—† }|�|s| j                  ||«      ƒ d {  –—†  y |�|n| j                  ||«      ƒ d {  –—† }|€y 	 t        |t        t        f«      rt
        j                  |«      S t
        j                  |«      S 7 Œ…7 Œi7 ŒL# t        $ r t        j                  d|«       Y y w xY w­w)Nz=Discarding malformed enqueued-token reservation record for %s)Ú_pop_redis_recordÚ_pop_local_recordry   r3   r]   rS   Úvalidate_jsonrb   r   r   rc   )r[   rq   r¢   Ú	redis_rawrd   s        r7   Úpop_reservationz'BatchEnqueuedTokenStore.pop_reservation†  sØ   è ø€ ð
 "&×!7Ñ!7¸Ó!A×Aˆ	ØÐ ©ð ×(Ñ(¨Ð3KÓL×LÐLØà"Ð.‰I¸$×:PÑ:PÐQYÐ[sÓ:t×4tð 	ð ˆ;Øð	Ü˜#¤¤U˜|Ô,Ü+×9Ñ9¸#Ó>Ð>Ü'×7Ñ7¸Ó<Ð<ð Bøð
 Møð 5uùô ò 	Ü ×(Ñ(Ð)hÐjrÔsÙð	üsa   ‚C—B˜CµB¶CÁB!ÁCÁ*B# ÂCÂB# ÂCÂCÂ!CÂ#CÃCÃCÃCc              ƒ   ó
  K  — | j                   }|€y 	 t        j                   || j                  |«      ft        f«      ƒ d {  –—† «      S 7 Œ# t
        $ r)}t        j                  dt        |«      «       Y d }~y d }~ww xY w­w)NzJRedis enqueued-token reservation pop failed, falling back to in-memory: %s)	r›   rQ   rb   r¡   r   r¨   r   rc   r3   )r[   rq   Ú
pop_scriptr¬   s       r7   rÙ   z)BatchEnqueuedTokenStore._pop_redis_recordŸ  s‚   è ø€ Ø ×,Ñ,ˆ
ØÐØð	Ü(×8Ñ8Ù  $×"2Ñ"2°8Ó"<Ð!>ÔAaÐ@cÓd×dóð Ødùäò 	Ü ×(Ñ(Ø\Ô^aÐbcÓ^dôô ûð		üs@   ‚B“0A ÁAÁA ÁBÁA Á	B ÁA;Á6BÁ;B Â Bc              ƒ   ó¤  K  — | j                   4 ƒd {  –—†  | j                  j                  | j                  |«      |d¬«      ƒ d {  –—† }|€	 d d d «      ƒd {  –—†  y | j                  j                  j
                  j                  | j                  |«      ¬«       d d d «      ƒd {  –—†  |S 7 Œž7 Œk7 ŒZ7 Œ# 1 ƒd {  –—†7  sw Y   S xY w­w)NT©r,   r¢   rÏ   rÅ   )r�   r‹   Úasync_get_cacher¡   r•   rÇ   rÈ   )r[   rq   r¥   Ústoreds       r7   rÚ   z)BatchEnqueuedTokenStore._pop_local_record­  sã   è ø€ Ø—:‘:÷ 	nñ 	nØ×4Ñ4×DÑDØ×$Ñ$ XÓ.Ø)-Øð Eó ÷ ˆFð
 ˆ~Ø÷	n÷ 	nð 	nð ×%Ñ%×0Ñ0×@Ñ@×MÑMÐRV×RbÑRbÐckÓRlÐMÔm÷	n÷ 	nð ˆð	nøðøð	nøð 	nø÷ 	n÷ 	nð 	nð ˆüst   ‚C“B2”C—1B:ÁB4Á	B:ÁCÁB6ÁCÁ!?B:Â CÂ+B8Â,CÂ4B:Â6CÂ8CÂ:CÃ CÃCÃCc              ƒ   óª   K  — | j                   j                  | j                  |«      |d¬«      ƒ d {  –—† }t        j	                  |«      xs dS 7 Œ­w)NTrá   r   )r‹   râ   rŸ   rR   rb   )r[   rK   r¥   rã   s       r7   r¾   z*BatchEnqueuedTokenStore._get_local_counter¹  sX   è ø€ Ø×0Ñ0×@Ñ@Ø×!Ñ! %Ó(Ø%)Øð Aó 
÷ 
ˆô
 '×6Ñ6°vÓ>ÒCÀ!ÐCð
ús   ‚1A³A´Ar-   c              ƒ   ó†   K  — | j                   j                  | j                  |«      |t        |d¬«      ƒ d {  –—†  y 7 Œ­w)NTrÍ   )r‹   rÔ   rŸ   r   )r[   rK   r-   r¥   s       r7   rÀ   z*BatchEnqueuedTokenStore._set_local_counterÁ  sC   è ø€ Ø×'Ñ'×7Ñ7Ø×!Ñ! %Ó(ØÜ0Ø%)Øð 8ó 
÷ 	
ò 	
ús   ‚7A¹?ºArZ   )#r/   r0   r1   Ú__doc__rF   rG   r   rH   rœ   Ústaticmethodr+   r3   rŸ   r¡   r4   rE   rM   r­   rU   r§   r³   r´   r»   r©   r<   rÊ   rÆ   r×   rÝ   r]   rÙ   r^   rÚ   r¾   rÀ   r5   r6   r7   rŠ   rŠ   ¯   s  „ ñð$ *.¯©ñ
à2ð
ð ˜B ˜IÑ&ð
ð 
ó	
ð. ðBÐ3ð B¸ò Bó ðBð ð>˜cð > cò >ó ð>ð 37ñ	jàðjð Ð-¨sÐ2Ñ3ðjð #0ð	jð
 
#ójð&
à%ð
ð %ð
ð ð	
ð
 Ð-¨sÐ2Ñ3ð
ð 
#ó
ð.à%ðð %ðð ð	ð
 'ðð  Ð 7¸Ð <Ñ=ðð 
ˆs�Cˆx‰óð$à$ðð ðð Ð-¨sÐ2Ñ3ð	ð
 
óðHà$ðHð ðHð Ð-¨sÐ2Ñ3ð	Hð
 
óHð
àð
ð Ð-¨sÐ2Ñ3ð
ð ð	
ð
 
#ó
ð* 37ñ^à2ð^ð #0ð^ð 
ó	^ð0Ð;Xð Ð]aó ð$ 37ñ	
àð
ð 3ð
ð #0ð	
ð
 
ó
ð@ 37ñàðð #0ðð 
'¨Ñ	-ó	ð2°ð ¸¸e¹ÀdÑ8Jó ð
°ð 
¸=ð 
ÈVó 
ðDÐ.Eð DÈ]ð DÐ_bó Dð
Ð.Eð 
Ècð 
ÐYfð 
Ðkoô 
r6   rŠ   )Eræ   rŽ   rÒ   rF   r‘   Úcollections.abcr   r   r   r   Údataclassesr   r   Útypingr	   r
   r   r   r   r   Úpydanticr   r   r   r   r   Úlitellm._loggingr   Úlitellm.constantsr   r   Úlitellm.proxy._typesr   Úopentelemetry.tracer   Ú_SpanÚlitellm.proxy.utilsr   Ú_InternalUsageCacheÚ	frozensetr    r3   r2   r#   r$   r%   r&   r'   r+   r:   r<   rJ   rM   r4   rO   rE   rP   r]   rQ   rR   rS   rU   r^   re   rp   r{   r}   rˆ   rŠ   r5   r6   r7   ú<module>rô      sM  ðòó Û Û Û ß BÓ Bß (ß P× Pç OÕ Oå 1ß gÝ /áÝ1åMà€DØ,Ðá8AÚMó9Ð   i°¡nÑ 5ó ð Ð/Ñ0€ˆ)Ó 0ð)Ð  ó ð(Ð ˜uó ð"Ð ˜ó ð
!Ð ˜ó ñ �$˜dÔ#÷ð ó $ðð !(Ð(9Ñ :Ð �IÓ :ñ �$˜dÔ#÷Xð Xó $ðXñ �$˜dÔ#÷ð ó $ðð
 (EÐGbÑ'bÐ ˜9Ó bá# I¨c±5¸A´;Ð.>Ñ$?Ó@€�Ó @Ù!,¨U°3¸°8©_Ó!=Ð ˜Ó =Ù*¨3°©;¸Ñ+=Ó>Ð �uÓ >Ù!,¨S°4©ZÓ!8Ð ˜Ó 8Ù)Ð*GÓHÐ �eÓ Hôq�Hô qð 7¨3°¨;Ñ#7¸$Ñ#>ð À3ÈÁ:ó ð"EØ%ðEà
Ð" CÐ'Ñ(óEð *¨#ð *°#ó *ô˜ô ð &ð Ð-?À$Ñ-Fó ÷Y
ò Y
r6   