From 6da83e806206e1958cbaa33c69f32a63c9dafdb5 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 16:35:59 +0000 Subject: [PATCH] fix(proxy): omit request_tags when unset to avoid prisma Json null error --- .../litellm_enterprise/proxy/hooks/managed_files.py | 2 +- .../anthropic_passthrough_logging_handler.py | 2 +- .../vertex_passthrough_logging_handler.py | 2 +- .../litellm_enterprise/proxy/hooks/test_managed_files.py | 8 +++++--- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/enterprise/litellm_enterprise/proxy/hooks/managed_files.py b/enterprise/litellm_enterprise/proxy/hooks/managed_files.py index 0087022b7af..8a480c52531 100644 --- a/enterprise/litellm_enterprise/proxy/hooks/managed_files.py +++ b/enterprise/litellm_enterprise/proxy/hooks/managed_files.py @@ -195,9 +195,9 @@ class _PROXY_LiteLLMManagedFiles(CustomLogger, BaseFileEndpoints): "created_by": user_api_key_dict.user_id, "team_id": user_api_key_dict.team_id, "api_key": user_api_key_dict.api_key or None, - "request_tags": Json(request_tags) if request_tags else None, "updated_by": user_api_key_dict.user_id, "status": file_object.status, + **({"request_tags": Json(request_tags)} if request_tags else {}), }, "update": { "file_object": file_object.model_dump_json(), diff --git a/litellm/proxy/pass_through_endpoints/llm_provider_handlers/anthropic_passthrough_logging_handler.py b/litellm/proxy/pass_through_endpoints/llm_provider_handlers/anthropic_passthrough_logging_handler.py index e3c6bc50977..661f783dcf6 100644 --- a/litellm/proxy/pass_through_endpoints/llm_provider_handlers/anthropic_passthrough_logging_handler.py +++ b/litellm/proxy/pass_through_endpoints/llm_provider_handlers/anthropic_passthrough_logging_handler.py @@ -981,7 +981,7 @@ class AnthropicPassthroughLoggingHandler: _request_tags = _request_metadata.get("tags") user_api_key_dict = UserAPIKeyAuth( user_id=_request_metadata.get("user_api_key_user_id", "default-user"), - api_key=_request_metadata.get("user_api_key") or "", + api_key=_request_metadata.get("user_api_key") or None, team_id=_request_metadata.get("user_api_key_team_id"), team_alias=_request_metadata.get("user_api_key_team_alias"), user_role=LitellmUserRoles.CUSTOMER, # Use proper enum value diff --git a/litellm/proxy/pass_through_endpoints/llm_provider_handlers/vertex_passthrough_logging_handler.py b/litellm/proxy/pass_through_endpoints/llm_provider_handlers/vertex_passthrough_logging_handler.py index bfa81b0919a..b939c2c056c 100644 --- a/litellm/proxy/pass_through_endpoints/llm_provider_handlers/vertex_passthrough_logging_handler.py +++ b/litellm/proxy/pass_through_endpoints/llm_provider_handlers/vertex_passthrough_logging_handler.py @@ -806,7 +806,7 @@ class VertexPassthroughLoggingHandler: _request_tags = _request_metadata.get("tags") user_api_key_dict = UserAPIKeyAuth( user_id=_request_metadata.get("user_api_key_user_id", "default-user"), - api_key=_request_metadata.get("user_api_key") or "", + api_key=_request_metadata.get("user_api_key") or None, team_id=_request_metadata.get("user_api_key_team_id"), team_alias=_request_metadata.get("user_api_key_team_alias"), user_role=LitellmUserRoles.CUSTOMER, # Use proper enum value diff --git a/tests/enterprise/litellm_enterprise/proxy/hooks/test_managed_files.py b/tests/enterprise/litellm_enterprise/proxy/hooks/test_managed_files.py index 73ab63af458..baa9a489088 100644 --- a/tests/enterprise/litellm_enterprise/proxy/hooks/test_managed_files.py +++ b/tests/enterprise/litellm_enterprise/proxy/hooks/test_managed_files.py @@ -2425,8 +2425,10 @@ async def test_store_unified_object_id_persists_request_identity(): @pytest.mark.asyncio -async def test_store_unified_object_id_no_tags_stores_null_request_tags(): - """When no request tags are present the column is left NULL rather than an empty-list Json.""" +async def test_store_unified_object_id_no_tags_omits_request_tags(): + """When no request tags are present the request_tags key must be omitted from the create + payload. Passing None to a Prisma Json? field raises MissingRequiredValueError, which would + break every non-tagged batch/file/response store.""" from litellm.proxy._types import UserAPIKeyAuth from litellm.types.utils import LiteLLMBatch @@ -2464,7 +2466,7 @@ async def test_store_unified_object_id_no_tags_stores_null_request_tags(): create_data = prisma_client.db.litellm_managedobjecttable.upsert.call_args.kwargs[ "data" ]["create"] - assert create_data["request_tags"] is None + assert "request_tags" not in create_data assert create_data["api_key"] == "hashed-key-abc"