
    gŎ              
          d Z ddlZddlZddlZddlmZmZmZ ddlmZm	Z	 ddl
Z
ddl
mZmZmZmZmZmZ ddlZddlmZ ddl ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ  e       Zde de!de fdZ"ejG                  ddg ee      ge$      e ee      fde!de%fd              Z&ejO                  ddgd ee      g       ee      fde%fd       Z(de	e)ee*   ee+   f      de,de	e)e*e-f      fdZ.ejO                  ddg ee      g      e e
j^                  dd       ee      fd e	e,   de%fd!              Z0d" Z1d#e	ee2      d$e	e)ee*   ee+   f      fd%Z3de de4de fd&Z5ejG                  d'dg ee      g      e ee      fde4de%fd(              Z6ejO                  d)dg ee      g      ejO                  d*dg ee      g       e
j^                  dd+       e
j^                  d,d,d-.       e
j^                  d/d,d0d12      fd3e	e,   d4e7d5e7fd6              Z8ejG                  d7dg ee      g      e ee       edd89      fde9de%d:e	e,   fd;              Z:d e,d<e,d=e;fd>Z<y)?z
Internal User Management Endpoints


These are members of a Team on LiteLLM

/user/new
/user/update
/user/delete
/user/info
/user/list
    N)datetime	timedeltatimezone)ListOptional)	APIRouterDependsHeaderHTTPExceptionRequeststatus)verbose_proxy_logger)*)user_api_key_auth)duration_in_secondsgenerate_key_helper_fnprepare_metadata_fields)management_endpoint_wrapper)handle_exception_on_proxy	data_jsondatareturnc                 t   d| v r%| d    t        t        j                               | d<   | j                  dd      }|du rd| d<   d}|j                  t
        j                  k(  rxd}t        j                  rft        j                  j                         D ]E  \  }}|| vs| |   || |<   |dk(  st        | |   t              s/t        | |         dk(  sA|| |<   G d	| v r*| d	   %|r#t        j                  t        j                  | d	<   d
| v r*| d
   %|r#t        j                  t        j                  | d
<   | S )Nuser_idauto_create_keyTFuser
table_namemodelsr   
max_budgetbudget_duration)struuiduuid4pop	user_roleLitellmUserRolesINTERNAL_USERlitellmdefault_internal_user_paramsitems
isinstancelistlenmax_internal_user_budgetinternal_user_budget_duration)r   r   r   is_internal_userkeyvalues         o/var/www/openai/venv/lib/python3.12/site-packages/litellm/proxy/management_endpoints/internal_user_endpoints.py _update_internal_new_user_paramsr4   &   sJ   I)I"6">"4::<0	)mm$5t<O% 	, ~~)777//%BBHHJ
Ui'9S>+A%*IcN8O"9S>48IcN+q0%*IcN K y Y|%<%D @ @ L&-&F&FIl#I%)4E*F*N E E Q+2+P+PI'(    	/user/newzInternal User management)tagsdependenciesresponse_modeluser_api_key_dictc                   K   ddl m}m} | j                         }t	        ||       }t        d+ddi| d{   }|j                  dd      mddlm}  |t        |j                  dd      t        |j                  dd      d|j                  d	d      
            t        ddd      |       d{    | j                  du rd|j                  dg       vrt        d      t        ddd|j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  d	d      |j                  dd      |j                  dd      
      }t        j                   |j"                  j%                  |              t'        |j                  dd      |j                  d!d      |d   |d   |j                  d"d      |j                  d	d      |j                  d#d      |j                  d$d      |j                  dd      |j                  d%d      |j                  d&d      |j                  d'd      |j                  d(d      |j                  d)d      *      S 7 D7 ȭw),a  
    Use this to create a new INTERNAL user with a budget.
    Internal Users can access LiteLLM Admin UI to make keys, request access to models.
    This creates a new user and generates a new api key for the new user. The new api key is returned.

    Returns user id, budget + new key.

    Parameters:
    - user_id: Optional[str] - Specify a user id. If not set, a unique id will be generated.
    - user_alias: Optional[str] - A descriptive name for you to know who this user id refers to.
    - teams: Optional[list] - specify a list of team id's a user belongs to.
    - user_email: Optional[str] - Specify a user email.
    - send_invite_email: Optional[bool] - Specify if an invite email should be sent.
    - user_role: Optional[str] - Specify a user role - "proxy_admin", "proxy_admin_viewer", "internal_user", "internal_user_viewer", "team", "customer". Info about each role here: `https://github.com/BerriAI/litellm/litellm/proxy/_types.py#L20`
    - max_budget: Optional[float] - Specify max budget for a given user.
    - budget_duration: Optional[str] - Budget is reset at the end of specified duration. If not set, budget is never reset. You can set duration as seconds ("30s"), minutes ("30m"), hours ("30h"), days ("30d"), months ("1mo").
    - models: Optional[list] - Model_name's a user is allowed to call. (if empty, key is allowed to call all models)
    - tpm_limit: Optional[int] - Specify tpm limit for a given user (Tokens per minute)
    - rpm_limit: Optional[int] - Specify rpm limit for a given user (Requests per minute)
    - auto_create_key: bool - Default=True. Flag used for returning a key as part of the /user/new response
    - aliases: Optional[dict] - Model aliases for the user - [Docs](https://litellm.vercel.app/docs/proxy/virtual_keys#model-aliases)
    - config: Optional[dict] - [DEPRECATED PARAM] User-specific config.
    - allowed_cache_controls: Optional[list] - List of allowed cache control values. Example - ["no-cache", "no-store"]. See all values - https://docs.litellm.ai/docs/proxy/caching#turn-on--off-caching-per-request-
    - blocked: Optional[bool] - [Not Implemented Yet] Whether the user is blocked.
    - guardrails: Optional[List[str]] - [Not Implemented Yet] List of active guardrails for the user
    - permissions: Optional[dict] - [Not Implemented Yet] User-specific permissions, eg. turning off pii masking.
    - metadata: Optional[dict] - Metadata for user, store information for user. Example metadata = {"team": "core-infra", "app": "app2", "email": "ishaan@berri.ai" }
    - max_parallel_requests: Optional[int] - Rate limit a user based on the number of parallel requests. Raises 429 error, if user's parallel requests > x.
    - soft_budget: Optional[float] - Get alerts when user crosses given budget, doesn't block requests.
    - model_max_budget: Optional[dict] - Model-specific max budget for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-budgets-to-keys)
    - model_rpm_limit: Optional[float] - Model-specific rpm limit for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-limits-to-keys)
    - model_tpm_limit: Optional[float] - Model-specific tpm limit for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-limits-to-keys)
    - spend: Optional[float] - Amount spent by user. Default is 0. Will be updated by proxy whenever user is used. You can set duration as seconds ("30s"), minutes ("30m"), hours ("30h"), days ("30d"), months ("1mo").
    - team_id: Optional[str] - [DEPRECATED PARAM] The team id of the user. Default is None. 
    - duration: Optional[str] - Duration for the key auto-created on `/user/new`. Default is None.
    - key_alias: Optional[str] - Alias for the key auto-created on `/user/new`. Default is None.

    Returns:
    - key: (str) The generated api key for the user
    - expires: (datetime) Datetime object for when key expires.
    - user_id: (str) Unique user id - used for tracking spend across multiple keys for same user id.
    - max_budget: (float|None) Max budget for given user.

    Usage Example 

    ```shell
     curl -X POST "http://localhost:4000/user/new"      -H "Content-Type: application/json"      -H "Authorization: Bearer sk-1234"      -d '{
         "username": "new_user",
         "email": "new_user@example.com"
     }'
    ```
    r   )general_settingsproxy_logging_objrequest_typer   Nteam_id)team_member_addr   
