Ë
    tPêj:w  ã            !       ó  — U d dl Z d dlZd dlmZ d dlmZ d dlmZmZmZ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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 d dl m!Z!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, d dl-m.Z.m/Z/m0Z0 d dl1m2Z2 erd dl+m3Z3  e4e.jj                  jl                  e.jn                  jl                  e.jp                  jl                  e.jr                  jl                  h«      Z:ee4e;      e<d<    e4e.jr                  jl                   e;e.jr                  «      f«      Z=ee4e;      e<d<    G d„ de«      Z>de?de?ddfd„Z@deAdeBfd„ZCdeAdeBfd „ZD	 d7d!e;dz  d"e;dz  d#e;dz  d$e;dz  d%e;dz  deBfd&„ZEde?de?dz  fd'„ZFd(e/dz  de?deGe;   dz  fd)„ZH	 	 d8d*d+d,ed!e;dz  d"e;dz  d$e;dz  d#e;dz  d-e;dz  de?de
j’                  ez  dz  d.ed/ed0eJd1e?dz  d2eGe;   dz  d3ee;   dz  ddf d4„ZKd1e?dz  ddfd5„ZLd1e?dz  ddfd6„ZMy)9é    N)ÚSequence)Údatetime)ÚTYPE_CHECKINGÚAnyÚFinalÚcast)Úverbose_proxy_logger)Ú+BACKGROUND_INTERACTION_COST_POLLING_ENABLED)ÚCustomLogger)Ú!_get_parent_otel_span_from_kwargsÚ get_litellm_metadata_from_kwargs)ÚStandardLoggingPayloadSetup)Úguardrail_information_cost)ÚUserAPIKeyAuth)Úget_key_objectÚget_team_objectÚlog_db_metrics)ÚRouteChecks)Údebitable_model_access_groupsÚget_llm_router)ÚLiteLLMProxyRequestSetup)Ú$should_suppress_spend_log_tracebacksÚspend_log_error)Ú*_sanitize_error_information_for_spend_logsÚget_request_model_access_groups)ÚProxyUpdateSpend)Ú	CallTypesÚStandardLoggingPayloadÚ&StandardLoggingPayloadErrorInformation)Ú!get_end_user_id_for_cost_tracking)ÚProxyLoggingÚ"_UNATTRIBUTED_TRACKABLE_CALL_TYPESÚ_CAPTURED_IDENTITY_CALL_TYPESc            
       ó    — e Zd Zd„ Z	 ddededededz  fd„Ze		 	 dde
