Ë
    tPêjQ  ã                   óî  — U d dl 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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 d dlmZ d dlmZ d dlmZmZ dZ e
e!d<   dZ"e
e!d<   dZ#e
e!d<    eejH                  e ejJ                  e#ejL                  e"i«      Z'e
e!d<    e(ejH                  ejL                  h«      Z)e
e!d<    ejT                  «       Z+e
e!d<    eejH                  dejJ                  dejL                  di«      Z,e
e!d<    edd¬«       G d„ d«      «       Z-d ed!e.dz  d"e.d#e.dz  d$e.f
d%„Z/d ed!e.dz  d&e.d'e-d$e.dz  f
d(„Z0d ed!e.dz  d"e.d#e.dz  d$e.f
d)„Z1d&e.d*ee.e2f   d$e-dz  fd+„Z3d&e.d$e4e.d,f   fd-„Z5d&e.d$e4e.d,f   fd.„Z6d ed!e.dz  d*ee.e2f   dz  d/edz  d$e7e.e7e.e2f   f   f
d0„Z8d1e2d$edz  fd2„Z9d3e2d$e:fd4„Z;d&e.d5ee4ee.dz  e2f      d$e4e4ee.e-f   d,f   fd6„Z< G d7„ d8e«      Z=y)9é    N)ÚIterableÚMapping)Ú	dataclass)ÚMappingProxyType)ÚFinal)Úverbose_proxy_logger)Ú	DualCache)ÚSpan)Úduration_in_seconds)Úget_bedrock_base_model)ÚLitellm_EntityTypeÚUserAPIKeyAuth)ÚRouterBudgetLimiting)ÚAllMessageValues)ÚBudgetConfigÚStandardLoggingPayloadÚvirtual_key_spendÚ"VIRTUAL_KEY_SPEND_CACHE_KEY_PREFIXÚend_user_model_spendÚEND_USER_SPEND_CACHE_KEY_PREFIXÚuser_model_spendÚUSER_SPEND_CACHE_KEY_PREFIXÚ_SPEND_CACHE_KEY_PREFIXESÚ_LEGACY_REQUEST_MODEL_SCOPESÚ_PROCESS_STARTED_ATÚvirtual_key_budget_start_timeÚuser_model_budget_start_timeÚend_user_budget_start_timeÚ_BUDGET_START_TIME_KEY_PREFIXEST)ÚfrozenÚslotsc                   ó&   — e Zd ZU dZeed<   eed<   y)ÚResolvedModelBudgetaU  The `model_max_budget` entry a request resolved to.

    ``budget_model`` is the key as the operator configured it, not the model
    name on the request. Every counter is keyed on it so enforcement, the
    post-call increment and the `/key/info` + `/user/info` usage reads cannot
    disagree about which counter a request belongs to.
    Úbudget_modelÚbudget_configN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r   © ó    úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/hooks/model_max_budget_limiter.pyr#   r#   ,   s   … ñð ÓØÔr-   r#   Úentity_typeÚ	entity_idr$   Úbudget_durationÚreturnc                 ó*   — t         |    › d|› d|› d|› �S )z[Sole owner of the per-model spend counter key, shared by its writer and all of its readers.ú:)r   ©r/   r0   r$   r1   s       r.   Úmodel_budget_spend_cache_keyr6   :   s*   € ô (¨Ñ4Ð5°Q°y°kÀÀ<À.ÐPQÐRaÐQbÐcÐcr-   ÚmodelÚresolvedc                 ó²   — |j                   j                  }| t        vs|€yt        j                  «       t
        z
  t        |«      k\  ryt        | |||¬«      S )aG  The counter this request was billed to before the budget model owned the key, or None.

    Upgrading proxies carry live counters keyed on the model as REQUESTED
    (`openai/gpt-4`) rather than as configured (`gpt-4`), and those were the
    counters the previous version enforced on. Nothing writes that spelling once
    this version is running, so the pre-upgrade and post-upgrade counters hold
    disjoint halves of one window and adding them is the window's real spend.

    Only the key and end-user scopes ever had one. The user scope is introduced
    by this change, so it has no counter to carry.

    The carry stops one budget window after start-up, because a legacy counter
    belongs to a window that was already open when this process replaced the one
    writing it. Past that point the lookup could only ever miss.
    Nr5   )r%   r1   r   ÚtimeÚ	monotonicr   r   r6   )r/   r0   r7   r8   r1   s        r.   Ú%_legacy_request_model_spend_cache_keyr<   D   s]   € ð* &×3Ñ3×CÑC€OØÔ6Ñ6¸/Ð:QØÜ‡~�~ÓÔ-Ñ-Ô1DÀ_Ó1UÒUØÜ'ØØØØ'ô	ð r-   c                 ó*   — t         |    › d|› d|› d|› �S )zìWindow start for one (entity, budget model) pair.

    Scoped per budget model because an entity may budget two models over
    different periods, and a shared start time lets the shorter period restart
    the longer one's window.
    r4   )r   r5   s       r.   Ú!model_budget_start_time_cache_keyr>   f   s*   € ô .¨kÑ:Ð;¸1¸Y¸KÀqÈÈÐVWÐXgÐWhÐiÐir-   Úmodel_max_budgetc                 ó°   — t        | «      D ]H  }|j                  |«      }|€Œt        |«      x}€t        j                  d|«       Œ;t        ||¬«      c S  y)z@Find the `model_max_budget` entry that governs `model`, or None.NzQIgnoring unusable model_max_budget entry for %s; it cannot be enforced or tracked)r$   r%   )Ú_budget_model_candidatesÚgetÚ_usable_budget_configr   Úwarningr#   )r7   r?   Ú	candidateÚraw_budget_configr%   s        r.   Úresolve_model_budgetrG   u   sp   € ä-¨eÓ4ò Xˆ	Ø,×0Ñ0°Ó;ÐØÐ$ØÜ2Ð3DÓEÐEˆMÐNô !×(Ñ(ØcØôð Ü"°	ÈÔWÒWð'Xð( r-   .c                 ó~   — t        t        j                  | | j                  d«      d   gt	        | «      ¢­«      «      S )aÞ  Names a budget may be configured under for a request on `model`, most specific first.

    Beyond the model as sent, a budget may be keyed on the model without its
    ``{custom_llm_provider}/`` prefix (``gpt-4o`` governs ``openai/gpt-4o``), on
    the Bedrock base model (``anthropic.claude-opus-4-8`` governs the
    cross-region ``us.anthropic.claude-opus-4-8``), or on the bare family name
    that Bedrock id shares with its direct-provider twin (``claude-opus-4-8``).
    ú/éÿÿÿÿ)ÚtupleÚdictÚfromkeysÚsplitÚ_bedrock_candidates)r7   s    r.   rA   rA   Ž   s7   € ô ”—‘  u§{¡{°3Ó'7¸Ñ';ÐYÔ>QÐRWÓ>XÑYÓZÓ[Ð[r-   c                 ó  — t        | «      }t        j                  j                  |«      }t	        |t
        «      r*t        |j                  dd«      «      j                  d«      sy|j                  d«      \  }}}|r||fS |fS )ao  Bedrock-only candidates, empty unless litellm prices `model` as a Bedrock model.

    Gating on the cost map rather than on a vendor allowlist is what makes
    splitting the leading dotted segment safe: most dotted model ids are not
    Bedrock ids at all (``azure/gpt-4.1``, ``gpt-image-1.5``), and splitting one
    of those would produce a garbage candidate.
    Úlitellm_providerÚ Úbedrockr,   ú.)	r   ÚlitellmÚ