user_email)r   rolerA   )r?   memberhttpr6   typepathscope)r   http_requestr:   TemailalertingzyEmail alerting not setup on config.yaml. Please set `alerting=['email']. 
Docs: https://docs.litellm.ai/docs/proxy/email`internal_user_createdinternal_userzWelcome to LiteLLM Proxytoken spendg        r   zDefault Team	key_alias)
eventevent_groupevent_messagerO   rQ   r   r   rA   r?   rR   )webhook_eventexpiresr%   
user_aliasteamsmetadatar   	tpm_limit	rpm_limitr    )r1   rW   r   r   r%   rA   rX   rY   r?   rZ   r   r[   r\   r     )litellm.proxy.proxy_serverr<   r=   jsonr4   r   get1litellm.proxy.management_endpoints.team_endpointsr@   TeamMemberAddRequestMemberr   send_invite_email
ValueErrorWebhookEventasynciocreate_taskslack_alerting_instance&send_key_created_or_user_invited_emailNewUserResponse)r   r:   r<   r=   r   responser@   rS   s           r3   new_userrm   H   sg    D O		I0DAI+MM9MMH
 }}Y%1U%!i6%MM)T:(}}\4@ !%{; 0
 	
 	
 %*..z2>> M  )'4,,w+,,w,||L#6LLD1||L$7LLN;ll;5
 	55\\# ] 	
 LL"%Y-L)#,,{D1<<d3<<d3ll7D)Y-j$/||Hd+,,{D1,,{D1 %6= e N	
