
    gpS                     t   d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZmZm	Z	 d dl
Z
d dl
mZmZmZmZmZmZ d dlZd dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ  e       ZejA                  d	d
g ee      g      defd       Z!ejA                  dd
g ee      gd       ee       e
jD                  d      fdede	ed   e#f   fd       Z$ejA                  dd
g ee      g       ee       e
jD                  dd      fdedee#   fd       Z%d ejL                         da'd Z(ejA                  dd
g ee      g      ejA                  dd
g ee      g      d                Z)d! Z*ejA                  d"d
g ee      g      d#        Z+ejA                  d$d
g ee      g      ejA                  d%d
g ee      g      d&               Z,ej[                  d"d
g ee      g      d'        Z.ej[                  d$d
g ee      g      ej[                  d%d
g ee      g      d(               Z/y))    N)datetime	timedelta)LiteralOptionalUnion)	APIRouterDependsHTTPExceptionRequestResponsestatus)verbose_proxy_logger)	AlertTypeCallInfoProxyErrorTypesProxyExceptionUserAPIKeyAuthWebhookEvent)user_api_key_auth)perform_health_checkz/testhealth)tagsdependenciesrequestc                 :   K   d| j                   j                  iS w)a  
    [DEPRECATED] use `/health/liveliness` instead.

    A test endpoint that pings the proxy server to check if it's healthy.

    Parameters:
        request (Request): The incoming request.

    Returns:
        dict: A dictionary containing the route of the request URL.
    route)urlpath)r   s    e/var/www/openai/venv/lib/python3.12/site-packages/litellm/proxy/health_endpoints/_health_endpoints.pytest_endpointr       s     $ W[[%%&&s   z/health/servicesF)r   r   include_in_schemazSpecify the service being hit.)descriptionuser_api_key_dictservice)slack_budget_alertslangfuseslack	openmeterwebhookemail
braintrustc                 	  K   	 ddl m}m}m} |t	        dddi      |dvrt	        ddd	| d
dg i      |dk(  s|dk(  s|t
        j                  v r>|dk7  r9t        j                  ddddgdd       d{   }ddj                  |      dS |dk(  rIddl	m
}  |       }|j                  j                          t        j                  ddddgdd      }dddS |dk(  rXt        | j                  xs ddd| j                   | j"                  | j$                        }|j'                  d|        d{    |d!k(  s|dk(  rd!|j)                  d"g       v r|j*                  j,                  	 |j*                  j,                  D ]  }	|j*                  j.                  	 |	|j*                  j.                  vr3d#}
|	t0        j2                  k(  rd$}
n|	t0        j4                  k(  rd%}
np|	t0        j6                  k(  rd&}
nZ|	t0        j&                  k(  rd'}
nD|	t0        j8                  k(  rd(}
n.|	t0        j:                  k(  rd)}
n|	t0        j<                  k(  rd*}
nd'}
|j?                  |
d+|	,       d{     n*|j?                  d-d+t0        j&                  ,       d{    |ZtA        jB                  |j*                  jE                                tA        jB                  |j*                  jG                                |j*                  j.                  xs g }tI        |      }d|d.d/S t	        d0dd1j                  |      i      |d2k(  rstK        d3d4d5| j                  xs dd6dd| j                   tM        jN                  d7      | j$                  8
      }|j*                  jQ                  |9       d{    dd:dS y7 J7 7 V7 ,7 # tR        $ r}tU        jV                  d;j                  tY        |                   tU        jZ                  t]        j^                                ta        |t              rYtc        te        |d<d=tY        |       d>      tf        jh                  te        |d?d@      te        |dAtj        jl                        B      ta        |tb              r|tc        dCtY        |      z   tf        jh                  te        |d?d@      tj        jl                  B      d}~ww xY ww)Dzj
    Hidden endpoint.

    Used by the UI to let user check if slack alerting is working as expected.
    r   )general_settingsprisma_clientproxy_logging_objNi  errorzService must be specified.status_codedetail)
