
    ^hy                     n   S r SSKrSSKrSSKrSSKrSSKJrJrJr  SSKJ	r	J
r
Jr  SSKrSSKJrJrJrJrJrJr  SSKJr  SSKrSSKJr  SSKJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0  SS	K1J2r2J3r3  SS
K4J5r5  SSK6J7r7J8r8  SSK9J:r:  \" 5       r;S\0S\S\<4S jr= S7S\:S\	\>   S\
\>   S\	\   4S jjr?\;R                  SS/\" \55      /\S9\8\" \55      \" SSS94S\%S\S\0S\
\>   4S jj5       5       rAS\/S\
\>   S\:S\0S\>S\
\>   4S  jrB\;R                  S!S/\" \55      /S"9\8\" \55      \" SSS94S\/S\S\0S\
\>   4S# jj5       5       rC\;R                  S$S/\" \55      /\(S9\8\" \55      4S\+S\S\04S% jj5       5       rD\;R                  S&S/\" \55      /S"9\8\" \55      4S\,S\S\04S' jj5       5       rE\;R                  S(S/\" \55      /\.S9\8\" \55      4S\-S\S\04S) jj5       5       rF\;R                  S*S/\" \55      /S"9\8\" \55      \" SSS94S\S\S\0S\
\>   4S+ jj5       5       rG\;R                  S,S/\" \55      /S"9\8\R                  " SS-S.9\" \55      4S\S\>S\04S/ jj5       5       rJ\;R                  S0S/\" \55      /S"9\8\" \55      4S\S\S\04S1 jj5       5       rK\;R                  S2S/\" \55      /S"9\8\" \55      4S\S\S\04S3 jj5       5       rL\;R                  S4S/\" \55      /S"9\8\R                  " SS5S.9\" \55      4S\S\
\>   S\04S6 jj5       5       rMg)8zb
TEAM MANAGEMENT

All /team management endpoints 

/team/new
/team/info
/team/update
/team/delete
    N)datetime	timedeltatimezone)ListOptionalUnion)	APIRouterDependsHeaderHTTPExceptionRequeststatus)	BaseModel)verbose_proxy_logger)BlockTeamRequestCommonProxyErrorsDeleteTeamRequestLiteLLM_AuditLogsLiteLLM_ModelTableLiteLLM_TeamMembershipLiteLLM_TeamTableLiteLLM_TeamTableCachedObjLiteLLM_UserTableLitellmTableNamesLitellmUserRolesMemberNewTeamRequestProxyErrorTypesProxyExceptionTeamAddMemberResponseTeamInfoResponseObjectTeamListResponseObjectTeamMemberAddRequestTeamMemberDeleteRequestTeamMemberUpdateRequestTeamMemberUpdateResponseUpdateTeamRequestUserAPIKeyAuth) allowed_route_check_inside_routeget_team_object)user_api_key_auth)add_new_membermanagement_endpoint_wrapper)PrismaClientuser_api_key_dictteam_objreturnc                     UR                    H.  nUR                  c  M  UR                  U R                  :X  d  M.    g   g)NTF)members_with_rolesuser_id)r/   r0   members      k/home/james-whalen/.local/lib/python3.13/site-packages/litellm/proxy/management_endpoints/team_endpoints.py_is_user_team_adminr7   A   s8     -->>%&..<M<U<U*U .     prisma_clientteam_idr4   c           	      0  #    [        U[        5      (       d  [        U5      nU R                  R                  R	                  Ub  USU0S.OSSU00SS0S9I Sh  vN n/ nU H+  nUR                  [        S0 UR                  5       D65        M-     U$  N97f)	z)Get all team memberships for a given userNin)r4   r:   r:   litellm_budget_tableT)whereinclude )
isinstancestrdblitellm_teammembership	find_manyappendr   
model_dump)r9   r:   r4   team_membershipsreturned_tmtms         r6   get_all_team_membershipsrK   K   s     
 gs##g,*--DDNN "  T7O<dG_-'. O   13K1DBMMODE  s   ABB:Bz	/team/newzteam management)tagsdependenciesresponse_modelzThe litellm-changed-by header enables tracking of actions performed by authorized users on behalf of other users, providing an audit trail for accountability)descriptiondatahttp_requestlitellm_changed_byc                 :  #    SSK JnJnJnJn  Uc  [        SSS0S9eU R                  c$  [        [        R                  " 5       5      U l        O@UR                  U R                  SS	S