s#   5JI;A>J6I>7GJ>Jz/user/available_rolesF)r7   include_in_schemar8   c                    K   i }t         D ]i  }|t         j                  t         j                  t         j                  t         j                  fv sD|j
                  |j                  d||j                  <   k |S w)z
    Endpoint used by Admin UI to show all available roles to assign a user
    return {
        "proxy_admin": {
            "description": "Proxy Admin role",
            "ui_label": "Admin"
        }
    }
    )descriptionui_label)r&   PROXY_ADMINPROXY_ADMIN_VIEW_ONLYr'   INTERNAL_USER_VIEW_ONLYrp   rq   r2   )r:   _data_to_returnrB   s      r3   ui_get_available_rolerv      st     & O  ((22**44	
 
  $// MM+ODJJ' ! s   AA9*A9	team_listr?   c                 >    | y | D ]  }|j                   |k(  s|c S  y )N)r?   )rw   r?   teams      r3   get_team_from_listrz      s-     <<7"K  r5   
/user/info)r7   r8   z!User ID in the request parameters)defaultrp   r   c                   K   ddl m} 	 |t        d      | /|j                  t        j
                  k(  rt                d{   S | |j                  |        d{   }nd}g }g }ddlm	}  |t        ddd	
      | |       d{   }|4t        |t              r$|}|D ]  }|j                  |j                          d}	|||j                  |j                  dd       d{   }	|	t        |	t              r|	D ]=  }|j                  |vs|j                  |       |j                  |j                         ? n|j                   | |j                  |j                          d{   }
|
&|j                  |
j                  dd       d{   }	|	Rt        |	t              rB|	D ]=  }|j                  |vs|j                  |       |j                  |j                         ? |j                  | dd       d{   }||d}|D ]  }|t#        |dd      z  } d|i}t%        ||      }|j'                  d        t        |t(              r|j+                         n|}t-        | |||      }|S 7 B7 )7 7 7 7 7 # t        $ r=}t/        j0                  dj3                  t5        |                   t7        |      d}~ww xY ww)aA  
    [10/07/2024]
    Note: To get all users (+pagination), use `/user/list` endpoint.


    Use this to get user information. (user row + all user key info)

    Example request
    ```
    curl -X GET 'http://localhost:4000/user/info?user_id=krrish7%40berri.ai'     --header 'Authorization: Bearer sk-1234'
    ```
    r   prisma_clientNDatabase not connected. Connect a database to your proxy - https://docs.litellm.ai/docs/simple_proxy#managing-auth---virtual-keys)r   )	list_teamrD   r{   rE   rH   )rJ   r   r:   ry   find_all)team_id_listr   
query_typer1   r   r   r   rQ   keys	all_teamsc                 $    t        | dd      xs dS N
team_aliasrP   getattrxs    r3   <lambda>zuser_info.<locals>.<lambda>u  s    gar&B&Hb&Hr5   r1   r   	user_infor   rY   z>litellm.proxy.proxy_server.user_info(): Exception occured - {})r^   r   	Exceptionr%   r&   rr   _get_user_info_for_proxy_adminget_datara   r   r   r+   r,   appendr?   rY   r   r   _process_keys_for_user_infosort	BaseModel
model_dumpUserInfoResponser   	exceptionformatr!   r   )r   r:   r   r   rw   r   r   teams_1ry   teams_2caller_user_infor   rQ   kreturned_keys
_user_inforesponse_dataes                     r3   r   r     s#    4 9e+  T  O!++/?/K/KK7999+44W4EEII	
 	P! %|< /
 
 :gt#<I##DLL1   "& )22&__J 3  G "z'4'@#D||<7!((.$++DLL9 $ %%1go%2%;%;)11 &< &    + - 6 6!1!7!7%) !7 !  "z'4'@#D||<7!((.$++DLL9 $ #++! , 
 
 !1EGQ//  %(I 4QIJ&0I&FI  "I 	 )zY
 k : F
  