model_costrB   Ú
isinstancerL   r*   Ú
startswithÚ	partition)r7   Ú
base_modelÚ
cost_entryÚ_Úwithout_vendors        r.   rO   rO   š   s|   € ô /¨uÓ5€JÜ×*Ñ*×.Ñ.¨zÓ:€JÜ�j¤$Ô'¬s°:·>±>ÐBTÐVXÓ3YÓ/Z×/eÑ/eÐfoÔ/pØØ%×/Ñ/°Ó4Ñ€A€qˆ.Ù+9ˆJ˜Ð'ÐLÀ
¸}ÐLr-   Úcachec              ƒ   ó  ‡ ‡K  — |�‰�|si S t        d„ |j                  «       D «       «      }|si S t        ˆˆ fd„|D «       «      }|j                  t        |«      ¬«      ƒ d{  –—† }t	        |t        «      r"t        |«      t        |«      k(  rt        |«      ndt        |«      z  }t        ||d¬«      D ��	�
ci c]6  \  \  }}	}
|t        t        |
«      d«      |	j                  |	j                  d	œ“Œ8 c}
}	}S 7 Œ–c c}
}	}w ­w)
a*  Current-window spend per configured budget model, as `/key/info` and `/user/info` report it.

    `cache` must be the DualCache the limiter writes the counters to; callers
    read it off the limiter rather than re-deriving it, so a scope that is being
    blocked can never report zero usage.
    Nc              3   óD   K  — | ]  \  }}t        |«      }|�||f–— Œ y ­w©N)rC   )Ú.0r$   rF   r%   s       r.   ú	<genexpr>z/build_model_max_budget_usage.<locals>.<genexpr>¹   s3   è ø€ ò á+ˆLÐ+Ü3Ð4EÓFˆMØÐ$ð 
