about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/litellm/proxy/analytics_endpoints
diff options
context:
space:
mode:
authorS. Solomon Darnell2025-03-28 21:52:21 -0500
committerS. Solomon Darnell2025-03-28 21:52:21 -0500
commit4a52a71956a8d46fcb7294ac71734504bb09bcc2 (patch)
treeee3dc5af3b6313e921cd920906356f5d4febc4ed /.venv/lib/python3.12/site-packages/litellm/proxy/analytics_endpoints
parentcc961e04ba734dd72309fb548a2f97d67d578813 (diff)
downloadgn-ai-master.tar.gz
two version of R2R are here HEAD master
Diffstat (limited to '.venv/lib/python3.12/site-packages/litellm/proxy/analytics_endpoints')
-rw-r--r--.venv/lib/python3.12/site-packages/litellm/proxy/analytics_endpoints/analytics_endpoints.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/litellm/proxy/analytics_endpoints/analytics_endpoints.py b/.venv/lib/python3.12/site-packages/litellm/proxy/analytics_endpoints/analytics_endpoints.py
new file mode 100644
index 00000000..f929cb74
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/litellm/proxy/analytics_endpoints/analytics_endpoints.py
@@ -0,0 +1,106 @@
+#### 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)},
+        )