0  +&&LSSA	

 (**+s   K!9J JJ K!J J ,J JAJ ,J-*J AJ 4J5'J J)J AJ JA7J K!J J J J J J J 	K!8KKK!c                    K   ddl m}  d}| t        d      | j                  j	                  |       d{   }t        j                  d|       |d   d   xs g }g }|D ]2  }|j                  d      g |d<   |j                  t        di |       4 |d   d	   xs g }|D cg c]  }t        di | }}|j                  d
        t        ||      }t        dd||      S 7 c c}w w)a1  
    Admin UI Endpoint - Returns All Teams and Keys when Proxy Admin is querying

    - get all teams in LiteLLM_TeamTable
    - get all keys in LiteLLM_VerificationToken table

    Why separate helper for proxy admin ?
        - To get Faster UI load times, get all teams and virtual keys in 1 query
    r   r~   z
        SELECT 
            (SELECT json_agg(t.*) FROM "LiteLLM_TeamTable" t) as teams,
            (SELECT json_agg(k.*) FROM "LiteLLM_VerificationToken" k WHERE k.team_id != 'litellm-dashboard' OR k.team_id IS NULL) as keys
    Nr   zresults_keys: %sr   r   rY   c                 $    t        | dd      xs dS r   r   r   s    r3   r   z0_get_user_info_for_proxy_admin.<locals>.<lambda>  s    WQb%A%GR%Gr5   r   r   r   r]   )r^   r   r   db	query_rawr   debugr`   r   LiteLLM_VerificationTokenLiteLLM_TeamTabler   r   r   )	r   	sql_queryresults_keys_in_db
keys_in_dbr1   _teams_in_dbry   r   s	            r3   r   r     s     9I
  P
 	
 "$$..y99G17;
6*0bKJ778$CM3:c:;  !G,2L:FG,$%--,LGHI/Z<XM	 # : Hs"   4C0C)A/C0&C+82C0+C0r   r   c                 ~   ddl m}m} g }| 	 |S | D ]  }|j                  |k(  r|j	                  dd      du r'	 |j                         }d|v r8|d   3|d   dk7  r+t        ||d         }|t        |d	d       }||d	<   nd |d	<   nd
|d	<   |j                  |        |S # t        $ r |j                         }Y qw xY w)Nr   )r<   litellm_master_key_hashdisable_master_key_returnFTr?   zlitellm-dashboard)rw   r?   r   None)r^   r<   r   rO   r`   r   r   dictrz   r   r   )	r   r   r<   r   r   r1   _key	team_infor   s	            r3   r   r     s     UM|> ; C		44$(()DeL " ^^-
 T!O/O'::.'i	 (!(L$!GJ)3D&)-D&%+\"  &9 : '  "xxz"s   B  B<;B<c                 j   i }| j                         D ]  \  }}|	|g i dfvs|t        vs|||<     d}|j                  t        j                  k(  rd}d|v rDt        |d         }t        j                  t        j                        t        |      z   }||d<   d|vr%|r#t        j                  t        j                  |d<   d|vri|rgt        j                  Wt        j                  |d<   t        |d         }t        j                  t        j                        t        |      z   }||d<   |S )	Nr   FTr    )duration)secondsbudget_reset_atr   )r*   )LiteLLM_ManagementEndpoint_MetadataFieldsr%   r&   r'   r   r   nowr   utcr   r(   r.   r/   )r   r   non_default_valuesr   vr0   
duration_suser_reset_ats           r3   _update_internal_user_paramsr     sK   !1M BB$%q! " ~~)777..(2DEV2WX
 X\\2Yz5RR0=,---!A!A!M/6/O/O|, 	!33 E E Q55 01 -+,=>J %LL6:9VVM4A01r5   z/user/updatec                 t  K   ddl m} 	 | j                         }|t        d      t	        ||       }|j                  | j                  dd       d{   }|r|j                  ni }t        | ||xs i 	      }t        j                  d
