
    ^h                     6   S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJrJrJ	r	J
r
JrJr  S SKJr  S SKrS SKrS SKrS SKrS SKJrJr  S SKJr  S SKJr  S SKJr  S S	KJrJr  S S
KJ r J!r!J"r"J#r#  S SK$J%r%  S SK&7  SSK'7  SSK(J)r)J*r*  SSK+J,r,J-r-   " S S\5      r.g)    N)	timedelta)AnyDictListLiteralOptionalUnion)APIError)verbose_loggerverbose_proxy_logger)	DualCache)CustomBatchLogger)_add_key_name_and_team_to_alert)get_async_httpx_clienthttpxSpecialProvider)	AlertTypeCallInfoVirtualKeyEventWebhookEvent)Router)*      )send_to_webhooksquash_payloads)_add_langfuse_trace_id_to_alert process_slack_alerting_variablesc                     ^  \ rS rSrSrSS/ \S0 S4S\\   S\\   S\\	   S\	\
   S\\\
\\	\   \4   4      S	\\   4U 4S
 jjjr      SXS\\	   S\\   S\\	\
      S\\\
\\	\   \4   4      S\\   S\\   4S jjrS rS rS rS rSYS jrS rS\S\4S jrS\4S jr    SZS\\R8                     S\\R8                     S\S   S\\   4S jjrS\S\4S  jr S\S!   S"\!4S# jr"S$\\   S%\\   S&\\   S'\\   S(\\   4
S) jr#S*\	\   S\4S+ jr$S,\S-   S.\S/   S0\S1\S2\\   S3\%S\4S4 jr&S5\'S6\SS4S7 jr(S5\'S6\SS4S8 jr)S9\S:\S;\*4S< jr+S9\4S= jr,S>\-S\4S? jr.  S[S@\SA\\   SB\\   4SC jjr/S>\-S\4SD jr0S>\-S,\S\4SE jr1 SYSF\SG\SH   S,\
SI\S"\\-   4
SJ jjr2SK r3SL r4SM r5S\4SN jr6SYS\\*   4SO jjr7S\SP\4SQ jjr8SR r9SS r:ST\;S,\
SU\4SV jr<SWr=U =r>$ )]SlackAlerting$   z 
Class for sending Slack Alerts
Ninternal_usage_cachealerting_thresholdalertingalert_typesalert_to_webhook_urldefault_webhook_urlc                 b  > Uc  SnX l         X0l        X@l        U=(       d
    [        5       U l        [        [        R                  S9U l        [        US9U l
        SU l        [        S0 UD6U l        Xpl        [        R                   " 5       U l        [$        T	U ]L  " S0 UDSU R"                  0D6  g )Ni,  )llm_providerr%   F
flush_lock )r"   r#   r$   r   r!   r   r   LoggingCallbackasync_http_handlerr   r%   
is_runningSlackAlertingArgsalerting_argsr&   asyncioLockr*   super__init__)
selfr!   r"   r#   r$   r%   r0   r&   kwargs	__class__s
            k/home/james-whalen/.local/lib/python3.13/site-packages/litellm/integrations/SlackAlerting/slack_alerting.pyr4   SlackAlerting.__init__*   s     %!$"4 &$8$GIK!"8-==#
 %E!5%
!  .??#6 !,,.>6>doo>    r0   
llm_routerc                 T   Ub*  Xl         [        R                  " U R                  5       5        Ub  X l        Ub  X0l        Ub  [        S0 UD6U l        UbI  U R                  c  [        US9U l        O-[        US9=(       d    0 nU R                  R                  U5        Ub  X`l        g g )Nr)   r+   )r#   r1   create_taskperiodic_flushr"   r$   r/   r0   r%   r   updater;   )r5   r#   r"   r$   r%   r0   r;   _new_valuess           r8   update_valuesSlackAlerting.update_valuesK   s     $M 3 3 56)&8#"*$!2!C]!CD+((0,L)=-)
 5-A  	  ))00=!(O "r:   c                    #    g 7fNr+   r5   s    r8   deployment_in_cooldown$SlackAlerting.deployment_in_cooldownn           c                    #    g 7frD   r+   rE   s    r8    deployment_removed_from_cooldown.SlackAlerting.deployment_removed_from_cooldownq   rH   rI   c                      [        [        5      $ rD   )listr   rE   s    r8   _all_possible_alert_types'SlackAlerting._all_possible_alert_typest   s     Ir:   c                 6    X2-
  nUR                  5       nUR                  S0 5      nUR                  SS5      n[        R                  " XvS9nUR                  SS 5      n	U	c  UR                  SS 5      n	[	        U	5      S S n
XWX4$ ! [
         a  nUeS nAff = f)Nlitellm_paramsmodel rS   optional_paramsmessagesinputd   )total_secondsgetlitellmget_api_basestr	Exception)r5   r6   
start_timeend_timetime_differencetime_difference_floatrR   rS   api_baserW   	_messageses               r8   )_response_taking_too_long_callback_helper7SlackAlerting._response_taking_too_long_callback_helperz   s    	&3O$3$A$A$C!#ZZ(8"=NJJw+E++%XHzz*d3H!::gt4 Hds+I(DD 	G	s   BB 
BBBc           	      0   Uc  g SU;   a|   SnUS   n[        U5      S:X  a  g S n [        UR                  5       S S9n[        U5      nUc  g UR                  5        H  u  pVUSU S[        US5       S	3-  nM     S
U-   S
-   nU$ g ! [         a     NJf = f)N_latency_per_deploymentrT   r   c                     U S   $ )Nr   r+   )xs    r8   <lambda>BSlackAlerting._get_deployment_latencies_to_alert.<locals>.<lambda>   s    1r:   key
: r   sz```)lensorteditemsdictr_   round)r5   metadata_message_to_send_deployment_latencies_deployment_latency_maprd   latencys          r8   "_get_deployment_latencies_to_alert0SlackAlerting._get_deployment_latencies_to_alert   s    $0
  "$,-F$G!()Q.6:#(.)//1~)% +//D*E' '.%<%B%B%D! b
"U715E4Fa$HH  &E$'77%?##9 1&  s   $B 
BBc                    #    U R                   b  U R                  c  g U R                  UUUS9u  pVpx[        R                  (       d  [        R
                  (       a  SnSU SU SU S3n	S[        US5       S	U R                   S
3n
0 nXPR                  :  as  UbE  SU;   a?  SUS   ;   a6  US   S   n[        XS9n	U R                  US9nUb  U	SU 3-  n	SU;   a  US   nU R                  X-   S[        R                  US9I S h  vN   g g  N7f)N)r6   r`   ra   >Message not logged. litellm.redact_messages_in_exceptions=True
Request Model: `z`
API Base: ``
Messages: ``z`Responses are slow - r   z&s response time > Alerting threshold: zs`rR   ry   request_infory   ry   z 
Available Deployment Latencies
alerting_metadataLowmessagelevel
alert_typer   )r#   r$   rg   r\   turn_off_message_loggingredact_messages_in_exceptionsrx   r"   r   r~   
send_alertr   llm_too_slow)r5   r6   completion_responser`   ra   rc   rS   rd   rW   r   slow_messager   	_metadatar|   s                 r8   !response_taking_too_long_callback/SlackAlerting.response_taking_too_long_callback   s     == D$4$4$< ::%! ;  	9h ++w/T/TWH+E7.
.YaXbbcd/6KA0N/OOuvz  wN  wN  vO  OQ  R"$ #:#:: "$.&)9"::"()9"::"F	>!-  +/*Q*Q& +R +' +6 <=T<UVL ')3(12E(F%//$3$11"3	 "   - ;,s   DDDDdeployment_metricsreturnc                   #    Sn UR                   (       aZ  U R                  R                  SR                  UR                  [
        R                  R                  5      SSS9I Sh  vN   US-  nUR                  bd  U R                  R                  SR                  UR                  [
        R                  R                  5      UR                  SS9I Sh  vN   US-  nU$  N| N! [         a     gf = f7f)a8  
Store the perf by deployment in cache
- Number of failed requests per deployment
- Latency / output tokens per deployment

'deployment_id:daily_metrics:failed_requests'
'deployment_id:daily_metrics:latency_per_output_token'

Returns
    int - count of metrics set (1 - if just latency, 2 - if failed + latency)
r   {}:{}r   N)rp   valueparent_otel_span)failed_requestr!   async_increment_cacheformatidSlackAlertingCacheKeysfailed_requests_keyr   latency_per_output_tokenlatency_keyr_   )r5   r   
return_vals      r8   async_update_daily_reports(SlackAlerting.async_update_daily_reports   s     
	!00//EE*--.BBHH %) F    a
 "::F//EE*--/E/Q/Q/W/W -EE%) F    a
/  		sN   C8A!C( 'C$(A0C( C&
C( #C8$C( &C( (
C52C84C55C8c                 $  ^^#    UR                  5       nU Vs/ s H-  nSR                  U[        R                  R                  5      PM/     nnU Vs/ s H-  nSR                  U[        R
                  R                  5      PM/     nnXE-   nU R                  R                  US9I Sh  vN nUc  gSnU H  n	U	c  M  U	S:  d  M  Sn  O   U(       a  gUS[        U5       n
U[        U5      S nSnU
 Vs/ s H
  nUb  UOUPM     snm[        [        [        T5      5      U4S jSS9SS	 nU Vs/ s H  nTU   S:  d  M  UPM     nnSnU Vs/ s H
  nUb  UOUPM     snm[        [        [        T5      5      U4S
 jSS9SS	 nU Vs/ s H  nTU   S:  d  M  UPM     nnS[        R                  " 5        S3nUS-  nU(       d  US-  n[        [        U5      5       H  nXNU      R                  S5      S   nUR                  U5      n[        U[        5      (       a  US   R!                  SS5      nO  g["        R$                  " UUb  US   O0 S9nUc  SnTUU      nUSUS-    SU SU SU S3	-  nM     US-  nU(       d  US-  n[        [        U5      5       H  nUUU      R                  S5      S   nUR                  U5      nUb  US   R!                  SS5      nOSn["        R$                  " UUb  US   O0 S9n['        TUU      S5      nUSUS-    SU SU SU S3	-  nM     U Vs/ s H  nUS4PM	     nnU Vs/ s H  nUS4PM	     nnUU-   nU R                  R)                  US9I Sh  vN   US [        R                  " 5       U R*                  R,                  -    S!3-  nU R/                  US"[0        R2                  0 S#9I Sh  vN   gs  snf s  snf  GNBs  snf s  snf s  snf s  snf s  snf s  snf  N N27f)$aM  
Send a daily report on:
- Top 5 deployments with most failed requests
- Top 5 slowest deployments (normalized by latency/output tokens)

Get the value from redis cache (if available) or in-memory and send it

Cleanup:
- reset values in cache -> prevent memory leak

Returns:
    True -> if successfuly sent
    False -> if not sent
r   )keysNFTr   c                    > TU    $ rD   r+   )ireplaced_failed_valuess    r8   rm   2SlackAlerting.send_daily_reports.<locals>.<lambda>S  s    03r:   )rp   reverse   c                    > TU    $ rD   r+   )r   replaced_slowest_valuess    r8   rm   r   e  s    1!4r:   z	

Time: `u(   `s
Here are today's key metrics 📈: 

u7   

*❗️ Top Deployments with Most Failed Requests:*

z	None
:rR   rS   rT   rU   	r   z. Deployment: `z`, Failed Requests: `z`,  API Base: ``
u#   

*😅 Top Slowest Deployments:*

   z`, Latency per output token: `zs/token`,  API Base: ``

)
cache_listz

Next Run is at: `z`sr   r   )get_model_idsr   r   r   r   r   r!   async_batch_get_cachert   ru   rangetimesplitget_model_info
isinstancerw   r[   r\   r]   rx   async_set_cache_pipeliner0   daily_report_frequencyr   r   daily_reports)r5   routeridsr   failed_request_keyslatency_keyscombined_metrics_keyscombined_metrics_valuesall_nonevalfailed_request_valueslatency_valuesplaceholder_valuer   top_5_failedindextop_5_slowestr   r   rp   _deploymentdeployment_namerd   latency_cache_keysfailed_request_cache_keyscombined_metrics_cache_keysr   r   s                             @@r8   send_daily_reports SlackAlerting.send_daily_reports  s9      ""$
 
 NN25IIOOP 	 

 TW
