
    ^hq@                        S r SSKrSSKJrJrJr  SSKJrJrJ	r	J
r
Jr  SSK7  SSKJr  SSKJrJr  SSKJr  \" 5       r\R+                  S	S
/\" \5      /\S9\" \5      4S\S\4S jj5       r\R+                  SS
/\" \5      /S9S 5       r\R+                  SS
/\" \5      /S9S 5       r\R9                  SS
/\" \5      /S9\" \5      4S\4S jj5       r\R+                  SS
/\" \5      /S9S\4S j5       r\R+                  SS
/\" \5      /\ S9\\" \5      4S\!S\
S\S\ 4S jj5       5       r"S\#S\$S\S\\%\&4   4S jr'g) z
Endpoints for /organization operations

/organization/new
/organization/update
/organization/delete
/organization/info
/organization/list
    N)ListOptionalTuple)	APIRouterDependsHTTPExceptionRequeststatus)*)user_api_key_auth)get_new_internal_user_defaultsmanagement_endpoint_wrapper)PrismaClientz/organization/newzorganization management)tagsdependenciesresponse_modeldatauser_api_key_dictc           	        #    SSK JnJn  Uc  [        SSS0S9eUR                  b  UR                  [
        R                  :w  a  [        SSS	UR                   30S9eU R                  c   [        R                  R                  5       nU R                  S
S9nUR                  5        VVs0 s H  u  pgXd;   d  M  Xg_M     nnn[        S0 UD6n	UR                  U	R                  S
S95      n
UR                  R                  R!                  0 U
EUR"                  =(       d    UUR"                  =(       d    US.ES9I Sh  vN nUR                  U l         [%        UR&                  5      S:X  a  Oc[%        U R&                  5      S:X  a  [        SSS0S9eU R&                   H.  nXR&                  ;  d  M  [        SSSU SUR&                   30S9e   [)        S0 U R                  S
S9DUR"                  =(       d    UUR"                  =(       d    US.D6nUR                  UR                  S
S95      nUR                  R*                  R!                  0 UES9I Sh  vN nU$ s  snnf  GN* N7f)a	  
Allow orgs to own teams

Set org level budgets + model access.

Only admins can create orgs.

# Parameters

- organization_alias: *str* - The name of the organization.
- models: *List* - The models the organization has access to.
- budget_id: *Optional[str]* - The id for a budget (tpm/rpm/max budget) for the organization.
### IF NO BUDGET ID - CREATE ONE WITH THESE PARAMS ###
- max_budget: *Optional[float]* - Max budget for org
- tpm_limit: *Optional[int]* - Max tpm limit for org
- rpm_limit: *Optional[int]* - Max rpm limit for org
- max_parallel_requests: *Optional[int]* - [Not Implemented Yet] Max parallel requests for org
- soft_budget: *Optional[float]* - [Not Implemented Yet] Get a slack alert when this soft budget is reached. Don't block requests.
- model_max_budget: *Optional[dict]* - Max budget for a specific model
- budget_duration: *Optional[str]* - Frequency of reseting org budget
- metadata: *Optional[dict]* - Metadata for team, store information for team. Example metadata - {"extra_info": "some info"}
- blocked: *bool* - Flag indicating if the org is blocked or not - will stop all calls from keys with this org_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)


Case 1: Create new org **without** a budget_id

```bash
curl --location 'http://0.0.0.0:4000/organization/new' 
--header 'Authorization: Bearer sk-1234' 
--header 'Content-Type: application/json' 
--data '{
    "organization_alias": "my-secret-org",
    "models": ["model1", "model2"],
    "max_budget": 100
}'


```

Case 2: Create new org **with** a budget_id

```bash
curl --location 'http://0.0.0.0:4000/organization/new' 
--header 'Authorization: Bearer sk-1234' 
--header 'Content-Type: application/json' 
--data '{
    "organization_alias": "my-secret-org",
    "models": ["model1", "model2"],
    "budget_id": "428eeaa8-f3ac-4e85-a8fb-7dc8d7aa8689"
}'
```
r   )litellm_proxy_admin_nameprisma_clientN  errorNo db connectedstatus_codedetail  z,Only admins can create orgs. Your role is = T)exclude_none)
created_by
updated_byr     z\User not allowed to give access to all models. Select models you want org to have access to.z)User not allowed to give access to model=z. Models you have access to =  )litellm.proxy.proxy_serverr   r   r   	user_roleLitellmUserRolesPROXY_ADMIN	budget_idLiteLLM_BudgetTablemodel_fieldskeysjsonitemsjsonify_objectdblitellm_budgettablecreateuser_idlenmodelsLiteLLM_OrganizationTablelitellm_organizationtable)r   r   r   r   budget_params
_json_datakv_budget_data
budget_row
new_budget_budgetmorganization_rownew_organization_rowresponses                   s/home/james-whalen/.local/lib/python3.13/site-packages/litellm/proxy/management_endpoints/organization_endpoints.pynew_organizationrE      s    N SW>O4PQQ 	##+&&*:*F*FFGHYHcHcGde
 	
 ~~	
 ,88==? YYDY1
)3)9)9);R);q?Q);R(8<8
"11*//t/2TU
%((<<CC/77S;S/77S;S D 
 
 !** ##$)t{{q {  A000# ##LQCOmn  oG  oG  nH  "I   1 
)))
&$,,H0H$,,H0H
 )7740 #%%??FF
