12
12
import asyncio
13
13
import json
14
14
import traceback
15
- from litellm ._uuid import uuid
16
15
from datetime import datetime , timezone
17
16
from typing import Any , Dict , List , Optional , Tuple , Union , cast
18
17
22
21
23
22
import litellm
24
23
from litellm ._logging import verbose_proxy_logger
24
+ from litellm ._uuid import uuid
25
25
from litellm .proxy ._types import (
26
26
BlockTeamRequest ,
27
27
CommonProxyErrors ,
105
105
106
106
class TeamMemberBudgetHandler :
107
107
"""Helper class to handle team member budget, RPM, and TPM limit operations"""
108
-
108
+
109
109
@staticmethod
110
110
def should_create_budget (
111
111
team_member_budget : Optional [float ] = None ,
112
112
team_member_rpm_limit : Optional [int ] = None ,
113
113
team_member_tpm_limit : Optional [int ] = None ,
114
114
) -> bool :
115
115
"""Check if any team member limits are provided"""
116
- return any ([
117
- team_member_budget is not None ,
118
- team_member_rpm_limit is not None ,
119
- team_member_tpm_limit is not None ,
120
- ])
121
-
116
+ return any (
117
+ [
118
+ team_member_budget is not None ,
119
+ team_member_rpm_limit is not None ,
120
+ team_member_tpm_limit is not None ,
121
+ ]
122
+ )
123
+
122
124
@staticmethod
123
125
async def create_team_member_budget_table (
124
126
data : Union [NewTeamRequest , LiteLLM_TeamTable ],
@@ -146,7 +148,7 @@ async def create_team_member_budget_table(
146
148
budget_id = budget_id ,
147
149
budget_duration = data .budget_duration ,
148
150
)
149
-
151
+
150
152
if team_member_budget is not None :
151
153
budget_request .max_budget = team_member_budget
152
154
if team_member_rpm_limit is not None :
@@ -165,12 +167,12 @@ async def create_team_member_budget_table(
165
167
new_team_data_json ["metadata" ][
166
168
"team_member_budget_id"
167
169
] = team_member_budget_table .budget_id
168
-
170
+
169
171
# Remove team member fields from new_team_data_json
170
172
TeamMemberBudgetHandler ._clean_team_member_fields (new_team_data_json )
171
173
172
174
return new_team_data_json
173
-
175
+
174
176
@staticmethod
175
177
async def upsert_team_member_budget_table (
176
178
team_table : LiteLLM_TeamTable ,
@@ -193,14 +195,14 @@ async def upsert_team_member_budget_table(
193
195
if team_member_budget_id is not None and isinstance (team_member_budget_id , str ):
194
196
# Budget exists - create update request with only provided values
195
197
budget_request = BudgetNewRequest (budget_id = team_member_budget_id )
196
-
198
+
197
199
if team_member_budget is not None :
198
200
budget_request .max_budget = team_member_budget
199
201
if team_member_rpm_limit is not None :
200
202
budget_request .rpm_limit = team_member_rpm_limit
201
203
if team_member_tpm_limit is not None :
202
204
budget_request .tpm_limit = team_member_tpm_limit
203
-
205
+
204
206
budget_row = await update_budget (
205
207
budget_obj = budget_request ,
206
208
user_api_key_dict = user_api_key_dict ,
@@ -221,11 +223,11 @@ async def upsert_team_member_budget_table(
221
223
team_member_rpm_limit = team_member_rpm_limit ,
222
224
team_member_tpm_limit = team_member_tpm_limit ,
223
225
)
224
-
226
+
225
227
# Remove team member fields from updated_kv
226
228
TeamMemberBudgetHandler ._clean_team_member_fields (updated_kv )
227
229
return updated_kv
228
-
230
+
229
231
@staticmethod
230
232
def _clean_team_member_fields (data_dict : dict ) -> None :
231
233
"""Remove team member fields from data dictionary"""
@@ -267,7 +269,6 @@ async def get_all_team_memberships(
267
269
return returned_tm
268
270
269
271
270
-
271
272
#### TEAM MANAGEMENT ####
272
273
@router .post (
273
274
"/team/new" ,
@@ -383,7 +384,7 @@ async def new_team( # noqa: PLR0915
383
384
"error" : f"Team id = { data .team_id } already exists. Please use a different team id."
384
385
},
385
386
)
386
-
387
+
387
388
# If max_budget is not explicitly provided in the request,
388
389
# check for a default value in the proxy configuration.
389
390
if data .max_budget is None :
@@ -503,7 +504,7 @@ async def new_team( # noqa: PLR0915
503
504
504
505
# Set Management Endpoint Metadata Fields
505
506
for field in LiteLLM_ManagementEndpoint_MetadataFields_Premium :
506
- if getattr (data , field ) is not None :
507
+ if getattr (data , field , None ) is not None :
507
508
_set_object_metadata_field (
508
509
object_data = complete_team_data ,
509
510
field_name = field ,
0 commit comments