Merge pull request #2287 from BerriAI/litellm_end_user_per_key_spend

feat(proxy_server.py): return top 100 end users for a given key
This commit is contained in:
Krish Dholakia 2024-03-01 19:51:56 -08:00 committed by GitHub
commit 6dc85ed8e3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 39 additions and 3 deletions

View file

@ -260,6 +260,10 @@ class NewTeamRequest(LiteLLMBase):
models: list = [] models: list = []
class GlobalEndUsersSpend(LiteLLMBase):
api_key: Optional[str] = None
class TeamMemberAddRequest(LiteLLMBase): class TeamMemberAddRequest(LiteLLMBase):
team_id: str team_id: str
member: Member member: Member

View file

@ -4146,7 +4146,7 @@ async def global_spend_keys(
tags=["Budget & Spend Tracking"], tags=["Budget & Spend Tracking"],
dependencies=[Depends(user_api_key_auth)], dependencies=[Depends(user_api_key_auth)],
) )
async def global_spend_end_users(): async def global_spend_end_users(data: GlobalEndUsersSpend):
""" """
[BETA] This is a beta endpoint. It will change. [BETA] This is a beta endpoint. It will change.
@ -4156,9 +4156,26 @@ async def global_spend_end_users():
if prisma_client is None: if prisma_client is None:
raise HTTPException(status_code=500, detail={"error": "No db connected"}) raise HTTPException(status_code=500, detail={"error": "No db connected"})
if data.api_key is None:
sql_query = f"""SELECT * FROM "Last30dTopEndUsersSpend";""" sql_query = f"""SELECT * FROM "Last30dTopEndUsersSpend";"""
response = await prisma_client.db.query_raw(query=sql_query) response = await prisma_client.db.query_raw(query=sql_query)
else:
"""
Gets the top 100 end-users for a given api key
"""
current_date = datetime.now()
past_date = current_date - timedelta(days=30)
response = await prisma_client.db.litellm_spendlogs.group_by( # type: ignore
by=["end_user"],
where={
"AND": [{"startTime": {"gte": past_date}}, {"api_key": data.api_key}]
},
sum={"spend": True},
order={"_sum": {"spend": "desc"}}, # type: ignore
take=100,
)
return response return response

View file

@ -10,17 +10,21 @@ import {
TableCell, TableCell,
TableBody, TableBody,
Tab, Tab,
Text,
TabGroup, TabGroup,
TabList, TabList,
TabPanels, TabPanels,
Metric, Metric,
Grid, Grid,
TabPanel, TabPanel,
Select,
SelectItem,
} from "@tremor/react"; } from "@tremor/react";
import { userInfoCall, adminTopEndUsersCall } from "./networking"; import { userInfoCall, adminTopEndUsersCall } from "./networking";
import { Badge, BadgeDelta, Button } from "@tremor/react"; import { Badge, BadgeDelta, Button } from "@tremor/react";
import RequestAccess from "./request_model_access"; import RequestAccess from "./request_model_access";
import CreateUser from "./create_user_button"; import CreateUser from "./create_user_button";
import Paragraph from "antd/es/skeleton/Paragraph";
interface ViewUserDashboardProps { interface ViewUserDashboardProps {
accessToken: string | null; accessToken: string | null;
@ -166,6 +170,17 @@ const ViewUserDashboard: React.FC<ViewUserDashboardProps> = ({
</Table> </Table>
</TabPanel> </TabPanel>
<TabPanel> <TabPanel>
<div className="flex items-center">
<div className="flex-1"></div>
<div className="flex-1 flex justify-between items-center">
<Text className="w-1/4 mr-2 text-right">Key</Text>
<Select defaultValue="1" className="w-3/4">
<SelectItem value="1">Option One</SelectItem>
<SelectItem value="2">Option Two</SelectItem>
<SelectItem value="3">Option Three</SelectItem>
</Select>
</div>
</div>
<Table> <Table>
<TableHead> <TableHead>
<TableRow> <TableRow>