From 598bfa32bb87484e56848e655cbb57317bf2444b Mon Sep 17 00:00:00 2001 From: JASHWANTH REDDY GUMMULA Date: Fri, 19 Jun 2026 09:39:07 +0530 Subject: [PATCH] feat(proxy): accept spend field on /team/member_update (#30783) --- litellm/proxy/_types.py | 4 ++++ .../management_endpoints/team_endpoints.py | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 8e2ec423cde..5e8caf55d85 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -3639,6 +3639,9 @@ class TeamMemberDeleteRequest(MemberDeleteRequest): class TeamMemberUpdateRequest(TeamMemberDeleteRequest): max_budget_in_team: Optional[float] = None + spend: Optional[float] = Field( + default=None, description="Amount spent by team member" + ) role: Optional[Literal["admin", "user"]] = None tpm_limit: Optional[int] = Field( default=None, description="Tokens per minute limit for this team member" @@ -3659,6 +3662,7 @@ class TeamMemberUpdateRequest(TeamMemberDeleteRequest): class TeamMemberUpdateResponse(MemberUpdateResponse): team_id: str max_budget_in_team: Optional[float] = None + spend: Optional[float] = None tpm_limit: Optional[int] = None rpm_limit: Optional[int] = None budget_duration: Optional[str] = None diff --git a/litellm/proxy/management_endpoints/team_endpoints.py b/litellm/proxy/management_endpoints/team_endpoints.py index 9be4c8a552a..e87d1647d36 100644 --- a/litellm/proxy/management_endpoints/team_endpoints.py +++ b/litellm/proxy/management_endpoints/team_endpoints.py @@ -3028,6 +3028,28 @@ async def team_member_update( team_default_budget_id=team_default_budget_id, ) + ### update team member spend + if data.spend is not None: + await prisma_client.db.litellm_teammembership.update( + where={"user_id_team_id": {"user_id": received_user_id, "team_id": data.team_id}}, + data={"spend": data.spend} + ) + + from litellm.proxy.proxy_server import spend_counter_cache + if spend_counter_cache is not None: + _counter_key = f"spend:team_member:{received_user_id}:{data.team_id}" + if spend_counter_cache.in_memory_cache is not None: + spend_counter_cache.in_memory_cache.set_cache( + key=_counter_key, value=data.spend, ttl=60 + ) + if spend_counter_cache.redis_cache is not None: + try: + await spend_counter_cache.redis_cache.async_set_cache( + key=_counter_key, value=data.spend, ttl=60 + ) + except Exception: + pass + ### update team member role if data.role is not None: team_members: List[Member] = [] @@ -3056,6 +3078,7 @@ async def team_member_update( user_id=received_user_id, user_email=data.user_email, max_budget_in_team=data.max_budget_in_team, + spend=data.spend, tpm_limit=data.tpm_limit, rpm_limit=data.rpm_limit, budget_duration=data.budget_duration,