"
 G  H Oe S

Ns?   B*I/,I$;I$A?I/ I*A1I/6B'I/I-I/-I/z/organization/update)r   r   c                      #    [        S5      e7fzd[TODO] Not Implemented yet. Let us know if you need this - https://github.com/BerriAI/litellm/issueszNot Implemented YetNotImplementedErrorr$       rD   update_organizationrK            3
44   z/organization/deletec                      #    [        S5      e7frG   rH   r$   rJ   rD   delete_organizationrO      rL   rM   z/organization/listc                 j  #    SSK Jn  Uc  [        SSS0S9eU R                  b  U R                  [        R
                  :w  a  [        SSS	U R                   3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U$  N7f)z
```
curl --location --request GET 'http://0.0.0.0:4000/organization/list'         --header 'Authorization: Bearer sk-1234'
```
r   r   Nr   r   r   r   r   z*Only admins can list orgs. Your role is = r#   )r%   r   r   r&   r'   r(   CommonProxyErrorsdb_not_connected_errorvaluer0   r7   	find_many)r   r   rC   s      rD   list_organizationrV      s      9W>O4PQQ 	##+&&*:*F*FFEFWFaFaEbc
 	
 .EEKKL
 	
 #%%??IIKKHO Ls   B(B3*B1+B3z/organization/infoc                   #    SSK Jn  Uc  [        SSS0S9e[        U R                  5      S:X  a  [        SSS	U R                   30S9eUR
                  R                  R                  S
SU R                  00SS0S9I Sh  vN nU$  N7f)z"
Get the org specific information
r   rQ   Nr   r   r   r   r#   z6Specify list of organization id's to query. Passed in=organization_idinlitellm_budget_tableT)whereinclude)r%   r   r   r4   organizationsr0   r7   rU   )r   r   rC   s      rD   info_organizationr^      s      9W>O4PQQ
4!#QRVRdRdQef
 	
 #%%??II 4););"<='. J  H
 Os   A?B