j                  ez  dz  fd	„«       Zedd
ededefd„«       Zed„ «       Zy)Ú_ProxyDBLoggerc              ƒ   óH   K  — | j                  ||||«      ƒ d {  –—†  y 7 Œ­w©N)Ú_PROXY_track_cost_callback)ÚselfÚkwargsÚresponse_objÚ
start_timeÚend_times        úr/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/hooks/proxy_track_cost_callback.pyÚasync_log_success_eventz&_ProxyDBLogger.async_log_success_eventH   s!   è ø€ Ø×-Ñ-¨f°lÀJÐPXÓY×YÒYús   ‚"š ›"NÚrequest_dataÚoriginal_exceptionÚuser_api_key_dictÚtraceback_strc              ƒ   ó¾  K  — 	 t        |j                  ¬«      ƒ d {  –—†  |j                  }t        j                  «       du s.|�-t        j                  |¬«      st        j                  |¬«      sy dd	lm} t        t        j                   |¬
«      «      }|j"                  |d<   d|d<   t%        j&                  ||¬«      }t)        «       r|j+                  dd «       t-        t.        t1        |«      «      }||d<   t        j3                  |¬«      ƒ d {  –—† }|j5                  dd «      xs i }	|	j7                  |«       |j5                  d«      }
t9        |
t        «      rd|	vr|
j5                  d«      }|�||	d<   d|vri |d<   |j5                  di «      }|j5                  di «      xs i }|j5                  d«      r|j5                  d«      |	d<   |j5                  d«      xs |j5                  d«      xs i |d   d<   |	|d   d<   d|vr(|j5                  d«      xs |j5                  dd«      |d<   d|vr(|j5                  d«      xs |j5                  dd«      |d<   |j5                  d«      }|�Q|j5                  d«      st;        |di «      j5                  d«      |d<   |j5                  d«      €t;        |dd «      |d<   t=        j>                  «       }|�t;        |dd «      }|�|}t9        |j5                  d «      t@        jB                  «      r(tE        tG        |j5                  d!«      xs d"«      d"«      nd"}|tI        |	j5                  d«      «      z   }|jJ                  jM                  |j"                  ||jN                  |jP                  |jR                  |||t=        j>                  «       |jT                  ¬#«
      ƒ d {  –—†  y 7 �Œ³# t        $ ry t        j                  d«       	 t        |j                  ¬«      ƒ d {  –—†7   |j                  �d|j                  d<   n$# t        $ r t        j                  d«       Y nw xY wY �Œ2w xY w7 �ŒB7 Œ�­w)$N©Úbudget_reservationz<Failed to release budget reservation during failure handlingTÚ	finalizedzMFailed to invalidate budget reservation counters after failure release failedF)Úrouter   )Úproxy_logging_obj)r2   Úuser_api_keyÚfailureÚstatus)r1   r3   Ú	tracebackÚerror_information©Úmetadatar@   Úlitellm_metadataÚ&standard_logging_guardrail_informationÚlitellm_paramsÚtagsÚproxy_server_requestÚmodelÚ Úcustom_llm_providerÚlitellm_logging_objÚstandard_logging_objectÚmodel_call_detailsÚlitellm_trace_idr,   Úcombined_usage_objectÚresponse_costç        ©
ÚtokenrN   Úuser_idÚend_user_idÚteam_idr*   Úcompletion_responser,   r-   Úorg_id)+Ú_release_budget_reservationr6   Ú	Exceptionr	   Ú	exceptionÚ'_invalidate_budget_reservation_countersÚrequest_router%   Ú_should_track_errors_in_dbr   Úis_llm_api_routeÚis_info_routeÚlitellm.proxy.proxy_serverr9   Údictr   Ú'get_sanitized_user_information_from_keyÚapi_keyr   Úget_error_informationr   Úpopr   r   r   Ú&_enrich_failure_metadata_with_key_infoÚgetÚupdateÚ
isinstanceÚgetattrr   ÚnowÚlitellmÚUsageÚmaxÚfloatr   Údb_spend_update_writerÚupdate_databaserR   rS   rT   rV   )r)   r0   r1   r2   r3   r[   r9   Ú	_metadataÚ_error_informationÚexisting_metadataÚlitellm_metadata_bucketÚguardrail_infoÚexisting_litellm_paramsÚexisting_litellm_metadataÚ_litellm_logging_objÚactual_start_timeÚ	obj_startÚrecovered_stream_costÚrecovered_response_costs                      r.   Úasync_post_call_failure_hookz+_ProxyDBLogger.async_post_call_failure_hookK   s§  è ø€ ð	Ü-ÐAR×AeÑAeÔf×fÐfð  1×>Ñ>ˆä×5Ñ5Ó7¸5Ñ@ØÐ(ä×,Ñ,°=ÕAÄ[×E^ÑE^ÐerÕEsð å@äÜ$×LÑLÐ_pÔqó
ˆ	ð %6×$=Ñ$=ˆ	�.Ñ!Ø'ˆ	�(ÑÜ8×NÑNØ1Ø'ô
Ðô 0Ô1ð ×"Ñ" ;°Ô5ô "Ü2Ü6Ð7IÓJó
Ðð *<ˆ	Ð%Ñ&ä(×OÑOØð Pó 
÷ 
ˆ	ð *6×)9Ñ)9¸*ÀdÓ)KÒ)QÈrÐØ× Ñ  Ô+à)5×)9Ñ)9Ð:LÓ)MÐäÐ.´Ô5Ø8Ð@QÑQà$;×$?Ñ$?Ð@hÓ$iˆNØÐ)ØN\Ð!Ð"JÑKà <Ñ/Ø-/ˆLÐ)Ñ*à)5×)9Ñ)9Ð:JÈBÓ)OÐØ+B×+FÑ+FÀzÐSUÓ+VÒ+\ÐZ\Ð!ð %×(Ñ(¨Ô0Ø(A×(EÑ(EÀfÓ(MÐ˜fÑ%ð ×ÑÐ3Ó4ÒqÐ8O×8SÑ8SÐTjÓ8kÒqÐoqð 	Ð%Ñ&Ð'=Ñ>ð 6GˆÐ%Ñ& zÑ2ð ˜,Ñ&Ø$;×$?Ñ$?ÀÓ$HÒ$iÈL×L\ÑL\Ð]dÐfhÓLiˆL˜Ñ!Ø ¨Ñ4Ø2I×2MÑ2MØ%ó3ò 3=à×!Ñ!Ð"7¸Ó<ð Ð.Ñ/ð '3×&6Ñ&6Ð7LÓ&MÐØÐ+Ø×#Ñ#Ð$=Ô>Ü:AÐBVÐXlÐnpÓ:q×:uÑ:uØ-ó;�Ð6Ñ7ð ×ÑÐ 2Ó3Ð;Ü3:Ð;OÐQcÐeiÓ3j�Ð/Ñ0ô %ŸL™L›NÐØÐ+Ü&Ð';¸\È4ÓPˆIØÐ$Ø$-Ð!ô ˜,×*Ñ*Ð+BÓCÄWÇ]Á]ÔSô ”�l×&Ñ& Ó7Ò>¸3Ó?ÀÔEàð 	ð
 *?ÔA[Ø×!Ñ!Ð"JÓKóB
ñ *
Ðð  ×6Ñ6×FÑFØ#×+Ñ+Ø1Ø%×-Ñ-Ø)×5Ñ5Ø%×-Ñ-ØØ 2Ø(Ü—\‘\“^Ø$×+Ñ+ð Gó 
÷ 	
ñ 	
ðy gúÜò 		Ü ×*Ñ*Ð+iÔjðÜ=ÐQb×QuÑQuÔv×vÑvØ$×7Ñ7ÐCØHLÐ%×8Ñ8¸ÑEùÜò Ü$×.Ñ.Øcöðýð		úð`
ùðV	
ús‡   ‚Q„O �OžO ¢C4QÄQÄJ3QÏ
QÏQÏO ÏQÏ2P-ÐPÐ P-Ð,QÐ-QÑQÑQÑQÑQÑQÑQÑQrU   c              ƒ   ó†
  K  — ddl m}m}m} t	        j
                  d«       	 t	        j
                  d|j                  dd «      |j                  dd «      «       t        |¬«      }|j                  di «      xs i }	t        |	«      }
t        |¬«      }|j                  d	«      r[|j                  d
«      sJt        j                  |t        |j                  d«      «      t        v¬«      ƒ d {  –—† }t        ||¬«       t        |¬«      }t!        t        d z  |j                  d
d «      «      }t!        t        d z  |j                  dd «      «      }t!        t        d z  |j                  dd «      «      }t!        t        d z  |j                  dd «      «      }|j                  dd «      }|j                  dd «      }|�|j                  dd «      n|j                  dd «      }t#        ||¬«      }t%        t'        |«      |�|j                  d«      nd t)        «       ¬«      }|�þ|j                  d	d «      }|j                  dd«      du rd}t	        j
                  d||«       t	        j
                  d||||
«       |j                  d«      }t+        ||||
|¬«      rmt-        |||||
||||||||||¬«      ƒ d {  –—†  t/        j0                   ||||
||||¬ «      «       |j2                  j5                  |||
||¬!«      ƒ d {  –—†  y |��/t7        |¬"«      ƒ d {  –—†  y t9        |«      rQt:        r!t=        |«      rt	        j
                  d#«       y t7        |¬"«      ƒ d {  –—†  t	        j
                  d$«       y t7        |¬"«      ƒ d {  –—†  |€K|j                  d%«      r|j                  d«      d&v r't	        j>                  d'|j                  dd(«      «       y |j                  d«      dus|j                  d«      du r6d|v r1|�
|d)   xs d*}nd+}|j                  d%«      }tA        d,|› d-|› d.�«      ‚y y y 7 �ŒN7 �Œ†7 �Œ?7 �Œ*7 Œå7 Œ½# t@        $ rê}d/|› d0tC        jD                  «       › �}|j                  d%d1«      }t        |¬«      }|j                  di «      j                  d2i «      }|j                  di «      j                  d3i «      }|j                  dd1«      }|d4|› d5|› d6|› d7|› d8|› d9�z  }t/        j0                  |jG                  ||¬:«      «       tI        d;t        |«      |¬<«       Y d }~y d }~ww xY w­w)=Nr   )Úincrement_spend_countersr9   Úupdate_cachez!INSIDE _PROXY_track_cost_callbackz3kwargs stream: %s + complete streaming response: %sÚstreamÚcomplete_streaming_response)r*   rC   r:   Úuser_api_key_user_idÚ	call_type)r@   Úresolve_missing_key_identity)r*   r@   r?   Úuser_api_key_team_idÚuser_api_key_org_idÚuser_api_key_aliasÚuser_api_end_user_max_budgetrJ   rN   )Ú	sl_objectr@   Úmodel_id)Ú
attributedÚserved_model_idÚrouterÚ	cache_hitFTrO   z+Cache Hit: response_cost %s, for user_id %sz7user_api_key %s, user_id %s, team_id %s, end_user_id %s©r:   rR   rT   rS   r„   )r9   r   r:   rR   rS   rT   rV   r*   rU   r,   r-   rN   r6   Úrequest_tagsÚmodel_access_groups)rQ   rR   rS   rN   rT   Úparent_otel_spanrD   )rQ   Ú	key_aliasrS   rN   Ú
max_budgetr5   z‰Cost tracking deferred for in-progress background interaction; the budget reservation stays open until the poll task logs the final usagezeReleased the budget reservation for an interaction create with no usage that no poll task will settlerF   )Ú_aresponses_websocketÚ
_arealtimezECost tracking - skipping, no standard_logging_object for call_type=%sÚunknownÚ response_cost_failure_debug_infozCresponse_cost_failure_debug_info is None in standard_logging_objectz!standard_logging_object not foundzCost tracking failed for model=z.
Debug info - zG
Add custom pricing - https://docs.litellm.ai/docs/proxy/custom_pricingz"Error in tracking cost callback - z
 Traceback:rG   rA   r@   z-
 Args to _PROXY_track_cost_callback
 model: z
 chosen_metadata: z
 litellm_metadata: z
 old_metadata: z
 call_type: ú
)Úerror_messageÚfailing_modelz$Error in tracking cost callback - %s)Úexc)%r_   r   r9   r€   r	   Údebugrf   r   r    r   r%   re   Ústrr#   Ú_write_spend_metadata_to_kwargsÚ%_get_budget_reservation_from_metadatar   Ú#_get_request_tags_for_cost_trackingr   r   r   Ú_should_track_cost_callbackÚ#_update_database_and_spend_countersÚasyncioÚcreate_taskÚslack_alerting_instanceÚcustomer_spend_alertrW   Ú!_is_unbilled_interaction_responser
   Ú$_is_unbilled_in_progress_interactionÚwarningrX   r=   Ú
format_excÚfailed_tracking_alertr   )r)   r*   rU   r,   r-   r   r9   r€   r“   rC   rS   r@   r6   rR   rT   rV   r”   Úend_user_max_budgetrŠ   rN   rD   r’   r:   r„   Ú cost_tracking_failure_debug_inforF   ÚeÚ	error_msgrA   Úold_metadatas                                 r.   r(   z)_ProxyDBLogger._PROXY_track_cost_callbackÜ   sî  è ø€ ÷	
ñ 	
ô 	×"Ñ"Ð#FÔGð_	SÜ ×&Ñ&ØEØ—
‘
˜8 TÓ*Ø—
‘
Ð8¸$Ó?ôô
 'HÈvÔ&VÐØ$*§J¡JÐ/?ÀÓ$DÒ$JÈˆNÜ!BÀ>Ó!RˆKÜ7¸vÔFˆHð �|‰|˜NÔ+°H·L±LÐAWÔ4XÜ!/×!VÑ!VØ%Ü14°V·Z±ZÀÓ5LÓ1MÔUrÐ1rð "Wó "÷ �ô 0°vÈÕQÜ(MÐW_Ô(`ÐÜ!¤#¨¡*¨h¯l©lÐ;QÐSWÓ.XÓYˆGÜ!¤#¨¡*¨h¯l©lÐ;QÐSWÓ.XÓYˆGÜ ¤ t¡¨X¯\©\Ð:OÐQUÓ-VÓWˆFÜ#¤C¨$¡J°·±Ð=QÐSWÓ0XÓYˆIØ)1¯©Ð6TÐVZÓ)[ÐØ>D¿j¹jÐIbÐdhÓ>iˆIà8AÐ8M�	—‘˜o¨tÔ4ÐSY×S]ÑS]Ð^mÐosÓStð ô >Ø#Ø!ôˆDô *GÜ:¸6ÓBØ=FÐ=R 	§¡¨jÔ 9ÐX\Ü%Ó'ô*Ðð Ð(Ø&.§l¡l°>À4Ó&H�Ø—:‘:˜k¨5Ó1°TÑ9Ø$'�MÜ(×.Ñ.Ð/\Ð^kÐmtÔuä$×*Ñ*ØMØ ØØØôð )/¯
©
°;Ó(?�	Ü.Ø!-Ø#Ø#Ø +Ø'õô >Ø*;Ø1IØ%1Ø 'Ø$/Ø 'Ø%Ø%Ø,?Ø#-Ø!)Ø&3Ø+=Ø%)Ø,?ô÷ ð ô( ×'Ñ'Ù$Ø".Ø$+Ø(3Ø*7Ø$+Ø-=Ø!%ôô
ð ,×CÑC×XÑXØ*Ø"+Ø$/Ø&3Ø#6ð Yó ÷ ñ ð (Ñ3Ü5ÐI[Ô\×\Ñ\ä4Ð5HÔIÝBÔGkØ+ôHô -×2Ñ2ðiôð Ü5ÐI[Ô\×\Ð\Ü(×.Ñ.ð8ôð Ü1ÐEWÔX×XÐXð
 Ð$ØŸ
™
 7Ô+¨v¯z©z¸+Ó/FÐJqÑ/qä(×0Ñ0Ø_ØŸ
™
 ;°	Ó:ôð Ø—:‘:˜hÓ'¨tÑ3Ø—J‘J˜xÓ(¨DÑ0Ð5RÐV\Ñ5\à Ð,à%Ð&HÑIò eØdñ 9ð
 <_Ð8Ø"ŸJ™J wÓ/�EÜ#Ø9¸%¸Ð@PÐQqÐPrð  s{ð  |óð ð 6]Ð0ðA 4ðmùð^ùð@ùð ]ùð ]øð Yùô6 ò 	SØ<¸Q¸C¸}ÌY×MaÑMaÓMcÐLdÐeˆIØ—J‘J˜w¨Ó+ˆEÜ7¸vÔFˆHØ&,§j¡jÐ1AÀ2Ó&F×&JÑ&JÐK]Ð_aÓ&bÐØ"(§*¡*Ð-=¸rÓ"B×"FÑ"FÀzÐSUÓ"VˆLØŸ
™
 ;°Ó3ˆIØÐJÈ5È'ÐQeÐfnÐeoð  pEð  FVð  EWð  Whð  iuð  hvð  vDð  ENð  DOð  OQð  Rñ  RˆIÜ×ÑØ!×7Ñ7Ø"+Ø"'ð 8ó ôô ÐBÄCÈÃFÐPQ×RÒRûð	SüsÜ   ‚ U£C
Q Ã-P;Ã.G
Q Ê8P>Ê9A	Q ÌQÌQ ÌUÌQ ÌQÌQ ÌUÌ 1Q ÍUÍQ Í!QÍ"Q Í;UÍ<Q ÎQ	ÎAQ ÏUÏAQ Ð8UÐ;Q Ð>Q ÑQ ÑQ ÑQ Ñ	Q Ñ	T>ÑC T9Ô4UÔ9T>Ô>Ur@   r…   Úreturnc              ƒ   óò  K  — | j                  d«      }|s| S ddlm}m}m} |r©| j                  d«      €˜	 t        ||||¬«      ƒ d{  –—† }| j                  d«      €|j                  | d<   | j                  d«      €|j                  | d<   | j                  d«      €|j                  | d<   | j                  d	«      €|j                  | d	<   | j                  d«      }|rF| j                  d«      €5	 t        ||||¬«      ƒ d{  –—† }|j                  �|j                  | d<   | S | S 7 Œß# t        $ r t        j                  d
|«       Y Œ~w xY w7 ŒJ# t        $ r t        j                  d|«       Y | S w xY w­w)aÄ  
        Enriches failure spend log metadata by looking up the key object (and team object)
        from cache/DB when key fields are missing.

        This handles two scenarios:
        1. Auth errors (401): UserAPIKeyAuth is created with only api_key set, all other
           fields are null. We look up the full key object to fill in alias, user_id,
           team_id, etc.
        2. Post-auth failures (provider errors, rate limits): key fields are populated
           but team_alias is missing because LiteLLM_VerificationTokenView SQL view
           doesn't include it. We look up the team object to fill in team_alias.

        Scenario 1 reads the key's identity as it stands right now, so it is only correct
        for a log emitted within the request it describes. Callers that log after a delay,
        against an identity captured earlier, pass resolve_missing_key_identity=False and
        keep their own user_id, team_id and org_id.
        r:   r   )Úprisma_clientr9   Úuser_api_key_cacherˆ   N)Úhashed_tokenrµ   r¶   r9   rƒ   r†   r‡   z>Failed to enrich failure metadata with key info for api_key=%sÚuser_api_key_team_alias)rT   rµ   r¶   r9   z@Failed to enrich failure metadata with team_alias for team_id=%s)rf   r_   rµ   r9   r¶   r   r”   rR   rT   rV   rX   r	   rž   r   Ú
