diff --git a/ui/litellm-dashboard/src/app/(dashboard)/users/_components/userRateLimitPayload.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/users/_components/userRateLimitPayload.test.ts
index c7ed31f1df6..c64f6e6a88a 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/users/_components/userRateLimitPayload.test.ts
+++ b/ui/litellm-dashboard/src/app/(dashboard)/users/_components/userRateLimitPayload.test.ts
@@ -37,15 +37,11 @@ describe("isValidRateLimitInput", () => {
["number zero", 0],
["integer string", "12"],
["integer", 12],
- ["maximum safe integer", String(Number.MAX_SAFE_INTEGER)],
])("accepts %s", (_label, value) => {
expect(isValidRateLimitInput(value)).toBe(true);
});
- it.each(["1.5", "-1", "abc", "1e400", "9007199254740992", "9007199254740993", "1e30", "9999999999999999999"])(
- "rejects %s",
- (value) => {
- expect(isValidRateLimitInput(value)).toBe(false);
- },
- );
+ it.each(["1.5", "-1", "abc", "1e400"])("rejects %s", (value) => {
+ expect(isValidRateLimitInput(value)).toBe(false);
+ });
});
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/users/_components/userRateLimitPayload.ts b/ui/litellm-dashboard/src/app/(dashboard)/users/_components/userRateLimitPayload.ts
index 90ff9dd58ed..82c0fb3bf88 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/users/_components/userRateLimitPayload.ts
+++ b/ui/litellm-dashboard/src/app/(dashboard)/users/_components/userRateLimitPayload.ts
@@ -13,5 +13,5 @@ export const isValidRateLimitInput = (value: string | number | null | undefined)
return true;
}
const number = Number(value);
- return Number.isSafeInteger(number) && number >= 0;
+ return Number.isFinite(number) && Number.isInteger(number) && number >= 0;
};
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/users/_components/user_edit_view.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/users/_components/user_edit_view.test.tsx
index dca6c04ec48..8d14e55df86 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/users/_components/user_edit_view.test.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/users/_components/user_edit_view.test.tsx
@@ -543,7 +543,7 @@ describe("UserEditView", () => {
expect(typeof onSubmit.mock.calls[0][0].rpm_limit).toBe("number");
});
- it.each(["-1", "1.5", "1e30", "9007199254740992"])("rejects an invalid TPM limit of %s", async (value) => {
+ it.each(["-1", "1.5"])("rejects an invalid TPM limit of %s", async (value) => {
const onSubmit = vi.fn();
renderWithProviders();
@@ -558,7 +558,7 @@ describe("UserEditView", () => {
fireEvent.submit(form);
expect(
- await screen.findByText("Enter a whole number from 0 to 9007199254740991, or leave empty for unlimited"),
+ await screen.findByText("Enter a non-negative whole number, or leave empty for unlimited"),
).toBeInTheDocument();
expect(onSubmit).not.toHaveBeenCalled();
});
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/users/_components/user_edit_view.tsx b/ui/litellm-dashboard/src/app/(dashboard)/users/_components/user_edit_view.tsx
index 75d35ebe561..f30ba1ccb5f 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/users/_components/user_edit_view.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/users/_components/user_edit_view.tsx
@@ -71,11 +71,11 @@ const budgetSchema = (unlimitedBudget: boolean) =>
tpm_limit: z
.union([z.string(), z.number()])
.nullish()
- .refine(isValidRateLimitInput, "Enter a whole number from 0 to 9007199254740991, or leave empty for unlimited"),
+ .refine(isValidRateLimitInput, "Enter a non-negative whole number, or leave empty for unlimited"),
rpm_limit: z
.union([z.string(), z.number()])
.nullish()
- .refine(isValidRateLimitInput, "Enter a whole number from 0 to 9007199254740991, or leave empty for unlimited"),
+ .refine(isValidRateLimitInput, "Enter a non-negative whole number, or leave empty for unlimited"),
});
type UserEditFormValues = z.infer>;