|        d}| j                  |t        | j                        dkD  rd| j                  |d<   t        j                  d       |j                  | j                  |d       d{   }t        j                  d|        |S | j                  t        t        j                                |d<   | j                  |d<   |j                  d| j                  idd       d{   }|t#        |t$              r+t        |      dk(  r|j'                  |d       d{   }|S t#        |t$              r;t        |      dkD  r-|D ](  }	|j                  |	j                  |d       d{   }* |S 7 7 7 7 [7 # t        $ r}
t        j(                  dj+                  t        |
                   t        j                  t-        j.                                t#        |
t0              rYt3        t5        |
ddt        |
       d      t6        j8                  t5        |
dd      t5        |
dt:        j<                              t#        |
t2              r|
t3        dt        |
      z   t6        j8                  t5        |
dd      t:        j<                        d}
~
ww xY ww)a8  
    Example curl 

    ```
    curl --location 'http://0.0.0.0:4000/user/update'     --header 'Authorization: Bearer sk-1234'     --header 'Content-Type: application/json'     --data '{
        "user_id": "test-litellm-user-4",
        "user_role": "proxy_admin_viewer"
    }'
    ```
    
    Parameters:
        - user_id: Optional[str] - Specify a user id. If not set, a unique id will be generated.
        - user_email: Optional[str] - Specify a user email.
        - password: Optional[str] - Specify a user password.
        - user_alias: Optional[str] - A descriptive name for you to know who this user id refers to.
        - teams: Optional[list] - specify a list of team id's a user belongs to.
        - send_invite_email: Optional[bool] - Specify if an invite email should be sent.
        - user_role: Optional[str] - Specify a user role - "proxy_admin", "proxy_admin_viewer", "internal_user", "internal_user_viewer", "team", "customer". Info about each role here: `https://github.com/BerriAI/litellm/litellm/proxy/_types.py#L20`
        - max_budget: Optional[float] - Specify max budget for a given user.
        - budget_duration: Optional[str] - Budget is reset at the end of specified duration. If not set, budget is never reset. You can set duration as seconds ("30s"), minutes ("30m"), hours ("30h"), days ("30d"), months ("1mo").
        - models: Optional[list] - Model_name's a user is allowed to call. (if empty, key is allowed to call all models)
        - tpm_limit: Optional[int] - Specify tpm limit for a given user (Tokens per minute)
        - rpm_limit: Optional[int] - Specify rpm limit for a given user (Requests per minute)
        - auto_create_key: bool - Default=True. Flag used for returning a key as part of the /user/new response
        - aliases: Optional[dict] - Model aliases for the user - [Docs](https://litellm.vercel.app/docs/proxy/virtual_keys#model-aliases)
        - config: Optional[dict] - [DEPRECATED PARAM] User-specific config.
        - allowed_cache_controls: Optional[list] - List of allowed cache control values. Example - ["no-cache", "no-store"]. See all values - https://docs.litellm.ai/docs/proxy/caching#turn-on--off-caching-per-request-
        - blocked: Optional[bool] - [Not Implemented Yet] Whether the user is blocked.
        - guardrails: Optional[List[str]] - [Not Implemented Yet] List of active guardrails for the user
        - permissions: Optional[dict] - [Not Implemented Yet] User-specific permissions, eg. turning off pii masking.
        - metadata: Optional[dict] - Metadata for user, store information for user. Example metadata = {"team": "core-infra", "app": "app2", "email": "ishaan@berri.ai" }
        - max_parallel_requests: Optional[int] - Rate limit a user based on the number of parallel requests. Raises 429 error, if user's parallel requests > x.
        - soft_budget: Optional[float] - Get alerts when user crosses given budget, doesn't block requests.
        - model_max_budget: Optional[dict] - Model-specific max budget for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-budgets-to-keys)
        - model_rpm_limit: Optional[float] - Model-specific rpm limit for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-limits-to-keys)
        - model_tpm_limit: Optional[float] - Model-specific tpm limit for user. [Docs](https://docs.litellm.ai/docs/proxy/users#add-model-specific-limits-to-keys)
        - spend: Optional[float] - Amount spent by user. Default is 0. Will be updated by proxy whenever user is used. You can set duration as seconds ("30s"), minutes ("30m"), hours ("30h"), days ("30d"), months ("1mo").
        - team_id: Optional[str] - [DEPRECATED PARAM] The team id of the user. Default is None. 
        - duration: Optional[str] - [NOT IMPLEMENTED].
        - key_alias: Optional[str] - [NOT IMPLEMENTED].
            
    
    r   r~   NzNot connected to DB!)r   r   r   find_uniquer   )r   r   existing_metadataz /user/update: Received data = %sr   z(In update user, user_id condition block.)r   r   r   z8received response from updating prisma client. response=rA   r   )key_valr   r   )r   r   z@litellm.proxy.proxy_server.user_update(): Exception occured - {}detailzAuthentication Error()paramr   status_code)messagerF   r   codezAuthentication Error, )r^   r   r_   r   r   r   r   rZ   r   r   r   r-   update_datarA   r!   r"   r#   r+   r,   insert_dataerrorr   	traceback