r%   r*   r&   r'   r(   r)   r+   otelcustom_callback_api	langsmithz!Service must be in list. Service=z. List=r%   r(   r+   r&   z"openai/litellm-mock-response-modeluserzHey, how's it going?)rolecontentzlitellm:/health/serviceszThis is a mock response)modelmessagesr7   mock_responsesuccessz!Mock LLM request made - check {}.)r   message)LangFuseLoggerz'Mock LLM request made - check langfuse.r)       )tokenspend
max_budgetuser_id	key_aliasteam_iduser_budget)type	user_infor'   alertingzdefault test messagezLLM Exception test alertzLLM Too Slow test alertzLLM Requests Hanging test alertzBudget Alert test alertzDB Exception test alertz!Outage Alert Exception test alertzDaily Reports test alertLow)r>   level
alert_typez"This is a test slack alert messagezBMock Slack Alert sent, verify Slack Alert Received on your channel)r   alert_typesr>   i  z@"{}" not in proxy config: general_settings. Unable to test this.r*   key_createdkeyzTest Email AlertzNEmail Test key (This is only a test alert key. DO NOT USE THIS IN PRODUCTION.)TEST_EMAIL_ADDRESS)
eventevent_groupevent_messagerB   rF   rC   rD   rE   
user_emailrG   )webhook_eventz2Mock Email Alert sent, verify Email Alert ReceivedzMlitellm.proxy.proxy_server.health_services_endpoint(): Exception occured - {}r3   zAuthentication Error()paramNoner2   )r>   rI   rY   codezAuthentication Error, )7litellm.proxy.proxy_serverr-   r.   r/   r
   litellmsuccess_callbackacompletionformat&litellm.integrations.langfuse.langfuser?   Langfuse
auth_check
completionr   rB   rE   rF   rG   budget_alertsgetslack_alerting_instancealert_to_webhook_urlrO   r   llm_exceptionsllm_too_slowllm_requests_hangingdb_exceptionsoutage_alertsdaily_reportsalerting_handlerasynciocreate_tasksend_monthly_spend_reportsend_weekly_spend_reportlistr   osgetenv&send_key_created_or_user_invited_email	Exceptionr   r0   strdebug	traceback
format_exc
isinstancer   getattrr   
auth_errorr   HTTP_500_INTERNAL_SERVER_ERROR)r#   r$   r-   r.   r/   _r?   langfuse_loggerrJ   rN   test_messagerO   rW   es                 r   health_services_endpointr   2   sm    4C
	
 	
 ?2N(O   
 
  @	RgQhPij  {",&7333:8M)):#)6LMN/7	 A $>EEgN 
 j M,.O$$//1"":#)6LMN/7	A $D 
 i '--3)11+55)11I $11"# 2   
 g,A!A*..z2>> &==RR 
 +BBWW # .EEQQ#'( *#4#L#L#X#X!Y %'=%)A)AA+EL'9+A+AA+DL'9+I+II+LL'9+B+BB+DL'9+B+BB+DL'9+B+BB+NL'9+B+BB+EL+DL/@@$0* A   9 X@ ,<< D##,#:#: =    !,'')AA[[] '')AAZZ\
 &==IIOR  #;/'#.c  $ #!c!j!j#"  g(#!0'--3j)1199%9:)11M $;;bb+ c   
 $O ' gHV^  
""[bbA	

 	""9#7#7#9:a' 8/DSVHA-NO$//a&1Qv/T/TU	  >*G,s1v5 ++!Wf-66	
 	
!
s   S5A6O :O;O S5AO  S5!AO 9O:D:O 4O
5,O !O"B
O ,S5-BO 9O:O S5O O 
O O O 
S2DS--S22S5z/healthz!Specify the model name (optional)r:   c                 n  K   ddl m}m}m}m}m} 	 |Q|2t        g ||       d{   \  }}||t        |      t        |      dS t        t        j                  ddi      t        j                  |      }	t        | j                        dkD  rn	 |r|S t        |	||	       d{   \  }}||t        |      t        |      dS 7 7 "# t        $ r[}
t        j                   d
j#                  t%        |
                   t        j&                  t)        j*                                |