team_alias)	r@   r…   Úapi_key_hashrµ   r9   r¶   Úkey_objrT   Úteam_objs	            r.   re   z5_ProxyDBLogger._enrich_failure_metadata_with_key_infoŒ  s¤  è ø€ ð& 'Ÿl™l¨>Ó:ˆÙØˆO÷	
ñ 	
ñ (¨H¯L©LÐ9MÓ,NÐ,VðÜ'5Ø!-Ø"/Ø'9Ø&7ô	(÷ "�ð —<‘<Ð 4Ó5Ð=Ø5<×5FÑ5F�HÐ1Ñ2Ø—<‘<Ð 6Ó7Ð?Ø7>·±�HÐ3Ñ4Ø—<‘<Ð 6Ó7Ð?Ø7>·±�HÐ3Ñ4Ø—<‘<Ð 5Ó6Ð>Ø6=·n±n�HÐ2Ñ3ð "Ÿ™Ð&<Ó=ˆÙ�x—|‘|Ð$=Ó>ÐFðÜ(7Ø#Ø"/Ø'9Ø&7ô	)÷ #�ð ×&Ñ&Ð2Ø:B×:MÑ:M�HÐ6Ñ7ð ˆˆxˆðK"ùô ò Ü$×*Ñ*ØTØ öðúð#ùô ò Ü$×*Ñ*ØVØõð ˆðüsq   ‚3E7¶D* ÁD(Á	BD* Ã$E7Ã2E ÄEÄE Ä$E7Ä(D* Ä*EÅ	E7ÅEÅE7ÅE ÅE4Å0E7Å3E4Å4E7c                  ó8   — ddl m}  | j                  d«      du ryy)zõ
        Returns True if errors should be tracked in the database

        By default, errors are tracked in the database

        If users want to disable error tracking, they can set the disable_error_logs flag in the general_settings
        r   ©Úgeneral_settingsÚdisable_error_logsTFN)r_   r¿   rf   r¾   s    r.   r\   z)_ProxyDBLogger._should_track_errors_in_dbÓ  s"   € õ 	@à×ÑÐ 4Ó5¸Ñ=ØØó    r'   ©NN)T)Ú__name__Ú
__module__Ú__qualname__r/   r`   rX   r   rŸ   r}   r   rk   ÚModelResponser   r(   ÚstaticmethodÚboolre   r\   © rÁ   r.   r%   r%   G   sÄ   „ òZð %)ñO
àðO
ð &ðO
ð *ð	O
ð
 ˜T‘zóO
ðb ð
 ØñmSð %×2Ñ2°SÑ8¸4Ñ?òmSó ðmSð^ ñD¸tð DÐcgð DÐswò Dó ðDðL ñó ñrÁ   r%   r*   r@   r³   c                 ód  — |j                  «       D ��ci c]"  \  }}|j                  d«      s|dk(  sŒ|€Œ ||“Œ$ }}}|sy | j                  di «      }dD ]S  }|j                  |«      }t	        |t
        «      sŒ%|j                  «       D ]  \  }}	|j                  |«      �Œ|	||<   Œ ŒU y c c}}w )Nr:   rD   rC   )rA   r@   )ÚitemsÚ
startswithÚ
setdefaultrf   rh   r`   )
r*   r@   ÚkÚvÚpatchrC   Úbucket_nameÚbucketÚkeyÚvalues
             r.   r    r    ã  s¶   € Ø&Ÿn™nÓ.×r‘d�a˜°1·<±<ÀÔ3OÐSTÐX^ÓS^ÐdeÑdqˆQ�‰TÐr€EÑrÙØà"×-Ñ-Ð.>ÀÓC€NØ7ò (ˆØ×#Ñ# KÓ0ˆÜ�fœdÕ#Ø#Ÿk™k›mò (‘