�}Ô%ñùs   ‚ c              3   óV   •K  — | ]   \  }}t        ‰‰||j                  ¬ «      –— Œ" y­w)r5   N)r6   r1   )rb   r$   r%   r0   r/   s      €€r.   rc   z/build_model_max_budget_usage.<locals>.<genexpr>Á   s;   øè ø€ ò ñ (ˆL˜-ô 	%Ø#ØØ%Ø)×9Ñ9÷		
ð 	
ñùs   ƒ&))Úkeysra   T)Ústricté   )Úcurrent_spendÚbudget_limitÚtime_period)rK   ÚitemsÚasync_batch_get_cacheÚlistrW   ÚlenÚzipÚroundÚ	_as_spendÚ
max_budgetr1   )r/   r0   r?   r^   ÚbudgetsÚ
spend_keysÚbatchedÚcurrent_spendsr$   r%   rh   s   ``         r.   Úbuild_model_max_budget_usagerw   ª   s$  ùè ø€ ð €}˜	Ð)Ñ1AØˆ	äñ à/?×/EÑ/EÓ/Gôó €Gñ Øˆ	Üô ð ,3ôó €Jð !×6Ñ6Ü�*Óð 7ó ÷ €Gô % W¬dÔ3¼¸G»ÌÈGËÒ8TŒˆgŒÐZaÔdgÐhoÓdpÑZpð ô =@ÀÈÐ`dÔ<e÷ð ñ 9Ñ)ˆ\˜=¨=ð 	Ü"¤9¨]Ó#;¸QÓ?Ø)×4Ñ4Ø(×8Ñ8ñ
ñ 	
ôð ðúôùs%   „A DÁ$C;Á%ADÂ;;C=Ã6DÃ=DrF   c                 ó”   — 	 t        j                  | «      }|j                  €y t        |j                  «       |S # t        $ r Y y w xY wra   )r   Úmodel_validater1   r   Ú	Exception)rF   r%   s     r.   rC   rC   Ý   sQ   € ðÜ+×:Ñ:Ð;LÓMˆØ×(Ñ(Ð0ØÜ˜M×9Ñ9Ô:ð Ðøô ò Ùðús   ‚!; ¤; »	AÁArh   c                 óL   — 	 t        | xs d«      S # t        t        f$ r Y yw xY w)Ng        )ÚfloatÚ	TypeErrorÚ
ValueError)rh   s    r.   rq   rq   è   s.   € ðÜ�]Ò) cÓ*Ð*øÜ”zÐ"ò Ùðús   ‚ ‘#¢#Úentity_budgetsc                 ó,   ‡ — t        ˆ fd„|D «       «      S )zQDrop the scopes that do not budget `model`, keeping only what can be incremented.c              3   ó¢   •K  — | ]F  \  }}}|�>t        |t        «      r.|r,t        ‰|¬«      }|�|j                  j                  �|||f–— ŒH y ­w)N©r7   r?   )rW   r   rG   r%   r1   )rb   r/   r0   r?   r8   r7   s        €r.   rc   z0_resolve_entity_model_budgets.<locals>.<genexpr>ô   s^   øè ø€ ò á4ˆK˜Ð$4ØÐ ¤ZÐ0@Ä'Ô%JÑO_Ü-°EÐL\Ô]ˆHØÐ H×$:Ñ$:×$JÑ$JÐ$Vð	 
�i Ô*ñùs   ƒAA)rK   ©r7   r   s   ` r.   Ú_resolve_entity_model_budgetsr„   ï   s   ø€ ô
 ó à8Fôó ð r-   c                   óF  — e Zd ZdZdefd„Zdededefd„Z	dedededz  fd	„Z
