
    ^h              	          S SK J r   S SKJrJr  S SKrS SKJrJrJrJr  S SK	7  S SK
Jr  \" 5       r\R                  SS/\" \5      /S	S
\\   00SS9\R                  " SSS9\R                  " SSS94S\\   S\\   4S jj5       rg)    )datetime)ListOptionalN)	APIRouterDependsHTTPExceptionstatus)*)user_api_key_authz/global/activity/cache_hitszBudget & Spend Tracking   modelF)tagsdependencies	responsesinclude_in_schemaz&Time from which to start viewing spend)defaultdescriptionzTime till which to view spend
start_dateend_datec                   #    U b  Uc  [        [        R                  SS0S9e[        R                  " U S5      n[        R                  " US5      nSSKJn   Uc  [        S5      eS	nUR                  R                  XRU5      I Sh  vN nUc  / $ U$  N! [         a(  n[        [        R                  S[        U5      0S9eSnAff = f7f)
a  
Get number of cache hits, vs misses

{
    "daily_data": [
            const chartdata = [
            {
                date: 'Jan 22',
                cache_hits: 10,
                llm_api_calls: 2000
            },
            {
                date: 'Jan 23',
                cache_hits: 10,
                llm_api_calls: 12
            },
    ],
    "sum_cache_hits": 20,
    "sum_llm_api_calls": 2012
}
Nerrorz&Please provide start_date and end_date)status_codedetailz%Y-%m-%dr   )prisma_clientzDatabase not connected. Connect a database to your proxy - https://docs.litellm.ai/docs/simple_proxy#managing-auth---virtual-keysa  
            SELECT
                CASE 
                    WHEN vt."key_alias" IS NOT NULL THEN vt."key_alias"
                    ELSE 'Unnamed Key'
                END AS api_key,
                sl."call_type",
                sl."model",
                COUNT(*) AS total_rows,
                SUM(CASE WHEN sl."cache_hit" = 'True' THEN 1 ELSE 0 END) AS cache_hit_true_rows,
                SUM(CASE WHEN sl."cache_hit" = 'True' THEN sl."completion_tokens" ELSE 0 END) AS cached_completion_tokens,
                SUM(CASE WHEN sl."cache_hit" != 'True' THEN sl."completion_tokens" ELSE 0 END) AS generated_completion_tokens
            FROM "LiteLLM_SpendLogs" sl
            LEFT JOIN "LiteLLM_VerificationToken" vt ON sl."api_key" = vt."token"
            WHERE 
                sl."startTime" BETWEEN $1::date AND $2::date + interval '1 day'
            GROUP BY 
                vt."key_alias",
                sl."call_type",
                sl."model"
        )r   r	   HTTP_400_BAD_REQUESTr   strptimelitellm.proxy.proxy_serverr   
ValueErrordb	query_raw	Exceptionstr)r   r   start_date_objend_date_objr   	sql_querydb_responsees           o/home/james-whalen/.local/lib/python3.13/site-packages/litellm/proxy/analytics_endpoints/analytics_endpoints.pyget_global_activityr)      s     R X-33EF
 	

 &&z:>N$$Xz:L8(
  T 	* *,,66|
 
 I
  
33SV$
 	

sH   AC
/B BB C
B C
B 
C#CCC
)r   typingr   r   fastapir   r   r   r	   litellm.proxy._types$litellm.proxy.auth.user_api_key_authr   routergetLiteLLM_SpendLogsQueryr"   r)        r(   <module>r4      s     !  = = " B	 !
#	$+,-gt-./    !(<! &mm3S
S

 smS
S
r3   