format_excr   ProxyExceptionr   ProxyErrorTypes
auth_errorr   HTTP_400_BAD_REQUEST)r   r:   r   r   r   existing_user_rowr   rl   existing_user_rowsexisting_userr   s              r3   user_updater     s6    p 9S
))+	 233 :d
 #0"8"8LLV #9 #
 
 ;L-66QS41/52
 	""#EtL"&<<#DLL(9A(=,0LLy) &&'QR*66'! 7  H
 !&&J8*U4 / __(,/

,=y)/3|, (5'='=%t7!% (> ( "
 ")-t4=O9PTU9U!.!:!:+ "; "   .5#>P:QTU:U%7M%2%>%> - 5 5/#) &? &  H &8 c
$"
   
""NUUA	

 	""9#7#7#9:a' 8/DSVHA-NO$//a&1Qv/J/JK	  >*G,s1v5 ++!Wf-,,	
 	
!
s   L8AH H	B'H =H>H L8AH :H;:H 5H6H ;L8<AH  HH L8	H H H H H 
L5DL00L55L8z/user/get_usersz
/user/listzFilter users by role   zPage number)r|   gerp      d   zNumber of items per page)r|   r   lerp   rB   page	page_sizec                 .  K   ddl m} |t        ddd| i      |dz
  |z  }|}d	}| rd