d
edeeef   dedefd„Zdedeeef   dedefd„Zdededz  deeef   dz  dededefd„Zdededz  dededef
d„Zdededz  fd„Z	 	 ddededee   dz  dedz  dedz  dee   fd„Zd„ Zy) Ú&_PROXY_VirtualKeyModelMaxBudgetLimiterz
    Handles budgets for model + virtual key

    Example: key=sk-1234567890, model=gpt-4o, max_budget=100, time_period=1d
    Ú
dual_cachec                 ó.   — || _         g | _        d | _        y ra   )r‡   Úredis_increment_operation_queueÚdeployment_budget_config)Úselfr‡   s     r.   Ú__init__z/_PROXY_VirtualKeyModelMaxBudgetLimiter.__init__  s   € Ø$ˆŒØ/1ˆÔ,Ø(,ˆÕ%r-   Úuser_api_key_dictr7   r2   c              ƒ   óÈ   K  — | j                  t        j                  |j                  |j                  |d|j                  › d|j
                  › d|› �¬«      ƒ d{  –—† S 7 Œ­w)z´
        Check if the user_api_key_dict is within the model budget

        Raises:
            BudgetExceededError: If the user_api_key_dict has exceeded the model budget
        zLiteLLM Virtual Key: z, key_alias: ú, exceeded budget for model=©r/   r0   r?   r7   Úexceeded_messageN)Ú_is_entity_within_model_budgetr   ÚKEYÚtokenr?   Ú	key_alias)r‹   r�   r7   s      r.   Úis_key_within_model_budgetzA_PROXY_VirtualKeyModelMaxBudgetLimiter.is_key_within_model_budget	  su   è ø€ ð ×8Ñ8Ü*×.Ñ.Ø'×-Ñ-Ø.×?Ñ?Øà'Ð(9×(?Ñ(?Ð'@ÀÐN_×NiÑNiÐMjð k-Ø-2¨Gð5ð 9ó 	
÷ 	
ð 		
ð 	
ús   ‚AA"ÁA ÁA"Nc              ƒ   óÎ   K  — |j                   xs i }|j                  |g «      D ]!  }	 | j                  ||¬«      ƒ d {  –—†  |c S  y 7 Œ
# t        j                  $ r Y Œ<w xY w­w)N)r�   r7   )Úbudget_fallbacksrB   r–   rU   ÚBudgetExceededError)r‹   r�   r7   r˜   Úfallback_models        r.   Ú get_fallback_model_within_budgetzG_PROXY_VirtualKeyModelMaxBudgetLimiter.get_fallback_model_within_budget  s   è ø€ ð
 9J×8ZÑ8ZÒ8`Ð^`ÐØ.×2Ñ2°5¸"Ó=ò 	ˆNðØ×5Ñ5ÐHYÐaoÐ5Óp×pÐpØ%Ò%ð	ð ð	 qùä×.Ñ.ò Ùðüs9   ‚&A%©A¿A
Á AÁA%Á
AÁA"ÁA%Á!A"Á"A%Úuser_idÚuser_model_max_budgetc           
   ƒ   ór   K  — | j                  t        j                  |||d|› d|› �¬«      ƒ d{  –—† S 7 Œ­w)z£
        Check if the internal user is within the model budget

        Raises:
            BudgetExceededError: If the user has exceeded the model budget
        zLiteLLM User: r�   r�   N)r’   r   ÚUSER)r‹   rœ   r�   r7   s       r.   Úis_user_within_model_budgetzB_PROXY_VirtualKeyModelMaxBudgetLimiter.is_user_within_model_budget-  sO   è ø€ ð ×8Ñ8Ü*×/Ñ/ØØ2ØØ-¨g¨YÐ6RÐSXÐRYÐZð 9ó 
