From a9d0e2cf91663a5bcc7ddfffaf8b4683b3ee5c31 Mon Sep 17 00:00:00 2001 From: Harshit28j Date: Fri, 27 Feb 2026 13:33:34 +0530 Subject: [PATCH] fix: req changes --- litellm/proxy/_types.py | 10 ++------- .../management_endpoints/project_endpoints.py | 22 ++++++++++++++++++- .../test_project_tags_pydantic.py | 16 +++++--------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 8713f54a3e..28311ab1b3 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -2599,10 +2599,7 @@ class NewProjectRequest(LiteLLM_BudgetTable): raise ValueError( f"tags must be a list of strings, got {type(values['tags']).__name__}" ) - for field in ( - LiteLLM_ManagementEndpoint_MetadataFields - + LiteLLM_ManagementEndpoint_MetadataFields_Premium - ): + for field in LiteLLM_ManagementEndpoint_MetadataFields: if values.get(field) is not None: if values.get("metadata") is None: values.update({"metadata": {}}) @@ -2635,10 +2632,7 @@ class UpdateProjectRequest(LiteLLM_BudgetTable): raise ValueError( f"tags must be a list of strings, got {type(values['tags']).__name__}" ) - for field in ( - LiteLLM_ManagementEndpoint_MetadataFields - + LiteLLM_ManagementEndpoint_MetadataFields_Premium - ): + for field in LiteLLM_ManagementEndpoint_MetadataFields: if values.get(field) is not None: if values.get("metadata") is None: values.update({"metadata": {}}) diff --git a/litellm/proxy/management_endpoints/project_endpoints.py b/litellm/proxy/management_endpoints/project_endpoints.py index c825802f31..8f48f9def7 100644 --- a/litellm/proxy/management_endpoints/project_endpoints.py +++ b/litellm/proxy/management_endpoints/project_endpoints.py @@ -358,6 +358,16 @@ async def new_project( }, ) + # ADD METADATA FIELDS + for field in LiteLLM_ManagementEndpoint_MetadataFields_Premium: + if getattr(data, field, None) is not None: + _set_object_metadata_field( + object_data=data, + field_name=field, + value=getattr(data, field), + ) + delattr(data, field) + if prisma_client is None: raise HTTPException( status_code=500, @@ -473,7 +483,7 @@ async def new_project( response_model=LiteLLM_ProjectTable, ) @management_endpoint_wrapper -async def update_project( +async def update_project( # noqa: PLR0915 data: UpdateProjectRequest, http_request: Request, user_api_key_dict: UserAPIKeyAuth = Depends(user_api_key_auth), @@ -543,6 +553,16 @@ async def update_project( }, ) + # ADD METADATA FIELDS + for field in LiteLLM_ManagementEndpoint_MetadataFields_Premium: + if getattr(data, field, None) is not None: + _set_object_metadata_field( + object_data=data, + field_name=field, + value=getattr(data, field), + ) + delattr(data, field) + if prisma_client is None: raise HTTPException( status_code=500, diff --git a/tests/test_litellm/test_project_tags_pydantic.py b/tests/test_litellm/test_project_tags_pydantic.py index ed3b29fe7b..b3f58df232 100644 --- a/tests/test_litellm/test_project_tags_pydantic.py +++ b/tests/test_litellm/test_project_tags_pydantic.py @@ -3,26 +3,20 @@ from litellm.proxy._types import NewProjectRequest, UpdateProjectRequest def test_new_project_request_tags(): - # Test tags are correctly moved to metadata["tags"] + # Test tags correctly stay top level initially req = NewProjectRequest( project_id="test_proj", team_id="team_1", tags=["tag1", "tag2"] ) - # After validation, tags should be inside metadata - assert req.metadata is not None - assert "tags" in req.metadata - assert req.metadata["tags"] == ["tag1", "tag2"] - assert req.tags is None # Or removed dependending on pydantic version + # tags should be top level initially + assert req.tags == ["tag1", "tag2"] def test_update_project_request_tags(): - # Test tags are correctly moved to metadata["tags"] + # Test tags correctly stay top level initially req = UpdateProjectRequest(project_id="test_proj", tags=["new_tag"]) - assert req.metadata is not None - assert "tags" in req.metadata - assert req.metadata["tags"] == ["new_tag"] - assert req.tags is None + assert req.tags == ["new_tag"] def test_new_project_request_invalid_tags_type():