|  d}d| d| d| d}|j                  j	                  |       d{   }d}	t        |      dkD  r|d   j                  d      }	|	 |z   }
||	|||
dS 7 7w)a  
    Get a paginated list of users, optionally filtered by role.

    Used by the UI to populate the user lists.

    Parameters:
        role: Optional[str]
            Filter users by role. Can be one of:
            - proxy_admin
            - proxy_admin_viewer
            - internal_user
            - internal_user_viewer
        page: int
            The page number to return
        page_size: int
            The number of items per page

    Currently - admin-only endpoint.
    r   r~   N  r   zNo db connected. prisma client=r   r   r   rP   zWHERE "user_role" = ''a  
    WITH total_users AS (
        SELECT COUNT(*) AS total_number_internal_users
        FROM "LiteLLM_UserTable"
    ),
    paginated_users AS (
        SELECT 
            u.*,
            (
                SELECT COUNT(*) 
                FROM "LiteLLM_VerificationToken" vt 
                WHERE vt."user_id" = u."user_id"
            ) AS key_count
        FROM "LiteLLM_UserTable" u
        z
        LIMIT z OFFSET zz
    )
    SELECT 
        (SELECT total_number_internal_users FROM total_users),
        *
    FROM paginated_users;
    total_number_internal_users)userstotalr   r   total_pages)r^   r   r   r   r   r-   r`   )rB   r   r   r   skiptakewhere_clauser   r   total_countr   s              r3   	get_usersr     s     L 9>}oNO
 	
 1H	!DD L0a:	 
 fHTF #I0 "$$..y99GK
7|aajnn%BC !LI-.K "  :s   ABB8Bz/user/deletezThe litellm-changed-by header enables tracking of actions performed by authorized users on behalf of other users, providing an audit trail for accountability)rp   litellm_changed_byc                   K   ddl m}m}m} |t	        dddi      | j
                  t	        ddd	i      | j
                  D ]   }|j                  j                  j                  d
|i       d{   }|t	        ddd| i      t        j                  du s[|j                  d      }t        j                   |t        t        t!        j"                               t%        j&                  t(        j*                        |xs |j,                  xs ||j.                  t0        j2                  |dd|	                    |j                  j4                  j7                  d
d| j
                  ii       d{    |j                  j8                  j7                  d
d| j
                  ii       d{    |j                  j                  j7                  d
d| j
                  ii       d{   }	|	S 7 7 7 G7 w)a{  
    delete user and associated user keys

    ```
    curl --location 'http://0.0.0.0:4000/user/delete' 
    --header 'Authorization: Bearer sk-1234' 
    --header 'Content-Type: application/json' 
    --data-raw '{
        "user_ids": ["45e3e396-ee08-4a61-a88e-16b3ce7e0849"]
    }'
    ```

    Parameters:
    - user_ids: List[str] - The list of user id's to be deleted.
    r   )create_audit_log_for_updatelitellm_proxy_admin_namer   Nr   r   zNo db connectedr   i  zNo user id passed inr   wherei  zUser not found, passed user_id=T)exclude_nonedeletedz{})	id
updated_at
changed_bychanged_by_api_keyr   	object_idactionupdated_valuesbefore_value)request_datain)r^   r   r   r   r   user_idsr   litellm_usertabler   r(   store_audit_logsr_   rg   rh   LiteLLM_AuditLogsr!   r"   r#   r   r   r   r   r   api_keyLitellmTableNamesUSER_TABLE_NAMElitellm_verificationtokendelete_manylitellm_invitationlink)
r   r:   r   r   r   r   r   user_row	_user_rowdeleted_userss
             r3   delete_userr    s    @  W>O4PQQ}}W>T4UVV ==&));;GGg& H 
 
 #B7)!LM  ''4/$MMtM<	##/%6"4::<0'/||HLL'A'9 (8088(87/@/H/H'8'H'H&-#,+/)2&# !L 


4
4
@
@4/0 A   
 


1
1
=
=4/0 >   
 (**<<HH4/0 I  M g
J

sO   A2H4G?5*H C H H;H<H=;H8H9HHHHorganization_idr%   c                 r  K   ddl m} |t        d      	 |j                  j                  j                  d|i       d{   }|t        d|       |j                  j                  j                  | ||d	       d{   }|S 7 H7 # t        $ r}t        d
t        |             d}~ww xY ww)a  
    Helper function to add an internal user to an organization

    Adds the user to LiteLLM_OrganizationMembership table

    - Checks if organization_id exists

    Raises:
    - Exception if database not connected
    - Exception if user_id or organization_id not found
    r   r~   NzDatabase not connectedr  r   z/Organization not found, passed organization_id=)r   r  r%   )r   z$Failed to add user to organization: )	r^   r   r   r   litellm_organizationtabler   litellm_organizationmembershipcreater!   )r   r  r%   r   organization_rownew_membershipr   s          r3   !add_internal_user_to_organizationr  e  s       9011I!.!1!1!K!K!W!W$o6 "X "
 
 #A/ARS 
  -//NNUU"#2&  V  
 
 %

  I>s1vhGHHIsM   B7+B BAB BB 
B7B B 	B4B//B44B7)=__doc__rg   r   r"   r   r   r   typingr   r   fastapir   r	   r
   r   r   r   r(   litellm._loggingr   litellm.proxy._types$litellm.proxy.auth.user_api_key_authr   ;litellm.proxy.management_endpoints.key_management_endpointsr   r   r   &litellm.proxy.management_helpers.utilsr   litellm.proxy.utilsr   routerr   NewUserRequestr4   postrk   UserAPIKeyAuthrm   r`   rv   Unionr   TeamListResponseObjectr!   LiteLLM_TeamMembershiprz   Queryr   r   r   r   UpdateUserRequestr   r   intr   DeleteUserRequestr  r&   r  r]   r5   r3   <module>r-     s      2 2 !  N N  1 " B 
 O 9	 N t D 
$	%+,-"	    )00A(B@
@%@ @F 
$	%+,-	   )00A(B%<
d#45t<R7SSTU

 e%'==>?
 
$	%+,-   *W]]"E )00A(B	z+c]z+ &	z+ z+z-`'
412
3'd#45t<R7SSTU'T+D +8I +d +\ 
$	%+,-  
  )00A(BG

G
%G
 G
T 
$	%+,-  
 
$	%+,-   ('--"8 aA=I"W]]qS.HU
3-U 	U
 UUp 
$	%+,-  
  )00A(B(. t)[
[%[ ![ [|+I+I+I  +Ir5   