÷ 
ð 	
ð 
úó   ‚.7°5±7Úend_user_idÚend_user_model_max_budgetc           
   ƒ   ór   K  — | j                  t        j                  |||d|› d|› �¬«      ƒ d{  –—† S 7 Œ­w)z¢
        Check if the end_user is within the model budget

        Raises:
            BudgetExceededError: If the end_user has exceeded the model budget
        zLiteLLM End User: r�   r�   N)r’   r   ÚEND_USER)r‹   r¢   r£   r7   s       r.   Úis_end_user_within_model_budgetzF_PROXY_VirtualKeyModelMaxBudgetLimiter.is_end_user_within_model_budgetA  sO   è ø€ ð ×8Ñ8Ü*×3Ñ3Ø!Ø6ØØ1°+°Ð>ZÐ[`ÐZaÐbð 9ó 
÷ 
ð 	
ð 
úr¡   r/   r0   r?   r‘   c              ƒ   ó@  K  — |syt        ||¬«      }|€"t        j                  d||j                  «       y|j                  j
                  }|�|dk  ry| j                  ||||¬«      ƒ d {  –—† }||k\  r$t        j                  ||||j                  |¬«      ‚y7 Œ.­w)NTr‚   z)Model %s not found in %s model_max_budgetr   ©r/   r0   r7   r8   )ÚmessageÚcurrent_costrr   r/   r0   )	rG   r   ÚdebugÚvaluer%   rr   Ú_get_spend_for_model_budgetrU   r™   )	r‹   r/   r0   r?   r7   r‘   r8   rr   rh   s	            r.   r’   zE_PROXY_VirtualKeyModelMaxBudgetLimiter._is_entity_within_model_budgetU  sÂ   è ø€ ñ  ØÜ.°UÐM]Ô^ˆØÐÜ ×&Ñ&Ð'RÐTYÐ[f×[lÑ[lÔmØà$×2Ñ2×=Ñ=ˆ
ØÐ ¨a¢Øà%)×%EÑ%EØ#ØØØð	 &Fó &
÷  
ˆð ˜JÒ&Ü×-Ñ-Ø(Ø*Ø%Ø'×-Ñ-Ø#ôð ð ð 
ús   ‚A+BÁ-BÁ./Br8   c              ƒ   ó*  K  — t        |||j                  |j                  j                  ¬«      }t	        ||||¬«      }t        | j                  |«      ƒ d{  –—† «      }|�||k(  r|S |t        | j                  |«      ƒ d{  –—† «      z   S 7 Œ67 Œ­w)a?  Spend charged to this budget in the current window, legacy counter included.

        A counter that was never written is zero spend, not unknown spend. The
        distinction only shows up at a zero-dollar cap, where skipping the
        comparison would let the strictest possible limit admit every request.
        r5   r¨   N)r6   r$   r%   r1   r<   rq   Ú_cached_spend)r‹   r/   r0   r7   r8   Ú	spend_keyÚlegacy_spend_keyrh   s           r.   r­   zB_PROXY_VirtualKeyModelMaxBudgetLimiter._get_spend_for_model_budgetx  s¤   è ø€ ô 8Ø#ØØ!×.Ñ.Ø$×2Ñ2×BÑBô	
ˆ	ô #HØ#ØØØô	#
Ðô  )¨t×/AÑ/AÀ)Ó/L×)LÓMˆØÐ#Ð'7¸9Ò'DØ Ð Øœy¨t×/AÑ/AÐBRÓ/S×)SÓTÑTÐTð *Møð *Tús$   ‚ABÁBÁ+BÂB
ÂBÂBr°   c              ƒ   óV   K  — | j                   j                  |¬«      ƒ d {  –—† S 7 Œ­w)N)Úkey)r‡   Úasync_get_cache)r‹   r°   s     r.   r¯   z4_PROXY_VirtualKeyModelMaxBudgetLimiter._cached_spend–  s$   è ø€ Ø—_‘_×4Ñ4¸Ð4ÓC×CÐCÐCús   ‚ )¢'£)Úhealthy_deploymentsÚmessagesÚrequest_kwargsÚparent_otel_spanc              ƒ   ó   K  — |S ­wra   r,   )r‹   r7   rµ   r¶   r·   r¸   s         r.   Úasync_filter_deploymentsz?_PROXY_VirtualKeyModelMaxBudgetLimiter.async_filter_deployments™  s   è ø€ ð #Ð"ùs   ‚c              ƒ   ó$  K  — t        j                  d«       |j                  dd«      }|€t        j                  d«       y|j                  di «      xs i }|j                  di «      xs i }|j                  d«      xs i }|j                  d«      xs |j                  d«      }	|	€y|j                  d	d
«      }
t        j                  |j                  d«      |j                  d«      ft        j
                  |j                  d«      |j                  d«      ft        j                  |j                  d«      xs |j                  d«      |j                  d«      ff}t        |	|¬«      }|st        j                  d|	«       y|D ]ƒ  \  }}}| j                  |j                  t        |||j                  |j                  j                  ¬«      t        |||j                  |j                  j                  ¬«      |
¬«      ƒ d{  –—†  Œ… | j                  j                  �| j!                  «       ƒ d{  –—†  t        j                  dt#        j$                  | j                  j&                  j(                  dt*        ¬«      «       y7 Œƒ7 ŒU­w)z”
        Track spend for virtual key + model in DualCache

        Example: key=sk-1234567890, model=gpt-4o, max_budget=100, time_period=1d
        z/in RouterBudgetLimiting.async_log_success_eventÚstandard_logging_objectNziSkipping _PROXY_VirtualKeyModelMaxBudgetLimiter.async_log_success_event: standard_logging_payload is NoneÚlitellm_paramsÚmetadataÚmodel_groupr7   Úresponse_costr   Úuser_api_key_hashÚuser_api_key_model_max_budgetÚuser_api_key_user_idÚ"user_api_key_user_model_max_budgetÚend_userÚuser_api_key_end_user_idÚ&user_api_key_end_user_model_max_budgetrƒ   z…Not running _PROXY_VirtualKeyModelMaxBudgetLimiter.async_log_success_event: no key, user or end-user model_max_budget covers model=%sr5   )r%   r°   Ústart_time_keyrÀ   z#current state of in memory cache %srg   )ÚindentÚdefault)r   r«   rB   r   r“   rŸ   r¥   r„   Ú_increment_spend_for_keyr%   r6   r$   r1   r>   r‡   Úredis_cacheÚ#_push_in_memory_increments_to_redisÚjsonÚdumpsÚin_memory_cacheÚ
cache_dictr*   )r‹   ÚkwargsÚresponse_objÚ
start_timeÚend_timeÚstandard_logging_payloadÚ_litellm_paramsÚ	_metadataÚpayload_metadatar7   rÀ   r   Úresolved_budgetsr/   r0   r8   s                   r.   Úasync_log_success_eventz>_PROXY_VirtualKeyModelMaxBudgetLimiter.async_log_success_event£  s…  è ø€ ô 	×"Ñ"Ð#TÔUØIOÏÉÐTmÐosÓItÐ Ø#Ð+Ü ×&Ñ&Ø{ôð à'-§z¡zÐ2BÀBÓ'GÒ'MÈ2ˆØ!0×!4Ñ!4°ZÀÓ!DÒ!JÈˆ	Ø":×">Ñ">¸zÓ"JÒ"PÈbÐð 0×3Ñ3°MÓBÒkÐF^×FbÑFbÐcjÓFkˆØˆ=Øà&>×&BÑ&BÀ?ÐTUÓ&Vˆô #×&Ñ&Ø ×$Ñ$Ð%8Ó9Ø—‘Ð=Ó>ðô #×'Ñ'Ø ×$Ñ$Ð%;Ó<Ø—‘ÐBÓCðô #×+Ñ+Ø(×,Ñ,¨ZÓ8ÒlÐ<L×<PÑ<PÐQkÓ<lØ—‘ÐFÓGðð!
ˆô$ #@ÀeÐ\jÔ"kÐÙÜ ×&Ñ&ðLàôð
 à0@ò 	Ñ,ˆK˜ HØ×/Ñ/Ø&×4Ñ4Ü6Ø +Ø'Ø!)×!6Ñ!6Ø$,×$:Ñ$:×$JÑ$Jô	ô  AØ +Ø'Ø!)×!6Ñ!6Ø$,×$:Ñ$:×$JÑ$Jô	 ð ,ð 0ó ÷ ñ ð	ð$ �?‰?×&Ñ&Ð2Ø×:Ñ:Ó<×<Ð<ä×"Ñ"Ø1Ü�J‰J�t—‘×6Ñ6×AÑAÈ!ÔUXÔYõ	
ð)øð$ =ús%   ‚HJÈJÈ	/JÈ8JÈ9AJÊJ)NN)r&   r'   r(   r)   r	   rŒ   r   r*   Úboolr–   r›   r   Úobjectr    r¦   r   r’   r#   r|   r­   r¯   rm   r   rL   r
   rº   rÛ   r,   r-   r.   r†   r†   ý   sÐ  „ ñð- 9ó -ð

à)ð
ð ð
ð 
ó	
ð,à)ðð ðð 
ˆt‰ó	ð
àð
ð  ' s¨F {Ñ3ð
ð ð	
ð
 
ó
ð(
àð
ð $+¨3°¨;Ñ#7ð
ð ð	
ð
 
ó
ð(!à'ð!ð ˜‘:ð!ð " # v +Ñ.°Ñ5ð	!ð
 ð!ð ð!ð 
ó!ðFUà'ðUð ˜‘:ðUð ð	Uð
 &ðUð 
óUð<D¨Sð D°U¸T±\ó Dð '+Ø(,ñ#àð#ð "ð#ð Ð'Ñ(¨4Ñ/ð	#ð
 ˜t™ð#ð  ™+ð#ð 
ˆd‰ó#óP
r-   r†   )>rÎ   r:   Úcollections.abcr   r   Údataclassesr   Útypesr   Útypingr   rU   Úlitellm._loggingr   Úlitellm.caching.cachingr	   Ú"litellm.integrations.custom_loggerr
   Ú*litellm.litellm_core_utils.duration_parserr   Ú!litellm.llms.bedrock.common_utilsr   Úlitellm.proxy._typesr   r   Ú&litellm.router_strategy.budget_limiterr   Úlitellm.types.llms.openair   Úlitellm.types.utilsr   r   r   r+   r   r   r“   rŸ   r¥   r   Ú	frozensetr   r;   r   r   r#   r*   r6   r<   r>   rÝ   rG   rK   rA   rO   rL   rw   rC   r|   rq   r„   r†   r,   r-   r.   ú<module>rì      s.  ðÜ Û ß -Ý !Ý "Ý ã Ý 1Ý -Ý 3Ý JÝ Dß CÝ GÝ 6ß Dà,?Ð " EÓ ?Ø)?Ð  Ó ?Ø%7Ð ˜UÓ 7á#3à×ÑÐ BØ×ÑÐ!<Ø×#Ñ#Ð%Dðó$Ð ˜5ó ñ '0Ð1C×1GÑ1GÐI[×IdÑIdÐ0eÓ&fÐ ˜eÓ fà+˜TŸ^™^Ó-Ð �UÓ -á)9à×ÑÐ ?Ø×ÑÐ!?Ø×#Ñ#Ð%Aðó*Ð  ó ñ �$˜dÔ#÷
 ð 
 ó $ð
 ðdØ#ðdà�T‰zðdð ðdð ˜4‘Zð	dð
 	ódðØ#ðà�T‰zðð ðð "ð	ð
 	ˆ4�ZóðDjØ#ðjà�T‰zðjð ðjð ˜4‘Zð	jð
 	ójð ð °w¸sÀF¸{Ñ7Kð ÐPcÐfjÑPjó ð2	\ Cð 	\¨E°#°s°(©Oó 	\ðM˜sð M u¨S°#¨X¡ó Mð 0Ø#ð0à�T‰zð0ð ˜c 6˜kÑ*¨TÑ1ð0ð �tÑð	0ð
 
ˆ#ˆt�C˜�KÑ Ð
 Ñ!ó0ðf¨Vð ¸ÀtÑ8Kó ð˜Vð ¨ó ðØðà˜UÐ#5°s¸T±zÀ6Ð#IÑJÑKðð ˆ5Ð# SÐ*=Ð=Ñ>ÀÐCÑDóôv
Ð-Aõ v
r-   