SVRGNN25AAGGHSV 	 
 !4 B(,(A(A(W(W& )X )
 #
 #**C37  +
  7&c%&!
 15H1I1KL  /"
. &E,==."
 #,-.3
 1	  ,
+e/Ee/Lq/PE| 	 
  (#
' &E,=='#
 #-./4
 1	  -
,e0G0NQR0RE} 	 

  		},WXPPz!Gs<()A%1o6<<SA!DC //4K+t,,"-.>"?"C"CGR"P++%5@5LK 01RTH *<?;EAaC5/@@UV[U\\kltkuuxyyG# *& 	<<z!Gs=)*A}Q/066s;A>C //4K&"-.>"?"C"CGR"P"$++%5@5LK 01RTH 1-2BCQGEAaC5/@@^_d^ee{  }E  |F  FK  L  LG +" 3??,3sAh,?9L$M9L#c1X9L!$M&8;T&T#''@@2 A 
 	
 	
 	*499;9K9K9b9b+b*cceff oo .. 	  
 	
 	
 C

#
0"

#

b @$M	
	
s   P4O!P4O&"P)O+*P>P0P6O.+P2O3O3	PO8"+PO=O=$FP;P	PP#P PAPPP.PPr`   ra   type)hanging_requestslow_responserequest_datac                   #    U R                   b  U R                  c  g SnUb  UR                  SS5      nUR                  SS 5      nUc  UR                  SS 5      n [        U5      nUS S n[
        R                  (       d  [
        R                  (       a  SnSU SU S	3nOSnUS
:X  Ga  [        R                  " U R                  5      I S h  vN   0 nUGb  UR                  SS5      S:w  Ga  UR                  SS5      S:w  Ga  UR                  SS5      n	U R                  R                  SR                  U	5      SS9I S h  vN n
U
b  U
S:X  d  U
S:X  a  g UR                  SS 5      bN  [        US   [        5      (       a6  [
        R                   " UUS   R                  S0 5      S9nUc  SnUSU 3-  nOdUR                  SS 5      bQ  [        US   [        5      (       a9  US   nUR                  SS5      n[#        X|S9nUc  SnSU;   a  US   nUSU S	3-  nSU R                   S3nS[
        R$                  ;   a(  ['        US9I S h  vN nUb  USR                  U5      -  nU R)                  UR                  S0 5      S 9nUb  US!U 3-  nU R+                  X-   S"[,        R.                  US#9I S h  vN   g g g g g ! [         a    Sn GNgf = f GN	 GN N N$7f)$NrT   rS   rW   rX   rY   r   r   r   r   r   litellm_statussuccessfaillitellm_call_idzrequest_status:{}T)rp   
local_only
deploymentrR   rU   z
API Base: ry   rd   r   r   z
API Base: `z`Requests are hanging - zs+ request time`langfuse)r   u   
🪢 Langfuse Trace: {}r   z
Deployment Latencies
Mediumr   )r#   r$   r[   r^   r_   r\   r   r   r1   sleepr"   r!   async_get_cacher   r   rw   r]   r   success_callbackr   r~   r   r   llm_requests_hanging)r5   r`   ra   r   r   rS   rW   r   r   r   status	_api_baser   alerting_messagelangfuse_urlr|   s                   r8   response_taking_too_long&SlackAlerting.response_taking_too_long  s     == D$4$4$<# $$Wb1E#''
D9H'++GT:x=#DS>
 0088 U  0wnXJaPLL$$--''   ')( $$%5r:iG $$%5r:fD #/"2"23Db"I.2.G.G.W.W+22?CPT /X / ) %6Y+>&FBR##L$7C
 .I I !( 4 4#(4\(B(F(F,b)!I !($&	 l9+$>>L!%%j$7C
 ,dI I
 '3:&>I )j" =I#B%1$L !($&	*i7,56I,J) mI;a$@@L /t/F/F.GGWX ! !9!99)H%1* $L $/$(C(J(J<(XX +/*Q*Q)--j"= +R +' +6 &>?V>W$XXLoo,;"(==&7	 &   { E H ) %  )V$sp   AK"K -A"K"KA6K"KD	K"KA*K";K <	K"KK"KK"K"K" K"error_messagefailing_modelc                   #    U R                   b  U R                  c  gSU R                  ;  a  gU R                  nSU-   nSR                  U5      nUR	                  US9I Sh  vN nUcV  U R                  US[        R                  0 S9I Sh  vN   UR                  USU R                  R                  S	9I Sh  vN   gg N^ N5 N
7f)
z
Raise alert when tracking failed for specific model

Args:
    error_message (str): Error message
    failing_model (str): Model that failed tracking
Nfailed_tracking_spendzFailed Tracking Cost for z budget_alerts:failed_tracking:{}ro   Highr   SENTrp   r   ttl)r#   r$   r!   r   r   r   r   r   async_set_cacher0   budget_alert_ttl)r5   r   r   _cacher   
_cache_keyresults          r8   failed_tracking_alert#SlackAlerting.failed_tracking_alert  s      == D$4$4$<"$*:*:: 55-=7>>}M
--*-==>//$::"$	 "    ((&&77 )     >s6   A!C#C$*CC,C;C<CCC)token_budgetuser_budgetteam_budgetproxy_budgetprojected_limit_exceeded	user_infoc                   #    U R                   nU R                  b  U R                  c  g SU R                  ;  a  g SnUR                  SS9nSnUR	                  5        H  u  pxSR                  Xx5      nM     S n	S n
SnS nUS:X  a  Sn
US	-  nO{US
:X  a  Sn
US-  nUR                  =(       d    UnOXUS:X  a  Sn
US-  nUR                  =(       d    UnO5US:X  a  Sn
US-  nUR                  nOUS:X  a  Sn
US-  nSn	UR                  nUR                  c  g UR                  S:  a'  UR                  UR                  -
  UR                  -  nOSnUR                  UR                  :  a  Sn	USUR                   S3-  nOUS::  a  Sn	US-  nOUS::  a  Sn	US-  nU	b  U
b  SR                  X5      nUR                  US9I S h  vN nUck  [        S&U	U
US .UD6nU R                  US!-   U-   S"[        R                  U0 S#9I S h  vN   UR!                  US$U R"                  R$                  S%9I S h  vN   g g  Nt N5 N
7f)'Nbudget_alerts
default_idT)exclude_nonerT   
{}: {}
r   proxyzProxy Budget: r   internal_userzUser Budget: r   teamzTeam Budget: r   rp   zKey Budget: r  z$Key Budget: Projected Limit Exceededr   budget_crossedzBudget Crossed
 Total Budget:`r   g?threshold_crossedz5% Threshold Crossed g333333?z15% Threshold Crossedzbudget_alerts:{}:{}ro   )eventevent_groupevent_message

r   )r   r   r   r  r   r   r   r+   )r!   r#   r$   
model_dumprv   r   user_idteam_idtoken
max_budgetspendr   r   r   r   r  r   r0   r   )r5   r   r  r   _iduser_info_jsonuser_info_strkvr  r  r  webhook_eventpercent_leftr   r   s                   r8   r  SlackAlerting.budget_alerts:  s     !55== D$4$4$<$"2"22)"--4-@"((*DA(//5M +
  	
  	  04>!!K--M]")K_,M##*sC]" K_,M##*sC^#K^+M//C//KCCM.E//C '!#$$y6$$%L L ??i222$E>y?S?S>TTUVVMT!'E44MT!'E44M!8.55eAJ!11j1AAF~ , ! +"/! %	! oo)F2]B (66+&( &    ,," **;; -    - Bs7   GH?H9A H?H;,H?2H=3H?;H?=H?r  	key_aliasend_user_idresponse_costr  c                    #    U R                   bY  SU R                   ;   aH  UbD  Ub@  Ub<  [        UUUUS S S US S SSSR                  X45      S9nU R                  US9I S h  vN   g g g g g g  N
7f)Nwebhookspend_trackedcustomerz-Customer spend tracked. Customer={}, spend={})r  r  r  customer_idr  r  
user_emailr  projected_exceeded_dateprojected_spendr  r  r  r  )r#   r   r   send_webhook_alert)r5   r  r  r   r!  r  r  s          r8   customer_spend_alert"SlackAlerting.customer_spend_alert  s      MM%T]]*'!) !#%'#(, $%&MTTE$ )))>>>+ * " ( + &2 ?s   AA,A* A,alertsc                     SSSS.nU H:  nUS:X  a  US==   S-  ss'   M  US:  a  US==   S-  ss'   M-  US==   S-  ss'   M<     S	nUR                  5        H!  u  pVUS:  d  M  US
R                  XV5      -  nM#     U$ )z
Parameters:
- alerts: List[int] -> list of error codes (either 408 or 500+)

Returns:
- str -> formatted string. This is an alert message, giving a human-friendly description of the errors.
r   )Timeout Errors
API ErrorsUnknown Errors  r0  r     r1  r2  rT   r  )rv   r   )r5   r.  error_breakdownalert	error_msgrp   r   s          r8   _count_outage_alerts"SlackAlerting._count_outage_alerts  s     ./aSTUE| 01Q61#-2- 01Q61  	)//1JCqy\00<<	 2 r:   r   )MajorMinorrp   )ModelRegionkey_valproviderrd   outage_valuec                     U S3USU0nUb  XWS'   SnUR                  5        H  u  pUSU	 SU
 S3-  nM     SU S	U S
U R                  US   S9 S[        [        R                  " 5       US   -
  S5       S3	$ )z!Format an alert message for slackz NameProviderzAPI Baserq   r   z:* `r   u   


*⚠️ z Service Outage*

z

*Errors:*
r.  )r.  z

*Last Check:* `last_updated_at   z	s ago`


)rv   r8  rx   r   )r5   r   rp   r>  r?  rd   r@  headersheaders_strr  r  s              r8   _outage_alert_msg_factory'SlackAlerting._outage_alert_msg_factory  s     U%=':x@"*JMMODAQqcaS,,K $		   ,x"89 : ;diikL1B$CCQGH I	 		r:   	exceptiondeployment_idc           	        #    U R                   c  gU R                   R                  US9nUc  gUR                  R                  nUR                  R                  nUc  [
        R                  " US9u  pE  nUR                  R                  nUc'  [
        R                  R                  XSR                  S9nUc  gXW-   nU R                  R                  US9I Sh  vN n	[        USS5      b-  UR                  S:w  a  UR                  S:  d  U R                   c  gU	c  [        5       n
U
R                  U5        [!        UUR                  /S	S	["        R"                  " 5       U
S
9n	U R                  R%                  UU	U R&                  R(                  S9I Sh  vN   g[+        U	S   5      U R&                  R,                  :  a  U	S   R/                  UR                  5        O U	S   n
U
R                  U5        XS'   ["        R"                  " 5       U	S'   U	S   S	L aw  [+        U	S   5      U R&                  R0                  :  aQ  [+        U
5      S:  aB  U R3                  SSUSU	US9nU R5                  US[6        R8                  0 S9I Sh  vN   SU	S'   O~U	S   S	L av  [+        U	S   5      U R&                  R:                  :  aP  [+        U
5      S:  aA  U R3                  SSUSU	US9nU R5                  US[6        R8                  0 S9I Sh  vN   SU	S'   U R                  R%                  XS9I Sh  vN   g GNZ GN N N3 N7f)zr
Send slack alert if specific provider region is having an outage.

Track for 408 (Timeout) and >=500 Error codes
Nmodel_idrS   )custom_llm_providerrR   ro   status_coder3  r4  F)provider_region_idr.  minor_alert_sentmajor_alert_sentrC  deployment_idsr   r.  rT  rC  rR  r   r;  r=  r   rp   r>  rd   r@  r?  r   r   TrS  r:  r   rp   r   )r;   get_deploymentrR   rS   rO  r\   get_llm_providerregion_nameutils_get_model_regionr!   r   getattrrP  setaddProviderRegionOutageModelr   r   r0   region_outage_alert_ttlrt   max_outage_alert_list_sizeappendminor_outage_alert_thresholdrG  r   r   outage_alertsmajor_outage_alert_threshold)r5   rI  rJ  r   rS   r?  _rY  	cache_keyr@  _deployment_setmsgs               r8   region_outage_alerts"SlackAlerting.region_outage_alerts  s     ??"__33]3K
))//,,@@$+$<$<5$I!EQ !//;;!--99$,=V=V : K  *	 ++;;	;JJ 	
 I}d3;%%,))C/&!eO.4#,!--.!&!& $		.L ++;;"&&>> <   
 |H%&););)V)VV")))*?*?@&'78M*)8%&*.))+&' +,5L*+!!>>?O$q(00"#)! 1 C //$22"$	 "    04L+, +,5L*+!!>>?O$q(00"#)! 1 C //$22"$	 "    04L+, ''77 8 
 	
 	
} K4@4	
s]   CL?L3B<L?L6C1L?L9	A>L?L;%L?-L=.L?6L?9L?;L?=L?c           	        #     U R                   R                  US9I Sh  vN n[        USS5      b-  UR                  S:w  a  UR                  S:  d  U R                  c  gU R                  R                  US9nUc  gUR                  R                  nUR                  R                  nUc   [        R                  " US9u  pV  n[        R                  " XTR                  S	9nUcc  [        UUR                  /S
S
[        R                  " 5       S9nU R                   R                  UUU R                   R"                  S9I Sh  vN   g[%        US   5      U R                   R&                  :  a  US   R)                  UR                  5        O [        R                  " 5       US'   US   S
L ah  [%        US   5      U R                   R*                  :  aB  U R-                  SSUUUUS9n	U R/                  U	S[0        R2                  0 S9I Sh  vN   SUS'   OoUS   S
L ag  [%        US   5      U R                   R4                  :  aA  U R-                  SSUUUUS9n	U R/                  U	S[0        R2                  0 S9I Sh  vN   SUS'   U R                   R                  X#S9I Sh  vN   g GN! [         a    Sn GNf = f GN{ N NF N"! [         a     gf = f7f)z
Send slack alert if model is badly configured / having an outage (408, 401, 429, >=500).

key = model_id

value = {
- model_id
- threshold
- alerts []
}

ttl = 1hr
max_alerts_size = 10
ro   NrP  r3  r4  rL  rN  rT   rU   F)rM  r.  rR  rS  rC  r   r.  rC  rR  r;  r<  rU  r   r   TrS  r:  r   rV  )r!   r   r\  rP  r;   rW  rR   rS   rO  r\   rX  r_   r]   OutageModelr   r   r0   outage_alert_ttlrt   ra  rb  rc  rG  r   r   rd  re  )
r5   rI  rJ  r@  r   rS   r?  rf  rd   ri  s
             r8   rd  SlackAlerting.outage_alerts  s=    &j	8<8Q8Q8a8afs8a8t2tL	=$7?))S0!--3??* 777OJ!--33E!00DDH",3,D,D5,Q)EQ ++-F-FH #**%112%*%*$(IIK  //??%&**;; @   
  L*+$$??@ X&--i.C.CD.2iikL*+ /0E9X./%%BBC 44&!%!-% 5  oo"(66&(	 &    48/0/0E9X./%%BBC 44&!%!-% 5  oo (66&(	 &    48/0 ++;;! <   K 3u* ! "!H" @,  		s   KK J)?K  K!K =K>/K .J, A>K J?K 	K
CK KA/K =K>%K #K$K (K)K ,J<8K ;J<<K K K K 
KKKK
model_namelitellm_model_namepassed_model_infoc                 ,  #    [        USS 5      n0 nSnUb'  [        R                  R                  U0 5      nSU S3nO [        R                  R                  U0 5      nSnUR	                  5        H,  u  pUS:X  d  US:X  a  SR                  U	5      n	Xx SU	 S	3-  nM.     S
U SU S[        R                  " SS5       SU SU S3n
U R                  U
S[        R                  0 S9nUb'  [        R                  " U5      (       a  UI S h  vN   g g g  N7f)N
base_modelrT   zBase Model: `r   input_cost_per_tokenoutput_cost_per_tokenz{:.8f}rr   rq   u%   
*🚅 New Model Added*
Model Name: `zn

Usage OpenAI Python SDK:
```
import openai
client = openai.OpenAI(
    api_key="your_api_key",
    base_url=PROXY_BASE_URLhttp://0.0.0.0:4000z:
)

response = client.chat.completions.create(
    model="z", # model to send to the proxy
    messages = [
        {
            "role": "user",
            "content": "this is a test request, write a short poem"
        }
    ]
)
```

Model Info: 
```
z
```
r   r   )r\  r\   
model_costr[   rv   r   osgetenvr   r   new_model_addedr1   iscoroutine)r5   rp  rq  rr  base_model_from_user
model_infort  model_info_strr  r  r   	alert_vals               r8   model_added_alertSlackAlerting.model_added_alert  s\      ''8,M

+ ++//0DbIJ()=(>cBJ ++//0BBGJ$$&DA**a3J.JOOA&2aSm+N '\   ii(*?@A B <    5< OO 00 	 $ 
	  W%8%8%C%COO &D s   DD
DDc                    #    g 7frD   r+   )r5   rp  s     r8   model_removed_alert!SlackAlerting.model_removed_alert>  rH   rI   r  c                   #    [         R                  " SS5      nUc  [        S5      eUR                  5       nSS0nU R                  R                  UUUS9I Sh  vN nUR                  S:X  a  g[        S	UR                  5        g
 N,7f)z
Sends structured alert to webhook, if set.

Currently only implemented for budget alerts

Returns -> True if sent, False if not.

Raises Exception
    - if WEBHOOK_URL is not set
WEBHOOK_URLNz$Missing webhook_url from environmentContent-typeapplication/json)urlrE  data   Tz#Error sending webhook alert. Error=F)	rz  r{  r_   model_dump_jsonr-   postrP  printtext)r5   r  webhook_urlpayloadrE  responses         r8   r+   SlackAlerting.send_webhook_alertA  s      iit4BCC//1!#560055 6 
 

 3&7G
s   AB	B-B	premium_useremail_logo_urlemail_support_contactc                 v   #    SSK JnJn  USLa(  Uc  Ub"  [        SUR                  R
                   35      eg 7f)Nr   )CommonProxyErrorsr  Tz$Trying to Customize Email Alerting
 )litellm.proxy.proxy_serverr  r  
