#### Analytics Endpoints ##### from datetime import datetime from typing import List, Optional import fastapi from fastapi import APIRouter, Depends, HTTPException, status from litellm.proxy._types import * from litellm.proxy.auth.user_api_key_auth import user_api_key_auth router = APIRouter() @router.get( "/global/activity/cache_hits", tags=["Budget & Spend Tracking"], dependencies=[Depends(user_api_key_auth)], responses={ 200: {"model": List[LiteLLM_SpendLogs]}, }, include_in_schema=False, ) async def get_global_activity( start_date: Optional[str] = fastapi.Query( default=None, description="Time from which to start viewing spend", ), end_date: Optional[str] = fastapi.Query( default=None, description="Time till which to view spend", ), ): """ 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 } """ if start_date is None or end_date is None: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail={"error": "Please provide start_date and end_date"}, ) start_date_obj = datetime.strptime(start_date, "%Y-%m-%d") end_date_obj = datetime.strptime(end_date, "%Y-%m-%d") from litellm.proxy.proxy_server import prisma_client try: if prisma_client is None: raise ValueError( "Database not connected. Connect a database to your proxy - https://docs.litellm.ai/docs/simple_proxy#managing-auth---virtual-keys" ) sql_query = """ 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" """ db_response = await prisma_client.db.query_raw( sql_query, start_date_obj, end_date_obj ) if db_response is None: return [] return db_response except Exception as e: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail={"error": str(e)}, )