��UØ—:‘:˜c“?Ñ*Ø"'�F˜3’Kñ(ñ(ùó ss   ”B,³B,¶B,rU   c                 ód   — ddl m} ddlm} t	        | |«      sy| j
                  d u xr  || «      S )Nr   )Úmissing_usage_is_expected©ÚInteractionsAPIResponseF)Ú,litellm.interactions.background_cost_pollingrÖ   Úlitellm.types.interactionsrØ   rh   Úusage)rU   rÖ   rØ   s      r.   r©   r©   ñ  s4   € ÝVÝBäÐ)Ð+BÔCØØ×$Ñ$¨Ð,Ò_Ñ1JÐK^Ó1_Ð_rÁ   c                 ód   — ddl m} ddlm} t	        | |«      sy| j
                  d u xr  || «      S )Nr   )Ú"is_pollable_background_interactionr×   F)rÙ   rÝ   rÚ   rØ   rh   rÛ   )rU   rÝ   rØ   s      r.   rª   rª   ú  s4   € Ý_ÝBäÐ)Ð+BÔCØØ×$Ñ$¨Ð,ÒhÑ1SÐTgÓ1hÐhrÁ   r:   rR   rT   rS   r„   c                 óR   — t        j                  «       du ry| €|€|€|�y|t        v S )aù  
    Determine if the cost callback should be tracked based on the kwargs

    Pass-through endpoints can be configured with ``auth=false``, which leaves
    the request with no key/user/team/end-user to attribute spend to. Those
    requests still forward real provider traffic that operators expect to see
    in request/usage logs, so they are tracked even when unauthenticated.
    The same reasoning applies to a completed managed batch's cost event
    (see _UNATTRIBUTED_TRACKABLE_CALL_TYPES).
    TF)r   Údisable_spend_updatesr"   r�   s        r.   r£   r£     s=   € ô& ×-Ñ-Ó/°4Ñ7ØàÐ 7Ð#6¸'Ð:MÐQ\ÐQhØØÔ:Ð:Ð:rÁ   c                 óô   — | j                  d«      }t        |t        «      r|S | j                  d«      }|€y t        |t        «      r%|j                  d«      }t        |t        «      r|S d S t        |dd «      S )NÚuser_api_key_budget_reservationÚuser_api_key_authr6   )rf   rh   r`   ri   )r@   Úmetadata_budget_reservationÚuser_api_key_auth_objr6   s       r.   r¡   r¡     s€   € Ø)1¯©Ð6WÓ)XÐÜÐ-¬tÔ4Ø*Ð*à#+§<¡<Ð0CÓ#DÐØÐ$ØÜÐ'¬Ô.Ø$9×$=Ñ$=Ð>RÓ$SÐÜ%/Ð0BÄDÔ%IÐ!ÐSÈtÐSÜÐ(Ð*>ÀÓEÐErÁ   rŠ   c                 ó˜   — | �$| j                  dd «      }t        |t        «      r|S |j                  dd «      }t        |t        «      r|S y )Nr‘   rD   )rf   rh   Úlist)rŠ   r@   r‘   Úmetadata_tagss       r.   r¢   r¢   ,  sM   € ð ÐØ'Ÿm™m¨N¸DÓAˆÜ�l¤DÔ)ØÐà#Ÿ<™<¨°Ó5€MÜ�-¤Ô&ØÐàrÁ   r9   r!   r   rV   r,   r-   rN   r6   r‘   r’   c              ƒ   ój  K  — 	 | j                   j                  ||||||||	|
