Added LiteLLM to the stack

This commit is contained in:
2025-08-18 09:40:50 +00:00
parent 0648c1968c
commit d220b04e32
2682 changed files with 533609 additions and 1 deletions

View File

@@ -0,0 +1,8 @@
from fastapi import APIRouter
from .internal_user_endpoints import router as internal_user_endpoints_router
management_endpoints_router = APIRouter()
management_endpoints_router.include_router(internal_user_endpoints_router)
__all__ = ["management_endpoints_router"]

View File

@@ -0,0 +1,67 @@
"""
Enterprise internal user management endpoints
"""
from fastapi import APIRouter, Depends, HTTPException
from litellm.proxy._types import UserAPIKeyAuth
from litellm.proxy.management_endpoints.internal_user_endpoints import user_api_key_auth
router = APIRouter()
@router.get(
"/user/available_users",
tags=["Internal User management"],
dependencies=[Depends(user_api_key_auth)],
)
async def available_enterprise_users(
user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth),
):
"""
For keys with `max_users` set, return the list of users that are allowed to use the key.
"""
from litellm.proxy._types import CommonProxyErrors
from litellm.proxy.proxy_server import (
premium_user,
premium_user_data,
prisma_client,
)
if prisma_client is None:
raise HTTPException(
status_code=500,
detail={"error": CommonProxyErrors.db_not_connected_error.value},
)
if premium_user is None:
raise HTTPException(
status_code=500, detail={"error": CommonProxyErrors.not_premium_user.value}
)
# Count number of rows in LiteLLM_UserTable
user_count = await prisma_client.db.litellm_usertable.count()
team_count = await prisma_client.db.litellm_teamtable.count()
if (
not premium_user_data
or premium_user_data is not None
and "max_users" not in premium_user_data
):
max_users = None
else:
max_users = premium_user_data.get("max_users")
if premium_user_data and "max_teams" in premium_user_data:
max_teams = premium_user_data.get("max_teams")
else:
max_teams = None
return {
"total_users": max_users,
"total_teams": max_teams,
"total_users_used": user_count,
"total_teams_used": team_count,
"total_teams_remaining": (max_teams - team_count if max_teams else None),
"total_users_remaining": (max_users - user_count if max_users else None),
}

View File

@@ -0,0 +1,30 @@
from typing import Optional
from litellm.proxy._types import GenerateKeyRequest, LiteLLM_TeamTable
def add_team_member_key_duration(
team_table: Optional[LiteLLM_TeamTable],
data: GenerateKeyRequest,
) -> GenerateKeyRequest:
if team_table is None:
return data
if data.user_id is None: # only apply for team member keys, not service accounts
return data
if (
team_table.metadata is not None
and team_table.metadata.get("team_member_key_duration") is not None
):
data.duration = team_table.metadata["team_member_key_duration"]
return data
def apply_enterprise_key_management_params(
data: GenerateKeyRequest,
team_table: Optional[LiteLLM_TeamTable],
) -> GenerateKeyRequest:
data = add_team_member_key_duration(team_table, data)
return data