diff --git a/litellm/proxy/management_endpoints/key_management_endpoints.py b/litellm/proxy/management_endpoints/key_management_endpoints.py index 82db6e140e8..45542cba7a3 100644 --- a/litellm/proxy/management_endpoints/key_management_endpoints.py +++ b/litellm/proxy/management_endpoints/key_management_endpoints.py @@ -534,6 +534,13 @@ async def _common_key_generation_helper( # noqa: PLR0915 upperbound_duration = duration_in_seconds( duration=upperbound_value ) + if value == "-1": + raise HTTPException( + status_code=400, + detail={ + "error": "'-1' is no longer a valid duration value. Pass duration: null to set a key to never expire." + }, + ) user_duration = duration_in_seconds(duration=value) if user_duration > upperbound_duration: raise HTTPException( diff --git a/ui/litellm-dashboard/src/components/common_components/KeyLifecycleSettings.tsx b/ui/litellm-dashboard/src/components/common_components/KeyLifecycleSettings.tsx index e7a0bff41a8..3b0f27a0cbd 100644 --- a/ui/litellm-dashboard/src/components/common_components/KeyLifecycleSettings.tsx +++ b/ui/litellm-dashboard/src/components/common_components/KeyLifecycleSettings.tsx @@ -69,6 +69,13 @@ const KeyLifecycleSettings: React.FC = ({ } else if (form && typeof form.setFieldsValue === "function") { form.setFieldsValue({ duration: null }); } + } else { + // Clear the null so duration is omitted from the request (not sent as never-expires) + if (form && typeof form.setFieldValue === "function") { + form.setFieldValue("duration", undefined); + } else if (form && typeof form.setFieldsValue === "function") { + form.setFieldsValue({ duration: undefined }); + } } };