|¬«
      ƒ d {  –—† }	  |||||||||||	|¬«      ƒ d {  –—†  y 7 Œ!# t        $ rz |�v	 t        |¬«      ƒ d {  –—†7   ‚ # t        $ rS t	        j
                  d«       	 t        |¬«      ƒ d {  –—†7   Y ‚ # t        $ r t	        j
                  d«       Y Y ‚ w xY ww xY w‚ w xY w7 Œ�# t        $ rO |�K	 t        |¬«      ƒ d {  –—†7   n$# t        $ r t	        j
                  d«       Y nw xY wd|d<   ‚ # d|d<   w xY w‚ w xY w­w)	NrP   r5   zAFailed to release budget reservation after database update failedzEFailed to invalidate budget reservation counters after release failed)rQ   rT   rR   rN   rV   r6   rS   rD   Ú
request_idÚrequest_started_atr’   zRFailed to invalidate budget reservation counters after spend counter update failedTr7   )ro   rp   rX   rW   r	   rY   rZ   )r9   r   r:   rR   rS   rT   rV   r*   rU   r,   r-   rN   r6   r‘   r’   Úspend_log_request_ids                   r.   r¤   r¤   <  sŽ  è ø€ ð"Ø%6×%MÑ%M×%]Ñ%]ØØ'ØØ#ØØØ 3Ø!ØØð &^ó &
÷  
Ðð4Ù&ØØØØ'ØØ1Ø#ØØ+Ø)Ø 3ô
÷ 	
ñ 	
ð7 
ùô ò ØÐ)ð	Ü1ÐEWÔX×XÑXð 	øô ò Ü$×.Ñ.Ð/rÔsðÜAÐUgÔh×hÒhð
 	øô	 !ò Ü(×2Ñ2Ø_öð 	ð	úð	úð 	ðúð	
ùô ò 
ØÐ)ð7Ü=ÐQcÔd×dÒdøÜò Ü$×.Ñ.Øhöðúð
 37Ð" ;Ñ/Øøð 37Ð" ;Ò/úØð
