diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 002df7acc..2e131d2b2 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -837,6 +837,7 @@ class ConfigList(LiteLLMBase): field_value: Any stored_in_db: Optional[bool] field_default_value: Any + premium_field: bool = False class ConfigGeneralSettings(LiteLLMBase): diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 456a30aaa..e225169f9 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -9918,6 +9918,9 @@ async def alerting_settings( field_value=_slack_alerting_args_dict.get(field_name, None), stored_in_db=_stored_in_db, field_default_value=field_info.default, + premium_field=( + True if field_name == "region_outage_alert_ttl" else False + ), ) return_val.append(_response_obj) return return_val diff --git a/ui/litellm-dashboard/src/app/page.tsx b/ui/litellm-dashboard/src/app/page.tsx index ed24020e9..a0c7b46a9 100644 --- a/ui/litellm-dashboard/src/app/page.tsx +++ b/ui/litellm-dashboard/src/app/page.tsx @@ -182,6 +182,7 @@ const CreateKeyPage = () => { userID={userID} userRole={userRole} accessToken={accessToken} + premiumUser={premiumUser} /> ) : page == "budgets" ? ( diff --git a/ui/litellm-dashboard/src/components/alerting/alerting_settings.tsx b/ui/litellm-dashboard/src/components/alerting/alerting_settings.tsx index 2e3476656..2941f133c 100644 --- a/ui/litellm-dashboard/src/components/alerting/alerting_settings.tsx +++ b/ui/litellm-dashboard/src/components/alerting/alerting_settings.tsx @@ -25,13 +25,18 @@ interface alertingSettingsItem { field_default_value: any; field_description: string; stored_in_db: boolean | null; + premium_field: boolean; } interface AlertingSettingsProps { accessToken: string | null; + premiumUser: boolean; } -const AlertingSettings: React.FC = ({ accessToken }) => { +const AlertingSettings: React.FC = ({ + accessToken, + premiumUser, +}) => { const [alertingSettings, setAlertingSettings] = useState< alertingSettingsItem[] >([]); @@ -116,6 +121,7 @@ const AlertingSettings: React.FC = ({ accessToken }) => { handleInputChange={handleInputChange} handleResetField={handleResetField} handleSubmit={handleSubmit} + premiumUser={premiumUser} /> ); }; diff --git a/ui/litellm-dashboard/src/components/alerting/dynamic_form.tsx b/ui/litellm-dashboard/src/components/alerting/dynamic_form.tsx index c271712c9..8804f623d 100644 --- a/ui/litellm-dashboard/src/components/alerting/dynamic_form.tsx +++ b/ui/litellm-dashboard/src/components/alerting/dynamic_form.tsx @@ -9,6 +9,7 @@ interface AlertingSetting { field_type: string; field_value: any; stored_in_db: boolean | null; + premium_field: boolean; } interface DynamicFormProps { @@ -16,6 +17,7 @@ interface DynamicFormProps { handleInputChange: (fieldName: string, newValue: any) => void; handleResetField: (fieldName: string, index: number) => void; handleSubmit: (formValues: Record) => void; + premiumUser: boolean; } const DynamicForm: React.FC = ({ @@ -23,19 +25,27 @@ const DynamicForm: React.FC = ({ handleInputChange, handleResetField, handleSubmit, + premiumUser, }) => { const [form] = Form.useForm(); const onFinish = () => { const formData = form.getFieldsValue(); - handleSubmit(formData); + const isEmpty = Object.values(formData).some( + (value) => value === "" || value === null || value === undefined + ); + if (!isEmpty) { + handleSubmit(formData); + } else { + console.log("Some form fields are empty."); + } }; return (
{alertingSettings.map((value, index) => ( - + {value.field_name}

= ({ {value.field_description}

- - - {value.field_type === "Integer" ? ( - handleInputChange(value.field_name, e)} - /> - ) : ( - handleInputChange(value.field_name, e)} - /> - )} - - + {value.premium_field ? ( + premiumUser ? ( + + + {value.field_type === "Integer" ? ( + handleInputChange(value.field_name, e)} + /> + ) : ( + handleInputChange(value.field_name, e)} + /> + )} + + + ) : ( + + + + ) + ) : ( + + + {value.field_type === "Integer" ? ( + handleInputChange(value.field_name, e)} + className="p-0" + /> + ) : ( + handleInputChange(value.field_name, e)} + /> + )} + + + )} {value.stored_in_db == true ? ( diff --git a/ui/litellm-dashboard/src/components/model_metrics/time_to_first_token.tsx b/ui/litellm-dashboard/src/components/model_metrics/time_to_first_token.tsx index 96e609b29..744b3d4a1 100644 --- a/ui/litellm-dashboard/src/components/model_metrics/time_to_first_token.tsx +++ b/ui/litellm-dashboard/src/components/model_metrics/time_to_first_token.tsx @@ -27,9 +27,9 @@ const TimeToFirstToken: React.FC = ({ /> ) : ( ) : null} diff --git a/ui/litellm-dashboard/src/components/settings.tsx b/ui/litellm-dashboard/src/components/settings.tsx index db330905a..5f712b1d4 100644 --- a/ui/litellm-dashboard/src/components/settings.tsx +++ b/ui/litellm-dashboard/src/components/settings.tsx @@ -36,6 +36,7 @@ interface SettingsPageProps { accessToken: string | null; userRole: string | null; userID: string | null; + premiumUser: boolean; } interface AlertingVariables { @@ -88,6 +89,7 @@ const Settings: React.FC = ({ accessToken, userRole, userID, + premiumUser, }) => { const [callbacks, setCallbacks] = useState(defaultLoggingObject); @@ -460,12 +462,32 @@ const Settings: React.FC = ({ ([key, value], index) => ( - handleSwitchChange(key)} - /> + {key == "region_outage_alerts" ? ( + premiumUser ? ( + handleSwitchChange(key)} + /> + ) : ( + + ) + ) : ( + handleSwitchChange(key)} + /> + )} {value} @@ -499,7 +521,10 @@ const Settings: React.FC = ({ - +