d}
~
ww xY ww)u  
    🚨 USE `/health/liveliness` to health check the proxy 🚨

    See more 👉 https://docs.litellm.ai/docs/proxy/health


    Check the health of all the endpoints in config.yaml

    To run health checks in the background, add this to config.yaml:
    ```
    general_settings:
        # ... other settings
        background_health_checks: True
    ```
    else, the health checks will be run on models when /health is called.
    r   )health_check_detailshealth_check_resultsllm_model_listuse_background_health_checks
user_modelN)
model_list	cli_modeldetails)healthy_endpointsunhealthy_endpointshealthy_countunhealthy_countr0   zModel list not initializedr1   )r   zHlitellm.proxy.proxy_server.py::health_endpoint(): Exception occured - {})r\   r   r   r   r   r   r   lenr
   r   r   copydeepcopymodelsrx   r   r0   r`   ry   rz   r{   r|   )r#   r:   r   r   r   r   r   r   r   _llm_model_listr   s              r   health_endpointr     sW    . +!%?S!ZAU@ :6!#6 *;+>%():%;'*+>'?	   "AA!=>  --7 ''(1,''';O0D< 622
 &7':!$%6!7#&':#;	 5:,6  ""V]]A	

 	""9#7#7#9:sd   D5C C
C D5AC D5C )C*C 	D5
C C 	D2AD--D22D5unknownr   last_updatedc                  @  K   ddl m}  t        j                         t        d   z
  }t        d   dk7  r|t        d      k  rt        S | dt        j                         d	at        S | j                          d {    d
t        j                         d	at        S 7 !w)Nr   )r.   r   r   r      )minutesdisconnectedr   	connected)r\   r.   r   nowdb_health_cacher   health_check)r.   	time_diffs     r   _db_health_readiness_checkr   b  s     8 !@@Ix I-)iPQ>R2R%3X\\^T

$
$
&&&!,hllnMO 's   A8B:B;"Bz	/settingsz/active/callbacksc                  r  K   ddl m} m} t        | j	                  d            }t
        j                  D cg c]  }t        |       }}t
        j                  D cg c]  }t        |       }}t
        j                  D cg c]  }t        |       }}t
        j                  D cg c]  }t        |       }}t
        j                  D cg c]  }t        |       }}t
        j                  D cg c]  }t        |       }	}t
        j                  D cg c]  }t        |       }
}||z   |z   |z   |z   |	z   |
z   }|j                  }d}|rt        |t              rt!        |      }|||||||	|
|t!        |      |t
        j"                  dS c c}w c c}w c c}w c c}w c c}w c c}w c c}w w)au  
    Returns a list of litellm level settings

    This is useful for debugging and ensuring the proxy server is configured correctly.

    Response schema:
    ```
    {
        "alerting": _alerting,
        "litellm.callbacks": litellm_callbacks,
        "litellm.input_callback": litellm_input_callbacks,
        "litellm.failure_callback": litellm_failure_callbacks,
        "litellm.success_callback": litellm_success_callbacks,
        "litellm._async_success_callback": litellm_async_success_callbacks,
        "litellm._async_failure_callback": litellm_async_failure_callbacks,
        "litellm._async_input_callback": litellm_async_input_callbacks,
        "all_litellm_callbacks": all_litellm_callbacks,
        "num_callbacks": len(all_litellm_callbacks),
        "num_alerting": _num_alerting,
        "litellm.request_timeout": litellm.request_timeout,
    }
    ```
    r   )r-   r/   rK   )rK   zlitellm.callbackszlitellm.input_callbackzlitellm.failure_callbackzlitellm.success_callbackzlitellm._async_success_callbackzlitellm._async_failure_callbackzlitellm._async_input_callbackall_litellm_callbacksnum_callbacksnum_alertingzlitellm.request_timeout)r\   r-   r/   ry   rf   r]   	callbacksinput_callbackfailure_callbackr^   _async_success_callback_async_failure_callback_async_input_callbackrK   r}   rt   r   request_timeout)r-   r/   	_alertingxlitellm_callbackslitellm_input_callbackslitellm_failure_callbackslitellm_success_callbackslitellm_async_success_callbackslitellm_async_failure_callbackslitellm_async_input_callbacksr   rK   _num_alertings                 r   active_callbacksr   w  s    F O$((45I *1):):;):AQ):;/6/E/EF/E!s1v/EF181I1I J1IAQ1I J181I1I J1IAQ1I J7>7V7V&W7V!s1v7V#&W7>7V7V&W7V!s1v7V#&W5<5R5R$S5RSV5R!$S 	
!	"
#	$ $	$ *		*
 *	* (	(  !))HMJx.H ."9$=$=+J+J)F!623%#*#:#: / <F J J&W&W$SsY   5F7F	F7F/F7FF7)F#;F7F(!F75F-F7F2-B
F7c                     t        | t              r| S 	 | j                  S # t        $ r6 	 | j                  j                  cY S # t        $ r t        |       cY cY S w xY ww xY w)N)r}   ry   __name__AttributeError	__class__)callbacks    r   callback_namer     sa    (C !    !	!%%... 	!x= 	!!s+     	AAAAAAAz/health/readinessc                    K   ddl m} m} 	 g }	 t        j                  D cg c]  }t        |       }}d}t        j                  zddlm	} t        j                  j                  }t        t        j                  j                  |      r6	 t        j                  j                  j                          d{   }||d}| t                d{   }dd|||d	|S dd
|||d	S c c}w # t        $ r t        j                  }Y w xY w7 S# t        $ r}dt        |      z   }Y d}~md}~ww xY w7 `# t        $ r}t!        ddt        |       d      d}~ww xY ww)zJ
    Unprotected endpoint for checking if worker can receive requests
    r   )r.   versionN)RedisSemanticCachezindex does not exist - error: )rI   