üsë   ‚D3„(A ¬A­A ²C ÁCÁ	C ÁD3ÁA ÁCÁA2Á+A.Á,A2Á1CÁ2CÂB(Â B#Â!B(Â&CÂ(C
ÃCÃCÃ	C
Ã
CÃCÃD3ÃC ÃD0Ã$C:Ã3C6Ã4C:Ã9D$Ã:DÄD$ÄDÄD$ÄD0Ä$D+Ä+D0Ä0D3c              ƒ   óD   K  — | €y ddl m}  || ¬«      ƒ d {  –—†  y 7 Œ­w)Nr   )Úrelease_budget_reservationr5   )Ú/litellm.proxy.spend_tracking.budget_reservationrí   )r6   rí   s     r.   rW   rW   ƒ  s+   è ø€ ØÐ!Øõñ %Ø-ô÷ ò úó   ‚ ˜™ c              ƒ   óD   K  — | €y ddl m}  || ¬«      ƒ d {  –—†  y 7 Œ­w)Nr   )Ú&invalidate_budget_reservation_countersr5   )rî   rñ   )r6   rñ   s     r.   rZ   rZ   �  s-   è ø€ ð Ð!Øõñ 1Ø-ô÷ ò úrï   r'   rÂ   )Nr¥   r=   Úcollections.abcr   r   Útypingr   r   r   r   rk   Úlitellm._loggingr	   Úlitellm.constantsr
   Ú"litellm.integrations.custom_loggerr   Ú'litellm.litellm_core_utils.core_helpersr   r   Ú*litellm.litellm_core_utils.litellm_loggingr   Ú7litellm.litellm_core_utils.llm_cost_calc.guardrail_costr   Úlitellm.proxy._typesr   Úlitellm.proxy.auth.auth_checksr   r   r   Úlitellm.proxy.auth.route_checksr   Ú'litellm.proxy.db.db_spend_update_writerr   r   Ú$litellm.proxy.litellm_pre_call_utilsr   Ú3litellm.proxy.spend_tracking.spend_log_error_loggerr   r   Ú1litellm.proxy.spend_tracking.spend_tracking_utilsr   r   Úlitellm.proxy.utilsr   Úlitellm.types.utilsr   r   r   Úlitellm.utilsr    r!   Ú	frozensetÚpass_throughrÔ   Úllm_passthrough_routeÚallm_passthrough_routeÚaretrieve_batchr"   rŸ   Ú__annotations__r#   r%   r`   r    ÚobjectrÈ   r©   rª   r£   r¡   ræ   r¢   rÆ   rn   r¤   rW   rZ   rÉ   rÁ   r.   ú<module>r     s'  ðÜ Û Ý $Ý ß 2Ó 2ã Ý 1Ý IÝ ;÷õ SÝ ^Ý /÷ñ õ
 8÷õ J÷÷õ 1÷ñ õ
 <áÝ0á<Eà×Ñ×$Ñ$Ø×'Ñ'×-Ñ-Ø×(Ñ(×.Ñ.ð
 	×!Ñ!×'Ñ'ð	ó=Ð " E¨)°C©.Ñ$9ó ñ 8Aà×!Ñ!×'Ñ'ÙˆI×%Ñ%Ó&ðó8Ð ˜u Y¨s¡^Ñ4ó ôY�\ô Yðx(¨Dð (¸Dð (ÀTó (ð`¸6ð `Àdó `ði¸fð iÈó ið !ñ;Ø˜‘*ð;à�4‰Zð;ð �4‰Zð;ð �t‘ð	;ð
 �T‰zð;ð 
ó;ð6F°Dð F¸TÀD¹[ó FðØ%¨Ñ,ðàðð 
ˆ#�Y�Ñóð< &*Ø04ñDØ%ðDà!ðDð ˜‘*ðDð �4‰Zð	Dð
 �t‘ðDð �4‰ZðDð �$‰JðDð ðDð !×.Ñ.°Ñ4°tÑ;ðDð ðDð ðDð ðDð ˜t™ðDð �s‘)˜dÑ"ðDð " #™¨Ñ-ðDð  
ó!DðN
¸$À¹+ð 
È$ó 
ðØ˜t™ðà	ôrÁ   