9I Sh  vN nUb  [        SSSU R                   S30S9eUR                  b  UR                  [        R                  :w  Ga|  U R                  bM  UR                  b@  U R                  UR                  :  a&  [        SSSUR                   SUR                   30S9eU R                  bM  UR                  b@  U R                  UR                  :  a&  [        SSSUR                   SUR                   30S9eU R                   bM  UR                   b@  U R                   UR                   :  a&  [        SSSUR                    SUR                   30S9eU R"                  ba  [%        UR"                  5      S:  aH  U R"                   H8  n	XR"                  ;  d  M  [        SSSUR"                   SUR&                   30S9e   UR&                  be  Sn
U R(                   H!  nUR&                  UR&                  :X  d  M  Sn
M#     U
SL a-  U R(                  R+                  [-        SUR&                  S95        SnU R.                  b  [1        U R.                  [2        5      (       a  [5        [6        R8                  " U R.                  5      UR&                  =(       d    UUR&                  =(       d    US9nUR:                  R<                  R?                  0 UR7                  SS9E5      I Sh  vN nUR@                  n[C        S+0 U R7                  5       DSU0D6nU RD                  bk  SSK J#n  USLa&  [I        S[J        RL                  RN                   35      eURP                  c  SU RD                  0Ul(        OU RD                  URP                  S'   URR                  bE  U" URR                  S9n[T        RV                  " [X        RZ                  5      []        US9-   nUUl/        URa                  SS9nURc                  US 9nUR:                  Rd                  R?                  US!S0S"9I Sh  vN nUR(                   HM  nURg                  UR&                  UR&                  UR                  /S#.S$S%UR                  /00S&9I Sh  vN   MO     [h        Rj                  SL a  UR7                  SS9n[6        R8                  " U[        S'9n[l        Rn                  " U" [q        [        [        R                  " 5       5      [T        RV                  " [X        RZ                  5      U=(       d    UR&                  =(       d    UURr                  [t        Rv                  U R                  S(USS)9	S*95         URa                  5       $  GN GN GNY GN! [x         a    UR3                  5       s $ f = f7f),uh  
Allow users to create a new team. Apply user permissions to their team.

👉 [Detailed Doc on setting team budgets](https://docs.litellm.ai/docs/proxy/team_budgets)


Parameters:
- team_alias: Optional[str] - User defined team alias
- team_id: Optional[str] - The team id of the user. If none passed, we'll generate it.
- members_with_roles: List[{"role": "admin" or "user", "user_id": "<user-id>"}] - A list of users and their roles in the team. Get user_id when making a new user via `/user/new`.
- metadata: Optional[dict] - Metadata for team, store information for team. Example metadata = {"extra_info": "some info"}
- tpm_limit: Optional[int] - The TPM (Tokens Per Minute) limit for this team - all keys with this team_id will have at max this TPM limit
- rpm_limit: Optional[int] - The RPM (Requests Per Minute) limit for this team - all keys associated with this team_id will have at max this RPM limit
- max_budget: Optional[float] - The maximum budget allocated to the team - all keys for this team_id will have at max this max_budget
- budget_duration: Optional[str] - The duration of the budget for the team. Doc [here](https://docs.litellm.ai/docs/proxy/team_budgets)
- models: Optional[list] - A list of models associated with the team - all keys for this team_id will have at most, these models. If empty, assumes all models are allowed.
- blocked: bool - Flag indicating if the team is blocked or not - will stop all calls from keys with this team_id.
- members: Optional[List] - Control team members via `/team/member/add` and `/team/member/delete`. 
- tags: Optional[List[str]] - Tags for [tracking spend](https://litellm.vercel.app/docs/proxy/enterprise#tracking-spend-for-custom-tags) and/or doing [tag-based routing](https://litellm.vercel.app/docs/proxy/tag_routing).
- organization_id: Optional[str] - The organization id of the team. Default is None. Create via `/organization/new`.
- model_aliases: Optional[dict] - Model aliases for the team. [Docs](https://docs.litellm.ai/docs/proxy/team_based_routing#create-team-with-model-alias)

Returns:
- team_id: (str) Unique team id - used for tracking spend across multiple keys for same team id.

_deprecated_params:
- admins: list - A list of user_id's for the admin role
- users: list - A list of user_id's for the user role

Example Request:
```
curl --location 'http://0.0.0.0:4000/team/new'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data '{
  "team_alias": "my-new-team_2",
  "members_with_roles": [{"role": "admin", "user_id": "user-1234"},
    {"role": "user", "user_id": "user-2434"}]
}'

```

 ```
curl --location 'http://0.0.0.0:4000/team/new'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data '{
            "team_alias": "QA Prod Bot", 
            "max_budget": 0.000000001, 
            "budget_duration": "1d"
        }'
```
r   )create_audit_log_for_updateduration_in_secondslitellm_proxy_admin_namer9   N  errorNo db connectedstatus_codedetailteamfind_uniquer:   
table_name
query_type  z
Team id = z0 already exists. Please use a different team id.z/tpm limit higher than user max. User tpm limit=z. User role=z/rpm limit higher than user max. User rpm limit=z1max budget higher than user max. User max budget=z6Model not in allowed user models. User allowed models=z
. User id=FTadmin)roler4   model_aliases
created_by
updated_byexclude_nonemodel_idpremium_user*Only premium users can add tags to teams. rL   durationsecondsdb_datalitellm_model_table)rP   r?   )r4   teamsrv   zpush )r4   rP   update_key_values_custom_querydefaultcreated	id
updated_at
changed_bychanged_by_api_keyr`   	object_idactionupdated_valuesbefore_valuerequest_datar@   )=litellm.proxy.proxy_serverrT   rU   rV   r9   r   r:   rB   uuiduuid4get_data	user_roler   PROXY_ADMIN	tpm_limit	rpm_limit
max_budgetmodelslenr4   r3   rF   r   rf   rA   dictr   jsondumpsrC   litellm_modeltablecreater|   r   rL   rm   
ValueErrorr   not_premium_uservaluemetadatabudget_durationr   nowr   utcr   budget_reset_atrG   jsonify_team_objectlitellm_teamtableupdate_datalitellmstore_audit_logsasynciocreate_taskr   api_keyr   TEAM_TABLE_NAME	Exception)rP   rQ   r/   rR   rT   rU   rV   r9   _existing_team_idmcreating_user_in_listr5   	_model_idr   
model_dictcomplete_team_datarm   
duration_sreset_atcomplete_team_data_dictteam_rowuser_updated_valuess                          r6   new_teamr   d   sS    J  W>O4PQQ||4::<( #0"8"8LLV #9 #
 
 (z$,,7gh  	##+&&*:*F*FF NN&!++7!2!<!<<NO`OjOjNkkw  yJ  yT  yT  xU  V  NN&!++7!2!<!<<NO`OjOjNkkw  yJ  yT  yT  xU  V  OO'!,,8"3">">>PQbQmQmPnnz  |M  |W  |W  {X  Y  ;;"s+<+C+C'Dq'H[[444'$'#']^o^v^v]w  xB  CT  C\  C\  B]  &^   !   , %--F~~!2!:!::(,% . !E)##**G->-F-FG
 I%*T5G5G*N*N/**T%7%78(00L4L(00L4L

 )++>>EE:!&&D&9:
 

 MM	 + 
))+ yy;t#<=N=_=_=e=e<fg  &&.+1499*='26))''/ ))5(2D2T2TU
<<-	*0MM-5*0;;;N+??' @  )6(8(8(J(J(Q(Q$&- )R ) #H #55''LL!\\X5E5E4FGh../, ( 
 	
 	
 6 4',11t1D**_cB'.4::<('||HLL91  0(00 0/'8'@'@0@@"ll$#2!%	
$""$$}
`
F#	
H  }}s~   A+X-W/.FXAX1C,XW2D>XW5AX5W86C(XW; .X2X5X8X;XXXXrk   rV   c           	      D  #    UnU R                   Gb  [        U R                   [        5      (       a  [        [        R
                  " U R                   5      UR                  =(       d    UUR                  =(       d    US9nUc;  UR                  R                  R                  0 UR	                  SS9ES9I Sh  vN nOOUR                  R                  R                  SU00 UR	                  SS9E0 UR	                  SS9ES.S9I Sh  vN nUR                  nU$  Nb N7f)	z,
Upsert model table and return the model id
Nre   Tri   rP   r|   )updater   r>   rP   )rf   rA   r   r   r   r   r4   rC   r   r   upsertr|   )rP   rk   r9   r/   rV   r   r   r   s           r6   _update_model_tabler   Z  s*     I%*T5G5G*N*N/**T%7%78(00L4L(00L4L

 ,//BBIIC*//T/BC  J   J  -//BBIIX&L!3!8!8d!8!KLL!3!8!8d!8!KL  J   J MM	s%   B7D 9D:AD 	D
D D z/team/update)rL   rM   c                   #    SSK Jn  SSKJnJnJnJnJn	Jn
  Uc  [        SSS0S9eU R                  c  [        S	SS
0S9e[        R                  " SU 5        UR                  R                  R                  SU R                  0S9I Sh  vN nUc  [        SSSU R                   30S9eU R!                  SS9nU R"                  bB  U" U R"                  S9n[$        R&                  " [(        R*                  5      [-        US9-   nXS'   SU;   ad  US   b^  SSKJn  USLa&  [1        S[2        R4                  R6                   35      eUR9                  S5      nSU;   a  US   b	  UUS   S'   OSU0US'   SU;   a8  UR9                  S5        [;        U UR<                  UUUS9I Sh  vN nUb  UUS'   UR?                  US9nUR                  R                  RA                  SU R                  0USS0S9I Sh  vN nUb  UR                  c  [        S	SSRC                  U5      0S9eU" UR                  [E        S&0 URG                  5       D6U
U	S 9I Sh  vN   [H        RJ                  SL a  UR!                  SS9n[         RL                  " U[N        S!9n[         RL                  " U[N        S!9n[P        RR                  " U" [U        [O        [V        RX                  " 5       5      [$        R&                  " [(        R*                  5      U=(       d    URZ                  =(       d    UUR\                  [^        R`                  U R                  S"UUS#9	S$95        UR                  US%.$  GN GN GNp GN7f)'a$	  
Use `/team/member_add` AND `/team/member/delete` to add/remove new team members  

You can now update team budget / rate limits via /team/update

Parameters:
- team_id: str - The team id of the user. Required param.
- team_alias: Optional[str] - User defined team alias
- metadata: Optional[dict] - Metadata for team, store information for team. Example metadata = {"team": "core-infra", "app": "app2", "email": "ishaan@berri.ai" }
- tpm_limit: Optional[int] - The TPM (Tokens Per Minute) limit for this team - all keys with this team_id will have at max this TPM limit
- rpm_limit: Optional[int] - The RPM (Requests Per Minute) limit for this team - all keys associated with this team_id will have at max this RPM limit
- max_budget: Optional[float] - The maximum budget allocated to the team - all keys for this team_id will have at max this max_budget
- budget_duration: Optional[str] - The duration of the budget for the team. Doc [here](https://docs.litellm.ai/docs/proxy/team_budgets)
- models: Optional[list] - A list of models associated with the team - all keys for this team_id will have at most, these models. If empty, assumes all models are allowed.
- blocked: bool - Flag indicating if the team is blocked or not - will stop all calls from keys with this team_id.
- tags: Optional[List[str]] - Tags for [tracking spend](https://litellm.vercel.app/docs/proxy/enterprise#tracking-spend-for-custom-tags) and/or doing [tag-based routing](https://litellm.vercel.app/docs/proxy/tag_routing).
- organization_id: Optional[str] - The organization id of the team. Default is None. Create via `/organization/new`.
- model_aliases: Optional[dict] - Model aliases for the team. [Docs](https://docs.litellm.ai/docs/proxy/team_based_routing#create-team-with-model-alias)

Example - update team TPM Limit

```
curl --location 'http://0.0.0.0:4000/team/update'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data-raw '{
    "team_id": "8d916b1c-510d-4894-a334-1c16a93344f5",
    "tpm_limit": 100
}'
```

Example - Update Team `max_budget` budget
```
curl --location 'http://0.0.0.0:4000/team/update'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data-raw '{
    "team_id": "8d916b1c-510d-4894-a334-1c16a93344f5",
    "max_budget": 10
}'
```
r   )_cache_team_object)rT   rU   rV   r9   proxy_logging_objuser_api_key_cacheNrW   rX   rY   rZ   rb   No team id passed inz/team/update - %sr:   r>     Team not found, passed team_id=Tri   ro   rq   r   rL   rl   rn   r   rf   )rP   rk   r9   r/   rV   rk   rs   ru   )r>   rP   r?   zTeam doesn't exist. Got={})r:   
team_tabler   r   rx   updatedr{   r   )r:   rP   r@   )1litellm.proxy.auth.auth_checksr   r   rT   rU   rV   r9   r   r   r   r:   r   debugrC   r   r^   r   r   r   r   r   r   r   rm   r   r   r   r   popr   rk   r   r   formatr   rG   r   r   r   rB   r   r   r   r   r   r4   r   r   r   )rP   rQ   r/   rR   r   rT   rU   rV   r9   r   r   existing_team_row
updated_kvr   r   rm   _tagsr   r   _before_value_after_values                        r6   update_teamr   ~  s    n B  W>O4PQQ||W>T4UVV2D9+..@@LL$,,' M    >t||nMN
 	

 -J '($2F2FG
<<-	*0MM )1$% 
6 2 >;t#<=N=_=_=e=e<fg  v&#
:(>(J-2Jz"6*&,e_Jz"*$'-&//'/%=
 
	  %.Jz"22:2FJ0077dll+*D1 8 
 	
  8++39@@JK
 	

   -F0C0C0EF-+	   4')..D.A

=#> JJz3?'.4::<('||HLL91  0(00 0/'8'@'@0@@"ll$#/!.	
$  ''::{J
	
sL   BM,
M DM,$M#%AM,6M&7AM,M)DM,#M,&M,)M,/team/member_addc                 	  #    SSK JnJnJnJn  Uc  [        SSS0S9eU R                  c  [        SSS	0S9eU R                  c  [        SSS
0S9e[        U R                  UUSUSSS9I Sh  vN nUc  [        SSS[        U SS5       30S9e[        S0 UR                  5       D6n[        US5      (       a\  UR                  [        R                  R                   :w  a4  [#        X(S9(       d&  [        SSSR%                  SUR                  5      0S9e/ n	/ n
['        U R                  [(        5      (       a]   [+        U R                  U R,                  UUUU R                  S9I Sh  vN u  pU	R3                  U5        Ub  U
R3                  U5        O['        U R                  [4        5      (       a  / nU R                   HW  n [+        UU R,                  UUUU R                  S9I Sh  vN u  pU	R3                  U5        Uc  MF  U
R3                  U5        MY     [6        R8                  " U6 I Sh  vN   ['        U R                  [(        5      (       a  U R                  nUR:                  cR  UR<                  bE  U	 H?  nUR<                  c  M  UR<                  UR<                  :X  d  M.  UR:                  Ul        MA     UR>                  R3                  U5        O['        U R                  [4        5      (       a  U R                  nU Hf  nUR:                  b  M  UR<                  c  M!  U	 H?  nUR<                  c  M  UR<                  UR<                  :X  d  M.  UR:                  Ul        MA     Mh     UR>                  RA                  U5        UR>                   Vs/ s H  oR                  5       PM     nnURB                  RD                  RG                  SU R                  0S[H        RJ                  " U5      0S9I Sh  vN nUc  [        SSSU R                   S30S9e[M        S0 UR                  5       DU	U
S.D6$  GN GN! [.         a?  n[        SSSR%                  U R                  U R                  [1        U5      5      0S9eSnAff = f GN! [.         a?  n[        SSSR%                  U R                  U R                  [1        U5      5      0S9eSnAff = f GNs  snf  N7f)a  
[BETA]

Add new members (either via user_email or user_id) to a team

If user doesn't exist, new user row will also be added to User Table

Only proxy_admin or admin of team, allowed to access this endpoint.
```

curl -X POST 'http://0.0.0.0:4000/team/member_add'     -H 'Authorization: Bearer sk-1234'     -H 'Content-Type: application/json'     -d '{"team_id": "45e3e396-ee08-4a61-a88e-16b3ce7e0849", "member": {"role": "user", "user_id": "krrish247652@berri.ai"}}'

```
r   )rV   r9   r   r   NrW   rX   rY   rZ   rb   r   zNo member/members passed inFT)r:   r9   r   parent_otel_spanr   check_cache_onlycheck_db_onlyr   zTeam not found for team_id=r:   r   r/   r0     JCall not allowed. User not proxy admin OR team admin. route={}, team_id={}r   )
new_membermax_budget_in_teamr9   r/   rV   r:   z6Unable to add user - {}, to team - {}, for reason - {}r3   r   zTeam with id z
 not found)updated_usersupdated_team_membershipsr@   )'r   rV   r9   r   r   r   r:   r5   r*   getattrr   rG   hasattrr   r   r   r   r7   r   rA   r   r,   r   r   rB   rF   r   r   gatherr4   
user_emailr3   extendrC   r   r   r   r   r    )rP   rQ   r/   rV   r9   r   r   r   r   r   r   updated_user
updated_tmetasksr   r   r   new_membersnm_db_team_membersupdated_teams                         r6   team_member_addr   &  s    :  W>O4PQQ||W>T4UVV{{W.K$L
 	
 .#-+   6wtYPT7U6VW
 	
 +L->-I-I-KL
 	!;//''+;+G+G+M+MM#/
 ell&&..
 	
 .0M=? $++v&&	-;;;#'#:#:+"3)A. ($L$ 	\*!$++J7	DKK	&	&A1? '+'>'>"/&7-E LL2 ,("   .%(//
;+ . nne$$$ $++v&&[[
 %**?*?*K%OO/:+@+@@)-J& & 	--44Z@	DKK	&	&kkBzz!bmm&?)D2t"--7W%)\\
 *  	--44[A 1C0U0UV0U10UV&));;BB$,,'"DJJ/?$@A C  L Wdll^:.V$W
 	
 ! 

!
!
##!9 IX(  	U\\T\\3q6 	",  # #!Y!`!` KKs1v"  	%> Ws   A*S,,Q-C
S,8/Q 'Q(Q .AS,%R*R+R1S,+S,2S"3AS,S,,A,S,S,+S,?S,AS,S%6AS,S*A S,Q 
R:RRS,R
S :SSS,%S,/team/member_deletec                   #    SSK Jn  Uc  [        SSS0S9eU R                  c  [        SSS	0S9eU R                  c  U R
                  c  [        SSS
0S9eUR                  R                  R                  SU R                  0S9I Sh  vN nUc%  [        SSSR                  U R                  5      0S9e[        S0 UR                  5       D6nUR                  [        R                  R                  :w  a4  [!        X%S9(       d&  [        SSSR                  SUR                  5      0S9e/ nUR"                   H  nU R                  b)  UR                  b  U R                  UR                  :X  a  M9  U R
                  b)  UR
                  b  U R
                  UR
                  :X  a  Mo  UR%                  U5        M     Xel        U Vs/ s H  owR                  5       PM     nnUR                  R                  R'                  SU R                  0S[(        R*                  " U5      0S9I Sh  vN n	0 n
U R                  b  U R                  U
S'   OU R
                  b  U R
                  U
S'   UR                  R,                  R/                  U
S9I Sh  vN nUb  [1        U[2        5      (       a  [5        U5      S:  a  U H  n/ nU R                  UR6                  ;   d  M!  UR6                  nUR9                  U R                  5        UR                  R,                  R'                  SUR                  0SSU00S9I Sh  vN   M     U$  GNs  snf  GN& N N7f)aj  
[BETA]

delete members (either via user_email or user_id) from a team

If user doesn't exist, an exception will be raised
```
curl -X POST 'http://0.0.0.0:8000/team/member_delete' 
-H 'Authorization: Bearer sk-1234' 
-H 'Content-Type: application/json' 
-d '{
    "team_id": "45e3e396-ee08-4a61-a88e-16b3ce7e0849",
    "user_id": "krrish247652@berri.ai"
}'
```
r   r9   NrW   rX   rY   rZ   rb   r   2Either user_id or user_email needs to be passed inr:   r   Team id={} does not exist in dbr   r   r   r   r3   r   r4   r   rv   setr@   )r   r9   r   r:   r4   r   rC   r   r^   r   r   rG   r   r   r   r   r7   r3   rF   r   r   r   litellm_usertablerE   rA   listr   rv   remove)rP   rQ   r/   r9   _existing_team_rowr   new_team_membersr   _db_new_team_members_key_valexisting_user_rowsexisting_user	team_lists                 r6   team_member_deleter     sW    < 9W>O4PQQ||W>T4UVV|| 7QR
 	

  -//AAMM$,,'  N    !>EEdllST
 	
 *L,>,I,I,KL
 	##'7'C'C'I'II#/
 ell)+<+D+D
 	
 &(11LL$		%		)OO'(1<</" 2 ,<(@P'Q@P1@P'Q0077t||
 #DJJ/C$DE	 8  	A G||!\\			$ $,//AAKK  L    %%t,,5G1H11L/MI||}222)//	  .#&&88??!=#8#8 "E9#56	 @    0 c\ (R	s_   BM	M	
D=MM AM+M,A%MMA
M AM>M?MMMMz/team/member_updatec                 @  #    SSK Jn  Uc  [        SSS0S9eU R                  c  [        SSS	0S9eU R                  c  U R
                  c  [        SSS
0S9eUR                  R                  R                  SU R                  0S9I Sh  vN nUc%  [        SSSR                  U R                  5      0S9e[        S0 UR                  5       D6nUR                  [        R                  R                  :w  a4  [!        X%S9(       d&  [        SSSR                  SUR                  5      0S9e[#        UU R                  US9I Sh  vN nSnU R                  b  U R                  nOZU R
                  bM  US   R$                   H:  nUR
                  c  M  UR
                  U R
                  :X  d  M.  UR                  n  O   Uc  [        SSSR                  U 5      0S9eSn	US    H!  n
U
R                  U:X  d  M  U
R&                  n	  O   U	c  UR                  R(                  R+                  U R,                  UR                  =(       d    SUR                  =(       d    SS.S9I Sh  vN nUR                  R.                  R+                  U R                  UUR&                  S.S9I Sh  vN   O:UR                  R(                  R1                  SU	0SU R,                  0S9I Sh  vN   [3        U R                  UU R
                  U R,                  S9$  GN GN N Nq N87f)z$
[BETA]

Update team member budgets
r   r   NrW   rX   rY   rZ   rb   r   r   r:   r   r   r   r   r   r   )rQ   r:   r/   	team_infoz,User id doesn't exist in team table. Data={}rH    )r   rg   rh   r   )r:   r4   	budget_idr   r   r   )r:   r4   r   r   r@   )r   r9   r   r:   r4   r   rC   r   r^   r   r   rG   r   r   r   r   r7   r   r3   r   litellm_budgettabler   r   rD   r   r&   )rP   rQ   r/   r9   r   r   returned_team_inforeceived_user_idr5   identified_budget_idrJ   
new_budgets               r6   team_member_updater  `  sP    " 9W>O4PQQ||W>T4UVV|| 7QR
 	

  -//AAMM$,,'  N    !>EEdllST
 	
 *L,>,I,I,KL
 	##'7'C'C'I'II#/
 ell)+<+D+D
 	
 8A!+8 2 '+||<<		$(5HHF  ,1B1Bdoo1U#)>>  I
 GNNtT
 	
 +/ !34::))#%<<  5 #(++??FF"55/77=2/77=2 G 
 

 55<<<<+'11 = 
 	
 	
 2299 45 7 78 : 
 	
 	

 $ ??22	 c82@
	
	
sq   BL	L
B9LLA
LL.AL8A-L%L&AL(L):L#L$/LLLLLz/team/deletec                 f  #    SSK JnJnJn  Uc  [	        SSS0S9eU R
                  c  [	        SSS	0S9eU R
                   H.  nUR                  US
SS9I Sh  vN nUb  M!  [	        SSSU 30S9e   [        R                  SL a  U R
                   H  nUR                  US
SS9I Sh  vN nUc  M!  UR                  SS9n	[        R                  " U" [        [        [        R                  " 5       5      [         R"                  " [$        R&                  5      U=(       d    UR(                  =(       d    UUR*                  [,        R.                  USSU	S9	S95        M     UR1                  U R
                  SS9I Sh  vN   UR1                  U R
                  S
S9I Sh  vN n
U
$  GNO GN N. N7f)ay  
delete team and associated team keys

Parameters:
- team_ids: List[str] - Required. List of team IDs to delete. Example: ["team-1234", "team-5678"]

```
curl --location 'http://0.0.0.0:4000/team/delete'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data-raw '{
    "team_ids": ["8d916b1c-510d-4894-a334-1c16a93344f5"]
}'
```
r   )rT   rV   r9   NrW   rX   rY   rZ   rb   r   r]   r^   r_   r   r   Tri   deletedz{}r{   r   key)team_id_listr`   )r   rT   rV   r9   r   team_idsr   r   r   r   r   r   r   rB   r   r   r   r   r   r   r4   r   r   r   delete_data)rP   rQ   r/   rR   rT   rV   r9   r:   r   	_team_rowdeleted_teamss              r6   delete_teamr    s    8  W>O4PQQ}}W>T4UVV ==&//= 0 
 
 #B7)!LM  ! 4'}}G:G:P:PF} ;Q ; 5H  48I+!2tzz|,#+<<#=#5 $4,44$43+<+D+D#4#D#D")('+%." %> 
#
#5
#
QQQ'33]]v 4  M c
5< RsP   AF1F'F1"AF1)F**CF1>F-?!F1 F/!F1*F1-F1/F1z
/team/infoz!Team ID in the request parameters)ry   rO   c                   #    SSK Jn   Uc  [        [        R                  SS0S9eUc  [        [        R
                  SS0S9eUR                  [        R                  R                  :X  d(  UR                  [        R                  R                  :X  a  ONUR                  b  XR                  :w  a2  [        [        R                  S	R                  UR                  U5      S9eUR                  US
SS9I Sh  vN nUc  [        [        R                  SSU S30S9eUR                  USS[         R"                  " 5       S9I Sh  vN nUc  / nUc  SnU H  nU[%        USS5      -  nM     SU0nU H&  n UR'                  5       nUR-                  SS5        M(     [/        X1/SS9I Sh  vN n	[1        U[*        5      (       a  [3        S0 UD6n
O9[1        U[4        5      (       a  [3        S0 UR'                  5       D6n
O
[3        5       n
[7        UU
UU	S9nU$  GN! N! [(         a    UR+                  5       n Nf = f N! [(         a  n[8        R:                  " SR                  U[<        R>                  " 5       5      5        [1        U[        5      (       aV  [A        [%        USS[C        U5       S35      [D        RF                  [%        USS5      [%        US[        RH                  5      S9e[1        U[@        5      (       a  Ue[A        S[C        U5      -   [D        RF                  [%        USS5      [        RH                  S9eSnAff = f7f) a  
get info on team + related keys

Parameters:
- team_id: str - Required. The unique identifier of the team to get info on.

```
curl --location 'http://localhost:4000/team/info?team_id=your_team_id_here'     --header 'Authorization: Bearer your_api_key_here'
```
r   r   NrX   zDatabase not connected. Connect a database to your proxy - https://docs.litellm.ai/docs/simple_proxy#managing-auth---virtual-keysrZ   messagez(Malformed request. No team id passed in.zPkey not allowed to access this team's info. Key team_id={}, Requested team_id={}r]   r^   r_   z Team not found, passed team id: .r  find_all)r:   r`   ra   expiresspendtokenr4   )r:   r   keysrH   z\litellm.proxy.management_endpoints.team_endpoints.py::team_info - Exception occurred - {}
{}r\   zAuthentication Error()paramNoner[   )r  typer  codezAuthentication Error, r@   )%r   r9   r   r   HTTP_500_INTERNAL_SERVER_ERRORHTTP_422_UNPROCESSABLE_ENTITYr   r   r   r   PROXY_ADMIN_VIEW_ONLYr:   HTTP_403_FORBIDDENr   r   HTTP_404_NOT_FOUNDr   r   r   rG   r   r   r   rK   rA   r   r   r!   r   rX   	traceback
format_excr   rB   r   
auth_errorHTTP_400_BAD_REQUEST)rQ   r:   r/   r9   r   r  r  kr  rI   
_team_inforesponse_objectr   s                r6   r   r   6  sa    , 9l
 "AA  a  ?"@@!#MN  ''+;+G+G+M+MM **55;;< &&.000"55ipp%--w   ((F} )   	
 "55!%EgYa#PQ  #++!LLN	 , 
 
 <DEGQ//  %(I C!nn& GGGT"  59d
 
 i&&*7Y7J	9--*DY-A-A-CDJ*,J0 (	
 o
*  !hhj!
&  
""krr9'')	

 a'' 8/DSVHA-NO$//a&1Qv/J/JK	  >**G,s1v5 ++!Wf-,,	
 	

s   MC-H? 7H8AH? H0H? 7H$H? +H=,A+H? MH? H? H:7H? 9H::H? ?
M	C:MMMz/team/blockc                    #    SSK Jn  Uc  [        S5      eUR                  R                  R                  SU R                  0SS0S9I Sh  vN nUc  [        S	S
SU R                   30S9eU$  N"7f)a  
Blocks all calls from keys with this team id.

Parameters:
- team_id: str - Required. The unique identifier of the team to block.

Example:
```
curl --location 'http://0.0.0.0:4000/team/block'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data '{
    "team_id": "team-1234"
}'
```

Returns:
- The updated team record with blocked=True



r   r   NNo DB Connected.r:   blockedTr   r   rX   r   rZ   r   r9   r   rC   r   r   r:   r   rP   rQ   r/   r9   records        r6   
block_teamr.    s     > 9*++ ##55<<$,,'y$.? =  F ~>t||nMN
 	

 M   A
A1A/#A1z/team/unblockc                    #    SSK Jn  Uc  [        S5      eUR                  R                  R                  SU R                  0SS0S9I Sh  vN nUc  [        S	S
SU R                   30S9eU$  N"7f)aQ  
Blocks all calls from keys with this team id.

Parameters:
- team_id: str - Required. The unique identifier of the team to unblock.

Example:
```
curl --location 'http://0.0.0.0:4000/team/unblock'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data '{
    "team_id": "team-1234"
}'
```
r   r   Nr)  r:   r*  Fr   r   rX   r   rZ   r+  r,  s        r6   unblock_teamr1    s     2 9*++ ##55<<$,,'y%.@ =  F ~>t||nMN
 	

 Mr/  z
/team/listz1Only return teams which this 'user_id' belongs toc           
        #    SSK Jn  [        X!S9(       d%  [        SSSR	                  UR
                  5      0S9eUc$  [        S	S[        R                  R                  0S9eUR                  R                  R                  5       I Sh  vN n/ nU(       a\  U HU  nUR                  (       d  M  UR                   H/  nS
U;   d  M  US
   c  M  US
   U:X  d  M  UR                  U5        M1     MW     OUnU Vs/ s H  ofR                  PM     nn[        X8US9I Sh  vN n	/ n
U H  n/ nU	 H0  nUR                  UR                  :X  d  M  UR                  U5        M2     UR                  R                   R                  SUR                  0S9I Sh  vN n U
R                  [#        S0 UR%                  5       DUUS.D65        M     U
R/                  S S9  U
$  GNSs  snf  N NR! [&         aV  nSR	                  UR                  UR%                  5       [)        U5      5      n[*        R,                  " U5         SnAGM  SnAff = f7f)z
```
curl --location --request GET 'http://0.0.0.0:4000/team/list'         --header 'Authorization: Bearer sk-1234'
```

Parameters:
- user_id: str - Optional. If passed will only return teams that the user_id is a member of.
r   r   )r/   requested_user_idi  rX   zCOnly admin users can query all teams/other teams. Your user role={}rZ   Nrb   r4   r  r:   r   )rH   r  zWInvalid team object for team_id: {}. team_object={}.
            Error: {}
            c                 .    [        U SS5      =(       d    S$ )N
team_aliasr   )r   )xs    r6   <lambda>list_team.<locals>.<lambda>t  s    71lB+G+M2+Mr8   )r  r@   )r   r9   r)   r   r   r   r   db_not_connected_errorr   rC   r   rE   r3   rF   r:   rK   litellm_verificationtokenr"   rG   r   rB   r   	exceptionsort)rQ   r4   r/   r9   responsefiltered_responser]   r5   	_team_idsrI   returned_responses_team_membershipsrJ   r  r   team_exceptions                   r6   	list_teamrC    sK    ( 9++ ^ee%//
 	
 .EEKKL
 	

 #%%77AACCHD&&&"55F!V+"9-9"9-8)006 6  %*;<*;$*;I<0' K 8:!:<BzzT\\)!((, 
 #%%??IIdll+ J 
 
	%%& oo'%6 "8  NOi D" =
  	doo/Q 
 !**>:	s   BI
G!I0III I:G IG%*IAIG'I-G)I I'I)
I	3A
I=II		I)N)N__doc__r   r   r!  r   r   r   r   typingr   r   r   fastapir	   r
   r   r   r   r   pydanticr   r   litellm._loggingr   litellm.proxy._typesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r   r)   r*   $litellm.proxy.auth.user_api_key_authr+   &litellm.proxy.management_helpers.utilsr,   r-   litellm.proxy.utilsr.   routerboolr7   rB   rK   postr   r   r   r   r   r  r  getQueryr   r.  r1  rC  r@   r8   r6   <module>rR     s  	     2 2 ( (  N N   1      4 C -	%1B	 OS*.s)>Fsm	
 !2 
	+,-$	    )00A(B(. t)	l
ll &l !	l l^!
!sm!  ! &	!
 "! c]!H +,GDU<V;W    )00A(B(. t)	a;
a;a; &a; !	a; a;H 
	+,-(	    )00A(Bp
pp &p pf 
	+,-  
  )00A(Bw
!ww &w wt 
	+,-+	    )00A(Bn
!nn &n nb +,GDU<V;W    )00A(B(. t)	W
WW &W !	W Wt )*'BS:T9U    =="E )00A(B@
@
@

 &@
 @
F *+7CT;U:V    )00A(B*
** &* *Z ,-WEV=W<X    )00A(B$
$$ &$ $N )*'BS:T9U    %]]"U )00A(BXXc]X
 &X Xr8   