ValueErrornot_premium_userr   )r5   r  r  r  r  s        r8   %_check_if_using_premium_email_feature3SlackAlerting._check_if_using_premium_email_feature`  sI      	Ot#)-B-N ;<M<^<^<d<d;ef  	s   79c           	        #     SSK Jn  U R                  b  SU R                  ;  a"  [        R                  " SU R                  5        gSSKJnJn  [        R                  " S[        R                  " SS 5      5      n[        R                  " S	S 5      nU R                  X5U5      I S h  vN   Uc  [        nUc  [        nUR                  nUR                  nUR                  n	UcB  U	b?  Ub<  UR                   R"                  R%                  S
U	0S9I S h  vN n
U
b  U
R                  nUR&                  nUR(                  n[        R                  " SS5      nSnUc#  [        R                  " SUR+                  5       S9  UR,                  S:X  a  [.        R1                  UUUUUUS9nOUR,                  S:X  aq  UR2                  nSnUbH  UbE  UR                   R4                  R%                  SU0S9I S h  vN nUb  UR6                  =(       d    Sn[8        R1                  UUUUUS9nO#[        R                  " SUR;                  5       S9  UR=                  5         USU 3US.nU" US   US   US   S9I S h  vN   g GN GNn N N! [>         a*  n[        R                  " S [A        U5      5         S nAgS nAff = f7f)!Nr   
send_emailemailz;Error sending email alert - 'email' not in self.alerting %sF)r  prisma_clientSMTP_SENDER_LOGOEMAIL_LOGO_URLEMAIL_SUPPORT_CONTACTr  )whererw  rx  Alert from LiteLLM Server*Trying to send email alert to no recipientextrakey_created)r  recipient_email
key_budget	key_tokenbase_urlr  internal_user_createdzDefault Teamr  -)r  r  	team_namer  r  z3Trying to send email alert on unknown webhook event	LiteLLM: tosubjecthtmlr  r  r  receiver_emailr  r  TzError sending email alert %s)!litellm.proxy.utilsr  r#   r   errorr  r  r  rz  r{  r  LITELLM_LOGO_URLLITELLM_SUPPORT_CONTACTr  r'  r  dblitellm_usertablefind_uniquer  r  rw   r  KEY_CREATED_EMAIL_TEMPLATEr   r  litellm_teamtable
team_aliasUSER_INVITED_EMAIL_TEMPLATEr  r  r_   r^   )r5   r  r  r  r  r  r  
event_namer  recipient_user_iduser_rowr  r  r  email_html_contentr  r  team_rowemail_eventrf   s                       r8   &send_key_created_or_user_invited_email4SlackAlerting.send_key_created_or_user_invited_emailo  s    c	6}}$t}}(D$**QMM NYY"BII.>$EN %'II.Et$L!<<.C   %!1$,(?%&44J+66O - 5 5'%1!-!.!1!1!C!C!O!O$&78 "P "  '&.&9&9O%++I&11Jyy!13HIH!<&$**@',,.
 ""m3%?%F%F#1$3)'%*? &G &" $$(??'//*	&=+D%2%5%5%G%G%S%S('2 &T &  H  +$,$7$7$>3	%@%G%G#1$3'%*? &H &" %**I'224
 ))+%&zl3*K *40#I. (   _ @ 2  	 &&'Es1vN	s   KAJ
 K	A J
 )J *A+J
 JCJ
 5J6BJ
 :J;J
 ?K J
 J
 J
 J
 

J> J94K9J>>Kc           	        #    SSK Jn  SSKJn  [        R
                  " S[        R
                  " SS5      5      n[        R
                  " SS5      nU R                  X5U5      I Sh  vN   Uc  [        nUc  [        nUR                  nUR                  nUR                  n	UR                  n
SnUc#  [        R                  " S	UR                  5       S
9  UR                   S:X  a  SU SU	 SU
 SU S3	nUR#                  5         USU 3US.nU" US   US   US   S9I Sh  vN   UR$                  S:X  a  SSKJn  U" US9I Sh  vN   g N N+ N	7f)z
Sends structured Email alert to an SMTP server

Currently only implemented for budget alerts

Returns -> True if sent, False if not.
r   )r  r  r  r  Nr  r  r  r  r  z
            <img src="zD" alt="LiteLLM Logo" width="150" height="50" />

            <p> Hi ze, <br/>

            Your LLM API usage this month has reached your account's <b> monthly budget of $a   </b> <br /> <br />

            API requests will be rejected until either (a) you increase your monthly budget or (b) your monthly usage resets at the beginning of the next calendar month. <br /> <br />

            If you have any questions, please send an email to zY <br /> <br />

            Best, <br />
            The LiteLLM team <br />
            r  r  r  r  r  r  r
  )send_team_budget_alertr*  F)r  r  r  r  rz  r{  r  r  r  r  r'  r  r  r   r  rw   r  r  r  #litellm.integrations.email_alertingr  )r5   r  r   r  r  r  r  r  r  	user_namer  r  r  r  s                 r8   send_email_alert_using_smtp)SlackAlerting.send_email_alert_using_smtp  s     	<2		*:D A
 !#		*A4 H88*?
 	
 	
 !-N ($;!"00
'22!))	"--
8" &&<MDVDVDX "22&%& '; ]]g\h i@ AV?V W" 	%%'!":,/&
 &t,	*V$
 	
 	

 $$.R(}EEEi	
T	
 Fs7   A%E'E(B:E"E##EEEEEr   r   )r   r   r   r   c                   #    U R                   c  gSU R                   ;   a   US:X  a  Ub  U R                  US9I Sh  vN   SU R                   ;   a   US:X  a  Ub  U R                  XSS9I Sh  vN   SU R                   ;  a  gX0R                  ;  a  gSS	KJn  UR
                  " 5       R                  S
5      n[        R                  " SS5      n	US:X  d  US:X  a  Un
OSU SU SU 3n
U(       a%  UR                  5        H  u  pU
SU SU S3-  n
M     U(       a%  UR                  5        H  u  pU
SU SU S3-  n
M     U	b	  U
SU	 S3-  n
U R                  b  X0R                  ;   a  U R                  U   nO1U R                  b  U R                  nO[        R                  " SS5      nUc  [        S5      eSU
0nSS0n[        U[        5      (       a*  U H#  nU R                  R!                  UUUUS.5        M%     O U R                  R!                  UUUUS.5        [#        U R                  5      U R$                  :  a  U R'                  5       I Sh  vN   gg GN  GN N7f)a  
Alerting based on thresholds: - https://github.com/BerriAI/litellm/issues/1298

- Responses taking too long
- Requests are hanging
- Calls are failing
- DB Read/Writes are failing
- Proxy Close to max budget
- Key Close to max budget

Parameters:
    level: str - Low|Medium|High - if calls might fail (Medium) or are failing (High); Currently, no alerts would be 'Low'.
    message: str - what is the alert about
Nr#  r  r*  r  )r  r   slackr   )datetimez%H:%M:%Srw  r   r|  zLevel: `z`
Timestamp: `z`

Message: r  : `r   z