index_infohealthyr   )r   dbcachelitellm_versionsuccess_callbackszNot connectedi  zService Unhealthy (rX   r1   )r\   r.   r   r]   r^   r   r   r   litellm.caching.cachingr   rI   r}   _index_inforx   ry   r   r
   )	r.   r   success_callback_namesr   
cache_typer   r   r   db_health_statuss	            r   health_readinessr     s|     B2U!#	> +2*B*B&*BQa *B # & 
==$B ++J'----/ABK'.}}':':'F'F'H!HJ '1
K
 $%?%AA#!##*%; #  $%##*%; G&  	>%,%=%="	> "I  K!ACF!JJK  B"  U6I#a&QR4STTUs   	ED3 C, C'C, AD3 +D 7D8D <D3 D1D3 ED3 &E'C, ,DD3 DD3 D 	D.D)$D3 )D..D3 3	E<EEEz/health/livelinessz/health/livenessc                     K   yw)z>
    Unprotected endpoint for checking if worker is alive
    z
I'm alive! r       r   health_livelinessr     s      s   c                  0   K   dddd} t        | d      S w)z6
    Options endpoint for health/readiness check.
    GET, OPTIONS*AllowzAccess-Control-Allow-MethodszAccess-Control-Allow-Headers   headersr2   r   response_headerss    r   health_readiness_optionsr   $  s)       (6(+
 ,#>>   c                  0   K   dddd} t        | d      S w)z7
    Options endpoint for health/liveliness check.
    r   r   r   r   r   r   r   s    r   health_liveliness_optionsr   5  s)       (6(+
 ,#>>r   )0rp   r   ru   r{   r   r   typingr   r   r   fastapir   r	   r
   r   r   r   r]   litellm._loggingr   litellm.proxy._typesr   r   r   r   r   r   $litellm.proxy.auth.user_api_key_authr   litellm.proxy.health_checkr   routerrf   r    Queryry   r   r   r   r   r   r   r   r   r   optionsr   r   r   r   r   <module>r      s#     	  ( + +  P P  1  C ; 
 
+,-  
' '
'  
+,-	   )00A(B 	"BCW
%W
	
 			W
W
t IXJg>O6P5QR(/0A(B(7===I%IC=I SIX 'G* 
+,-  
 
+,-  
BBJ
! 
+,-  
8U
8Uv 
+,-  
 
+,-  
 
+,-  
	?
	? 
+,-  
 
+,-  
	?	?r   