BB
z/organization/member_addhttp_requestreturnc                   #     SSK Jn  U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[        U SS5       30S9e[        U R                  [        5      (       a  U R                  nOU R                  /n/ n/ nU HD  n[        UU R                  US9I Sh  vN u  pUR                  U	5        UR                  U
5        MF     [        U R                  UUS9$  N NC! [         a  n[        U[        5      (       aV  [        [        USS[!        U5       S35      ["        R$                  [        USS5      [        US[&        R(                  5      S9e[        U[        5      (       a  Ue[        S[!        U5      -   ["        R$                  [        USS5      [&        R(                  S9eSnAff = f7f)a_  
[BETA]

Add new members (either via user_email or user_id) to an organization

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

Only proxy_admin or org_admin of organization, allowed to access this endpoint.

# Parameters:

- organization_id: str (required)
- member: Union[List[Member], Member] (required)
    - role: Literal[LitellmUserRoles] (required)
    - user_id: Optional[str]
    - user_email: Optional[str]

Note: Either user_id or user_email must be provided for each member.

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

The following is executed in this function:

1. Check if organization exists
2. Creates a new Internal User if the user_id or user_email is not found in LiteLLM_UserTable
3. Add Internal User to the `LiteLLM_OrganizationMembership` table
r   rQ   Nr   r   r   r   rX   r[     z+Organization not found for organization_id=)memberrX   r   )rX   updated_users updated_organization_membershipsr   zAuthentication Error()paramNoner   )messagetyperh   codezAuthentication Error, )r%   r   r   r0   r7   find_uniquerX   getattr
isinstancerd   r   add_member_to_organizationappendOrganizationAddMemberResponse	ExceptionProxyExceptionstrProxyErrorTypes
auth_errorr
   HTTP_500_INTERNAL_SERVER_ERROR)r   r_   r   r   existing_organization_rowmembersre   rf   rd   updated_userupdated_organization_membershipes               rD   organization_member_addr~     s    h=
< CBS8TUU  ""<<HH($*>*>? I   	"
 %,J7SWYjlpKqJrs  dkk4((kkG{{mG13VX(F0!$($8$8"/  :L   .,334ST  - 00'-M
 	
C.  
a'' 8/DSVHA-NO$//a&1Qv/T/TU	  >**G,s1v5 ++!Wf-66	
 	

sP   G AD D	A;D DA D G 	D D 
GCGGG rd   rX   r   c                   #     SnSnSnU R                   b7  UR                  R                  R                  SU R                   0S9I Sh  vN nU R                  b7  UR                  R                  R                  SU R                  0S9I Sh  vN nUc}  Ucz  U R                   =(       d    [        [        R                  " 5       5      n[        UU R                  S9nUR                  USS9I Sh  vN nUb  [        S0 UR                  5       D6nO~Ub  [        U5      S:  a  [        S	S
S0S9eUb  [        S0 UR                  5       D6nOCUb  [        S0 UR                  5       D6nO&[        SS
SU R                    SU R                   30S9eUc%  [        SU R                    SU R                   35      eUR                  R                  R!                  UUR                   U R"                  S.S9I Sh  vN n	[%        S0 U	R                  5       D6n
X:4$  GN GN GN- N)! [&         a  n[        SU 35      eSnAff = f7f)z
Add a member to an organization

- Checks if member.user_id or member.user_email is in LiteLLM_UserTable
- If not found, create a new user in LiteLLM_UserTable
- Add user to organization in LiteLLM_OrganizationMembership
Nr3   rb   
user_email)r3   r   user)r   
table_name   r#   r   zIMultiple users with this email found in db. Please use 'user_id' instead.r   rc   zUser not found for user_id=z and user_email=z2User does not exist in LiteLLM_UserTable. user_id=)rX   r3   r&   r"   z%Error adding member to organization: r$   )r3   r0   litellm_usertablerm   r   ru   uuiduuid4r   insert_dataLiteLLM_UserTable
model_dumpr4   r   
ValueErrorlitellm_organizationmembershipr2   role#LiteLLM_OrganizationMembershipTablers   )rd   rX   r   user_objectexisting_user_id_rowexisting_user_email_rowr3   new_user_defaults_returned_user_organization_membershiporganization_membershipr}   s               rD   rp   rp     s    EF37#"&>>%)6)9)9)K)K)W)W &..1 *X * $  (#&&88DD'):):; E   $  ',C,K!>>>S->G >!,,!
 $1#<#<BS`f#<#ggN)/N.2K2K2MN$0S9P5QTU5Uh  %0+S.E.P.P.RSK!-+P.B.M.M.OPK:6>>:JJZ[a[l[lZmn  DV^^DTTdekevevdwx   ""AAHH'6*22!' I   	! #F #
&113#
 33y$ h:  F@DEEFst   IAH" 	H
AH" HA"H" 0H1DH" 6H 7H" IH" H" H"  H" "
H?,H::H??I)(__doc__r   typingr   r   r   fastapir   r   r   r	   r
   litellm.proxy._types$litellm.proxy.auth.user_api_key_authr   &litellm.proxy.management_helpers.utilsr   r   litellm.proxy.utilsr   routerpostNewOrganizationResponseNewOrganizationRequestUserAPIKeyAuthrE   rK   rO   getrV   OrganizationRequestr^   rr   OrganizationMemberAddRequestr~   	OrgMemberru   r   r   rp   r$   rJ   rD   <module>r      s=    ( ( F F " B -	 
#	$+,-*	   )00A(BM
 M%MM` 
#	$+,-  
5
5
 
#	$+,-  
5
5
 
#	$+,-   )00A(B%
D 
#	$+,-  
"5 
0 
#	$+,-0	    )00A(Bj

&j
j
 &j
 #	j
 j
ZRFRFRF  RF AAB	RFrJ   