*Alerting Metadata*: 
z

Proxy URL: `r   SLACK_WEBHOOK_URLz*Missing SLACK_WEBHOOK_URL from environmentr  r  r  )r  rE  r  r   )r#   r+  r  r$   r  nowstrftimerz  r{  rv   r%   r&   r  r   rN   	log_queuerb  rt   
batch_sizeflush_queue)r5   r   r   r   r   r  r6   r  current_time_proxy_base_urlformatted_messagerp   r   slack_webhook_urlr  rE  r  s                    r8   r   SlackAlerting.send_alert  s    . ==  &o-%))	)BBB t}}$o-% 22' 3    $--'---%  ||~..z:))$4d;(J:K,K ' 5'nWIV  $lln
!tC5E7%%@@! -/557
!'B3%s5'QV%WW! 8&#3O3DA!FF %%1777 ))*5  %%1 $ 8 8 "		*=t D$IJJ,-!#56'..(%%"#*#*&0	 ) NN!!,&&",	 t~~$//1""$$$ 2Y CJ %s4   :I$I/I$,I-G(I$I"I$I$"I$c           	      .  #    U R                   (       d  g [        U R                   5      nUR                  5        Vs/ s H  n[        XS   US   S9PM     nn[        R
                  " U6 I S h  vN   U R                   R                  5         g s  snf  N$7f)Nitemcount)slackAlertingInstancer  r  )r  r   valuesr   r1   gatherclear)r5   squashed_queuer  taskss       r8   async_send_batchSlackAlerting.async_send_batch  s     ~~(8
 '--/	
 0 &*fT'] 0	 	 
 nne$$$
 	%s   :BBB.B/%Bc           	      D  #     SU R                   ;   GaO  UR                  S0 5      =(       d    0 nUR                  S0 5      =(       d    0 nUR                  SS5      =(       d    SnXC-
  nUn	[        U[        R                  5      (       at  [        US5      (       ac  UR                  bV  [        UR                  S5      (       a;  UR                  R                  n
U
b"  U
S	:  a  [        UR                  5       U
-  5      n	[        U	[        5      (       a  U	R                  5       n	U R                  [        US
U	[        R                  R                  5       S95      I Sh  vN   gg N! [         a,  n[         R"                  " S[%        U5       35         SnAgSnAff = f7f)zLog deployment latencyr   rR   r  r   rT   usageNcompletion_tokensr   Fr   r   r   
updated_atzR[Non-Blocking Error] Slack Alerting: Got error in logging LLM deployment latency: )r$   r[   r   r\   ModelResponsehasattrr  r  floatrZ   r   r   DeploymentMetricsrZ  get_utc_datetimer_   r   r  r^   )r5   r6   response_objr`   ra   rR   r  rM  
response_sfinal_valuer  rf   s               r8   async_log_success_event%SlackAlerting.async_log_success_event  sy    "	$"2"22!',<b!A!GR+//bAGR
%>>$39r(0(=
(lG,A,ABBL'22$**6 2 24GHH(4(:(:(L(L%(49JQ9N&+&4469JJ' k955"-";";"=K55%#',1<#*==#A#A#C	  + 3*  	 &&dehijekdlm 		sA   F EE' E%E' #F %E' '
F1"FF FF c           	        #    UR                  S0 5      nUR                  S0 5      =(       d    0 nUR                  SS5      n SU R                  ;   a@   U R                  [        USS[        R
                  R                  5       S95      I Sh  vN   [        UR                  S
S5      [        5      (       aX  SU R                  ;   a  U R                  US
   US9I Sh  vN   SU R                  ;   a  U R                  US
   US9I Sh  vN   ggg N! [         a,  n[        R                  " S	[        U5       35         SnANSnAff = f Nm ND! [         a     gf = f7f)z Log failure + deployment latencyrR   r  r   rT   r   TNr  zException raises -rI  rd  )rI  rJ  rj  )r[   r$   r   r  r\   rZ  r  r_   r   debugr^   r   r
   rd  rj  )	r5   r6   r  r`   ra   _litellm_params_model_inforM  rf   s	            r8   async_log_failure_event%SlackAlerting.async_log_failure_event  st     **%5r:%)),;Ar??4,	$"2"22
H99)'+/59'.}}'E'E'G	   &**["5x@@"d&6&66,,"("5&. -   
 *T-=-==33"("5X 4    > A ! H"((+=c!fX)FGGH
  		s   A E E :D DD AE E*E 	E
E E D 
E	"E?E E		E E 
EE EE c                 J  #    SnU R                   R                  [        R                  R                  SS9I Sh  vN n[
        R
                  " 5       nUc<  U R                   R                  [        R                  R                  US9I Sh  vN   U$ [        U[        5      (       aq  U R                  R                  nXC-
  U:  aS  U R                  US9I Sh  vN   U R                   R                  [        R                  R                  US9I Sh  vN   SnU$  N N NF N7f)z;
Returns:
- True -> report sent
- False -> report not sent
FN)rp   r   rV  )r   T)r!   r   r   report_sent_keyr   r   r   r   r  r0   r   r   )r5   r;   report_sent_boolreport_sentr  interval_secondss         r8   _run_scheduler_helper#SlackAlerting._run_scheduler_helper  s-     ! 55EE&66<<! F 
 

 yy{++;;*::@@" <   $   U++#11HH)-==--Z-@@@//??.>>DD& @    $( 5
 AsG   8D#DAD#DAD#D9D#D!	D#D#D#!D#c                 P  #    Ub  U R                   c  gSU R                   ;   a}   U R                  US9I Sh  vN   [        R                  " U R                  R
                  S-
  U R                  R
                  S-   5      n[        R                  " U5      I Sh  vN   M|  g Nj N	7f)z
If 'daily_reports' enabled

Ping redis cache every 5 minutes to check if we should send the report

If yes -> call send_daily_report()
Nr   )r;   r   )r$   r	  randomrandintr0   report_check_intervalr1   r   )r5   r;   intervals      r8   _run_scheduled_daily_report)SlackAlerting._run_scheduled_daily_report  s      !1!1!9d...00J0GGG!>>&&<<q@&&<<q@ mmH---  	 H
 .s"   5B&B"A"B&B$B&$B&
time_rangec                   #    U R                   b  SU R                  ;  a  g SSKJn  [	        USS 5      nUS   R                  5       S:w  a  [        S5      e[        R                  R                  5       R                  5       nU[        R                  " US9-
  nU" UR                  S	5      UR                  S	5      S
9I Sh  vN nUb  U/ / 4:X  a  gUu  pxSUR                  S5       SUR                  S5       SU S3n	Ub5  U	S-  n	U H*  n
[        [        U
S   5      S5      nU	SU
S    SU S3-  n	M,     Ub5  U	S-  n	U H*  n
[        [        U
S   5      S5      nU	SU
S    SU S3-  n	M,     U R                  U	S[        R                   0 S9I Sh  vN   g N N! [         a#  n["        R$                  " SU 35         SnAgSnAf[&         a#  n["        R$                  " SU 35         SnAgSnAff = f7f)z
Send a spend report for a configurable time range.

:param time_range: A string specifying the time range, e.g., "1d", "7d", "30d"
Nspend_reportsr    _get_spend_report_for_time_rangedz0Time range must be specified in days, e.g., '7d'days%Y-%m-%d
start_dateend_dateu   *💸 Spend Report for `%m-%d-%Y - z` (z days)*

*Team Spend Report:*
total_spendrD  Team: `r  ` | Spend: `$r   
*Tag Spend Report:*
Tag: `individual_request_tagr   r   zInvalid time range format: zError sending spend report: )r#   r$   7litellm.proxy.spend_tracking.spend_management_endpointsr  intlowerr  r  r  dater   r  rx   r  r   r   r  r   r  r_   )r5   r  r  r  todays_dater  _respspend_per_teamspend_per_tag_spend_messager  _team_spend
_tag_spendverf   s                  r8   send_weekly_spend_report&SlackAlerting.send_weekly_spend_report  sW     == O4;K;K$K/	K
 z#2'D"~##%, !STT"++//1668K$x'9'9t'DDJ:%..z:$--j9 E }"b 1,1)N7
8K8KJ8W7XX[\g\p\pq{\|[}  ~A  BF  AG  GP  QN)"<<+E"'eM.B(CQ"GK"!%"5!6mK=PSTN , (";;*E!&uU=-A'BA!FJ"u5M/N.O}]g\hhk&llN + //&$22"$	 "   32  	K &&)DRD'IJJ 	K &&)EaS'IJJ	Ksr   G:B!F FF G:CF FF G:F F 
G7)GG:G7G2-G:2G77G:c                 z  #     SSK Jn  SSKJn  [        R                  R                  5       R                  5       nUR                  SS9nU" UR                  UR                  5      u  pVU[        R                  " US-
  S9-   nU" UR                  S5      UR                  S5      S9I S	h  vN nUb  U/ / 4:X  a  g	Uu  pS
UR                  S5       SUR                  S5       S3n
Ub9  U
S-  n
U H.  nUS   n[        U5      n[        US5      nU
SUS    SU S3-  n
M0     U	b9  U
S-  n
U	 H.  nUS   n[        U5      n[        US5      nU
SUS    SU S3-  n
M0     U R                  U
S[        R                   0 S9I S	h  vN   g	 N N! ["         a!  n[$        R&                  " SU5         S	nAg	S	nAff = f7f)rT   r   )
monthranger  r   )dayr  r  r  Nu    *💸 Monthly Spend Report for `r  r   z` *
r!  r"  rD  r#  r  r$  r   r%  r&  r'  r   r   $Error sending weekly spend report %s)calendarr7  r(  r  r  r  r+  replaceyearmonthr   r  r  rx   r   r   r  r_   r   rI  )r5   r7  r  r,  first_day_of_monthrf  last_day_of_monthr-  monthly_spend_per_teammonthly_spend_per_tagr0  r  r1  r2  rf   s                  r8   send_monthly_spend_report'SlackAlerting.send_monthly_spend_reportT  s:    5	V+ #++//1668K!,!4!4!4!;#-k.>.>@Q@Q#R A 2X5G5G&*6 ! ;-66zB*33J? E
 }"b 1<A9"?@R@[@[\f@g?hhkl}  mG  mG  HR  mS  lT  TY  ZN%1"<<3E"'"6K"'"4K"'Q"7K"!%"5!6mK=PSTN 4 %0";;2E!&}!5J!&z!2J!&z1!5J"u5M/N.O}]g\hhk&llN 3 //&$22"$	 "   A@  	V **+QSTUU	Vs`   F;B(F ,F	-F <F;=CF FF F;	F F 
F8F3.F;3F88F;c                    #     SSK Jn  U" 5       I Sh  vN nSU 3nU R                  US[        R                  0 S9I Sh  vN   g N2 N! [
         a!  n[        R                  " SU5         SnAgSnAff = f7f)z
Helper to send fallback statistics from prometheus server -> to slack

This runs once per day and sends an overview of all the fallback statistics
r   )#get_fallback_metric_from_prometheusNz*Fallback Statistics:*
r   r   r9  )6litellm.integrations.prometheus_helpers.prometheus_apirE  r   r   fallback_reportsr_   r   r  )r5   rE  !falllback_success_info_prometheusfallback_messagerf   s        r8   #send_fallback_stats_from_prometheus1SlackAlerting.send_fallback_stats_from_prometheus  s     	R :;; .
 ++L*MN  //($55"$	 "    	# <  	R &&'MqQQ	RsP   A9A A,A A	A A9A 	A 
A6A1,A91A66A9	key_eventr  c                   #     SU S3nUR                  5       nUS-  nUR                  5        H  u  pgSU;   d  M  XF SU S3-  nM     US-  nUR                  nUR                  5        H  u  pgUS:X  a  M  XF SU S3-  nM     U R                  USU0 S	9I S
h  vN   g
 N! [         a!  n	[
        R                  " SU	5         S
n	A	g
S
n	A	ff = f7f)z
Handles sending Virtual Key related alerts

Example:
- New Virtual Key Created
- Internal User Updated
- Team Created, Updated, Deleted
r   r   z*Action Done by:*

created_byr  z
*Arguments passed:*
user_api_key_dictr   r   Nz-Error sending send_virtual_key_event_slack %s)r  rv   request_kwargsr   r_   r   r  )
r5   rL  r   r  r   key_event_dictrp   r   rP  rf   s
             r8   send_virtual_key_event_slack*SlackAlerting.send_virtual_key_event_slack  s    	*S)G&113N ,,G,224
3&c%44G 5
 00G&55N,224
--U#eWC00 5
 //%"$	 "    	  	 &&?  		sF   C4B# AB# B!B#  C!B# #
C-C	C	CC)r%   r$   r#   r0   r"   r-   r&   r*   r!   r.   r;   )NNNNNNrD   )NNr   N)NN)7d)?__name__
__module____qualname____firstlineno____doc__DEFAULT_ALERT_TYPESr   r   r  r   r   r   r	   r^   r4   r   rA   rF   rK   rO   rg   r~   r   r  r)  r   boolr   r  r   rw   r   r   r   r  r,  r8  BaseOutageModelrG  r
   rj  rd  r   r  r  r   r+  r  r  r  r   r  r  r  r	  r  r4  rB  rJ  r   rR  __static_attributes____classcell__)r7   s   @r8   r   r   $   sr    59 #%': -1?&y1? %
? 4.? )_? 'E$s)S.112
? &c]? ?F $(.215QU(,'+!)4.!) %UO!) d9o.	!)
 'tIuT#Y^7L,L'MN!)  ~!) V$!)F2 $D1f,"3,	,\T$ Tp 3704<M'+mX../m 8,,-m 89	m
 tnm^ S >g(
g gR"?}"? C="? c]	"?
  "? UO"?H49  0,- &' 	
  3- & 
8G
G
 G
 
	G
R}} } 
	}~99369KN9vC l t D )-/3	 !  (}	f)f	fPE)E7:E	EZ -1l%l% ./l% 	l%
  l% L)l%\$LB"  " HHSM *8K 8Kt7Vr@.". . 	. .r:   r   )/r1   r  rz  r  r   r   typingr   r   r   r   r   r	   openair
   r\   litellm.litellm_core_utils*litellm.litellm_core_utils.litellm_logginglitellm.typeslitellm._loggingr   r   litellm.caching.cachingr   (litellm.integrations.custom_batch_loggerr   2litellm.litellm_core_utils.exception_mapping_utilsr   &litellm.llms.custom_httpx.http_handlerr   r   litellm.proxy._typesr   r   r   r   litellm.routerr   )litellm.types.integrations.slack_alertingemail_templates.templatesbatching_handlerr   r   rZ  r   r   r   r+   r:   r8   <module>rn     sh      	    < <   ! 1  A - F T S ! 7 ) > Tw% wr:   