diff --git a/litellm/proxy/management_endpoints/scim_v2.py b/litellm/proxy/management_endpoints/scim_v2.py index ef7450b696..53e3c7ba3c 100644 --- a/litellm/proxy/management_endpoints/scim_v2.py +++ b/litellm/proxy/management_endpoints/scim_v2.py @@ -5,26 +5,15 @@ Provides basic implementations of SCIM v2 endpoints for testing and integration purposes. """ -import json import uuid -from datetime import datetime, timezone -from typing import Any, Dict, List, Optional, Union +from typing import List, Optional, Union -from fastapi import ( - APIRouter, - Body, - HTTPException, - Path, - Query, - Request, - Response, - status, -) -from pydantic import BaseModel, EmailStr, Field +from fastapi import APIRouter, Body, HTTPException, Path, Query, Response from litellm._logging import verbose_proxy_logger from litellm.proxy._types import LiteLLM_UserTable, NewUserRequest, NewUserResponse from litellm.proxy.management_endpoints.internal_user_endpoints import new_user +from litellm.types.proxy.management_endpoints.scim_v2 import * scim_router = APIRouter( prefix="/scim/v2", @@ -32,63 +21,6 @@ scim_router = APIRouter( ) -# SCIM Resource Models -class SCIMResource(BaseModel): - schemas: List[str] - id: Optional[str] = None - externalId: Optional[str] = None - meta: Optional[Dict[str, Any]] = None - - -class SCIMUserName(BaseModel): - familyName: str - givenName: str - formatted: Optional[str] = None - middleName: Optional[str] = None - honorificPrefix: Optional[str] = None - honorificSuffix: Optional[str] = None - - -class SCIMUserEmail(BaseModel): - value: EmailStr - type: Optional[str] = None - primary: Optional[bool] = None - - -class SCIMUserGroup(BaseModel): - value: str # Group ID - display: Optional[str] = None # Group display name - type: Optional[str] = "direct" # direct or indirect - - -class SCIMUser(SCIMResource): - userName: str - name: SCIMUserName - displayName: Optional[str] = None - active: bool = True - emails: Optional[List[SCIMUserEmail]] = None - groups: Optional[List[SCIMUserGroup]] = None - - -class SCIMMember(BaseModel): - value: str # User ID - display: Optional[str] = None # Username or email - - -class SCIMGroup(SCIMResource): - displayName: str - members: Optional[List[SCIMMember]] = None - - -# SCIM List Response Models -class SCIMListResponse(BaseModel): - schemas: List[str] = ["urn:ietf:params:scim:api:messages:2.0:ListResponse"] - totalResults: int - startIndex: Optional[int] = 1 - itemsPerPage: Optional[int] = 10 - Resources: List[Union[SCIMUser, SCIMGroup]] - - class ScimTransformations: DEFAULT_SCIM_NAME = "Unknown User" DEFAULT_SCIM_FAMILY_NAME = "Unknown Family Name" diff --git a/litellm/types/proxy/management_endpoints/scim_v2.py b/litellm/types/proxy/management_endpoints/scim_v2.py new file mode 100644 index 0000000000..736e8e5690 --- /dev/null +++ b/litellm/types/proxy/management_endpoints/scim_v2.py @@ -0,0 +1,60 @@ +from typing import Any, Dict, List, Optional, Union + +from pydantic import BaseModel, EmailStr + + +# SCIM Resource Models +class SCIMResource(BaseModel): + schemas: List[str] + id: Optional[str] = None + externalId: Optional[str] = None + meta: Optional[Dict[str, Any]] = None + + +class SCIMUserName(BaseModel): + familyName: str + givenName: str + formatted: Optional[str] = None + middleName: Optional[str] = None + honorificPrefix: Optional[str] = None + honorificSuffix: Optional[str] = None + + +class SCIMUserEmail(BaseModel): + value: EmailStr + type: Optional[str] = None + primary: Optional[bool] = None + + +class SCIMUserGroup(BaseModel): + value: str # Group ID + display: Optional[str] = None # Group display name + type: Optional[str] = "direct" # direct or indirect + + +class SCIMUser(SCIMResource): + userName: str + name: SCIMUserName + displayName: Optional[str] = None + active: bool = True + emails: Optional[List[SCIMUserEmail]] = None + groups: Optional[List[SCIMUserGroup]] = None + + +class SCIMMember(BaseModel): + value: str # User ID + display: Optional[str] = None # Username or email + + +class SCIMGroup(SCIMResource): + displayName: str + members: Optional[List[SCIMMember]] = None + + +# SCIM List Response Models +class SCIMListResponse(BaseModel): + schemas: List[str] = ["urn:ietf:params:scim:api:messages:2.0:ListResponse"] + totalResults: int + startIndex: Optional[int] = 1 + itemsPerPage: Optional[int] = 10 + Resources: List[Union[SCIMUser, SCIMGroup]]